package com.vincent.rsf.server.manager.service; import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam; import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog; import java.io.IOException; import java.math.BigDecimal; import java.util.Collection; import java.util.List; import java.util.Map; /** 云仓上报待办 */ public interface CloudWmsNotifyLogService extends IService { List listPending(int limit, int maxRetry); void fillFromConfig(CloudWmsNotifyLog log); /** 上报类型:入出库结果(系统配置优先,缺省 IN_OUT_RESULT) */ String getReportTypeInOutResult(); /** 上报类型:库存调整(系统配置优先,缺省 INVENTORY_ADJUST) */ String getReportTypeInventoryAdjust(); /** 通知状态:待通知(系统配置优先,缺省 0) */ int getNotifyStatusPending(); /** 通知状态:已成功(系统配置优先,缺省 1) */ int getNotifyStatusSuccess(); /** 通知状态:失败(系统配置优先,缺省 2) */ int getNotifyStatusFail(); /** 入出库同单分组键(orderNo+入库/出库+仓),与调度内存合并一致 */ String inOutMergeKeyFromRequestBody(String requestBody); /** 解析请求体为入出库行列表(单行 JSON 或 lines 数组) */ List parseInOutLinesFromRequestBody(String requestBody) throws IOException; /** 发送前占位,避免与合并并发;返回 false 表示已有实例在处理 */ boolean tryClaimSending(Long id); void clearSending(Long id); /** sending=1 且 update_time 超时:补偿清零;启用 Redis 时还要求占位已失 */ void recoverStaleSendingWhenRedisMiss(); /** manual 模式:按单号放行暂缓的入出库待办(send_hold=1→0) */ R manualFlushToNotifyByOrderCode(String orderCode, boolean inbound); /** 出库汇总:以各 task_item 最新一条入出库待办 request_body.qty 为准(无则 map 不含该 id) */ Map mapOutQtyFromInOutNotifyLogByTaskItemIds(Collection taskItemIds); /** 完结上报去重:biz_ref 已含该 taskItemId 的入出库待办任一行存在则不重复插入 */ boolean hasInOutNotifyRowForTaskItem(Long taskItemId, boolean inbound); /** 与完结同结构的单行待办;pending/fail 则更新 request_body */ void saveOrUpdateInOutNotifyEarly(InOutResultReportParam param, Long taskId, Long taskItemId, boolean sendHold, Integer tenantId); }