| | |
| | | import com.gs.xky.dto.XkyDetail; |
| | | import com.gs.xky.entity.DeliveryNotice; |
| | | import com.gs.xky.entity.DeliveryNoticeDetail; |
| | | import com.gs.xky.entity.MesInvItemArn; |
| | | import com.gs.xky.mapper.DeliveryNoticeMapper; |
| | | import com.gs.xky.service.DeliveryNoticeDetailService; |
| | | import com.gs.xky.service.DeliveryNoticeService; |
| | | import com.gs.xky.service.MesInvItemArnService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | |
| | | public class DeliveryNoticeServiceImpl extends ServiceImpl<DeliveryNoticeMapper, DeliveryNotice> |
| | | implements DeliveryNoticeService { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(DeliveryNoticeServiceImpl.class); |
| | | private final DeliveryNoticeDetailService detailService; |
| | | |
| | | private final MesInvItemArnService invItemArnService; |
| | | |
| | | @Override |
| | | public boolean saveDeliveryNotice(XkyDetail xkyDetail) { |
| | |
| | | public void callPdaReceiptBtn(String inStr, String result) { |
| | | baseMapper.callPdaReceiptBtn(inStr, result); |
| | | } |
| | | } |
| | | |
| | | @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 = ""; |
| | | |
| | | // 调用存储过程 |
| | | baseMapper.callPrcMesInvItemArnStatus22(factory, company, userCode, id, poResult, poText); |
| | | |
| | | // 返回结果 |
| | | return poResult; |
| | | } |
| | | |
| | | // |
| | | |
| | | |
| | | @Override |
| | | public void processMesInvItemArnStatusAsync(List<MesInvItemArn> itemArnMinus) { |
| | | if (itemArnMinus == null || itemArnMinus.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | // 记录开始处理的日志 |
| | | log.info("【processMesInvItemArnStatusAsync】开始处理{}条数据", itemArnMinus.size()); |
| | | |
| | | // 分批处理,每批最多处理20条数据 |
| | | int batchSize = 20; |
| | | int totalSize = itemArnMinus.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); |
| | | List<MesInvItemArn> batchItems = itemArnMinus.subList(fromIndex, toIndex); |
| | | |
| | | log.info("【processMesInvItemArnStatusAsync】处理第{}批数据,范围:{}-{}", i + 1, fromIndex, toIndex); |
| | | |
| | | // 异步处理每批数据 |
| | | processAsyncBatch(batchItems); |
| | | } |
| | | |
| | | log.info("【processMesInvItemArnStatusAsync】全部数据处理提交完成"); |
| | | } |
| | | |
| | | /** |
| | | * 异步处理一批MesInvItemArn数据 |
| | | * |
| | | * @param batchItems 当前批次的数据 |
| | | */ |
| | | @Async("taskExecutor") |
| | | public void processAsyncBatch(List<MesInvItemArn> batchItems) { |
| | | log.info("【processAsyncBatch】异步处理{}条数据开始", batchItems.size()); |
| | | processBatch(batchItems); |
| | | 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数据 |
| | | * |
| | | * @param batchItems 当前批次的数据 |
| | | */ |
| | | private void processBatch(List<MesInvItemArn> batchItems) { |
| | | // 遍历每个 itemArn |
| | | batchItems.forEach(itemArn -> { |
| | | try { |
| | | // 处理每个 itemArn |
| | | Integer result = processMesInvItemArnStatus("1000", "1000", "PL017", itemArn.getId()); |
| | | log.info("【processBatch】处理itemArn: {}, 结果: {}", itemArn.getId(), result); |
| | | } catch (Exception e) { |
| | | // 处理异常,记录详细日志 |
| | | log.error("【processBatch】处理itemArn: {} 异常: {}", itemArn.getId(), e.getMessage(), e); |
| | | } |
| | | }); |
| | | } |
| | | } |