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.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.erp.params.ReportDataParam; import com.vincent.rsf.server.api.controller.erp.params.ReportParams; import com.vincent.rsf.server.api.service.ReportMsgService; import com.vincent.rsf.server.common.utils.FieldsUtils; 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.StockItemServiceImpl; import com.vincent.rsf.server.manager.service.impl.StockServiceImpl; import com.vincent.rsf.server.system.entity.User; import com.vincent.rsf.server.system.service.UserService; import lombok.extern.slf4j.Slf4j; 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 java.util.*; import java.util.stream.Collectors; /** * @author Ryan * @version 1.0 * @title AsnOrderLogSchedule * @description * @create 2025/3/19 19:07 */ @Slf4j @Component public class AsnOrderLogSchedule { @Autowired private PurchaseService purchaseService; @Autowired private DeliveryService deliveryService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private AsnOrderLogService asnOrderLogService; @Autowired private AsnOrderItemLogService asnOrderItemLogService; @Autowired private TransferOrderService transferOrderService; @Autowired private TransferService transferService; @Autowired private UserService userService; @Autowired private ReportMsgService reportMsgService; @Autowired private StockItemService stockItemService; @Autowired private StockService stockService; /** * @param * @return * @author Ryan * @description 删除已完成订单加入Log表 * @time 2025/3/19 19:09 */ @Scheduled(cron = "0/35 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void InStockToLog() { List wkOrders = asnOrderService.list(new LambdaQueryWrapper() .eq(WkOrder::getType, OrderType.ORDER_IN.type) .isNotNull(WkOrder::getPoCode) .ne(WkOrder::getPoCode, "") .eq(WkOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val)); if (wkOrders.isEmpty()) { return; } try { moveOrderToLog(wkOrders, OrderType.ORDER_IN.type); } catch (Exception e) { throw new CoolException(e.getMessage()); } } /** * @param * @return * @author Ryan * @description 出库单完成后,状态修改 * @time 2025/6/16 08:35 */ @Scheduled(cron = "0/30 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void outStockComplete() { List wkOrders = asnOrderService.list(new LambdaQueryWrapper() .eq(WkOrder::getType, OrderType.ORDER_OUT.type) .isNotNull(WkOrder::getPoCode) .ne(WkOrder::getPoCode, "") .eq(WkOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val)); if (wkOrders.isEmpty()) { return; } try { moveOrderToLog(wkOrders, OrderType.ORDER_OUT.type); } catch (Exception e) { throw new CoolException(e.getMessage()); } } /** * @author Ryan * @date 2025/10/28 * @description: 上传已完成订单至ERP平台 * @version 1.0 */ public void reportOrders(WkOrder order) { ReportParams params = new ReportParams(); List orderItems = asnOrderItemService.list(new LambdaQueryWrapper().eq(WkOrderItem::getOrderId, order.getId())); if (orderItems.isEmpty()) { throw new CoolException("订据明细不存在!!"); } List reportData = new ArrayList<>(); orderItems.forEach(orderItem -> { ReportDataParam param = new ReportDataParam(); User user = userService.getById(order.getUpdateBy()); String nickName = null; if (!Objects.isNull(user)) { nickName = user.getNickname(); } //获取入库库位信息 if (order.getType().equals(OrderType.ORDER_IN.type)) { //筛选当前唯一字段所有出入库信息 List stockItems = stockItemService.list(new LambdaQueryWrapper() .eq(StockItem::getFieldsIndex, orderItem.getFieldsIndex())); //获取库存中订单库位 if (!stockItems.isEmpty()) { Set stockIds = stockItems.stream().map(StockItem::getStockId).collect(Collectors.toSet()); //获取库存库位信息 List stocks = stockService.list(new LambdaQueryWrapper() .in(Stock::getId, stockIds) .eq(Stock::getType, OrderType.ORDER_IN.type) .eq(Stock::getSourceCode, order.getCode())); Set locs = stocks.stream().map(Stock::getLocCode).collect(Collectors.toSet()); String locCode = StringUtils.join(locs.toArray(), ","); param.setZone(locCode); } } //获取索引内容 Map fields = FieldsUtils.getFields(orderItem.getFieldsIndex()); //设置通用参数 param.setWMSNO(order.getCode()) .setPONO(order.getPoCode()) .setOrderNO(order.getPoCode()) .setOrderDate(order.getCreateTime()) .setItemCode(orderItem.getMatnrCode()) .setEditUser(nickName) .setEditDate(order.getUpdateTime()) .setGoodsNO(fields.get("crushNo")) .setMemoDtl(order.getMemo()); if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_DONE_IN.type)) { //采购入库单 params.setOrderType("PO_Instock").setAction("Update"); //获取指定查询字段CrushNo 票号 param.setInQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE_RETURN.type)) { //采购退货 params.setOrderType("PR_Outstock").setAction("Update"); param.setOutQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_PROD.type)) { //生产入库单 // params.setOrderType("WO_Outstock").setAction("Update"); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE.type)) { //生产退料 params.setOrderType("WR_Instock").setAction("Update"); param.setInQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.type)) { //生产领料 params.setOrderType("WO_Outstock").setAction("Update"); param.setOutQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_PROD_ADDITION.type)) { //生产补料 params.setOrderType("WR_Instock_BL").setAction("Update"); param.setOutQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_FIX_OUT.type)) { params.setOrderType("WO_Outstock_WR").setAction("Update"); param.setOutQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type)) { //其它入库单/手动入库单 params.setOrderType("In_Instock").setAction("Update"); param.setInQty(orderItem.getQty()); } else if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_OTHER.type)) { //其它出库单/手动出库单 params.setOrderType("Io_Outstock").setAction("Update"); param.setOutQty(orderItem.getQty()); } reportData.add(param); }); params.setData(reportData); try { R reported = reportMsgService.uploadReportOrders(params); if (reported.get("code").equals("200")) { order.setNtyStatus(OrderReportStatus.ORDER_REPORT_STATUS_ALL.val); asnOrderService.updateById(order); } } catch (Exception e) { log.error("", e); } } /** * @param * @param type * @return * @author Ryan * @description 添加历史单据, 产上报ERP * @time 2025/6/16 08:56 */ @Transactional(rollbackFor = Exception.class) public void moveOrderToLog(List wkOrders, String type) { Set longSet = wkOrders.stream().map(WkOrder::getId).collect(Collectors.toSet()); List orderItems = asnOrderItemService.list(new LambdaQueryWrapper() .in(WkOrderItem::getOrderId, longSet)); if (orderItems.isEmpty()) { throw new CoolException("收货明细为空!!"); } for (WkOrder order : wkOrders) { try { //上报次数限定 if (order.getReportOnce() < 4) { //上报已完成订单至ERP、MES等三方系统 reportOrders(order); order.setReportOnce(order.getReportOnce() + 1); if (!asnOrderService.updateById(order)) { log.error(order.getCode() + ",单据上传次数修改失败!!"); } } } catch (Exception e) { log.error(e.getMessage()); } if (order.getNtyStatus().equals(OrderReportStatus.ORDER_REPORT_STATUS_ALL.val)) { AsnOrderLog one = asnOrderLogService.getOne(new LambdaQueryWrapper().eq(AsnOrderLog::getCode, order.getCode()), false); if (Objects.isNull(one)) { AsnOrderLog orderLog = new AsnOrderLog(); if (type.equals(OrderType.ORDER_OUT.type)) { order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val); order.setQty(order.getWorkQty()); } BeanUtils.copyProperties(order, orderLog); orderLog.setId(null); orderLog.setAsnId(order.getId()); if (!asnOrderLogService.save(orderLog)) { throw new CoolException("主单历史档添加失败!!"); } List logs = new ArrayList<>(); List items = asnOrderItemService.list(new LambdaQueryWrapper() .eq(WkOrderItem::getOrderId, order.getId())); items.forEach(item -> { AsnOrderItemLog itemLog = new AsnOrderItemLog(); BeanUtils.copyProperties(item, itemLog); itemLog.setAsnItemId(itemLog.getId()) .setId(null) .setMatnrId(item.getMatnrId()) .setLogId(orderLog.getId()) .setAsnId(item.getOrderId()); logs.add(itemLog); }); if (!asnOrderItemLogService.saveBatch(logs)) { throw new CoolException("单据明细历史档保存失败!!"); } //更新PO/DO单执行状态 if (type.equals(OrderType.ORDER_IN.type)) { if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)) { order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val); if (!asnOrderService.updateById(order)) { throw new CoolException("单据状态更新失败!!"); } // List orders = transferOrderService.list(new LambdaQueryWrapper().eq(TransferOrder::getTransferId, order.getPoId())); // if (orders.isEmpty()) { // throw new CoolException("数据错误:关联表信息不存在!!"); // } // Set orderIds = orders.stream().map(TransferOrder::getOrderId).collect(Collectors.toSet()); // if (!asnOrderItemService.remove(new LambdaQueryWrapper() // .in(WkOrderItem::getOrderId, orderIds))) { // throw new CoolException("原单据明细删除失败!!"); // } // if (!this.asnOrderService.removeByIds(orderIds)) { // throw new CoolException("原单据删除失败!!"); // } if (!transferService.update(new LambdaUpdateWrapper() .eq(Transfer::getId, order.getPoId()) .set(Transfer::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val))) { throw new CoolException("调拔单状态修改失败!!"); } return; } else { if (!Objects.isNull(order.getPoId())) { purchaseService.update(new LambdaUpdateWrapper() .set(Purchase::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val) .eq(Purchase::getId, order.getPoId())); } } } else { if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)) { order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val); if (!asnOrderService.updateById(order)) { throw new CoolException("单据状态更新失败!!"); } //如果为调拔单据保留 return; } else { if (!Objects.isNull(order.getPoId())) { deliveryService.update(new LambdaUpdateWrapper() .eq(Delivery::getId, order.getPoId()) .set(Delivery::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val)); } } } } if (!asnOrderItemService.remove(new LambdaQueryWrapper() .eq(WkOrderItem::getOrderId, order.getId()))) { throw new CoolException("原单据明细删除失败!!"); } if (!this.asnOrderService.removeById(order.getId())) { throw new CoolException("原单据删除失败!!"); } try { //休眠3秒 Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } } }