| rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| version/db/sys_config_asn_order_purge_after_days.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| version/db/sys_dict_asn_exce_status_2_pending_inbound.sql | ●●●●● 补丁 | 查看 | 原始文档 | 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);