1. 新增囤积统计接口:计算已发货钢卷的平均囤积周期和平均囤积成本 - 囤积周期 = 发货时间 - 二维码第一步创建时间 - 囤积成本 = 囤积天数 × 钢卷净重 × 1元/吨/天 - 支持与分页列表相同的查询条件筛选 2. 新增二维码详情查询接口:在分页查询基础上填充完整的二维码记录信息 - 前端可通过 qrcodeRecord.content 获取二维码JSON内容 - 采用批量查询避免N+1性能问题 调整前,钢卷查询无法获取二维码详细内容,也无法统计囤积相关指标;调整后,支持二维码内容查看和囤积成本分析,为仓储成本核算提供数据支持。
413 lines
17 KiB
Java
413 lines
17 KiB
Java
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.servlet.http.HttpServletResponse;
|
||
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<WmsMaterialCoilVo> queryPageList(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||
|
||
/**
|
||
* 查询钢卷物料表列表(包含发货单明细绑定信息)
|
||
*/
|
||
TableDataInfo<WmsMaterialCoilBindVo> queryPageListWithBindInfo(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||
|
||
/**
|
||
* 查询钢卷物料表列表(包含订单关联信息)
|
||
* 前端传 includeOrderRel=true 时返回每个钢卷关联的订单列表
|
||
*/
|
||
TableDataInfo<WmsMaterialCoilVo> queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||
|
||
/**
|
||
* 查询钢卷物料表列表(包含改判记录信息)
|
||
* 每个钢卷会携带其关联的改判记录列表(通过wms_coil_quality_rejudge表)
|
||
*/
|
||
TableDataInfo<WmsMaterialCoilRejudgeVo> queryPageListWithRejudge(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||
|
||
/**
|
||
* 查询钢卷物料表列表
|
||
*/
|
||
List<WmsMaterialCoilVo> queryList(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 按入场卷号批量查询(供规程同步分页列表使用,IN 查询避免 N 次单查)
|
||
*/
|
||
List<WmsMaterialCoilVo> queryByEnterCoilNos(List<String> enterCoilNos);
|
||
|
||
/**
|
||
* 规程同步专用:DB 层分页查询(避免全表加载),支持 material LIKE 过滤和 syncStatus 过滤。
|
||
* specIds 不为空时追加 mc.spec_id IN (...) 条件。
|
||
*/
|
||
List<WmsMaterialCoilVo> queryPageForSpecSync(WmsMaterialCoilBo bo, int pageNum, int pageSize,
|
||
String syncStatus, String material, java.util.Set<Long> specIds);
|
||
|
||
/**
|
||
* 规程同步专用:一次 SQL 返回 total/synced/unsynced 三个计数。
|
||
*/
|
||
Map<String, Object> countForSpecSync(WmsMaterialCoilBo bo, String material, java.util.Set<Long> specIds);
|
||
|
||
/**
|
||
* 规程同步专用:以 processed_coil_ids 展开后的 coilId 集合为主,分页查 L3 钢卷(含 item join)。
|
||
*/
|
||
List<WmsMaterialCoilVo> queryByProcessedCoilIds(java.util.Collection<Long> coilIds,
|
||
String enterCoilNo, String currentCoilNo, String material, String qualityStatus,
|
||
String syncStatus, java.util.Set<Long> filterSpecIds, int offset, int pageSize);
|
||
|
||
/**
|
||
* 规程同步专用:以 processed_coil_ids 展开后的 coilId 集合为主,计算满足 L3 过滤条件的总数。
|
||
*/
|
||
long countByProcessedCoilIds(java.util.Collection<Long> coilIds,
|
||
String enterCoilNo, String currentCoilNo, String material, String qualityStatus,
|
||
String syncStatus, java.util.Set<Long> filterSpecIds);
|
||
|
||
/**
|
||
* 规程同步专用:不区分 syncStatus,一次查询返回 total/synced/unsynced/movedOn 整体汇总(用于统计条)。
|
||
*/
|
||
java.util.Map<String, Long> getOverallSyncStats(java.util.Collection<Long> coilIds,
|
||
String enterCoilNo, String currentCoilNo, String material, String qualityStatus,
|
||
java.util.Set<Long> filterSpecIds);
|
||
|
||
/**
|
||
* 统计筛选条件下的全量汇总数据(高性能:只查sum/count)
|
||
* 独立的统计接口,不影响分页查询
|
||
*/
|
||
Map<String, java.math.BigDecimal> getStatistics(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 新增钢卷物料表
|
||
*/
|
||
WmsMaterialCoilVo insertByBo(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 修改钢卷物料表
|
||
* 如果newCoils不为空,则进行批量更新(分卷/合卷)
|
||
* 如果newCoils为空,则进行单个更新
|
||
* @return 单个更新或合卷时返回新钢卷ID,分卷时返回逗号分隔的新钢卷ID字符串
|
||
*/
|
||
String updateByBo(WmsMaterialCoilBo bo, String qrcodeStepType);
|
||
|
||
/**
|
||
* 合卷操作
|
||
* 在批量更新逻辑的基础上,为newCoils中的每个被合的卷加入actionId和actionType
|
||
* 如果传递了actionId,则更新操作记录状态为已完成,并设置完成时间和合卷后的钢卷ID到processedCoilIds
|
||
* 如果未传actionId,则创建新的操作记录
|
||
*/
|
||
Long mergeCoils(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 简单更新钢卷物料表
|
||
* 直接更新属性内容,不进行历史记录处理
|
||
*/
|
||
Boolean updateSimple(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 校验并批量删除钢卷物料表信息
|
||
*/
|
||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||
|
||
/**
|
||
* 钢卷溯源查询
|
||
* 根据钢卷ID查询二维码,解析content中的steps,然后根据steps中的钢卷号反向查询数据库
|
||
*
|
||
* @param coilId 钢卷ID
|
||
* @param currentCoilNo 当前钢卷号(可选,用于查询特定子钢卷)
|
||
* @return 溯源结果(包含二维码信息、按存储顺序排列的 steps、traceLayout 并排展示结构、数据库记录)
|
||
*/
|
||
Map<String, Object> queryTrace(Long coilId, String currentCoilNo);
|
||
|
||
/**
|
||
* 查询各个库区中不同类型的钢卷分布情况
|
||
* 按库区分组,统计每种物品类型和物品ID的钢卷数量和重量
|
||
*
|
||
* @param itemType 物品类型(可选)
|
||
* @param itemId 物品ID(可选)
|
||
* @return 分布情况列表,包含库区信息、物品类型、物品ID、数量、重量等
|
||
*/
|
||
List<WmsMaterialCoilVo> getDistributionByWarehouse(String itemType, Long itemId);
|
||
|
||
/**
|
||
* 查询不同类型的钢卷在不同库区的分布情况
|
||
* 按物品类型和物品ID分组,统计每个库区的钢卷数量和重量
|
||
*
|
||
* @param itemType 物品类型(可选)
|
||
* @param itemId 物品ID(可选)
|
||
* @return 分布情况列表,包含物品类型、物品ID、库区信息、数量、重量等
|
||
*/
|
||
List<WmsMaterialCoilVo> getDistributionByItemType(String itemType, Long itemId);
|
||
|
||
List<WmsMaterialCoilVo> getDistributionByActualWarehouse(String itemType, Long itemId);
|
||
|
||
List<WmsMaterialCoilVo> getDistributionByActualItemType(String itemType, Long itemId);
|
||
|
||
/**
|
||
* 查询钢卷导出数据列表
|
||
*
|
||
* @param bo 查询条件
|
||
* @return 导出数据列表
|
||
*/
|
||
List<com.klp.domain.vo.WmsMaterialCoilExportVo> queryExportList(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 发货报表导出数据列表(按 coilIds)
|
||
*
|
||
* @param bo 查询条件(前端通过 POST 传 coilIds)
|
||
* @return 发货报表导出数据列表
|
||
*/
|
||
List<WmsMaterialCoilDeliveryExportVo> 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<Long> coilIdList, Integer status);
|
||
|
||
/**
|
||
* 根据更新前的钢卷ID列表获取更新后的钢卷ID列表
|
||
*
|
||
* @param oldCoilIds 更新前的钢卷ID列表
|
||
* @return 更新后的钢卷ID列表
|
||
*/
|
||
Map<Long, String> getUpdatedCoilIdsByOldCoilIds(List<Long> 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<String, Object> checkCoilNoDuplicate(Long coilId, String enterCoilNo, String currentCoilNo, String supplierCoilNo);
|
||
|
||
/**
|
||
* 根据入场钢卷号前缀查询最大的入场钢卷号
|
||
* 前端传入入场钢卷号的前四位,查询所有符合的入场钢卷号,返回最大值
|
||
*
|
||
* @param enterCoilNoPrefix 入场钢卷号前缀(前四位)
|
||
* @return 返回结果Map,包含:
|
||
* - maxEnterCoilNo: 最大的入场钢卷号
|
||
* - prefix: 前缀值
|
||
*/
|
||
Map<String, Object> getMaxEnterCoilNoByPrefix(String enterCoilNoPrefix);
|
||
|
||
/**
|
||
* 查询data_type=1时的重复钢卷分组
|
||
* 将入场钢卷号重复的分为一组,将当前钢卷号重复的分为一组
|
||
* 返回结构:
|
||
* {
|
||
* enterGroups: [ { enterCoilNo: "xxx", coils: [WmsMaterialCoilVo...] }, ...],
|
||
* currentGroups: [ { currentCoilNo: "yyy", coils: [WmsMaterialCoilVo...] }, ...]
|
||
* }
|
||
*/
|
||
Map<String, Object> getDuplicateCoilGroups();
|
||
|
||
/**
|
||
* 回滚钢卷操作
|
||
* 根据当前钢卷ID找到历史钢卷并恢复,删除当前钢卷
|
||
* 用于撤销单个更新、合卷或分卷操作
|
||
*
|
||
* @param currentCoilId 当前钢卷ID(需要回滚的钢卷)
|
||
* @return 操作结果,包含恢复的历史钢卷信息
|
||
*/
|
||
Map<String, Object> 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<String, Object> completeSpecialSplit(@NotNull(message = "待操作记录ID不能为空") Long pendingActionId);
|
||
|
||
Map<String, Object> cancelSpecialSplit(@NotNull(message = "待操作记录ID不能为空") Long pendingActionId);
|
||
|
||
List<CoilTrimStatisticsVo> getCoilTrimStatistics();
|
||
|
||
List<CategoryWidthStatisticsVo> getCategoryWidthStatistics();
|
||
|
||
WmsMaterialCoilVo returnCoil(@NotNull(message = "钢卷ID不能为空") Long coilId);
|
||
|
||
/**
|
||
* 原料钢卷库位分布查询:先返回库位,再返回该库位下钢卷
|
||
*/
|
||
WmsMaterialCoilLocationGridVo queryLocationGrid(Long actualWarehouseId,
|
||
String itemType,
|
||
String enterCoilNo,
|
||
String currentCoilNo,
|
||
String manufacturer);
|
||
|
||
List<WmsMaterialCoilAllExportVo> queryExportListAll(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 查询itemId和itemType不匹配的钢卷
|
||
* 检查所有钢卷的itemId是否存在于对应的表中(根据itemType)
|
||
* 返回所有不匹配的钢卷记录
|
||
*
|
||
* @return 不匹配的钢卷列表
|
||
*/
|
||
List<WmsMaterialCoilVo> queryMismatchedItemCoils();
|
||
|
||
/**
|
||
* 查询材质异常的钢卷(packing_status与wms_product.material或wms_raw_material.material不匹配)
|
||
* 通过itemType确定关联的表,对比packing_status和关联表的material字段
|
||
*
|
||
* @param pageQuery 分页参数
|
||
* @return 材质异常的钢卷列表(分页)
|
||
*/
|
||
TableDataInfo<WmsMaterialCoilVo> queryMaterialMismatchCoils(PageQuery pageQuery);
|
||
|
||
/**
|
||
* 修复材质异常的钢卷
|
||
* 1. 根据coilId查询钢卷的入场钢卷号(enterCoilNo)
|
||
* 2. 查询该入场钢卷号下的所有钢卷作为一组
|
||
* 3. 找到packing_status为该入场钢卷号且itemName LIKE '%热轧卷板%'的itemId
|
||
* 4. 用该itemId对应的material更新整组的packing_status
|
||
*
|
||
* @param coilId 钢卷ID
|
||
* @return 修复结果
|
||
*/
|
||
Boolean fixMaterialMismatchCoils(Long coilId);
|
||
|
||
/**
|
||
* 根据入场钢卷号查询最早的热轧卷板材质
|
||
* 用于前端传入某个入场钢卷号,查询该组钢卷中是否有热轧卷板
|
||
* 如果有,返回最早创建的热轧卷板的材质信息
|
||
*
|
||
* @param enterCoilNo 入场钢卷号
|
||
* @return 材质信息,如果没有热轧卷板则返回null
|
||
*/
|
||
String queryEarliestHotRolledMaterial(String enterCoilNo);
|
||
|
||
/**
|
||
* 查询钢卷报表数据(轻量级,仅返回必要字段)
|
||
* 使用与分页列表相同的查询条件,但只返回少量字段以提升传输性能
|
||
*
|
||
* @param bo 查询条件
|
||
* @return 报表数据
|
||
*/
|
||
List<WmsMaterialCoilReportVo> queryReportList(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 退火报表导出数据列表(按 coilIds)
|
||
*
|
||
* @param bo 查询条件(前端通过 POST 传 coilIds)
|
||
* @return 退火报表导出数据列表
|
||
*/
|
||
List<WmsMaterialCoilAnnealExportVo> queryAnnealExportList(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 解除钢卷锁定状态
|
||
* 将钢卷的 exclusiveStatus 字段设置为 0
|
||
*
|
||
* @param coilId 钢卷ID
|
||
* @return 操作结果
|
||
*/
|
||
Boolean unlockCoil(@NotNull(message = "钢卷ID不能为空") Long coilId);
|
||
|
||
/**
|
||
* 导出异常报表(按 coilIds,联查钢卷信息、异常信息、改判原因)
|
||
* 一个钢卷可能对应多个异常,钢卷信息合并居中,异常信息逐条显示
|
||
* 改判原因放在钢卷信息和异常信息之间
|
||
*
|
||
* @param bo 查询条件(前端通过 POST 传 coilIds)
|
||
* @param response HTTP响应对象
|
||
*/
|
||
void exportAbnormalReport(WmsMaterialCoilBo bo, HttpServletResponse response);
|
||
|
||
/**
|
||
* 根据入场钢卷号或当前钢卷号查询钢卷,供双机架计划绑定使用
|
||
*/
|
||
com.klp.domain.vo.WmsMaterialCoilVo queryByCoilNo(String coilNo);
|
||
|
||
/**
|
||
* 统计已发货钢卷的平均囤积周期和平均囤积成本
|
||
* 使用与分页列表相同的查询条件,按发货时间筛选已发货钢卷
|
||
* 囤积周期 = 发货时间 - 二维码中第一个步骤的创建时间
|
||
* 囤积成本 = 囤积天数 * 净重(吨) * 1元/吨/天
|
||
*
|
||
* @param bo 查询条件
|
||
* @return avgHoardingDays(平均囤积天数), avgHoardingCost(平均囤积成本), totalCount(已发货钢卷数量)
|
||
*/
|
||
Map<String, Object> getHoardingStatistics(WmsMaterialCoilBo bo);
|
||
|
||
/**
|
||
* 查询钢卷物料表列表(包含二维码记录信息)
|
||
* 与queryPageList查询条件完全一致,区别是会填充qrcodeRecord字段(WmsGenerateRecordVo)
|
||
* 前端可通过qrcodeRecord.content获取二维码的JSON内容
|
||
*
|
||
* @param bo 查询条件
|
||
* @param pageQuery 分页参数
|
||
*/
|
||
TableDataInfo<WmsMaterialCoilVo> queryPageListWithQrcode(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||
}
|
||
|