chen.lin
2 天以前 9140aee230de0ef41de9682a9353fbd372e2bcaa
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -10,6 +10,8 @@
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.mapper.AsnOrderItemMapper;
import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
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;
@@ -23,6 +25,8 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@@ -56,8 +60,10 @@
    @Autowired
    private ReportMsgService reportMsgService;
    @Autowired
    private AsnOrderMapper asnOrderMapper;
    @Autowired
    private AsnOrderItemMapper asnOrderItemMapper;
    /**
     * @param
@@ -66,7 +72,7 @@
     * @description 删除已完成订单加入Log表
     * @time 2025/3/19 19:09
     */
    @Scheduled(cron = "0/35 * * * * ?  ")
    @Scheduled(cron = "0 0 5 * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void InStockToLog() {
        List<WkOrder> wkOrders = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
@@ -91,7 +97,8 @@
     * @description 出库单完成后,状态修改
     * @time 2025/6/16 08:35
     */
    @Scheduled(cron = "0/30 * * * * ?  ")
    @Scheduled(cron = "0/25 * * * * ?  ")
//    @Scheduled(cron = "0 0 2 1 * ?")
    @Transactional(rollbackFor = Exception.class)
    public void outStockComplete() {
        List<WkOrder> wkOrders = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
@@ -108,8 +115,6 @@
            throw new CoolException(e.getMessage());
        }
    }
    /**
@@ -145,10 +150,11 @@
                    log.error(e.getMessage());
                }
            }
            if (order.getNtyStatus().equals(OrderReportStatus.ORDER_REPORT_STATUS_ALL.val)) {
//            if (order.getType().equals(OrderType.ORDER_OUT.type) &&  order.getReportOnce() >= 4) {
                AsnOrderLog one = asnOrderLogService.getOne(new LambdaQueryWrapper<AsnOrderLog>().eq(AsnOrderLog::getCode, order.getCode()), false);
                AsnOrderLog orderLog;
                if (Objects.isNull(one)) {
                    AsnOrderLog orderLog = new AsnOrderLog();
                    orderLog = new AsnOrderLog();
                    if (type.equals(OrderType.ORDER_OUT.type)) {
                        order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
                        order.setQty(order.getWorkQty());
@@ -156,28 +162,41 @@
                    BeanUtils.copyProperties(order, orderLog);
                    orderLog.setId(null);
                    orderLog.setAsnId(order.getId());
                    if (!asnOrderLogService.save(orderLog)) {
                        throw new CoolException("主单历史档添加失败!!");
                    }
                    List<AsnOrderItemLog> logs = new ArrayList<>();
                    List<WkOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                            .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("单据明细历史档保存失败!!");
                } else {
                    if (type.equals(OrderType.ORDER_OUT.type)) {
                        order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
                        order.setQty(order.getWorkQty());
                    }
                    long existingLogId = one.getId();
                    BeanUtils.copyProperties(order, one);
                    one.setId(existingLogId);
                    one.setAsnId(order.getId());
                    if (!asnOrderLogService.updateById(one)) {
                        throw new CoolException("主单历史档更新失败!!");
                    }
                    orderLog = one;
                    asnOrderItemLogService.remove(new LambdaQueryWrapper<AsnOrderItemLog>().eq(AsnOrderItemLog::getLogId, existingLogId));
                }
                List<AsnOrderItemLog> logs = new ArrayList<>();
                List<WkOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                        .eq(WkOrderItem::getOrderId, order.getId()));
                items.forEach(item -> {
                    AsnOrderItemLog itemLog = new AsnOrderItemLog();
                    BeanUtils.copyProperties(item, itemLog);
                    itemLog.setAsnItemId(item.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)) {
@@ -190,7 +209,7 @@
//                        if (orders.isEmpty()) {
//                            throw new CoolException("数据错误:关联表信息不存在!!");
//                        }
//                        Set<Long> orderIds = orders.stream().map(TransferOrder::getOrderId).collect(Collectors.toSet());
//                        Set<Long> orderIds = orders.stream().map(TransferOrder::getOrd erId).collect(Collectors.toSet());
//                        if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
//                                .in(WkOrderItem::getOrderId, orderIds))) {
//                            throw new CoolException("原单据明细删除失败!!");
@@ -203,7 +222,8 @@
                                    .set(Transfer::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val))) {
                                throw new CoolException("调拔单状态修改失败!!");
                            }
                            return;
                            removeOriginalOrderAndItems(order);
                            continue;
                        } else {
                            if (!Objects.isNull(order.getPoId())) {
                                purchaseService.update(new LambdaUpdateWrapper<Purchase>()
@@ -218,7 +238,8 @@
                                throw new CoolException("单据状态更新失败!!");
                            }
                            //如果为调拔单据保留
                            return;
                            removeOriginalOrderAndItems(order);
                            continue;
                        } else {
                            if (!Objects.isNull(order.getPoId())) {
                                deliveryService.update(new LambdaUpdateWrapper<Delivery>()
@@ -227,16 +248,38 @@
                            }
                        }
                    }
                }
                if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
                        .eq(WkOrderItem::getOrderId, order.getId()))) {
                    throw new CoolException("原单据明细删除失败!!");
                }
                if (!this.asnOrderService.removeById(order.getId())) {
                    throw new CoolException("原单据删除失败!!");
                }
            }
                    // 转入历史后删除原单及明细
                    removeOriginalOrderAndItems(order);
        }
    }
    /** 删除原入库/出库通知单及明细(转入历史后调用) */
    private void removeOriginalOrderAndItems(WkOrder order) {
        if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()))) {
            throw new CoolException("原单据明细删除失败!!");
        }
        if (!asnOrderService.removeById(order.getId())) {
            throw new CoolException("原单据删除失败!!");
        }
    }
    /** 每月1号凌晨执行:物理删除上上个月之前已被逻辑删除的入库/出库通知单及明细 */
    @Scheduled(cron = "0 0 0 1 * ?")
    @Transactional(rollbackFor = Exception.class)
    public void physicalDeleteLogicDeletedOrders() {
        LocalDate startOfTwoMonthsAgo = LocalDate.now().minusMonths(2).withDayOfMonth(1);
        Date before = Date.from(startOfTwoMonthsAgo.atStartOfDay(ZoneId.systemDefault()).toInstant());
        List<Long> ids = asnOrderMapper.selectLogicDeletedOrderIdsBefore(before);
        if (ids == null || ids.isEmpty()) {
            return;
        }
        final int batchSize = 500;
        for (int i = 0; i < ids.size(); i += batchSize) {
            int to = Math.min(i + batchSize, ids.size());
            List<Long> batch = ids.subList(i, to);
            asnOrderItemMapper.physicalDeleteByOrderIds(batch);
            asnOrderMapper.physicalDeleteByIds(batch);
        }
        log.info("物理删除上上个月之前已逻辑删除的原单及明细,订单数:{}", ids.size());
    }
}