| tms/src/main/java/com/ruoyi/tms/service/impl/TmsArBillServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/car_wx_app/App.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/car_wx_app/components/OdometerPopup/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/car_wx_app/config.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/car_wx_app/pages/examine/operate.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ui/car_wx_app/uni_modules/uview-ui/components/u-number-box/u-number-box.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
tms/src/main/java/com/ruoyi/tms/service/impl/TmsArBillServiceImpl.java
@@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; import org.springframework.transaction.annotation.Transactional; import org.springframework.stereotype.Service; @@ -570,8 +571,8 @@ String rateStr = sysConfigService.selectConfigByKey("sys.hk.rmb.rate"); BigDecimal exchangeRate = new BigDecimal(rateStr); // 收集所有费用名称,用于动态生成列 Set<String> feeNames = new HashSet<>(); // 收集所有费用名称和对应的货币,用于动态生成列 Map<String, String> feeCurrencyMap = new HashMap<>(); for (TmsArBillItem item : bill.getItems()) { // 应收费用ID @@ -580,15 +581,33 @@ List<TmsReceivableFeeItem> tmsReceivableFeeItems = tmsReceivableFeeItemMapper.selectTmsReceivableFeeItemList(new TmsReceivableFeeItem() {{ setHeadId(arFeeId); }}); // 从应收费用明细中收集费用名称 // 从应收费用明细中收集费用名称和货币 for (TmsReceivableFeeItem feeItem : tmsReceivableFeeItems) { feeNames.add(feeItem.getFeeName()); feeCurrencyMap.put(feeItem.getFeeName(), feeItem.getCurrency()); } } // 将费用名称转换为列表,保持顺序 List<String> feeNameList = new ArrayList<>(feeNames); // 将费用名称转换为列表,并按要求排序:运费放在最前面,杂费放在最后面 List<String> feeNameList = new ArrayList<>(); List<String> otherFees = new ArrayList<>(); for (String feeName : feeCurrencyMap.keySet()) { if ("运费".equals(feeName)) { feeNameList.add(feeName); } else if ("杂费".equals(feeName)) { otherFees.add(feeName); } else { otherFees.add(feeName); } } // 添加其他费用 feeNameList.addAll(otherFees.stream().filter(fee -> !"杂费".equals(fee)).collect(Collectors.toList())); // 添加杂费到最后 if (feeCurrencyMap.containsKey("杂费")) { feeNameList.add("杂费"); } // 基础列数(序号、装货日期、装货点、卸货点、车牌、型号) int baseColumns = 6; @@ -614,7 +633,7 @@ createTitleArea(sheet, styles,bill); // 表头 createDynamicTableHeader(sheet, styles, feeNameList, baseColumns, remarkColumn); createDynamicTableHeader(sheet, styles, feeNameList, feeCurrencyMap, baseColumns, remarkColumn); // 数据区域 int startRow = 5; @@ -687,12 +706,8 @@ }}); // 处理应收费用明细 for (TmsReceivableFeeItem feeItem : tmsReceivableFeeItems) { BigDecimal amount = feeItem.getRegisterAmount(); // 如果是港币,转换为人民币 if ("HKD".equals(feeItem.getCurrency()) || "港币".equals(feeItem.getCurrency())) { amount = amount.multiply(exchangeRate).setScale(2, RoundingMode.HALF_UP); } feeMap.put(feeItem.getFeeName(), amount); // 保持原始金额,不进行币种转换 feeMap.put(feeItem.getFeeName(), feeItem.getRegisterAmount()); } // 填充费用列 @@ -707,9 +722,9 @@ feeTotals.put(feeName, feeTotals.get(feeName).add(feeAmount)); } // 备注 // 备注 - 为空 Cell remarkCell = row.createCell(remarkColumn); remarkCell.setCellValue("" + (fee.getDispatchNo() != null ? fee.getDispatchNo() : "")); remarkCell.setCellValue(""); remarkCell.setCellStyle(styles.get("data")); rowIndex++; @@ -746,13 +761,24 @@ if (i == 0) { cell.setCellValue("合计(RMB)"); } // 合计行的备注设置汇率 if (i == remarkColumn) { cell.setCellValue("汇率: " + exchangeRate); } cell.setCellStyle(styles.get("total")); } sheet.addMergedRegion(new CellRangeAddress(totalRow, totalRow, 0, 5)); // 计算所有费用的合计 // 计算所有费用的合计(转换为人民币) BigDecimal grandTotal = BigDecimal.ZERO; for (BigDecimal amount : feeTotals.values()) { for (String feeName : feeTotals.keySet()) { BigDecimal amount = feeTotals.get(feeName); // 获取该费用的币种 String currency = feeCurrencyMap.get(feeName); // 如果是港币,转换为人民币 if ("HKD".equals(currency) || "港币".equals(currency)) { amount = amount.multiply(exchangeRate).setScale(2, RoundingMode.HALF_UP); } grandTotal = grandTotal.add(amount); } @@ -898,7 +924,6 @@ * * @param sheet 工作表 * @param styles 样式映射 * @param tmsReceivableFee 应收费用查询条件 */ private void createTitleArea(SXSSFSheet sheet, Map<String, CellStyle> styles, TmsArBill tmsArBill) { // 标题行(无边框,居中) @@ -964,10 +989,11 @@ * @param sheet 工作表 * @param styles 样式映射 * @param feeNameList 费用名称列表 * @param feeCurrencyMap 费用名称到货币的映射 * @param baseColumns 基础列数 * @param remarkColumn 备注列位置 */ private void createDynamicTableHeader(SXSSFSheet sheet, Map<String, CellStyle> styles, List<String> feeNameList, int baseColumns, int remarkColumn) { private void createDynamicTableHeader(SXSSFSheet sheet, Map<String, CellStyle> styles, List<String> feeNameList, Map<String, String> feeCurrencyMap, int baseColumns, int remarkColumn) { Row headerRow = sheet.createRow(4); headerRow.setHeightInPoints(25); @@ -982,7 +1008,10 @@ // 费用列 for (int i = 0; i < feeNameList.size(); i++) { Cell cell = headerRow.createCell(baseColumns + i); cell.setCellValue(feeNameList.get(i) + "(人民币)"); String feeName = feeNameList.get(i); String currency = feeCurrencyMap.get(feeName); cell.setCellValue(feeName + "(" + currency + ")"); cell.setCellStyle(styles.get("header")); } tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java
@@ -1207,6 +1207,7 @@ // 2、 获取实报实销费用 List<TmsFinanceDetail> tmsFinanceDetails = tmsFinanceDetailService.selectTmsFinanceDetailList(new TmsFinanceDetail() {{ setDispatchOrderId(tmsDispatchOrder.getId()); setStatus(0); }}); if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){ @@ -1326,6 +1327,7 @@ // 2、 获取实报实销费用 List<TmsFinanceDetail> tmsFinanceDetails = tmsFinanceDetailService.selectTmsFinanceDetailList(new TmsFinanceDetail() {{ setDispatchOrderId(tmsDispatchOrder.getId()); setStatus(0); setIsYF(1); }}); ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -202,7 +202,7 @@ </el-link> </el-tooltip> <!-- <!-- <el-tooltip content="完成行程" placement="top"> <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check"> @@ -679,7 +679,7 @@ importTemplateTmsDispatchOrder, ypdddjSumbit, tmsTmsDispatchOrderImportLog, saveTmsFinanceDetail2, getLastLicensePlate, getLastLicensePlate, } from "@/api/tms/tmsDispatchOrder"; import useCurrentInstance from "@/utils/useCurrentInstance"; import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue"; @@ -1381,6 +1381,7 @@ if (res.code == 200) { form.value.licensePlate = res.data.licensePlate; form.value.vehicleId = res.data.vehicleId form.value.actualVehicleType = res.data.vehicleType; } }).finally(() => { data.isChanging = false; @@ -1402,7 +1403,7 @@ // mainDriverName: active.driverName, // }); // console.log(active.driverName,'44'); // getLastLicensePlate(active.driverName).then(res => { // getLastLicensePlate(active.driverName).then(res => { // console.log(res); // }) ui/car_wx_app/App.vue
@@ -16,36 +16,40 @@ console.log('App Hide') }, methods:{ updateApp() { const updateManager = uni.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 }); updateApp() { const updateManager = uni.getUpdateManager(); updateManager.onUpdateReady(function (res) { uni.showModal({ title: '更新提示', content: '新版本已经准备好,是否重启应用?', showCancel: false, success(res) { if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate(); } else if (res.cancel) { console.log('用户点击取消,不更新'); } } }); updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 console.log('检查更新结果:', res.hasUpdate); if (res.hasUpdate) { console.log('发现新版本,正在下载...'); } else { console.log('当前已是最新版本'); } }); }); updateManager.onUpdateReady(function (res) { uni.showModal({ title: '更新提示', content: '新版本已经准备好,是否重启应用?', success(res) { if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate(); } } }); }); updateManager.onUpdateFailed(function (res) { // 新的版本下载失败 uni.showModal({ title: '已经有新版本了哟~', content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~', }) }); updateManager.onUpdateFailed(function (res) { // 新的版本下载失败 uni.showModal({ title: '更新失败', content: '新版本下载失败,请检查网络后重试', showCancel: false }); }); } ui/car_wx_app/components/OdometerPopup/index.vue
@@ -13,7 +13,6 @@ <u-number-box v-model="localForm.odometer" class="number-box" :min="0" :step="1" button-size="28" inputWidth="90" @@ -65,7 +64,7 @@ data() { return { localForm: { odometer: 0, odometer: undefined, iscc: '1' } } @@ -74,11 +73,13 @@ watch: { show(val) { if (val) { // 弹窗打开时,同步父组件的数据到本地 this.localForm = { odometer: this.form.odometer || 0, odometer: this.form.odometer || '', iscc: this.form.iscc || '1' } console.log(this.form.odometer,this.localForm) } } }, ui/car_wx_app/config.js
@@ -1,6 +1,6 @@ //const host = 'https://tmsapi.ygalogisticspark.com/api/'; const host = 'https://tmsapi.ygalogisticspark.com/api/'; //const host = 'http://61.143.42.70:7010/cwgltest-api/'; const host = 'http://192.168.1.92:8060/'; //const host = 'http://192.168.1.92:8060/'; // const host = 'https://jyjyapi.ygalogisticspark.com/api2/zhfw/api/third'; const imageUrlYL = 'http://localhost:8080'; const aliOssUrl = 'https://huichang-tms.oss-cn-hongkong.aliyuncs.com'; ui/car_wx_app/pages/examine/operate.vue
@@ -20,7 +20,7 @@ <u--form ref="uForm" :rules="rules" :model="form" labelPosition="left"> <u-form-item borderBottom label=" " labelWidth="0" prop="address"> <view class="form-row" @click="getLocation"> <view class="form-label required"> <view class="form-label"> <view class="label-icon"> <u--image :showLoading="true" src="/static/bt.png" width="18" height="18" /> </view> @@ -47,6 +47,14 @@ <text>时间</text> </view> <uni-datetime-picker type="datetime" v-model="form.tripTime" class="flex-1" /> </view> </u-form-item> <u-form-item borderBottom label=" " v-if="form.odometer" labelWidth="0" prop="odometer"> <view class="form-row"> <view class="form-label"> <text>仪表里程</text> </view> <view class="form-label">{{form.odometer || 0}} KM</view> </view> </u-form-item> @@ -223,7 +231,7 @@ const ODOMETER_TYPES = Object.freeze(['3', '5', '7']) const INITIAL_FORM = Object.freeze({ address: '', tripTime: '', odometer: 0, tripType: '', address: '', tripTime: '', odometer: undefined, tripType: '', feeType: '', currency: '', actualFeeAmount: 0, iscc: '1', longitude: '', latitude: '' }) @@ -468,10 +476,10 @@ if (type !== '1') { if (ODOMETER_TYPES.includes(type)) { this.form.odometer = this.tmsTripTables[0]?.odometer || 0 this.form.odometer = this.tmsTripTables[0]?.odometer || undefined this.form.iscc = '1' } else { this.form.odometer = 0 this.form.odometer = undefined } this.$nextTick(() => { this.showPopup = true }) } ui/car_wx_app/uni_modules/uview-ui/components/u-number-box/u-number-box.vue
@@ -194,6 +194,9 @@ // 格式化整理数据,限制范围 format(value) { value = this.filter(value) if (!value){ return value } // 如果为空字符串,那么设置为0,同时将值转为Number类型 value = value === '' ? 0 : +value // 对比最大最小值,取在min和max之间的值