| package com.vincent.rsf.server.manager.schedules; | 
|   | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.vincent.rsf.framework.exception.CoolException; | 
| import com.vincent.rsf.server.common.config.SysStockProperties; | 
| import com.vincent.rsf.server.common.utils.CommonUtil; | 
| import com.vincent.rsf.server.common.utils.DateUtils; | 
| import com.vincent.rsf.server.manager.entity.*; | 
| import com.vincent.rsf.server.manager.enums.PakinIOStatus; | 
| import com.vincent.rsf.server.manager.service.*; | 
| import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
| import com.vincent.rsf.server.system.utils.SerialRuleUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.BeanUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.scheduling.annotation.Scheduled; | 
| import org.springframework.stereotype.Component; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import javax.annotation.Resource; | 
| import java.util.ArrayList; | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.Objects; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * @author Ryan | 
|  * @version 1.0 | 
|  * @title ScheduleJobs | 
|  * @description | 
|  * @create 2025/3/3 15:38 | 
|  */ | 
| @Component | 
| public class ScheduleJobs { | 
|   | 
|     @Autowired | 
|     private PurchaseService purchaseService; | 
|     @Autowired | 
|     private PurchaseItemService purchaseItemService; | 
|   | 
|     @Autowired | 
|     private AsnOrderService asnOrderService; | 
|   | 
|     @Autowired | 
|     private MatnrService matnrService; | 
|   | 
|     @Autowired | 
|     private AsnOrderItemService asnOrderItemService; | 
|   | 
|     @Resource | 
|     private SysStockProperties flowProperties; | 
|     @Autowired | 
|     private WaitPakinService waitPakinService; | 
|     @Autowired | 
|     private WaitPakinItemService waitPakinItemService; | 
|     @Autowired | 
|     private WaitPakinLogService waitPakinLogService; | 
|     @Autowired | 
|     private WaitPakinItemLogService waitPakinItemLogService; | 
|   | 
|   | 
|     /** | 
|      * @author Ryan | 
|      * @description  根据PO单据生成ASN单,自动生成ASN单为全量生成 | 
|      * @throws | 
|      * @return | 
|      * @time 2025/3/3 15:44 | 
|      */ | 
|     @Scheduled(cron = "0 0/05 * * * ?  ") | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public synchronized void genAsnOrder() { | 
|         //判断是否开启自动生成ASN单据 | 
|         if (!flowProperties.getFlagAutoAsn()) { | 
|             return; | 
|         } | 
|         //获取未生成ASN单据 | 
|         List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getStatus, 0)); | 
|         //PO单为空,直接跳出当前任务 | 
|         if (purchases.isEmpty()) { | 
|             return; | 
|         } | 
|         //生成ASN单据 | 
|         purchases.forEach(purchase -> { | 
|             if (!Objects.isNull(purchase.getStartTime())) { | 
|                 //判断起始时间是否大于当前时间 | 
|                 if (DateUtils.compareDate(new Date(), purchase.getStartTime())) { | 
|                     return; | 
|                 } | 
|             } | 
|             List<PurchaseItem> items = purchaseItemService.list(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getPurchaseId, purchase.getId())); | 
|             if (items.isEmpty()) { | 
|                 throw new CoolException("子列表数据为空,请查询PO单是否正确录入!!"); | 
|             } | 
|             AsnOrder order = new AsnOrder(); | 
|             //根据编码规则生成ASN单号 | 
|             String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, purchase); | 
|             order.setAnfme(purchase.getAnfme()) | 
|                     .setCode(code) | 
|                     .setArrTime(purchase.getPreArr()) | 
|                     .setQty(purchase.getQty()) | 
|                     .setPoId(purchase.getId()) | 
|                     .setPoCode(purchase.getCode()); | 
|             if (!asnOrderService.save(order)) { | 
|                 throw new CoolException("ASN单据保存失败!!"); | 
|             } | 
|             List<AsnOrderItem> orderItems = new ArrayList<>(); | 
|             items.forEach(item -> { | 
|                 AsnOrderItem orderItem = new AsnOrderItem(); | 
|                 Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode())); | 
|                 if (Objects.isNull(matnr)) { | 
|                     throw new CoolException("数据错误:当前物料不存在!!"); | 
|                 } | 
|                 String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item); | 
|                 if (StringUtils.isBlank(trackCode)) { | 
|                     throw new CoolException("单据跟踪码生成失败:请检查「sys_asn_mantr_label」是否配置完成!!"); | 
|                 } | 
| //                String barcode = code + matnr.getCode(); | 
|                 orderItem.setAnfme(item.getAnfme()) | 
|                         .setAsnId(order.getId()) | 
|                         .setQty(item.getQty()) | 
|                         .setSplrName(item.getSplrName()) | 
|                         .setAsnCode(code) | 
|                         .setSplrCode(item.getSplrCode()) | 
|                         .setPoDetlId(item.getId()) | 
|                         .setPlatItemId(item.getPlatItemId()) | 
|                         .setTrackCode(trackCode) | 
|                         .setPoCode(purchase.getCode()) | 
|                         .setPurQty(item.getAnfme()) | 
|                         .setPurUnit(item.getUnit()) | 
|                         .setMatnrCode(matnr.getCode()) | 
|                         .setMaktx(matnr.getName()) | 
|                         .setMatnrId(matnr.getId()); | 
|                 orderItems.add(orderItem); | 
|             }); | 
|             if (!asnOrderItemService.saveBatch(orderItems)) { | 
|                 throw new CoolException(("Asn单据明细保存失败!!")); | 
|             } | 
|   | 
|             //任务执行完成,修改已完成数量和PO单执行状态 | 
|             purchase.setQty(purchase.getAnfme()).setStatus(1); | 
|   | 
|             if (!purchaseService.saveOrUpdate(purchase)) { | 
|                 throw new CoolException("PO单执行完成后,保存失败!!"); | 
|             } | 
|         }); | 
|     } | 
|   | 
|     /** | 
|      * @author Ryan | 
|      * @description 生成物料标签 | 
|      * @param | 
|      * @return | 
|      * @time 2025/3/29 12:35 | 
|      */ | 
|     @Scheduled(cron = "0 0/05 * * * ?  ") | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void generateMatnrLabel() { | 
|         List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() | 
|                         .isNull(AsnOrderItem::getTrackCode) | 
|                 .select(AsnOrderItem::getId)); | 
|         if (Objects.isNull(list) || list.isEmpty()) { | 
|             return; | 
|         } | 
|         List<AsnOrderItem> items = new ArrayList<>(); | 
|         list.forEach(item -> { | 
|             String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item); | 
|             if (StringUtils.isBlank(trackCode)) { | 
|                 throw new CoolException("单据跟踪码生成失败:请检查「sys_asn_mantr_label」是否配置完成!!"); | 
|             } | 
|             item.setTrackCode(trackCode); | 
|             items.add(item); | 
|         }); | 
|   | 
|         if (!asnOrderItemService.updateBatchById(items)) { | 
|             throw new CoolException("生成编码失败!!"); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * @author Ryan | 
|      * @description 组拖历史档 | 
|      * @param | 
|      * @return | 
|      * @time 2025/3/29 12:36 | 
|      */ | 
|     @Scheduled(cron = "0/25 * * * * ?") | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void pakinLog() { | 
|         List<WaitPakin>  pakinIds = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>() | 
|                 .eq(WaitPakin::getIoStatus, Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_TASK_DONE.val)) | 
|                 .select(WaitPakin::getId)); | 
|         if (pakinIds.isEmpty()) { | 
|             return; | 
|         } | 
|         List<Long> list = pakinIds.stream().map(WaitPakin::getId).collect(Collectors.toList()); | 
|         List<WaitPakin> pakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().in(WaitPakin::getId, list)); | 
|         if (pakins.isEmpty()) { | 
|             throw new CoolException("组拖单为空!!"); | 
|         } | 
|         List<WaitPakinLog> pakinLogs = new ArrayList<>(); | 
|         pakins.forEach(pakin ->{ | 
|             WaitPakinLog log = new WaitPakinLog(); | 
|             BeanUtils.copyProperties(pakin, log); | 
|             log.setPakinId(pakin.getId()).setIoStatus(Short.parseShort("2")); | 
|             pakinLogs.add(log); | 
|         }); | 
|         if (!waitPakinLogService.saveBatch(pakinLogs)) { | 
|             throw new CoolException("历史档保存失败!!"); | 
|         } | 
|         List<WaitPakinItemLog> itemLogs = new ArrayList<>(); | 
|         List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().in(WaitPakinItem::getPakinId, list)); | 
|         if (pakinItems.isEmpty()) { | 
|             throw new CoolException("组拖明细为空!!"); | 
|         } | 
|         pakinItems.forEach(item -> { | 
|             WaitPakinItemLog itemLog = new WaitPakinItemLog(); | 
|             BeanUtils.copyProperties(item, itemLog); | 
|             itemLog.setPakinItemId(item.getId()) | 
|                     .setPakinId(item.getPakinId()); | 
|             itemLogs.add(itemLog); | 
|         }); | 
|   | 
|         if (!waitPakinItemLogService.saveBatch(itemLogs)) { | 
|             throw new CoolException("历史明细档保存失败!!"); | 
|         } | 
|         if (!waitPakinService.removeByIds(list)) { | 
|             throw new CoolException("原单据删除失败!!"); | 
|         } | 
|         if (!waitPakinItemService.remove(new LambdaQueryWrapper<WaitPakinItem>().in(WaitPakinItem::getPakinId, list))) { | 
|             throw new CoolException("原单据明细删除失败!!"); | 
|         } | 
|     } | 
|   | 
| } |