cl
7 天以前 66d2950e1a594bcb50c34875d6a87a3ab367056a
库位编号规则和和CTU保持一致
2个文件已添加
4个文件已修改
68 ■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/db/sys_config_asn_order_purge_after_days.sql 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/db/sys_dict_asn_exce_status_2_pending_inbound.sql 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -775,6 +775,9 @@
            return taskItem.setTaskId(taskId)
                    .setOrderType(OrderType.ORDER_IN.type)
                    .setSource(item.getId())
                    .setPlatItemId(item.getPlatItemId())
                    .setPlatOrderCode(item.getPlatOrderCode())
                    .setPlatWorkCode(item.getPlatWorkCode())
                    .setTrackCode(item.getTrackCode())
                    .setCreateBy(loginUserId)
                    .setUpdateBy(loginUserId)
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -15,7 +15,9 @@
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;
@@ -64,6 +66,9 @@
    private AsnOrderMapper asnOrderMapper;
    @Autowired
    private AsnOrderItemMapper asnOrderItemMapper;
    @Autowired
    private ConfigService configService;
    /**
     * @param
@@ -253,7 +258,7 @@
        }
    }
    /** 删除原入库/出库通知单及明细(转入历史后调用) */
    /** 转入历史后对原单及明细逻辑删除 */
    private void removeOriginalOrderAndItems(WkOrder order) {
        if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()))) {
            throw new CoolException("原单据明细删除失败!!");
@@ -263,12 +268,13 @@
        }
    }
    /** 每月1号凌晨执行:物理删除上上个月之前已被逻辑删除的入库/出库通知单及明细 */
    /** 逻辑删除超过配置天数({@link GlobalConfigCode#ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS},默认 60)则物理清理原单及明细 */
    @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());
        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;
@@ -280,6 +286,17 @@
            asnOrderItemMapper.physicalDeleteByOrderIds(batch);
            asnOrderMapper.physicalDeleteByIds(batch);
        }
        log.info("物理删除上上个月之前已逻辑删除的原单及明细,订单数:{}", ids.size());
        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;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -2880,8 +2880,9 @@
                    }
                }
            }
            // 入/出库均仅云仓来源单据参与上报(明细需带 platOrderCode 或 platWorkCode)
            boolean hasCloudSource = taskItems.stream().anyMatch(this::hasCloudOrderRef);
            // 入库组托场景允许按 WaitPakinItem.asnCode 兜底识别云仓来源,避免 plat* 为空时误跳过
            boolean hasCloudSource = taskItems.stream().anyMatch(this::hasCloudOrderRef)
                    || (isInbound && !sourceToOrderNo.isEmpty());
            if (!hasCloudSource) {
                log.info("入/出库结果上报待办跳过:无云仓来源单据,taskId={}", task.getId());
                return;
@@ -2889,7 +2890,14 @@
            ObjectMapper om = new ObjectMapper();
            Date now = new Date();
            for (TaskItem item : taskItems) {
                if (!hasCloudOrderRef(item)) {
                if (item == null) {
                    continue;
                }
                boolean hasTaskItemCloudRef = hasCloudOrderRef(item);
                boolean hasInboundAsnFallbackRef = isInbound
                        && item.getSource() != null
                        && StringUtils.isNotBlank(sourceToOrderNo.get(item.getSource()));
                if (!hasTaskItemCloudRef && !hasInboundAsnFallbackRef) {
                    continue;
                }
                String orderNo = isInbound ? sourceToOrderNo.get(item.getSource()) : (item.getPlatOrderCode() != null ? item.getPlatOrderCode() : item.getPlatWorkCode());
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java
@@ -66,4 +66,9 @@
     */
    public final static String CUS_ITEM_SYNC_MODE = "CUS_ITEM_SYNC_MODE";
    /**
     * 入库/出库通知单逻辑删除后,满多少天可由定时任务物理清理(sys_config.type=2 数字,默认脚本 30)
     */
    public final static String ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS = "ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS";
}
version/db/sys_config_asn_order_purge_after_days.sql
New file
@@ -0,0 +1,12 @@
-- 逻辑删除后的原单(man_asn_order)超过若干天再物理删除;与 AsnOrderLogSchedule.physicalDeleteLogicDeletedOrders 一致
INSERT INTO `sys_config` (`uuid`, `name`, `flag`, `type`, `val`, `content`, `status`, `deleted`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `memo`)
SELECT UPPER(UUID()), '通知单逻辑删除后物理清理天数', 'ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS', 2, '30',
       '逻辑删除满该天数后可被定时任务物理清理', 1, 0, 1, NULL, NOW(), NULL, NOW(),
       '单位:天;type=2 数字'
WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `flag` = 'ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS' AND (`deleted` = 0 OR `deleted` IS NULL));
-- 已存在该配置时,将天数改为 30
UPDATE `sys_config`
SET `val` = '30', `update_time` = NOW()
WHERE `flag` = 'ASN_ORDER_LOGIC_DELETED_PURGE_AFTER_DAYS'
  AND (`deleted` = 0 OR `deleted` IS NULL);
version/db/sys_dict_asn_exce_status_2_pending_inbound.sql
New file
@@ -0,0 +1,7 @@
-- 入库通知单等界面展示:exceStatus=2 显示为「待入库」(库内仍为 2,与 AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE 一致)
UPDATE `sys_dict_data`
SET `label` = '待入库',
    `update_time` = NOW()
WHERE `dict_type_code` = 'sys_asn_exce_status'
  AND `value` = '2'
  AND (`deleted` = 0 OR `deleted` IS NULL);