package com.vincent.rsf.server.manager.schedules; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.config.SysStockProperties; import com.vincent.rsf.server.common.utils.DateUtils; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.service.impl.WarehouseAreasItemServiceImpl; import com.vincent.rsf.server.system.constant.GlobalConfigCode; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.entity.Config; import com.vincent.rsf.server.system.entity.FieldsItem; import com.vincent.rsf.server.system.service.ConfigService; import com.vincent.rsf.server.system.service.FieldsItemService; import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl; 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.Collections; 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; @Autowired private ConfigService configService; @Autowired private WarehouseAreasService warehouseAreasService; @Autowired private WarehouseAreasItemServiceImpl warehouseAreasItemService; @Autowired private CompanysService companysService; @Autowired private TransferService transferService; @Autowired private OutStockService outStockService; @Autowired private FieldsItemService fieldsItemService; // /** // * @author Ryan // * @date 2025/5/9 // * @description: 直接组托开关为true,将收货单直接加入临时库存 // * @version 1.0 // */ // @Scheduled(cron = "0/25 * * * * ?") // @Transactional(rollbackFor = Exception.class) // public synchronized void IgnoreReceipt() { // Config config = configService.getOne(new LambdaQueryWrapper().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN)); // if (Objects.isNull(config)) { // return; // } // if (!Boolean.parseBoolean(config.getVal())) { // return; // } // //自动收货单 // List orders = asnOrderService.list(new LambdaQueryWrapper() // .eq(WkOrder::getType, OrderType.ORDER_IN.type) // .eq(WkOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)); // if (!orders.isEmpty()) { // for (WkOrder order : orders) { // if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)) { // WkOrder one = outStockService.getOne(new LambdaQueryWrapper() // .eq(WkOrder::getPoCode, order.getPoCode()) // .eq(WkOrder::getWkType, OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)); // if (Objects.isNull(one)) { // throw new CoolException("数据错误"); // } // if (!one.getExceStatus().equals(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val)) { // continue; // } // } // // List orderItems = asnOrderItemService.list(new LambdaQueryWrapper().eq(WkOrderItem::getOrderId, order.getId())); // if (orderItems.isEmpty()) { // return; // } // // 收货区已停用:不再写入收货区,仅更新单据状态与数量 //// List receiptAreas = warehouseAreasService.list(new LambdaQueryWrapper() //// .eq(WarehouseAreas::getType, WarehouseAreasType.WAREHOUSE_AREAS_TYPE_RECEIPT.type)); //// WarehouseAreas receiptArea = receiptAreas.isEmpty() ? null : receiptAreas.get(0); //// List items = new ArrayList<>(); // for (WkOrderItem item : orderItems) { //// Long areaId = receiptArea == null ? null : receiptArea.getId(); //// String areaName = receiptArea == null ? null : receiptArea.getName(); //// WarehouseAreasItem param = new WarehouseAreasItem(); //// BeanUtils.copyProperties(item, param); //// param.setAsnCode(order.getCode()).setAsnId(order.getId()); //// if (areaId != null) { //// param.setAreaId(areaId).setAreaName(areaName); //// } //// items.add(param); //// Matnr matnr = matnrService.getOne(new LambdaQueryWrapper().eq(Matnr::getId, item.getMatnrId())); //// if (Objects.isNull(matnr)) { //// throw new CoolException("物料不存在!!"); //// } //// if (receiptArea != null) { //// try { //// updateReceipt(receiptArea, item, order, matnr); //// } catch (Exception e) { //// throw new CoolException(e.getMessage()); //// } //// } // if (!asnOrderItemService.update(new LambdaUpdateWrapper().set(WkOrderItem::getQty, item.getAnfme()).eq(WkOrderItem::getId, item.getId()))) { // throw new CoolException("收货单明细完成数量修改失败!!"); // } // } //// if (!warehouseAreasItemService.saveBatch(items)) { //// throw new CoolException("收货单保存至收货区执行失败!!"); //// } // // if (!asnOrderService.update(new LambdaUpdateWrapper() // .set(WkOrder::getQty, order.getAnfme()) // .set(WkOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val) // .eq(WkOrder::getId, order.getId()))) { // throw new CoolException("收货单状态修改失败!!"); // } // } // } // } /** 收货区已停用,方法整体注释 * @author Ryan * @date 2025/5/12 * @description: 收货区库存更新 */ // @Transactional(rollbackFor = Exception.class) // public void updateReceipt(WarehouseAreas areasItem, WkOrderItem orderItem, WkOrder wkOrder, Matnr matnr) throws Exception { // Companys companys = new Companys(); // if (StringUtils.isNoneBlank(orderItem.getSplrCode())) { // companys = companysService.getOne(new LambdaQueryWrapper().eq(Companys::getCode, orderItem.getSplrCode())); // } // WarehouseAreasItem item = new WarehouseAreasItem(); // item.setTrackCode(orderItem.getBarcode()) // .setAreaName(areasItem.getName()) // .setAreaId(areasItem.getId()) // .setAsnItemId(orderItem.getId()) // .setAsnCode(wkOrder.getCode()) // .setAsnId(wkOrder.getId()) // .setProdTime(orderItem.getProdTime()) // .setPlatItemId(orderItem.getPlatItemId()) // .setPlatOrderCode(orderItem.getPlatOrderCode()) // .setPlatWorkCode(orderItem.getPlatWorkCode()) // .setProjectCode(orderItem.getProjectCode()) // .setSplrId(companys.getId()) // .setUnit(orderItem.getStockUnit()) // .setStockUnit(orderItem.getStockUnit()) // .setMatnrCode(matnr.getCode()) // .setAnfme(orderItem.getAnfme()) // .setMatnrId(matnr.getId()) // .setIsptResult(orderItem.getIsptResult()) // .setMaktx(matnr.getName()) // .setSplrBatch(orderItem.getSplrBatch()) // .setWeight(matnr.getWeight()) // .setFieldsIndex(orderItem.getFieldsIndex()) // .setShipperId(matnr.getShipperId()); // List warehousList = StringUtils.isNotBlank(orderItem.getFieldsIndex()) // ? warehouseAreasItemService.list(new LambdaQueryWrapper().eq(WarehouseAreasItem::getFieldsIndex, orderItem.getFieldsIndex())) // : Collections.emptyList(); // WarehouseAreasItem warehousItem = warehousList.isEmpty() ? null : warehousList.get(0); // if (!Objects.isNull(warehousItem)) { // List fieldsList = fieldsItemService.list(new LambdaQueryWrapper() // .eq(FieldsItem::getUuid, orderItem.getFieldsIndex()).last("LIMIT 1")); // FieldsItem fieldsItem = fieldsList.isEmpty() ? null : fieldsList.get(0); // if (!Objects.isNull(fieldsItem)) { // throw new CoolException("票号:" + fieldsItem.getValue() + "已在收货区,不可推送相当票号数据。请联系管理员!!" ); // } // } // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() // .eq(WarehouseAreasItem::getMatnrCode, orderItem.getMatnrCode()) // .eq(!Cools.isEmpty(orderItem.getFieldsIndex()), WarehouseAreasItem::getFieldsIndex, orderItem.getFieldsIndex()) // .eq(WarehouseAreasItem::getAsnCode, orderItem.getOrderCode()) // .eq(StringUtils.isNotBlank(orderItem.getSplrBatch()), WarehouseAreasItem::getSplrBatch, orderItem.getSplrBatch()); // if (Objects.isNull(orderItem.getIsptResult())) { // queryWrapper.isNull(WarehouseAreasItem::getIsptResult); // } else { // queryWrapper.eq(WarehouseAreasItem::getIsptResult, orderItem.getIsptResult()); // } // List serviceList = warehouseAreasItemService.list(queryWrapper); // WarehouseAreasItem serviceOne = serviceList.isEmpty() ? null : serviceList.get(0); // if (!Objects.isNull(serviceOne)) { // item.setId(serviceOne.getId()); // item.setAnfme(orderItem.getAnfme()); // } // if (!warehouseAreasItemService.saveOrUpdate(item)) { // throw new CoolException("收货失败!!"); // } // } /** * @return * @throws * @author Ryan * @description 根据PO单据生成ASN单, 自动生成ASN单为全量生成 * @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 purchases = purchaseService.list(new LambdaQueryWrapper().eq(Purchase::getExceStatus, 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单是否正确录入!!"); } WkOrder order = new WkOrder(); //根据编码规则生成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 -> { WkOrderItem orderItem = new WkOrderItem(); Matnr matnr = matnrService.getOne(new LambdaQueryWrapper().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()) .setOrderId(order.getId()) .setQty(item.getQty()) .setSplrName(item.getSplrName()) .setOrderCode(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()) .setExceStatus(POExceStatus.PO_EXCE_STATUS_EXCE_ING.val); if (!purchaseService.saveOrUpdate(purchase)) { throw new CoolException("PO单执行完成后,保存失败!!"); } }); } /** * @param * @return * @author Ryan * @description 生成物料标签 * @time 2025/3/29 12:35 */ @Scheduled(cron = "0 0/05 * * * ? ") @Transactional(rollbackFor = Exception.class) public void generateMatnrLabel() { List list = asnOrderItemService.list(new LambdaQueryWrapper() .isNull(WkOrderItem::getTrackCode) .select(WkOrderItem::getId)); if (Objects.isNull(list) || list.isEmpty()) { return; } List 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); item.setBarcode(trackCode); items.add(item); }); if (!asnOrderItemService.updateBatchById(items)) { throw new CoolException("生成编码失败!!"); } } }