package com.klp.service; import com.klp.domain.vo.*; import com.klp.domain.bo.WmsMaterialCoilBo; import com.klp.domain.bo.WmsMaterialCoilReportSummaryBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; import com.klp.domain.vo.dashboard.CoilTrimStatisticsVo; import com.klp.domain.vo.dashboard.CategoryWidthStatisticsVo; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Collection; import java.util.List; import java.util.Map; /** * 钢卷物料表Service接口 * * @author Joshi * @date 2025-07-18 */ public interface IWmsMaterialCoilService { /** * 查询钢卷物料表 */ WmsMaterialCoilVo queryById(Long coilId); /** * 查询钢卷物料表列表 */ TableDataInfo queryPageList(WmsMaterialCoilBo bo, PageQuery pageQuery); /** * 查询钢卷物料表列表(包含发货单明细绑定信息) */ TableDataInfo queryPageListWithBindInfo(WmsMaterialCoilBo bo, PageQuery pageQuery); /** * 查询钢卷物料表列表 */ List queryList(WmsMaterialCoilBo bo); /** * 新增钢卷物料表 */ WmsMaterialCoilVo insertByBo(WmsMaterialCoilBo bo); /** * 修改钢卷物料表 * 如果newCoils不为空,则进行批量更新(分卷/合卷) * 如果newCoils为空,则进行单个更新 * @return 单个更新或合卷时返回新钢卷ID,分卷时返回逗号分隔的新钢卷ID字符串 */ String updateByBo(WmsMaterialCoilBo bo); /** * 合卷操作 * 在批量更新逻辑的基础上,为newCoils中的每个被合的卷加入actionId和actionType * 如果传递了actionId,则更新操作记录状态为已完成,并设置完成时间和合卷后的钢卷ID到processedCoilIds * 如果未传actionId,则创建新的操作记录 */ Boolean mergeCoils(WmsMaterialCoilBo bo); /** * 简单更新钢卷物料表 * 直接更新属性内容,不进行历史记录处理 */ Boolean updateSimple(WmsMaterialCoilBo bo); /** * 校验并批量删除钢卷物料表信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); /** * 钢卷溯源查询 * 根据钢卷ID查询二维码,解析content中的steps,然后根据steps中的钢卷号反向查询数据库 * * @param coilId 钢卷ID * @param currentCoilNo 当前钢卷号(可选,用于查询特定子钢卷) * @return 溯源结果(包含二维码信息和数据库记录) */ Map queryTrace(Long coilId, String currentCoilNo); /** * 查询各个库区中不同类型的钢卷分布情况 * 按库区分组,统计每种物品类型和物品ID的钢卷数量和重量 * * @param itemType 物品类型(可选) * @param itemId 物品ID(可选) * @return 分布情况列表,包含库区信息、物品类型、物品ID、数量、重量等 */ List getDistributionByWarehouse(String itemType, Long itemId); /** * 查询不同类型的钢卷在不同库区的分布情况 * 按物品类型和物品ID分组,统计每个库区的钢卷数量和重量 * * @param itemType 物品类型(可选) * @param itemId 物品ID(可选) * @return 分布情况列表,包含物品类型、物品ID、库区信息、数量、重量等 */ List getDistributionByItemType(String itemType, Long itemId); List getDistributionByActualWarehouse(String itemType, Long itemId); List getDistributionByActualItemType(String itemType, Long itemId); /** * 查询钢卷导出数据列表 * * @param bo 查询条件 * @return 导出数据列表 */ List queryExportList(WmsMaterialCoilBo bo); /** * 发货报表导出数据列表(按 coilIds) * * @param bo 查询条件(前端通过 POST 传 coilIds) * @return 发货报表导出数据列表 */ List queryDeliveryExportList(WmsMaterialCoilBo bo); /** * 按“所在库区 + 当前钢卷号”精确查询钢卷质量状态(用于良品/次品口径判定)。 * * 说明: * - 仅匹配 data_type=1 且 del_flag=0 的当前有效数据 * - 若匹配不到,返回 null(调用方按“忽略不计”处理) * * @param warehouseId 所在库区ID(wms_material_coil.warehouse_id) * @param currentCoilNo 当前钢卷号(wms_material_coil.current_coil_no) * @return qualityStatus(如 "C+","C","C-","D+","D","D-"),或 null */ String queryQualityStatusByWarehouseIdAndCurrentCoilNo(Long warehouseId, String currentCoilNo); int exportCoil(@NotEmpty(message = "主键不能为空") Long coilId); Boolean batchUpdateDeliveryStatus(List coilIdList, Integer status); /** * 根据更新前的钢卷ID列表获取更新后的钢卷ID列表 * * @param oldCoilIds 更新前的钢卷ID列表 * @return 更新后的钢卷ID列表 */ Map getUpdatedCoilIdsByOldCoilIds(List oldCoilIds); int withdrawExportCoil(@NotNull(message = "主键不能为空") Long coilId); /** * 检查钢卷号是否重复 * 根据入场钢卷号、当前钢卷号和厂家原料卷号查询数据库,判断哪个钢卷号重复 * * @param coilId 钢卷ID(修改时传入,用于排除自身) * @param enterCoilNo 入场钢卷号 * @param currentCoilNo 当前钢卷号 * @param supplierCoilNo 厂家原料卷号 * @return 返回结果Map,包含: * - duplicateType: "enter" (入场钢卷号重复), "current" (当前钢卷号重复), "supplier" (厂家原料卷号重复), "both" (都重复), "none" (都不重复) * - enterCoilNoDuplicate: 入场钢卷号是否重复 (true/false) * - currentCoilNoDuplicate: 当前钢卷号是否重复 (true/false) * - supplierCoilNoDuplicate: 厂家原料卷号是否重复 (true/false) */ Map checkCoilNoDuplicate(Long coilId, String enterCoilNo, String currentCoilNo, String supplierCoilNo); /** * 根据入场钢卷号前缀查询最大的入场钢卷号 * 前端传入入场钢卷号的前四位,查询所有符合的入场钢卷号,返回最大值 * * @param enterCoilNoPrefix 入场钢卷号前缀(前四位) * @return 返回结果Map,包含: * - maxEnterCoilNo: 最大的入场钢卷号 * - prefix: 前缀值 */ Map getMaxEnterCoilNoByPrefix(String enterCoilNoPrefix); /** * 查询data_type=1时的重复钢卷分组 * 将入场钢卷号重复的分为一组,将当前钢卷号重复的分为一组 * 返回结构: * { * enterGroups: [ { enterCoilNo: "xxx", coils: [WmsMaterialCoilVo...] }, ...], * currentGroups: [ { currentCoilNo: "yyy", coils: [WmsMaterialCoilVo...] }, ...] * } */ Map getDuplicateCoilGroups(); /** * 回滚钢卷操作 * 根据当前钢卷ID找到历史钢卷并恢复,删除当前钢卷 * 用于撤销单个更新、合卷或分卷操作 * * @param currentCoilId 当前钢卷ID(需要回滚的钢卷) * @return 操作结果,包含恢复的历史钢卷信息 */ Map rollbackCoil(@NotNull(message = "当前钢卷ID不能为空") Long currentCoilId); /** * 特殊分卷 - 第一步:锁定钢卷 * 设置钢卷独占状态 * * @param coilId 被分卷的钢卷ID * @return 待操作记录ID */ Boolean startSpecialSplit(@NotNull(message = "钢卷ID不能为空") Long coilId, Integer actionType); /** * 特殊分卷 - 第二步:逐个创建子钢卷 * 生成单个子钢卷并更新二维码信息,不设置母卷为历史数据 * * @param parentCoilId 母卷ID * @param childCoilBo 子钢卷数据 * @param pendingActionId 待操作记录ID * @return 创建的子钢卷信息 */ WmsMaterialCoilVo createChildCoilInSpecialSplit(@NotNull(message = "母卷ID不能为空") Long parentCoilId, @NotNull(message = "子钢卷数据不能为空") WmsMaterialCoilBo childCoilBo, @NotNull(message = "待操作记录ID不能为空") Long pendingActionId); /** * 特殊分卷 - 第三步:完成分卷操作 * 批量更新二维码追溯信息,设置母卷为历史数据,解除独占状态 * * @param pendingActionId 待操作记录ID * @return 操作结果 */ Map completeSpecialSplit(@NotNull(message = "待操作记录ID不能为空") Long pendingActionId); Map cancelSpecialSplit(@NotNull(message = "待操作记录ID不能为空") Long pendingActionId); List getCoilTrimStatistics(); List getCategoryWidthStatistics(); WmsMaterialCoilVo returnCoil(@NotNull(message = "钢卷ID不能为空") Long coilId); /** * 原料钢卷库位分布查询:先返回库位,再返回该库位下钢卷 */ WmsMaterialCoilLocationGridVo queryLocationGrid(Long actualWarehouseId, String itemType, String enterCoilNo, String currentCoilNo, String manufacturer); List queryExportListAll(WmsMaterialCoilBo bo); /** * 报表汇总(待操作条件 + 钢卷条件) */ WmsMaterialCoilReportSummaryVo reportSummary(WmsMaterialCoilReportSummaryBo bo); /** * 查询itemId和itemType不匹配的钢卷 * 检查所有钢卷的itemId是否存在于对应的表中(根据itemType) * 返回所有不匹配的钢卷记录 * * @return 不匹配的钢卷列表 */ List queryMismatchedItemCoils(); }