| service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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">