啊鑫
2025-06-05 e47d11017af9eff6581591d5d73c1e55676b0955
src/main/java/com/gs/xky/service/XkyService.java
@@ -1,6 +1,9 @@
package com.gs.xky.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.gs.xky.config.ApiResponse;
import com.gs.xky.config.BodyParam;
@@ -9,10 +12,10 @@
import com.gs.xky.dto.BarcodeDeliveryNo;
import com.gs.xky.dto.XkyDetail;
import com.gs.xky.dto.XkyEntity;
import com.gs.xky.entity.DeliveryNotice;
import com.gs.xky.entity.DeliveryNoticeDetail;
import com.gs.xky.entity.TblBarcodeInformation;
import com.gs.xky.entity.*;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -24,79 +27,132 @@
@RequiredArgsConstructor
public class XkyService {
    private static final Logger log = LoggerFactory.getLogger(XkyService.class);
    private final ApiService apiService;
    private final DeliveryNoticeService deliveryNoticeService;
    private final TblBarcodeInformationService barcodeInformationService;
    private final DeliveryNoticeDetailService deliveryNoticeDetailService;
    private final MesInvItemArnService mesInvItemArnService;
    private final MesInvItemArnDetailService mesInvItemArnDetailService;
    private final MesInvItemBarcodesService mesInvItemBarcodesService;
    private final MesQaItemsDetect01Service mesQaItemsDetect01Service;
    public void GetSaveDetail() throws IOException {
        long currentTimeMillis = System.currentTimeMillis();
        long startDate = currentTimeMillis - (30 * 60 * 1000); // 计算 120 分钟前的时间戳
        XkyCommonParam param = XkyCommonParam.GetInit();
        // 计算五分钟前的时间戳
        long startDate = currentTimeMillis - (65 * 60 * 1000); // 5 分钟 = 5 * 60 * 1000 毫秒
        // 创建 BodyParam 对象并赋值
        XkyCommonParam<BodyParam> param = XkyCommonParam.GetInit();
        BodyParam bodyParam = new BodyParam();
        bodyParam.setStartDate(startDate);
        bodyParam.setEndDate(currentTimeMillis);
        bodyParam.setErpCode(DataAcquisitionConfiguration.TEST_ERP_CODE);
        bodyParam.setStatus(new int[]{1});
        bodyParam.setLogisticsStatus(2);
        bodyParam.setStatus(new int[]{1, 6});
        param.setBody(bodyParam);
        // 记录请求参数日志
        log.info("【GetSaveDetail 请求参数】时间: {}, 参数: {}", currentTimeMillis, JSONUtil.toJsonStr(param));
        ApiResponse<XkyEntity> noList = apiService.sendListRequest(param, XkyEntity.class, "https://openapi.xiekeyun.com/delivery/getNoList.json");
//        List<String> deliveryNoList = noList.getDataList().stream().map(XkyEntity::getDeliveryNo).collect(Collectors.toList());
        // 记录返回数据日志
        log.info("【GetSaveDetail 响应数据】时间: {}, 返回: {}", currentTimeMillis, JSONUtil.toJsonStr(noList));
        List<XkyEntity> deliveryNoList = noList.getDataList();
        if (CollUtil.isEmpty(deliveryNoList)) {
            log.info("【GetSaveDetail】返回列表为空,跳过处理");
            return;
        }
        LambdaUpdateWrapper<DeliveryNotice> deliveryNoticeWrapper = new LambdaUpdateWrapper<>();
        log.info("【GetSaveDetail】获取到{}条送货单数据", deliveryNoList.size());
        LambdaUpdateWrapper<DeliveryNoticeDetail> updateWrapper = new LambdaUpdateWrapper<>();
        // 分批处理数据,减少内存占用
        int batchSize = 10; // 每批处理10条数据
        int totalSize = deliveryNoList.size();
        int batchCount = (totalSize + batchSize - 1) / batchSize; // 向上取整计算批次数
        LambdaUpdateWrapper<TblBarcodeInformation> updateWrapper1 = new LambdaUpdateWrapper<>();
        for (int i = 0; i < batchCount; i++) {
            int fromIndex = i * batchSize;
            int toIndex = Math.min((i + 1) * batchSize, totalSize);
        deliveryNoList.forEach(deliveryNo -> {
            log.info("【GetSaveDetail】处理第{}批送货单数据,范围:{}-{}", i + 1, fromIndex, toIndex);
            // 获取当前批次的数据
            List<XkyEntity> batchDeliveries = deliveryNoList.subList(fromIndex, toIndex);
            // 处理当前批次的数据
            processBatchDeliveries(batchDeliveries);
        }
        log.info("【GetSaveDetail】所有送货单处理完成");
    }
    /**
     * 批量处理送货单数据
     *
     * @param batchDeliveries 当前批次的送货单数据
     */
    private void processBatchDeliveries(List<XkyEntity> batchDeliveries) {
        batchDeliveries.forEach(deliveryNo -> {
            try {
                if ("4".equals(deliveryNo.getStatus()) || "8".equals(deliveryNo.getStatus())) {
                    deliveryNoticeWrapper.clear();
                    updateWrapper.clear();
                    updateWrapper1.clear();
                    deliveryNoticeWrapper.eq(DeliveryNotice::getDeliveryNo, deliveryNo.getDeliveryNo());
                    DeliveryNotice one = deliveryNoticeService.getOne(deliveryNoticeWrapper, false);
                    if (deliveryNoticeService.remove(deliveryNoticeWrapper)) {
                        updateWrapper.eq(DeliveryNoticeDetail::getPid, one.getId());
                        deliveryNoticeDetailService.remove(updateWrapper);
                        updateWrapper1.eq(TblBarcodeInformation::getDeliveryNo, deliveryNo.getDeliveryNo());
                        barcodeInformationService.remove(updateWrapper1);
                if ("6".equals(deliveryNo.getStatus()) || "0".equals(deliveryNo.getLogisticsStatus())) {
                    log.info("【processBatchDeliveries】移除送货单: {}", deliveryNo.getDeliveryNo());
                    remove1(deliveryNo);
                } else if ("1".equals(deliveryNo.getStatus()) && ("2".equals(deliveryNo.getLogisticsStatus()) || "1".equals(deliveryNo.getLogisticsStatus()))) {
                    log.info("【processBatchDeliveries】处理送货单: {}, 物流状态: {}", deliveryNo.getDeliveryNo(), deliveryNo.getLogisticsStatus());
                    XkyDetail detail = getDetail(deliveryNo.getDeliveryNo());
                    deliveryNoticeService.saveDeliveryNotice(detail);
                    List<BarcodeDeliveryNo> barcodeDeliveryNos = GetBarcodeInformation(deliveryNo.getDeliveryNo());
                    barcodeInformationService.SaveBarcodeInformation(barcodeDeliveryNos, deliveryNo.getDeliveryNo());
                    //已送达的才自动转换为MES到货单
                    if ("2".equals(deliveryNo.getLogisticsStatus())) {
                        log.info("【processBatchDeliveries】送货单已送达,执行签收: {}", deliveryNo.getDeliveryNo());
                        deliveryNoticeService.callPdaReceiptBtn("送货单签收[BTNOK[PL017[" + deliveryNo.getDeliveryNo(), "");
                    }
                }
                XkyDetail detail = getDetail(deliveryNo.getDeliveryNo());
                deliveryNoticeService.saveDeliveryNotice(detail);
                List<BarcodeDeliveryNo> barcodeDeliveryNos = GetBarcodeInformation(deliveryNo.getDeliveryNo());
                barcodeInformationService.SaveBarcodeInformation(barcodeDeliveryNos, deliveryNo.getDeliveryNo());
            } catch (IOException e) {
                throw new RuntimeException(e);
                log.error("【processBatchDeliveries】处理送货单异常: {}, 异常: {}", deliveryNo.getDeliveryNo(), e.getMessage(), e);
                // 不抛出异常,避免一个送货单的异常导致整个批次失败
            } catch (Exception e) {
                log.error("【processBatchDeliveries】处理送货单未预期异常: {}, 异常: {}", deliveryNo.getDeliveryNo(), e.getMessage(), e);
                // 不抛出异常,避免一个送货单的异常导致整个批次失败
            }
        });
    }
    public void remove1(XkyEntity deliveryNo) {
        //MesQaItemsDetect01与MesInvItemArnDetail的关联关系是
        //MesQaItemsDetect01.lotNo=MesInvItemArnDetail.billNo
        //and MesQaItemsDetect01.item_id=MesInvItemArnDetail.item_id
        //我现在希望不清空DeliveryNotice,DeliveryNoticeDetail,TblBarcodeInformation表的数据了
        //还有MesInvItemArn,MesInvItemArnDetail,MesInvItemBarcodes表的数据
        //只删除MesQaItemsDetect01表的数据
        LambdaQueryWrapper<MesInvItemArn> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(MesInvItemArn::getPaperBillNo, deliveryNo.getDeliveryNo());
        MesInvItemArn mesInvItemArn = mesInvItemArnService.getOne(wrapper, false);
        // 只有当找到对应的MesInvItemArn记录时才删除MesQaItemsDetect01表的数据
        if (mesInvItemArn != null) {
            // 更新MesInvItemArn表,设置syncFlag=1,syncMsg="SRM手动删除送货单"
            LambdaUpdateWrapper<MesInvItemArn> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(MesInvItemArn::getId, mesInvItemArn.getId())
                    .set(MesInvItemArn::getSyncFlag, 1)
                    .set(MesInvItemArn::getStatus, 1)
                    .set(MesInvItemArn::getSyncMsg, "SRM手动删除送货单");
            mesInvItemArnService.update(updateWrapper);
            // 删除MesQaItemsDetect01表的数据
            mesQaItemsDetect01Service.removeQa(mesInvItemArn.getBillNo());
        }
    }
    private XkyDetail getDetail(String deliveryNo) throws IOException {
        XkyCommonParam param = XkyCommonParam.GetInit();
        XkyCommonParam<BodyParam> param = XkyCommonParam.GetInit();
        // 创建 BodyParam 对象并赋值
        BodyParam bodyParam = new BodyParam();
@@ -113,7 +169,7 @@
    }
    private List<BarcodeDeliveryNo> GetBarcodeInformation(String deliveryNo) throws IOException {
        XkyCommonParam param = XkyCommonParam.GetInit();
        XkyCommonParam<BodyParam> param = XkyCommonParam.GetInit();
        // 创建 BodyParam 对象并赋值
        BodyParam bodyParam = new BodyParam();
@@ -128,4 +184,48 @@
        return noList.getDataList();
    }
    private void remove(XkyEntity deliveryNo) {
        LambdaUpdateWrapper<DeliveryNotice> deliveryNoticeWrapper = new LambdaUpdateWrapper<>();
        deliveryNoticeWrapper.eq(DeliveryNotice::getDeliveryNo, deliveryNo.getDeliveryNo());
        DeliveryNotice one = deliveryNoticeService.getOne(deliveryNoticeWrapper, false);
        if (deliveryNoticeService.remove(deliveryNoticeWrapper)) {
            LambdaUpdateWrapper<DeliveryNoticeDetail> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(DeliveryNoticeDetail::getPid, one.getId());
            deliveryNoticeDetailService.remove(updateWrapper);
            LambdaUpdateWrapper<TblBarcodeInformation> updateWrapper1 = new LambdaUpdateWrapper<>();
            updateWrapper1.eq(TblBarcodeInformation::getDeliveryNo, deliveryNo.getDeliveryNo());
            barcodeInformationService.remove(updateWrapper1);
            LambdaQueryWrapper<MesInvItemArn> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(MesInvItemArn::getPaperBillNo, deliveryNo.getDeliveryNo());
            MesInvItemArn mesInvItemArn = mesInvItemArnService.getOne(wrapper, false);
            mesInvItemArnService.remove(wrapper);
            if (mesInvItemArn != null) {
                LambdaUpdateWrapper<MesInvItemArnDetail> updateWrapper2 = new LambdaUpdateWrapper<>();
                updateWrapper2.eq(MesInvItemArnDetail::getMid, mesInvItemArn.getId());
                mesInvItemArnDetailService.remove(updateWrapper2);
                LambdaUpdateWrapper<MesInvItemBarcodes> updateWrapper3 = new LambdaUpdateWrapper<>();
                updateWrapper3.eq(MesInvItemBarcodes::getBillNo, mesInvItemArn.getBillNo());
                mesInvItemBarcodesService.remove(updateWrapper3);
                mesQaItemsDetect01Service.removeQa(mesInvItemArn.getBillNo());
            }
        }
    }
}