cl
7 天以前 1c5108cbd44c7e577e389efa6ec15c5e6922df93
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -10,10 +10,14 @@
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;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
import com.vincent.rsf.server.system.entity.User;
import com.vincent.rsf.server.system.service.ConfigService;
import com.vincent.rsf.server.system.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -23,6 +27,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,6 +62,13 @@
    @Autowired
    private ReportMsgService reportMsgService;
    @Autowired
    private AsnOrderMapper asnOrderMapper;
    @Autowired
    private AsnOrderItemMapper asnOrderItemMapper;
    @Autowired
    private ConfigService configService;
    /**
     * @param
@@ -64,7 +77,7 @@
     * @description 删除已完成订单加入Log表
     * @time 2025/3/19 19:09
     */
    @Scheduled(cron = "0 0 2 1 * ?")
    @Scheduled(cron = "0 */5 * * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void InStockToLog() {
        List<WkOrder> wkOrders = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
@@ -89,7 +102,7 @@
     * @description 出库单完成后,状态修改
     * @time 2025/6/16 08:35
     */
    @Scheduled(cron = "0/15 * * * * ?  ")
    @Scheduled(cron = "0/25 * * * * ?  ")
//    @Scheduled(cron = "0 0 2 1 * ?")
    @Transactional(rollbackFor = Exception.class)
    public void outStockComplete() {
@@ -144,8 +157,9 @@
            }
//            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());
@@ -153,28 +167,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)) {
@@ -200,7 +227,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>()
@@ -215,7 +243,8 @@
                                throw new CoolException("单据状态更新失败!!");
                            }
                            //如果为调拔单据保留
                            return;
                            removeOriginalOrderAndItems(order);
                            continue;
                        } else {
                            if (!Objects.isNull(order.getPoId())) {
                                deliveryService.update(new LambdaUpdateWrapper<Delivery>()
@@ -224,16 +253,50 @@
                            }
                        }
                    }
                }
//                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("原单据删除失败!!");
        }
    }
    /** 逻辑删除超过配置天数({@link GlobalConfigCode#ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS},默认 60)则物理清理原单及明细 */
    @Scheduled(cron = "0 0 0 1 * ?")
    @Transactional(rollbackFor = Exception.class)
    public void physicalDeleteLogicDeletedOrders() {
        int keepDays = resolvePurgeAfterDays();
        LocalDate cutoff = LocalDate.now().minusDays(keepDays);
        Date before = Date.from(cutoff.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("物理删除已逻辑删除超过{}天的原单及明细,订单数:{}", keepDays, ids.size());
    }
    private int resolvePurgeAfterDays() {
        try {
            Integer v = configService.getVal(GlobalConfigCode.ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS, Integer.class);
            if (v != null && v >= 1) {
                return v;
            }
        } catch (Exception ignored) {
        }
        return 30;
    }
}