8个文件已修改
166 ■■■■■ 已修改文件
tms/src/main/java/com/ruoyi/tms/service/impl/TmsArBillServiceImpl.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/car_wx_app/App.vue 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/car_wx_app/components/OdometerPopup/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/car_wx_app/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/car_wx_app/pages/examine/operate.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/car_wx_app/uni_modules/uview-ui/components/u-number-box/u-number-box.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | 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 @@
            &nbsp;
          </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之间的值