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.service.*; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; 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; /** * @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; /** * @author Ryan * @description 根据PO单据生成ASN单,自动生成ASN单为全量生成 * @throws * @return * @time 2025/3/3 15:44 */ @Scheduled(cron = "0 0/05 * * * ? ") // @Scheduled(cron = "0/5 * * * * ?") @Transactional(rollbackFor = Exception.class) public void genAsnOrder() { //判断是否开启自动生成ASN单据 if (!flowProperties.getFlagAutoAsn()) { return; } //获取未生成ASN单据 List purchases = purchaseService.list(new LambdaQueryWrapper().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 items = purchaseItemService.list(new LambdaQueryWrapper().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 orderItems = new ArrayList<>(); items.forEach(item -> { AsnOrderItem orderItem = new AsnOrderItem(); Matnr matnr = matnrService.getOne(new LambdaQueryWrapper().eq(Matnr::getCode, item.getMatnrCode())); if (Objects.isNull(matnr)) { throw new CoolException("数据错误:当前物料不存在!!"); } //TODO barcode生成策略 String barcode = code + matnr.getCode(); orderItem.setAnfme(item.getAnfme()) .setAsnId(order.getId()) .setQty(item.getQty()) .setSplrName(item.getSplrName()) .setAsnCode(code) .setSplrCode(item.getSplrCode()) .setMatnk(item.getMatnrName()) .setPoDetlId(item.getId()) .setBarcode(barcode) .setPoCode(purchase.getCode()) .setPurQty(item.getAnfme()) .setPurUnit(item.getUnit()) .setMatnk(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单执行完成后,保存失败!!"); } }); } }