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; import com.gs.xky.config.DataAcquisitionConfiguration; import com.gs.xky.config.XkyCommonParam; import com.gs.xky.dto.BarcodeDeliveryNo; import com.gs.xky.dto.XkyDetail; import com.gs.xky.dto.XkyEntity; 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; import java.io.IOException; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @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(); BodyParam bodyParam = new BodyParam(); bodyParam.setStartDate(startDate); bodyParam.setEndDate(currentTimeMillis); bodyParam.setErpCode(DataAcquisitionConfiguration.TEST_ERP_CODE); bodyParam.setStatus(new int[]{1, 6}); param.setBody(bodyParam); // 记录请求参数日志 log.info("【GetSaveDetail 请求参数】时间: {}, 参数: {}", currentTimeMillis, JSONUtil.toJsonStr(param)); ApiResponse noList = apiService.sendListRequest(param, XkyEntity.class, "https://openapi.xiekeyun.com/delivery/getNoList.json"); // 记录返回数据日志 log.info("【GetSaveDetail 响应数据】时间: {}, 返回: {}", currentTimeMillis, JSONUtil.toJsonStr(noList)); List deliveryNoList = noList.getDataList(); if (CollUtil.isEmpty(deliveryNoList)) { log.info("【GetSaveDetail】返回列表为空,跳过处理"); return; } log.info("【GetSaveDetail】获取到{}条送货单数据", deliveryNoList.size()); // 分批处理数据,减少内存占用 int batchSize = 10; // 每批处理10条数据 int totalSize = deliveryNoList.size(); int batchCount = (totalSize + batchSize - 1) / batchSize; // 向上取整计算批次数 for (int i = 0; i < batchCount; i++) { int fromIndex = i * batchSize; int toIndex = Math.min((i + 1) * batchSize, totalSize); log.info("【GetSaveDetail】处理第{}批送货单数据,范围:{}-{}", i + 1, fromIndex, toIndex); // 获取当前批次的数据 List batchDeliveries = deliveryNoList.subList(fromIndex, toIndex); // 处理当前批次的数据 processBatchDeliveries(batchDeliveries); } log.info("【GetSaveDetail】所有送货单处理完成"); } /** * 批量处理送货单数据 * * @param batchDeliveries 当前批次的送货单数据 */ private void processBatchDeliveries(List batchDeliveries) { batchDeliveries.forEach(deliveryNo -> { try { 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 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(), ""); } } } catch (IOException 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 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 updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(MesInvItemArn::getId, mesInvItemArn.getId()) .set(MesInvItemArn::getSyncFlag, 1) .set(MesInvItemArn::getStatus, 1) .set(MesInvItemArn::getSyncMsg, "SRM手动删除送货单"); mesInvItemArnService.update(updateWrapper); //MesInvItemArnDetail LambdaUpdateWrapper deleteWrapper = new LambdaUpdateWrapper<>(); deleteWrapper.eq(MesInvItemArnDetail::getMid, mesInvItemArn.getId()) .set(MesInvItemArnDetail::getReturnFlag, 1); mesInvItemArnDetailService.update(deleteWrapper); // 删除MesQaItemsDetect01表的数据 mesQaItemsDetect01Service.removeQa(mesInvItemArn.getBillNo()); } } private XkyDetail getDetail(String deliveryNo) throws IOException { XkyCommonParam param = XkyCommonParam.GetInit(); // 创建 BodyParam 对象并赋值 BodyParam bodyParam = new BodyParam(); bodyParam.setErpCode(DataAcquisitionConfiguration.TEST_ERP_CODE); bodyParam.setDeliveryNo(deliveryNo); param.setBody(bodyParam); ApiResponse noList = apiService.sendListRequest(param, XkyDetail.class, "https://openapi.xiekeyun.com/delivery/getDetail.json"); return noList.getData(); } private List GetBarcodeInformation(String deliveryNo) throws IOException { XkyCommonParam param = XkyCommonParam.GetInit(); // 创建 BodyParam 对象并赋值 BodyParam bodyParam = new BodyParam(); bodyParam.setErpCode(DataAcquisitionConfiguration.TEST_ERP_CODE); bodyParam.setDeliveryNo(deliveryNo); param.setBody(bodyParam); ApiResponse noList = apiService.sendListRequest(param, BarcodeDeliveryNo.class, "https://openapi.xiekeyun.com/barcode/byDeliveryNo.json"); return noList.getDataList(); } private void remove(XkyEntity deliveryNo) { LambdaUpdateWrapper deliveryNoticeWrapper = new LambdaUpdateWrapper<>(); deliveryNoticeWrapper.eq(DeliveryNotice::getDeliveryNo, deliveryNo.getDeliveryNo()); DeliveryNotice one = deliveryNoticeService.getOne(deliveryNoticeWrapper, false); if (deliveryNoticeService.remove(deliveryNoticeWrapper)) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(DeliveryNoticeDetail::getPid, one.getId()); deliveryNoticeDetailService.remove(updateWrapper); LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); updateWrapper1.eq(TblBarcodeInformation::getDeliveryNo, deliveryNo.getDeliveryNo()); barcodeInformationService.remove(updateWrapper1); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(MesInvItemArn::getPaperBillNo, deliveryNo.getDeliveryNo()); MesInvItemArn mesInvItemArn = mesInvItemArnService.getOne(wrapper, false); mesInvItemArnService.remove(wrapper); if (mesInvItemArn != null) { LambdaUpdateWrapper updateWrapper2 = new LambdaUpdateWrapper<>(); updateWrapper2.eq(MesInvItemArnDetail::getMid, mesInvItemArn.getId()); mesInvItemArnDetailService.remove(updateWrapper2); LambdaUpdateWrapper updateWrapper3 = new LambdaUpdateWrapper<>(); updateWrapper3.eq(MesInvItemBarcodes::getBillNo, mesInvItemArn.getBillNo()); mesInvItemBarcodesService.remove(updateWrapper3); mesQaItemsDetect01Service.removeQa(mesInvItemArn.getBillNo()); } } } }