瀏覽代碼

电子单签收数据预处理第三版优化查询

njs 6 月之前
父節點
當前提交
ee4216bf6b

+ 3 - 0
suishenbang-system/src/main/java/com/dgtly/system/domain/DeliverSignVO.java

@@ -32,4 +32,7 @@ public class DeliverSignVO {
 
     /**运单下交货单数量*/
     private String deliverNum;
+
+    /**运单*/
+    private String tmsShipmentNum;
 }

+ 2 - 2
suishenbang-system/src/main/java/com/dgtly/system/mapper/MetaHanaDeliverSignMapper.java

@@ -93,7 +93,7 @@ public interface MetaHanaDeliverSignMapper
      * @author: njs
      * @date: 2025/6/5 10:09
      */
-    List<MetaHanaDeliverSign> selectDeliverSignListByOrderNumberAndOrderItem(@Param("OrderNumber") String OrderNumber, @Param("OrderItem")String OrderItem);
+    List<MetaHanaDeliverSign> selectDeliverSignListByOrderNumberAndOrderItem();
 
     /**
      * @description: 根据运单查询交货单签收信息
@@ -102,7 +102,7 @@ public interface MetaHanaDeliverSignMapper
      * @author: njs
      * @date: 2025/6/5 10:05
      */
-    List<DeliverSignVO> selectDeliverSignByTmsShipmentNumber(@Param("deliverNumberList") List<String> deliverNumberList);
+    List<DeliverSignVO> selectDeliverSignByTmsShipmentNumber();
 
 
 

+ 148 - 116
suishenbang-system/src/main/java/com/dgtly/system/service/impl/MetaHanaDeliverSignServiceImpl.java

@@ -2,7 +2,10 @@ package com.dgtly.system.service.impl;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import com.dgtly.system.domain.DeliverSignVO;
 import com.dgtly.system.domain.OrderSignVO;
@@ -97,62 +100,73 @@ public class MetaHanaDeliverSignServiceImpl implements IMetaHanaDeliverSignServi
      */
     @Override
     public void pretreatmentHanaDeliverSign() {
-       List<String>  orderList = metaHanaDeliverSignMapper.selectOrderNumberSign();
+        List<MetaHanaDeliverSign> orderList = metaHanaDeliverSignMapper.selectDeliverSignListByOrderNumberAndOrderItem();
+
         //先处理订单,(处理电子单签收里的订单)
         if(orderList !=null && orderList.size()>0){
             List<OrderSignVO> orderSignVOList = new ArrayList<>();
-            orderList.forEach(order->{
-                OrderSignVO vo = new OrderSignVO();
-                vo.setOrderNumber(order);
-                List<MetaHanaDeliverSign> hanaDeliverSignList = metaHanaDeliverSignMapper.selectDeliverSignListByOrderNumberAndOrderItem(order,null);
-                if(hanaDeliverSignList !=null && hanaDeliverSignList.size()>0){
-                    List<String> signList = new ArrayList<>();
-                    hanaDeliverSignList.forEach(sign->{
-                        BigDecimal differenceQty = new BigDecimal(0);
-                        //差值
-                        if (org.apache.commons.lang.StringUtils.isNotBlank(sign.getDifferenceQty())) {
-                            differenceQty = new BigDecimal(sign.getDifferenceQty());
-                            differenceQty = differenceQty.setScale(0, BigDecimal.ROUND_HALF_UP);
-                        }
-                        //判断是否待签收和异常签收标记
-                        if(differenceQty.compareTo(new BigDecimal("0")) == 0 ) {
-                            if(sign.getZdateDate() !=null && !("").equals(sign.getZdateDate()) && !sign.getZdateDate().equals("00000000")){
-                                //正常签收
-                                signList.add("1");
-                            }else{
-                                //未签收
-                                signList.add("3");
-                            }
-                        }else{
-                            if(("全部签收").equals(sign.getAbnormalStatus())){
-                                //正常签收
-                                signList.add("1");
-                            }else{
-                                //异常签收 待签收
-                                signList.add("0");
+            // 先建立运单号与对象的映射关系
+            Map<String, List<MetaHanaDeliverSign>> orderSignList = orderList.stream()
+                    .collect(Collectors.groupingBy(MetaHanaDeliverSign::getOrderNumber));
+
+            // 遍历处理每个运单号
+            orderSignList.forEach((orderNum, list) -> {
+                        if(orderSignVOList !=null && orderSignVOList.size()>0){
+                            if(!orderSignVOList.contains(orderNum)){
+                                OrderSignVO vo = new OrderSignVO();
+                                vo.setOrderNumber(orderNum);
+                                List<String> signList = new ArrayList<>();
+                                if(list !=null && list.size()>0){
+                                    list.forEach(sign->{
+                                        BigDecimal differenceQty = new BigDecimal(0);
+                                        //差值
+                                        if (org.apache.commons.lang.StringUtils.isNotBlank(sign.getDifferenceQty())) {
+                                            differenceQty = new BigDecimal(sign.getDifferenceQty());
+                                            differenceQty = differenceQty.setScale(0, BigDecimal.ROUND_HALF_UP);
+                                        }
+                                        //判断是否待签收和异常签收标记
+                                        if(differenceQty.compareTo(new BigDecimal("0")) == 0 ) {
+                                            if(sign.getZdateDate() !=null && !("").equals(sign.getZdateDate()) && !sign.getZdateDate().equals("00000000")){
+                                                //正常签收
+                                                signList.add("1");
+                                            }else{
+                                                //未签收
+                                                signList.add("3");
+                                            }
+                                        }else{
+                                            if(("全部签收").equals(sign.getAbnormalStatus())){
+                                                //正常签收
+                                                signList.add("1");
+                                            }else{
+                                                //异常签收 待签收
+                                                signList.add("0");
+                                            }
+                                        }
+                                    });
+
+                                    if(signList !=null && signList.size()>0){
+                                        if(signList.contains("0")){
+                                            //异常签收 待签收
+                                            vo.setSignType(0);
+                                            String signTime = findMaxValidDateTime(list);
+                                            vo.setZdateDate(signTime);
+                                        }else if(signList.contains("1") && !signList.contains("0")){
+                                            //正常签收
+                                            vo.setSignType(1);
+                                            String signTime = findMaxValidDateTime(list);
+                                            vo.setZdateDate(signTime);
+                                        }else{
+                                            //未签收
+                                            vo.setSignType(3);
+                                        }
+                                    }
+
+                                    orderSignVOList.add(vo);
+
+                                }
                             }
-                        }
-                    });
-                    if(signList !=null && signList.size()>0){
-                        if(signList.contains("0")){
-                            //异常签收 待签收
-                            vo.setSignType(0);
-                            vo.setZdateDate(hanaDeliverSignList.get(0).getSignTime());
-                        }else if(signList.contains("1") && !signList.contains("0")){
-                            //正常签收
-                            vo.setSignType(1);
-                            vo.setZdateDate(hanaDeliverSignList.get(0).getSignTime());
-                        }else{
-                            //未签收
-                            vo.setSignType(3);
-                        }
-                    }
-                }else{
-                    vo.setSignType(3);
                 }
-                orderSignVOList.add(vo);
             });
-
             if(orderSignVOList !=null && orderSignVOList.size()>0){
                 //清除表数据再批量新增
                 metaHanaDeliverSignMapper.truncateOrderSign();
@@ -162,82 +176,100 @@ public class MetaHanaDeliverSignServiceImpl implements IMetaHanaDeliverSignServi
         }
 
         //再处理运单,(处理tms运单表中的运单)
-        List<String>  tmsShipMentList = metaHanaDeliverSignMapper.selectTmsShipmentNumberSign();
+        List<DeliverSignVO> tmsShipMentList =  metaHanaDeliverSignMapper.selectDeliverSignByTmsShipmentNumber();
         if(tmsShipMentList !=null && tmsShipMentList.size()>0){
             List<TmsShipmentSignVO> tmsList = new ArrayList<>();
-            tmsShipMentList.forEach(tmsShipmentNumber->{
-                TmsShipmentSignVO signVO = new TmsShipmentSignVO();
-                signVO.setTmsShipmentNumber(tmsShipmentNumber);
-            //abnormalStatus 1未签收;2未开始补货;3部分签收;4全部签收
-               List<String> deliverNumberList = metaHanaDeliverSignMapper.selectDeliverNumListByTmsShipmentNumber(tmsShipmentNumber);
-            if(deliverNumberList !=null){
-            List<DeliverSignVO> deliverSignList =  metaHanaDeliverSignMapper.selectDeliverSignByTmsShipmentNumber(deliverNumberList);
-            if(deliverSignList !=null && deliverSignList.size()>0){
-                List<String> signList = new ArrayList<>();
-                deliverSignList.forEach(sign->{
-                    //计算该运单下电子签收单状态和最近签收时间
-                    BigDecimal differenceQty = new BigDecimal(0);
-                    if (org.apache.commons.lang.StringUtils.isNotBlank(sign.getDifferenceQty())) {
-                        differenceQty = new BigDecimal(sign.getDifferenceQty());
-                        differenceQty = differenceQty.setScale(0, BigDecimal.ROUND_HALF_UP);
-                    }
-                    //判断是否待签收和异常签收标记
-                    if(differenceQty.compareTo(new BigDecimal("0")) == 0) {
-                        //正常签收
-                        //没有签收时间的则为未签收
-                        if(sign.getZDate() !=null && !("").equals(sign.getZDate()) && !sign.getZDate().equals("00000000")){
-                            sign.setSignType(1);
-                        }else{
-                            sign.setSignType(3);
-                        }
-                    }else{
-                        if(("4").equals(sign.getAbnormalStatus())){
-                            //正常签收
-                            sign.setSignType(1);
-                        }else{
-                            //异常签收 待签收
-                            sign.setSignType(0);
-                        }
+            List<String> tmsSignList = new ArrayList<>();
+            // 先建立运单号与对象的映射关系
+            Map<String, List<DeliverSignVO>> shipmentMap = tmsShipMentList.stream()
+                    .collect(Collectors.groupingBy(DeliverSignVO::getTmsShipmentNum));
 
-                    }
-                    signList.add(sign.getSignType().toString());
+            // 遍历处理每个运单号
+                        shipmentMap.forEach((shipmentNum, list) -> {
+                            if (tmsList != null && tmsList.size() > 0) {
+                                //已处理过就跳过
+                                if (!tmsList.contains(shipmentNum)) {
+                                    TmsShipmentSignVO signVO = new TmsShipmentSignVO();
+                                    signVO.setTmsShipmentNumber(shipmentNum);
+                                    if (list != null && list.size() > 0) {
+                                        list.forEach(sign -> {
+                                            //计算该运单下电子签收单状态和最近签收时间
+                                            BigDecimal differenceQty = new BigDecimal(0);
+                                            if (org.apache.commons.lang.StringUtils.isNotBlank(sign.getDifferenceQty())) {
+                                                differenceQty = new BigDecimal(sign.getDifferenceQty());
+                                                differenceQty = differenceQty.setScale(0, BigDecimal.ROUND_HALF_UP);
+                                            }
+                                            //判断是否待签收和异常签收标记
+                                            if (differenceQty.compareTo(new BigDecimal("0")) == 0) {
+                                                //正常签收
+                                                //没有签收时间的则为未签收
+                                                if (sign.getZDate() != null && !("").equals(sign.getZDate()) && !sign.getZDate().equals("00000000")) {
+                                                    sign.setSignType(1);
+                                                } else {
+                                                    sign.setSignType(3);
+                                                }
+                                            } else {
+                                                //abnormalStatus 1未签收;2未开始补货;3部分签收;4全部签收
+                                                if (("4").equals(sign.getAbnormalStatus())) {
+                                                    //正常签收
+                                                    sign.setSignType(1);
+                                                } else {
+                                                    //异常签收 待签收
+                                                    sign.setSignType(0);
+                                                }
 
-                    if(!sign.getSignType().equals("3")){
-                        //最近一次签收日期
-                        if(sign.getZdateDate() !=null ){
-                            signVO.setZdateDate(sign.getZdateDate());
-                        }
-                    }
-
-                });
-                if(signList.contains("0")){
-                    signVO.setSignType(0);
-                }else if(!signList.contains("0") && signList.contains("1")){
-                    signVO.setSignType(1);
-                }else{
-                    signVO.setSignType(3);
-                }
+                                            }
+                                            tmsSignList.add(sign.getSignType().toString());
 
-            }else{
-                //未签收
-                signVO.setSignType(3);
-                }
-               }else{
-                   //未签收
-                   signVO.setSignType(3);
-               }
-                tmsList.add(signVO);
-            });
-            if(tmsList !=null && tmsList.size()>0){
-                //清楚表数据再批量新增
-                metaHanaDeliverSignMapper.truncateTmsShipmentSign();
-                metaHanaDeliverSignMapper.batchTmsShipmentSign(tmsList);
+                                        });
 
-            }
+                                        if (tmsSignList.contains("0")) {
+                                            signVO.setSignType(0);
+                                            String signTime = findMaxTMSDateTime(list);
+                                            signVO.setZdateDate(signTime);
+                                        } else if (!tmsSignList.contains("0") && tmsSignList.contains("1")) {
+                                            signVO.setSignType(1);
+                                            String signTime = findMaxTMSDateTime(list);
+                                            signVO.setZdateDate(signTime);
+                                        } else {
+                                            signVO.setSignType(3);
+                                        }
+
+                                    }
+
+                                    tmsList.add(signVO);
+                                }
+                            }
+                        });
+                        if(tmsList !=null && tmsList.size()>0){
+                            //清楚表数据再批量新增
+                            metaHanaDeliverSignMapper.truncateTmsShipmentSign();
+                            metaHanaDeliverSignMapper.batchTmsShipmentSign(tmsList);
+
+                        }
 
         }
 
     }
 
 
+    public  String findMaxValidDateTime(List<MetaHanaDeliverSign> list) {
+        return list.stream()
+                .filter(obj -> !obj.getSignTime().startsWith("0000"))
+                .map(MetaHanaDeliverSign::getSignTime)  // 提取需要比较的字段
+                .max(Comparator.naturalOrder())
+                .orElse(null);
+    }
+
+    public  String findMaxTMSDateTime(List<DeliverSignVO> list) {
+        return list.stream()
+                .filter(obj -> !obj.getZdateDate().startsWith("0000"))
+                .map(DeliverSignVO::getZdateDate)  // 提取需要比较的字段
+                .max(Comparator.naturalOrder())
+                .orElse(null);
+    }
+
+
+
+
 }

+ 49 - 43
suishenbang-system/src/main/resources/mapper/system/MetaHanaDeliverSignMapper.xml

@@ -112,56 +112,62 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectDeliverSignListByOrderNumberAndOrderItem" resultType="com.dgtly.system.domain.MetaHanaDeliverSign">
         SELECT
-        a.order_number AS orderNumber,
-        a.difference_qty AS differenceQty,
-        a.zdate_time AS zdateTime,
-        DATE_FORMAT(
-        MAX(STR_TO_DATE(CONCAT(b.zdate_date, b.zdate_time), '%Y%m%d%H%i%s')),
-        '%Y-%m-%d %H:%i:%s'
-        ) AS signTime,
-        a.abnormal_status AS abnormalStatus
-        FROM meta_hana_deliver_sign a
-        JOIN meta_hana_deliver_sign b ON
-        a.order_number = b.order_number
-        <where>
-            <if test="OrderNumber !=null and OrderNumber !='' "> and a.order_number = #{OrderNumber}</if>
-        </where>
+            a.order_number AS orderNumber,
+            a.difference_qty AS differenceQty,
+            a.zdate_date AS zdateDate,
+            a.abnormal_status AS abnormalStatus,
+            DATE_FORMAT( MAX( STR_TO_DATE( CONCAT( a.zdate_date, a.zdate_time ), '%Y%m%d%H%i%s' )), '%Y-%m-%d %H:%i:%s' ) AS signTime
+        FROM
+            meta_hana_deliver_sign a
         GROUP BY
-        a.order_number,a.difference_qty,
-        a.zdate_date, a.zdate_time, a.abnormal_status
+            a.order_number,
+            a.difference_qty,
+            a.zdate_date,
+            a.zdate_time,
+            a.abnormal_status
     </select>
 
 
 
     <select id="selectDeliverSignByTmsShipmentNumber" resultType="com.dgtly.system.domain.DeliverSignVO">
         SELECT
-        a.difference_qty AS differenceQty,
-        CASE a.abnormal_status
-        WHEN '补货中' THEN 1
-        WHEN '未开始补货' THEN 2
-        WHEN '部分签收' THEN 3
-        WHEN '全部签收' THEN 4
-        ELSE 5
-        END AS abnormalStatus,
-        DATE_FORMAT(
-        MAX(STR_TO_DATE(CONCAT(b.zdate_date, b.zdate_time), '%Y%m%d%H%i%s')),
-        '%Y-%m-%d %H:%i:%s'
-        ) AS zdateDate,
-        a.zdate_date AS zDate
-        FROM meta_hana_deliver_sign a
-        JOIN (
-        SELECT deliver_number, zdate_date, zdate_time
-        FROM meta_hana_deliver_sign
-        WHERE deliver_number IN  <foreach collection="deliverNumberList" item="deliverNumber" open="(" separator="," close=")">
-        #{deliverNumber}
-    </foreach>
-        ) b ON a.deliver_number = b.deliver_number
-        WHERE a.deliver_number IN
-        <foreach collection="deliverNumberList" item="deliverNumber" open="(" separator="," close=")">
-            #{deliverNumber}
-        </foreach>
-        GROUP BY a.deliver_number, a.deliver_Item,a.difference_qty,a.abnormal_status,a.zdate_date,a.zdate_time
-
+            b.tms_shipment_number AS tmsShipmentNum,
+            a.difference_qty AS differenceQty,
+            CASE
+                a.abnormal_status
+                WHEN '补货中' THEN
+                    1
+                WHEN '未开始补货' THEN
+                    2
+                WHEN '部分签收' THEN
+                    3
+                WHEN '全部签收' THEN
+                    4 ELSE 5
+                END AS abnormalStatus,
+            DATE_FORMAT( MAX( STR_TO_DATE( CONCAT( a.zdate_date, a.zdate_time ), '%Y%m%d%H%i%s' )), '%Y-%m-%d %H:%i:%s' ) AS zdateDate,
+            a.zdate_date AS zDate
+        FROM
+            meta_hana_deliver_sign a
+                JOIN (
+                SELECT
+                    tms_shipment_number,
+                    delivery_number
+                FROM
+                    tms_logistics_status
+                WHERE
+                    is_delete = '0'
+                  AND date_format( create_time, '%Y%m%d' ) >= DATE_ADD( LAST_DAY( NOW() - INTERVAL 3 MONTH ), INTERVAL 1 DAY )
+                GROUP BY
+                    tms_shipment_number,
+                    delivery_number
+            ) b ON a.deliver_number = b.delivery_number
+        GROUP BY
+            a.deliver_number,
+            a.deliver_Item,
+            a.difference_qty,
+            a.abnormal_status,
+            a.zdate_date,
+            a.zdate_time
 
     </select>