wujianwei
2025-07-29 4d9eeaa5bc6c47feeac930f2af73e7d210572921
新增查看费用接口
2个文件已添加
5个文件已修改
290 ■■■■■ 已修改文件
service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
@@ -1,6 +1,8 @@
package com.ruoyi.cwgl.controller;
import java.util.List;
import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -46,6 +48,15 @@
        startPage();
        List<DispatchOrder> list = dispatchOrderService.selectDispatchOrderList2(dispatchOrder);
        return getDataTable(list);
    }    /**
     * 查询调度单列表
     */
    @PreAuthorize("@ss.hasPermi('cwgl:dispatchOrder:item')")
    @GetMapping("/item")
    public AjaxResult item(String no)
    {
        List<DispatchOrderItemVo> list = dispatchOrderService.selectDispatchOrderItem(no);
        return AjaxResult.success(list);
    }
    /**
service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.cwgl.domain;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 调度单及账单信息
 */
@Data
public class DispatchOrderItem {
    // 订单信息
    private Date createdTime; // 订单日期
    private String dispatchNo; // 调度单号
    private String transportMode; // 运输方式
    private String loadMode; // 配载方式
    private String productId; // 服务产品
    private String carrierName; // 承运商
    // 车辆信息
    private String vehicleTypeId; // 运输工具类型
    private String licensePlateNumber; // 车牌
    private String vehiclePlateId; // 车板号
    // 驾驶员信息
    private String mainDriverName; // 主驾驶员名称
    private String assistantDriverName; // 副驾驶员名称
    // 调度信息
    private Integer pointNum; // 提送货点数
    private BigDecimal reWeighingWeight; // 复磅重量
    private BigDecimal quantity; // 件数
    private Date requiredArrivalTime; // 要求到达时间
    private Date actualDepartureTime; // 实际出发时间
    private Date actualArrivalTime; // 实际到达时间
    private BigDecimal dispatchQuantity; // 实发件数
    private BigDecimal dispatchWeight; // 实发重量(千克)
    private BigDecimal dispatchVolume; // 实发体积(立方)
    private String status; // 调度单状态
    private String transportLine; // 运输线路
    private String departureLocationName; // 出发地名称
    private String arrivalLocationName; // 目的地名称
    // 账单信息
    private String billType; // 账单类型(P-应付,R-应收)
    private String isDeleted; // 是否删除(0-否,1-是)
    private Date feeDataCreatedTime; // 创建时间
    private String checkStatus; // 审核标识
    private String currencyType; // 币制类型
    private String feeItem; // 费用类型
    private Date feeTime; // 计费时间
    private String remark; // 结算备注
    private BigDecimal settleFee; // 结算金额
    private String feeDataStatus; // 结算状态
    private String settableFeeItems; // 可结算费用项
    private String billName; // 账单名字
    private String billStatus; // 账单状态(OP-打开,DA-审核中,EA-已审核,IN-已开票,PA-已支付,CH-在线对账)
}
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.cwgl.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 调度单对象 dispatch_order
 *
 * @author ruoyi
 * @date 2025-07-29
 */
@Data
public class DispatchOrderItemVo {
    /** 费用类型 */
    private String feeItem;
    /**
     * 应收费用
     */
    private BigDecimal receivableFee;
    /**
     * 实收费用
     */
    private BigDecimal actualFee;
    /**
     * 是否可结算 0否1是
     */
    private int isSettlement;
    /**
     * 应收币制类型
     */
    private String receivableFeeCurrency;
    /**
     * 实收币制类型
     */
    private String actualFeeCurrency;
}
service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
@@ -3,6 +3,7 @@
import java.util.List;
import com.ruoyi.cwgl.domain.DispatchOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cwgl.domain.DispatchOrderItem;
/**
@@ -85,4 +86,6 @@
     * @return 结果
     */
    public int deleteDispatchOrderByIds(Integer[] ids);
    List<DispatchOrderItem> selectDispatchOrderItemByNo(String no);
}
service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
@@ -3,6 +3,8 @@
import java.util.List;
import com.ruoyi.cwgl.domain.DispatchOrder;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo;
/**
 * 调度单Service接口
 * 
@@ -100,4 +102,11 @@
     * @return 结果
     */
    public int deleteDispatchOrderById(Integer id);
    /**
     * 查看费用明细
     * @param no
     * @return
     */
    List<DispatchOrderItemVo> selectDispatchOrderItem(String no);
}
service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
@@ -1,9 +1,14 @@
package com.ruoyi.cwgl.service.impl;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import com.ruoyi.common.utils.DateUtils;
import javax.annotation.Resource;
import com.ruoyi.cwgl.domain.DispatchOrderItem;
import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
import org.springframework.scheduling.annotation.Async;
@@ -191,4 +196,68 @@
    {
        return dispatchOrderMapper.deleteDispatchOrderById(id);
    }
    @DataSource(DataSourceType.CWSJ)
    @Override
    public List<DispatchOrderItemVo> selectDispatchOrderItem(String no) {
        // 使用Map来临时存储分组结果
        Map<String, DispatchOrderItemVo> summaryMap = new HashMap<>();
        List<DispatchOrderItem> dispatchOrderItems=dispatchOrderMapper.selectDispatchOrderItemByNo(no);
        Set<String> settableFeeItemSet = null;
        for (DispatchOrderItem dispatchOrderItem : dispatchOrderItems) {
            String settableFeeItems = dispatchOrderItem.getSettableFeeItems();
            if (settableFeeItemSet==null) {
                settableFeeItemSet = new HashSet<>(
                        Arrays.asList(settableFeeItems.split(",")));
            }
            // 判断是否可结算
            String feeItem = dispatchOrderItem.getFeeItem();
            int isSettable = isFeeItemSettable(feeItem, settableFeeItemSet);
            // 如果Map中不存在该费用类型,则创建新条目
            if (!summaryMap.containsKey(feeItem)) {
                DispatchOrderItemVo summary = new DispatchOrderItemVo();
                summary.setFeeItem(feeItem);
                summary.setReceivableFee(BigDecimal.ZERO);
                summary.setActualFee(BigDecimal.ZERO);
                summary.setIsSettlement(isSettable);
                summaryMap.put(feeItem, summary);
            }
            // 根据账单类型累加金额
            DispatchOrderItemVo summary = summaryMap.get(feeItem);
            if ("R".equals(dispatchOrderItem.getBillType())) { // 应收
                summary.setReceivableFee(summary.getReceivableFee().add(dispatchOrderItem.getSettleFee()));
            } else if ("P".equals(dispatchOrderItem.getBillType())) { // 应付
                summary.setActualFee(summary.getActualFee().add(dispatchOrderItem.getSettleFee()));
            }
        }
           // 转换为List并过滤、排序
        return summaryMap.values().stream()
                // 过滤掉应收应付都为0的记录
                .filter(dto -> dto.getReceivableFee().compareTo(BigDecimal.ZERO) != 0
                        || dto.getActualFee().compareTo(BigDecimal.ZERO) != 0)
                // 排序:可结算的在前,不可结算的在后;然后按总金额降序
                .sorted(Comparator.comparing(DispatchOrderItemVo::getIsSettlement).reversed()
                        .thenComparing(dto -> dto.getReceivableFee().add(dto.getActualFee()),
                                Comparator.reverseOrder()))
                .collect(Collectors.toList());
    }
    /**
     * 判断费用类型是否可结算
     */
    private static int isFeeItemSettable(String feeItem, Set<String> settableFeeItemSet) {
        if (feeItem == null || settableFeeItemSet == null) {
            return 0;
        }
            if (settableFeeItemSet.contains(feeItem)) {
                return 1;
            }
        return 0;
    }
}
service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
@@ -171,6 +171,91 @@
        </where>
        order by ts.CREATED_TIME desc
    </select>
    <select id="selectDispatchOrderItemByNo" resultType="com.ruoyi.cwgl.domain.DispatchOrderItem">
            SELECT
ts.CREATED_TIME as createdTime,
ts.DISPATCH_NO as dispatchNo,
ts.TRANSPORT_MODE as transportMode,
ts.LOAD_MODE as loadMode,
ts.PRODUCT_ID as productId,
bp.NAME as carrierName,
ts.VEHICLE_TYPE_ID as vehicleTypeId,
vhc.LICENSE_PLATE_NUMBER as licensePlateNumber,
ts.VEHICLE_PLATE_ID as vehiclePlateId,
-- ts.MAIN_DRIVER_ID '主驾驶员ID',
-- ts.ASSISTANT_DRIVER_ID '副驾驶员ID',
driver_m.NAME as mainDriverName,
driver_a.NAME as assistantDriverName,
ts.POINT_NUM as pointNum,
ts.RE_WEIGHING_WEIGHT as reWeighingWeight,
ts.QUANTITY as quantity,
ts.REQUIRED_ARRIVAL_TIME as requiredArrivalTime,
ts.ACTUAL_DEPARTURE_TIME as actualDepartureTime,
ts.ACTUAL_ARRIVAL_TIME as actualArrivalTime,
-- ts.BE_RETURN '是否回程',
ts.DISPATCH_QUANTITY as dispatchQuantity,
ts.DISPATCH_WEIGHT as dispatchWeight,
ts.DISPATCH_VOLUME as dispatchVolume,
-- bfd.ID '账单明细Id',
ts.STATUS as status,
ts.TRANSPORT_LINE as transportLine,
-- ts.REMARK '调度单备注',
-- ts.ROUTE_CODE '线路号',
-- ts.DEPARTURE_LOCATION_ID '出发地ID',
location_d.NAME_TREE as departureLocationName,
-- ts.ARRIVAL_LOCATION_ID '目的地ID',
location_a.NAME_TREE as arrivalLocationName,
-- bill.id '账单ID',
fb.type AS billType,
bfd.CREATED_TIME as feeDataCreatedTime,
-- bfd.BILL_ID '账单明细ID',
bfd.CHECK_STATUS as checkStatus,
bfd.CURRENCY_TYPE as currencyType,
-- bfd.ENTITY_LEVEL2 '二级主体',
-- bfd.ENTITY_LEVEL3 '三级主体',
-- bfd.FEE_BOOK_ID '账本ID',
bfd.FEE_ITEM as feeItem,
-- bfd.FEE_SOURCE '费用来源',
bfd.FEE_TIME as feeTime,
bfd.REMARK as remark,
bfd.SETTLE_FEE as settleFee,
bfd.STATUS as feeDataStatus,
bt.FIELDS as settableFeeItems,
bill.NAME as billName,
-- bill.CHECK_ONLINE'在线对账',
 bill.STATUS AS  billStatus
FROM
-- 账单明细表
    bms_fee_data bfd
-- 订单表
    LEFT JOIN oms_order ord
    ON bfd.ENTITY_ID = ord.DISPATCH_CODE
-- 调度单表
    LEFT JOIN tms_shipment ts
        ON ts.DISPATCH_NO = ord.DISPATCH_CODE
-- 账单主表
    left join bms_bill bill on bill.id= bfd.BILL_ID
-- 账册表
    LEFT JOIN bms_fee_book fb ON fb.id = bill.FEE_BOOK_ID
-- 运输工具表
    left join tms_vehicle  vhc on ts.VEHICLE_ID=vhc.id
-- 承运商表
    left join base_provider bp on bp.ID=ts.CARRIER_ID
-- 司机表
    left join tms_driver driver_m on driver_m.ID=ts.MAIN_DRIVER_ID
-- 司机表
    left join tms_driver driver_a on driver_a.ID=ts.ASSISTANT_DRIVER_ID
-- 地区表
    left join base_location location_a on location_a.ID =ts.ARRIVAL_LOCATION_ID
    -- 地区表
    left join base_location location_d on location_d.ID =ts.DEPARTURE_LOCATION_ID
    -- 账单模板表
    left join bms_bill_template bt on bt.ID=bill.BILL_TEMPLATE_ID
WHERE
    bfd.ENTITY_ID = #{no}
    </select>
    <!-- 新增 -->
    <insert id="insertDispatchOrder" parameterType="com.ruoyi.cwgl.domain.DispatchOrder"  useGeneratedKeys="true" keyProperty="id">