啊鑫
3 天以前 b54eecf57118f38f0e3ddcdce8c2b9412a47bf7e
添加赋值订单号为空的情况
已修改6个文件
157 ■■■■■ 文件已修改
src/main/java/com/gs/xky/mapper/DeliveryNoticeMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/DeliveryNoticeService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/Impl/DeliveryNoticeServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/XkyService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/DeliveryNoticeMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/xky/XkyApplicationTests.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/mapper/DeliveryNoticeMapper.java
@@ -22,6 +22,19 @@
     */
    void callPdaReceiptBtn(@Param("C_IN_STR") String inStr, @Param("C_RESULT") String result);
    /**
     * 调用 Oracle 存储过程 PRC_RF_PDA_RECEIPT_BTN_test001
     *
     * @param deliveryNo 送货单号
     * @param userid     用户ID
     * @param res        输出结果码
     * @param msg        输出消息
     */
    void callPdaReceiptBtn1(@Param("C_DELIVERY_NO") String deliveryNo,
                            @Param("C_userid") String userid,
                            @Param("c_res") Integer res,
                            @Param("c_msg") String msg);
    //PRC_MES_INV_ITEM_ARN_STATUS22
    void callPrcMesInvItemArnStatus22(@Param("PI_FACTORY") String factory,
                                      @Param("PI_COMPANY") String company,
src/main/java/com/gs/xky/service/DeliveryNoticeService.java
@@ -19,6 +19,15 @@
    void callPdaReceiptBtn(String inStr, String result);
    /**
     * 调用新的存储过程 PRC_RF_PDA_RECEIPT_BTN_test001
     *
     * @param deliveryNo 送货单号
     * @param userid     用户ID
     * @return 返回包含结果码和消息的数组,[0]为结果码,[1]为消息
     */
    Object[] callPdaReceiptBtn1(String deliveryNo, String userid);
    Integer processMesInvItemArnStatus(String factory, String company, String userCode, Long id);
    void processMesInvItemArnStatusAsync(List<MesInvItemArn> itemArnMinus);
@@ -29,4 +38,6 @@
     * @param batchItems 当前批次的数据
     */
    void processAsyncBatch(List<MesInvItemArn> batchItems);
    boolean setDeliveryNotice();
}
src/main/java/com/gs/xky/service/Impl/DeliveryNoticeServiceImpl.java
@@ -100,6 +100,27 @@
    }
    @Override
    public Object[] callPdaReceiptBtn1(String deliveryNo, String userid) {
        // 创建用于接收输出参数的变量
        Integer res = null;
        String msg = null;
        try {
            // 调用存储过程
            baseMapper.callPdaReceiptBtn1(deliveryNo, userid, res, msg);
            log.info("调用存储过程PRC_RF_PDA_RECEIPT_BTN_test001成功: 送货单号={}, 用户ID={}, 结果码={}, 消息={}",
                    deliveryNo, userid, res, msg);
            return new Object[]{res, msg};
        } catch (Exception e) {
            log.error("调用存储过程PRC_RF_PDA_RECEIPT_BTN_test001失败: 送货单号={}, 用户ID={}, 异常={}",
                    deliveryNo, userid, e.getMessage(), e);
            throw e;
        }
    }
    @Override
    public Integer processMesInvItemArnStatus(String factory, String company, String userCode, Long id) {
        Integer poResult = 1;
        String poText = "";
@@ -154,6 +175,98 @@
        log.info("【processAsyncBatch】异步处理{}条数据完成", batchItems.size());
    }
    @Override
    public boolean setDeliveryNotice() {
        LambdaQueryWrapper<DeliveryNoticeDetail> nullPoErpNoWrapper = new LambdaQueryWrapper<>();
        nullPoErpNoWrapper.isNull(DeliveryNoticeDetail::getPoErpNo);
        nullPoErpNoWrapper.orderByAsc(DeliveryNoticeDetail::getPid, DeliveryNoticeDetail::getLineNo);
        List<DeliveryNoticeDetail> nullPoErpNoList = detailService.list(nullPoErpNoWrapper);
        if (CollUtil.isEmpty(nullPoErpNoList)) {
            log.info("没有找到需要更新的PO_ERP_NO为null的记录");
            return true;
        }
        log.info("找到{}条PO_ERP_NO为null的记录需要更新", nullPoErpNoList.size());
        int updatedCount = 0;
        for (DeliveryNoticeDetail nullRecord : nullPoErpNoList) {
            Integer currentLineNo;
            try {
                currentLineNo = Integer.parseInt(nullRecord.getLineNo());
                // 如果LINE_NO为1,跳过这条记录,继续处理下一条
                if (currentLineNo == 1) {
                    log.info("跳过LINE_NO为1的记录: ID={}, 继续处理其他记录", nullRecord.getId());
                    continue;
                }
            } catch (NumberFormatException e) {
                log.warn("无法解析LINE_NO为数字: {}, 跳过这条记录", nullRecord.getLineNo());
                continue;
            }
            // 获取同一PID下所有记录
            LambdaQueryWrapper<DeliveryNoticeDetail> sameParentWrapper = new LambdaQueryWrapper<>();
            sameParentWrapper.eq(DeliveryNoticeDetail::getPid, nullRecord.getPid());
            List<DeliveryNoticeDetail> allRecords = detailService.list(sameParentWrapper);
            // 按LINE_NO顺序依次向前查找第一个PO_ERP_NO不为null的记录
            DeliveryNoticeDetail nearestRecord = null;
            // 从当前LINE_NO-1开始向前查找
            for (int searchLineNo = currentLineNo - 1; searchLineNo >= 1; searchLineNo--) {
                for (DeliveryNoticeDetail candidate : allRecords) {
                    try {
                        Integer candidateLineNo = Integer.parseInt(candidate.getLineNo());
                        if (candidateLineNo.equals(searchLineNo) && StrUtil.isNotEmpty(candidate.getPoErpNo())) {
                            nearestRecord = candidate;
                            break;
                        }
                    } catch (NumberFormatException e) {
                        log.warn("无法解析候选记录LINE_NO为数字: {}", candidate.getLineNo());
                    }
                }
                // 如果找到了就跳出外层循环
                if (nearestRecord != null) {
                    break;
                }
            }
            if (nearestRecord != null && StrUtil.isNotEmpty(nearestRecord.getPoErpNo())) {
                LambdaUpdateWrapper<DeliveryNoticeDetail> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(DeliveryNoticeDetail::getId, nullRecord.getId())
                        .set(DeliveryNoticeDetail::getPoErpNo, nearestRecord.getPoErpNo())
                        .set(DeliveryNoticeDetail::getPurchaseType, nearestRecord.getPurchaseType())
                        .set(DeliveryNoticeDetail::getPoLineNo, nearestRecord.getPoLineNo());
                boolean updated = detailService.update(updateWrapper);
                if (updated) {
                    updatedCount++;
                    log.info("更新记录ID: {}, LINE_NO: {}, 设置PO_ERP_NO为: {} (来源LINE_NO: {})",
                            nullRecord.getId(), nullRecord.getLineNo(), nearestRecord.getPoErpNo(), nearestRecord.getLineNo());
//                    LambdaQueryWrapper<DeliveryNotice> queryWrapper = new LambdaQueryWrapper<>();
//                    queryWrapper.eq(DeliveryNotice::getId, nullRecord.getPid());
//                    DeliveryNotice one = getOne(queryWrapper, false);
//
//                    callPdaReceiptBtn1(one.getDeliveryNo(), "PL017");
                } else {
                    log.error("更新记录ID: {} 失败", nullRecord.getId());
                }
            } else {
                log.error("记录ID: {}, LINE_NO: {} 找不到可用的PO_ERP_NO值,需要人工处理",
                        nullRecord.getId(), nullRecord.getLineNo());
            }
        }
        log.info("共更新了{}条记录", updatedCount);
        return updatedCount > 0;
    }
    /**
     * 批量处理MesInvItemArn数据
     *
src/main/java/com/gs/xky/service/XkyService.java
@@ -104,6 +104,15 @@
                    log.info("【processBatchDeliveries】处理送货单: {}, 物流状态: {}", deliveryNo.getDeliveryNo(), deliveryNo.getLogisticsStatus());
                    XkyDetail detail = getDetail(deliveryNo.getDeliveryNo());
                    deliveryNoticeService.saveDeliveryNotice(detail);
                    // 数据插入后,处理PO_ERP_NO为null的记录
                    try {
                        deliveryNoticeService.setDeliveryNotice();
                        log.info("【processBatchDeliveries】PO_ERP_NO null值处理完成: {}", deliveryNo.getDeliveryNo());
                    } catch (Exception e) {
                        log.error("【processBatchDeliveries】处理PO_ERP_NO null值异常: {}, 异常: {}", deliveryNo.getDeliveryNo(), e.getMessage(), e);
                    }
                    List<BarcodeDeliveryNo> barcodeDeliveryNos = GetBarcodeInformation(deliveryNo.getDeliveryNo());
                    barcodeInformationService.SaveBarcodeInformation(barcodeDeliveryNos, deliveryNo.getDeliveryNo());
                    //已送达的才自动转换为MES到货单
src/main/resources/mapper/DeliveryNoticeMapper.xml
@@ -28,4 +28,12 @@
                #{PO_TEXT, mode=OUT, jdbcType=VARCHAR}
              )}
    </select>
    <select id="callPdaReceiptBtn1" statementType="CALLABLE">
        {call PRC_RF_PDA_RECEIPT_BTN_test001(
                #{C_DELIVERY_NO, mode=IN, jdbcType=VARCHAR},
                #{C_userid, mode=IN, jdbcType=VARCHAR},
                #{c_res, mode=OUT, jdbcType=NUMERIC},
                #{c_msg, mode=OUT, jdbcType=VARCHAR}
              )}
    </select>
</mapper>
src/test/java/com/gs/xky/XkyApplicationTests.java
@@ -60,7 +60,7 @@
    @Test
    void cs() throws IOException {
        String str = "2225060624DY;";
        String str = "22250702H88F;";
        String[] split = str.split(";");
@@ -166,5 +166,6 @@
//        xkyEntity.setDeliveryNo("222505057541");
//        xkyService.remove1(xkyEntity);
        deliveryNoticeService.setDeliveryNotice();
    }
}