From 4d9eeaa5bc6c47feeac930f2af73e7d210572921 Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期二, 29 七月 2025 15:36:34 +0800
Subject: [PATCH] 新增查看费用接口

---
 service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java              |   62 ++++++++++++
 service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java         |    9 +
 service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java |   71 ++++++++++++++
 service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml                  |   85 +++++++++++++++++
 service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java            |    3 
 service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java         |   49 +++++++++
 service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java    |   11 ++
 7 files changed, 289 insertions(+), 1 deletions(-)

diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java b/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
index 51248a5..87fdbcc 100644
--- a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
+++ b/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);
     }
 
     /**
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java b/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java
new file mode 100644
index 0000000..2749c03
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrderItem.java
@@ -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-鍦ㄧ嚎瀵硅处)
+
+
+
+}
\ No newline at end of file
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java b/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
new file mode 100644
index 0000000..9956d37
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
@@ -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;
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
index be684e3..99d13c2 100644
--- a/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
+++ b/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);
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java b/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
index 238e0ce..96829a1 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
+++ b/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;
+
 /**
  * 璋冨害鍗昐ervice鎺ュ彛
  * 
@@ -100,4 +102,11 @@
      * @return 缁撴灉
      */
     public int deleteDispatchOrderById(Integer id);
+
+    /**
+     * 鏌ョ湅璐圭敤鏄庣粏
+     * @param no
+     * @return
+     */
+    List<DispatchOrderItemVo> selectDispatchOrderItem(String no);
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
index cb510b9..7ae20a3 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
+++ b/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()));
+            }
+        }
+           // 杞崲涓篖ist骞惰繃婊ゃ�佹帓搴�
+        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;
+    }
 }
diff --git a/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml b/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
index de53e3d..6884b7c 100644
--- a/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
+++ b/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 '鍑哄彂鍦癐D',
+location_d.NAME_TREE as departureLocationName,
+-- ts.ARRIVAL_LOCATION_ID '鐩殑鍦癐D',
+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">

--
Gitblit v1.8.0