将coilId的存储模式改成string
This commit is contained in:
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.helper.LoginHelper;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -17,6 +18,10 @@ import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.domain.vo.WmsGenerateRecordVo;
|
||||
import com.klp.domain.vo.WmsWarehouseVo;
|
||||
import com.klp.domain.vo.WmsRawMaterialVo;
|
||||
import com.klp.domain.vo.WmsProductBomVo;
|
||||
import com.klp.domain.vo.WmsBomItemVo;
|
||||
import com.klp.domain.bo.WmsProductBomBo;
|
||||
import com.klp.domain.bo.WmsBomItemBo;
|
||||
import com.klp.domain.WmsMaterialCoil;
|
||||
import com.klp.domain.WmsStock;
|
||||
import com.klp.domain.bo.WmsStockBo;
|
||||
@@ -28,6 +33,8 @@ import com.klp.service.IWmsStockService;
|
||||
import com.klp.service.IWmsGenerateRecordService;
|
||||
import com.klp.service.IWmsWarehouseService;
|
||||
import com.klp.service.IWmsRawMaterialService;
|
||||
import com.klp.service.IWmsProductBomService;
|
||||
import com.klp.service.IWmsBomItemService;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import java.util.List;
|
||||
@@ -55,6 +62,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
private final IWmsGenerateRecordService generateRecordService;
|
||||
private final IWmsWarehouseService warehouseService;
|
||||
private final IWmsRawMaterialService rawMaterialService;
|
||||
private final IWmsProductBomService productBomService;
|
||||
private final IWmsBomItemService bomItemService;
|
||||
|
||||
/**
|
||||
* 查询钢卷物料表
|
||||
@@ -66,12 +75,28 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果查询到的是历史数据,尝试查找对应的当前数据
|
||||
if (vo.getDataType() != null && vo.getDataType() == 0) {
|
||||
// 根据入场钢卷号查找当前数据
|
||||
LambdaQueryWrapper<WmsMaterialCoil> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(WmsMaterialCoil::getEnterCoilNo, vo.getEnterCoilNo())
|
||||
.eq(WmsMaterialCoil::getDataType, 1) // 查找当前数据
|
||||
.orderByDesc(WmsMaterialCoil::getCreateTime); // 按创建时间倒序,获取最新的
|
||||
|
||||
List<WmsMaterialCoilVo> currentDataList = baseMapper.selectVoList(lqw);
|
||||
if (!currentDataList.isEmpty()) {
|
||||
// 如果找到当前数据,返回最新的当前数据
|
||||
vo = currentDataList.get(0);
|
||||
}
|
||||
// 如果没有找到当前数据,仍然返回历史数据供查看
|
||||
}
|
||||
|
||||
// 查询关联对象
|
||||
fillRelatedObjects(vo);
|
||||
|
||||
|
||||
return vo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 填充关联对象信息
|
||||
*/
|
||||
@@ -81,25 +106,33 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
WmsWarehouseVo warehouse = warehouseService.queryById(vo.getWarehouseId());
|
||||
vo.setWarehouse(warehouse);
|
||||
}
|
||||
|
||||
|
||||
// 查询下一库区信息
|
||||
if (vo.getNextWarehouseId() != null) {
|
||||
WmsWarehouseVo nextWarehouse = warehouseService.queryById(vo.getNextWarehouseId());
|
||||
vo.setNextWarehouse(nextWarehouse);
|
||||
}
|
||||
|
||||
|
||||
// 查询二维码信息
|
||||
if (vo.getQrcodeRecordId() != null) {
|
||||
WmsGenerateRecordVo qrcodeRecord = generateRecordService.queryById(vo.getQrcodeRecordId());
|
||||
vo.setQrcodeRecord(qrcodeRecord);
|
||||
}
|
||||
|
||||
|
||||
// 查询原材料信息(当itemType为raw_material时)
|
||||
if ("raw_material".equals(vo.getItemType()) && vo.getItemId() != null) {
|
||||
WmsRawMaterialVo rawMaterial = rawMaterialService.queryById(vo.getItemId());
|
||||
vo.setRawMaterial(rawMaterial);
|
||||
|
||||
// 查询原材料对应的BOM信息(通过bomId查询BomItem列表)
|
||||
if (rawMaterial != null && rawMaterial.getBomId() != null) {
|
||||
WmsBomItemBo bomItemBo = new WmsBomItemBo();
|
||||
bomItemBo.setBomId(rawMaterial.getBomId());
|
||||
List<WmsBomItemVo> bomItemList = bomItemService.queryList(bomItemBo);
|
||||
vo.setBomItemList(bomItemList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 查询产品信息(当itemType为product时)
|
||||
// TODO: 当产品VO定义后,添加产品查询逻辑
|
||||
if ("product".equals(vo.getItemType()) && vo.getItemId() != null) {
|
||||
@@ -147,13 +180,13 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
// 1. 生成二维码
|
||||
Long qrcodeRecordId = generateQrcodeForInsert(bo);
|
||||
bo.setQrcodeRecordId(qrcodeRecordId);
|
||||
|
||||
|
||||
// 2. 如果warehouseId为空,查找或创建stock
|
||||
if (bo.getWarehouseId() == null) {
|
||||
Long warehouseId = findOrCreateStock(bo);
|
||||
bo.setWarehouseId(warehouseId);
|
||||
}
|
||||
|
||||
|
||||
// 3. 插入钢卷数据
|
||||
WmsMaterialCoil add = BeanUtil.toBean(bo, WmsMaterialCoil.class);
|
||||
add.setDataType(1); // 新增的钢卷默认为当前数据
|
||||
@@ -166,7 +199,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 生成二维码(新增)
|
||||
*/
|
||||
@@ -174,18 +207,18 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
try {
|
||||
Map<String, Object> contentMap = new HashMap<>();
|
||||
String currentCoilNo = bo.getCurrentCoilNo() != null ? bo.getCurrentCoilNo() : bo.getEnterCoilNo();
|
||||
|
||||
|
||||
contentMap.put("enter_coil_no", bo.getEnterCoilNo()); // 入场钢卷号(唯一不变)
|
||||
contentMap.put("current_coil_no", currentCoilNo); // 当前钢卷号(可变)
|
||||
contentMap.put("coil_id", "null"); // 钢卷ID(新增时暂时为null,插入后更新)
|
||||
|
||||
|
||||
// 创建steps数组
|
||||
List<Map<String, Object>> steps = new ArrayList<>();
|
||||
Map<String, Object> step1 = new HashMap<>();
|
||||
step1.put("step", 1);
|
||||
step1.put("action", "新增");
|
||||
step1.put("current_coil_no", currentCoilNo);
|
||||
|
||||
|
||||
// 判断是合卷还是分卷
|
||||
if (bo.getHasMergeSplit() != null && bo.getHasMergeSplit() == 2) {
|
||||
// 合卷:父编号字符串用逗号分隔
|
||||
@@ -199,27 +232,27 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
// 默认:当前钢卷号
|
||||
step1.put("operation", "新增");
|
||||
}
|
||||
|
||||
|
||||
steps.add(step1);
|
||||
contentMap.put("steps", steps);
|
||||
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String contentJson = objectMapper.writeValueAsString(contentMap);
|
||||
|
||||
|
||||
WmsGenerateRecordBo recordBo = new WmsGenerateRecordBo();
|
||||
recordBo.setContent(contentJson);
|
||||
recordBo.setSerialNumber(bo.getEnterCoilNo()); // 使用入场钢卷号作为编号
|
||||
recordBo.setQrcodeType(0L);
|
||||
recordBo.setIsEnabled(0L);
|
||||
recordBo.setSize(200L);
|
||||
|
||||
|
||||
WmsGenerateRecordVo record = generateRecordService.insertByBo(recordBo);
|
||||
return record.getRecordId();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("生成二维码失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查找或创建stock
|
||||
*/
|
||||
@@ -227,13 +260,13 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
if (bo.getItemType() == null || bo.getItemId() == null) {
|
||||
throw new RuntimeException("物品类型和物品ID不能为空");
|
||||
}
|
||||
|
||||
|
||||
// 查询是否存在相同的stock
|
||||
WmsStockBo stockBo = new WmsStockBo();
|
||||
stockBo.setItemType(bo.getItemType());
|
||||
stockBo.setItemId(bo.getItemId());
|
||||
List<WmsStockVo> stockList = stockService.queryList(stockBo);
|
||||
|
||||
|
||||
if (!stockList.isEmpty()) {
|
||||
// 如果找到相同的stock,返回第一个的warehouseId
|
||||
return stockList.get(0).getWarehouseId();
|
||||
@@ -279,20 +312,20 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
if (bo.getCoilId() == null) {
|
||||
throw new RuntimeException("钢卷ID不能为空");
|
||||
}
|
||||
|
||||
|
||||
// 查询原钢卷是否存在
|
||||
WmsMaterialCoil oldCoil = baseMapper.selectById(bo.getCoilId());
|
||||
if (oldCoil == null) {
|
||||
throw new RuntimeException("钢卷不存在");
|
||||
}
|
||||
|
||||
|
||||
// 直接更新钢卷属性
|
||||
WmsMaterialCoil updateCoil = BeanUtil.toBean(bo, WmsMaterialCoil.class);
|
||||
validEntityBeforeSave(updateCoil);
|
||||
|
||||
|
||||
// 使用MyBatis-Plus的updateById方法直接更新
|
||||
boolean flag = baseMapper.updateById(updateCoil) > 0;
|
||||
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
||||
@@ -305,21 +338,36 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
if (oldCoil == null) {
|
||||
throw new RuntimeException("原钢卷不存在");
|
||||
}
|
||||
|
||||
|
||||
// 1. 更新二维码,添加操作记录
|
||||
updateQrcodeContent(oldCoil.getQrcodeRecordId(), bo);
|
||||
|
||||
|
||||
// 2. 将原数据更新为历史数据(data_type=0)
|
||||
LambdaUpdateWrapper<WmsMaterialCoil> updateWrapper = new LambdaUpdateWrapper<>();
|
||||
updateWrapper.eq(WmsMaterialCoil::getCoilId, bo.getCoilId())
|
||||
.set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据
|
||||
baseMapper.update(null, updateWrapper);
|
||||
|
||||
|
||||
// 3. 插入一条新的当前数据(data_type=1)
|
||||
WmsMaterialCoil newCoil = BeanUtil.toBean(bo, WmsMaterialCoil.class);
|
||||
newCoil.setCoilId(null); // 清空ID,让数据库自动生成新的ID
|
||||
newCoil.setDataType(1); // 设置为当前数据
|
||||
newCoil.setQrcodeRecordId(oldCoil.getQrcodeRecordId()); // 继承二维码ID
|
||||
|
||||
// 确保关键字段不丢失
|
||||
if (newCoil.getEnterCoilNo() == null) {
|
||||
newCoil.setEnterCoilNo(oldCoil.getEnterCoilNo());
|
||||
}
|
||||
if (newCoil.getSupplierCoilNo() == null) {
|
||||
newCoil.setSupplierCoilNo(oldCoil.getSupplierCoilNo()); // 保留厂家原料卷号
|
||||
}
|
||||
if (newCoil.getItemType() == null) {
|
||||
newCoil.setItemType(oldCoil.getItemType());
|
||||
}
|
||||
if (newCoil.getItemId() == null) {
|
||||
newCoil.setItemId(oldCoil.getItemId());
|
||||
}
|
||||
|
||||
validEntityBeforeSave(newCoil);
|
||||
boolean flag = baseMapper.insert(newCoil) > 0;
|
||||
if (flag) {
|
||||
@@ -340,11 +388,11 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
throw new RuntimeException("原钢卷不存在");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 判断是分卷还是合卷
|
||||
boolean isSplit = false;
|
||||
boolean isMerge = false;
|
||||
|
||||
|
||||
// 检查bo本身是否为合卷
|
||||
if (bo.getHasMergeSplit() != null && bo.getHasMergeSplit() == 2) {
|
||||
isMerge = true;
|
||||
@@ -357,7 +405,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 1. 将原数据更新为历史数据(data_type=0)
|
||||
// 注意:合卷时bo的coilId可能为空,因为bo是合卷后的新钢卷
|
||||
if (bo.getCoilId() != null) {
|
||||
@@ -366,42 +414,51 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
.set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据
|
||||
baseMapper.update(null, updateWrapper);
|
||||
}
|
||||
|
||||
|
||||
// 2. 插入多条新的当前数据(data_type=1)
|
||||
List<WmsMaterialCoil> newCoils = new ArrayList<>();
|
||||
List<String> allNewCoilNos = new ArrayList<>();
|
||||
|
||||
|
||||
// 收集所有新钢卷号
|
||||
for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) {
|
||||
allNewCoilNos.add(newCoilBo.getCurrentCoilNo());
|
||||
}
|
||||
|
||||
|
||||
if (isSplit) {
|
||||
// 分卷:将bo作为被分卷的原始对象,newCoils中的对象作为分卷后产生的新钢卷
|
||||
if (oldCoil == null) {
|
||||
throw new RuntimeException("分卷操作需要原钢卷信息");
|
||||
}
|
||||
|
||||
|
||||
// 1. 将原始钢卷更新为历史数据(已在上面完成)
|
||||
|
||||
// 2. 为每个分卷后的子钢卷生成独立的二维码并插入数据库
|
||||
for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) {
|
||||
WmsMaterialCoil newCoil = BeanUtil.toBean(newCoilBo, WmsMaterialCoil.class);
|
||||
newCoil.setCoilId(null);
|
||||
newCoil.setDataType(1);
|
||||
newCoil.setEnterCoilNo(oldCoil.getEnterCoilNo());
|
||||
|
||||
// 为每个子钢卷生成独立二维码
|
||||
Long newQrcodeId = generateQrcodeForSplit(oldCoil, newCoilBo, allNewCoilNos);
|
||||
newCoil.setQrcodeRecordId(newQrcodeId);
|
||||
|
||||
validEntityBeforeSave(newCoil);
|
||||
baseMapper.insert(newCoil);
|
||||
newCoils.add(newCoil);
|
||||
|
||||
// 更新二维码内容中的coilId
|
||||
updateQrcodeCoilId(newQrcodeId, newCoil.getCoilId());
|
||||
}
|
||||
|
||||
// 2. 为每个分卷后的子钢卷生成独立的二维码并插入数据库
|
||||
for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) {
|
||||
WmsMaterialCoil newCoil = BeanUtil.toBean(newCoilBo, WmsMaterialCoil.class);
|
||||
newCoil.setCoilId(null);
|
||||
newCoil.setDataType(1);
|
||||
// 继承原钢卷的基本信息
|
||||
newCoil.setEnterCoilNo(oldCoil.getEnterCoilNo());
|
||||
newCoil.setSupplierCoilNo(oldCoil.getSupplierCoilNo()); // 保留厂家原料卷号
|
||||
newCoil.setItemType(oldCoil.getItemType());
|
||||
newCoil.setItemId(oldCoil.getItemId());
|
||||
newCoil.setTeam(oldCoil.getTeam());
|
||||
// 如果没有指定库区,使用原库区
|
||||
if (newCoil.getWarehouseId() == null) {
|
||||
newCoil.setWarehouseId(oldCoil.getWarehouseId());
|
||||
}
|
||||
|
||||
// 为每个子钢卷生成独立二维码
|
||||
Long newQrcodeId = generateQrcodeForSplit(oldCoil, newCoilBo, allNewCoilNos);
|
||||
newCoil.setQrcodeRecordId(newQrcodeId);
|
||||
|
||||
validEntityBeforeSave(newCoil);
|
||||
baseMapper.insert(newCoil);
|
||||
newCoils.add(newCoil);
|
||||
|
||||
// 更新二维码内容中的coilId
|
||||
updateQrcodeCoilId(newQrcodeId, newCoil.getCoilId());
|
||||
}
|
||||
} else if (isMerge) {
|
||||
// 合卷:将bo作为合卷后的新钢卷,newCoils中的对象作为参与合卷的原始钢卷
|
||||
// 1. 将参与合卷的原始钢卷更新为历史数据
|
||||
@@ -413,35 +470,50 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
baseMapper.update(null, originalUpdateWrapper);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 2. 生成合卷后的新钢卷二维码
|
||||
Long mergedQrcodeId = generateQrcodeForMerge(bo, bo.getNewCoils());
|
||||
|
||||
|
||||
// 3. 插入合卷后的新钢卷
|
||||
WmsMaterialCoil newCoil = BeanUtil.toBean(bo, WmsMaterialCoil.class);
|
||||
newCoil.setCoilId(null);
|
||||
newCoil.setDataType(1);
|
||||
// 合卷后的钢卷使用自己的enterCoilNo,如果没有则从参与合卷的原始钢卷中获取
|
||||
if (newCoil.getEnterCoilNo() == null && !bo.getNewCoils().isEmpty()) {
|
||||
// 从第一个参与合卷的原始钢卷获取enterCoilNo
|
||||
|
||||
// 从第一个参与合卷的原始钢卷获取基本信息
|
||||
if (!bo.getNewCoils().isEmpty()) {
|
||||
WmsMaterialCoil firstOriginalCoil = baseMapper.selectById(bo.getNewCoils().get(0).getCoilId());
|
||||
if (firstOriginalCoil != null) {
|
||||
newCoil.setEnterCoilNo(firstOriginalCoil.getEnterCoilNo());
|
||||
// 继承基本信息
|
||||
if (newCoil.getEnterCoilNo() == null) {
|
||||
newCoil.setEnterCoilNo(firstOriginalCoil.getEnterCoilNo());
|
||||
}
|
||||
if (newCoil.getSupplierCoilNo() == null) {
|
||||
newCoil.setSupplierCoilNo(firstOriginalCoil.getSupplierCoilNo()); // 保留厂家原料卷号
|
||||
}
|
||||
if (newCoil.getItemType() == null) {
|
||||
newCoil.setItemType(firstOriginalCoil.getItemType());
|
||||
}
|
||||
if (newCoil.getItemId() == null) {
|
||||
newCoil.setItemId(firstOriginalCoil.getItemId());
|
||||
}
|
||||
if (newCoil.getTeam() == null) {
|
||||
newCoil.setTeam(firstOriginalCoil.getTeam());
|
||||
}
|
||||
}
|
||||
}
|
||||
newCoil.setQrcodeRecordId(mergedQrcodeId);
|
||||
|
||||
|
||||
validEntityBeforeSave(newCoil);
|
||||
baseMapper.insert(newCoil);
|
||||
newCoils.add(newCoil);
|
||||
|
||||
|
||||
// 更新二维码内容中的coilId
|
||||
updateQrcodeCoilId(mergedQrcodeId, newCoil.getCoilId());
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 为分卷生成新二维码(每个子钢卷一个)
|
||||
*/
|
||||
@@ -451,7 +523,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
contentMap.put("enter_coil_no", oldCoil.getEnterCoilNo());
|
||||
contentMap.put("current_coil_no", newCoilBo.getCurrentCoilNo());
|
||||
contentMap.put("coil_id", "null"); // 钢卷ID(分卷时暂时为null,插入后更新)
|
||||
|
||||
|
||||
// 复制原钢卷的历史steps
|
||||
List<Map<String, Object>> steps = new ArrayList<>();
|
||||
if (oldCoil.getQrcodeRecordId() != null) {
|
||||
@@ -467,7 +539,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 添加分卷步骤
|
||||
Map<String, Object> splitStep = new HashMap<>();
|
||||
splitStep.put("step", steps.size() + 1);
|
||||
@@ -477,27 +549,28 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
splitStep.put("old_coil_id", String.valueOf(oldCoil.getCoilId()));
|
||||
splitStep.put("new_current_coil_nos", String.join(",", allNewCoilNos));
|
||||
splitStep.put("child_coils", allNewCoilNos);
|
||||
splitStep.put("operator", LoginHelper.getUsername()); // 操作者
|
||||
steps.add(splitStep);
|
||||
|
||||
|
||||
contentMap.put("steps", steps);
|
||||
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String contentJson = objectMapper.writeValueAsString(contentMap);
|
||||
|
||||
|
||||
WmsGenerateRecordBo recordBo = new WmsGenerateRecordBo();
|
||||
recordBo.setContent(contentJson);
|
||||
recordBo.setSerialNumber(oldCoil.getEnterCoilNo() + "-" + newCoilBo.getCurrentCoilNo());
|
||||
recordBo.setQrcodeType(0L);
|
||||
recordBo.setIsEnabled(0L);
|
||||
recordBo.setSize(200L);
|
||||
|
||||
|
||||
WmsGenerateRecordVo record = generateRecordService.insertByBo(recordBo);
|
||||
return record.getRecordId();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("生成分卷二维码失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 为合卷生成新二维码(合并多个父钢卷的二维码信息)
|
||||
*/
|
||||
@@ -506,7 +579,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
if (mergedCoilBo == null) {
|
||||
throw new RuntimeException("合卷后的钢卷数据不能为空");
|
||||
}
|
||||
|
||||
|
||||
Map<String, Object> contentMap = new HashMap<>();
|
||||
// 获取enterCoilNo,优先使用mergedCoilBo的,如果没有则从原始钢卷中获取
|
||||
String enterCoilNo = mergedCoilBo.getEnterCoilNo();
|
||||
@@ -519,10 +592,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
contentMap.put("enter_coil_no", enterCoilNo);
|
||||
contentMap.put("current_coil_no", mergedCoilBo.getCurrentCoilNo());
|
||||
contentMap.put("coil_id", "null"); // 钢卷ID(合卷时暂时为null,插入后更新)
|
||||
|
||||
|
||||
// 合并所有参与合卷的原始钢卷的历史steps
|
||||
List<Map<String, Object>> steps = new ArrayList<>();
|
||||
|
||||
|
||||
// 从参与合卷的原始钢卷中获取二维码信息并合并
|
||||
if (originalCoils != null && !originalCoils.isEmpty()) {
|
||||
for (WmsMaterialCoilBo originalCoilBo : originalCoils) {
|
||||
@@ -545,13 +618,13 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 添加合卷步骤
|
||||
Map<String, Object> mergeStep = new HashMap<>();
|
||||
mergeStep.put("step", steps.size() + 1);
|
||||
mergeStep.put("action", "更新");
|
||||
mergeStep.put("operation", "合卷");
|
||||
|
||||
|
||||
// 收集参与合卷的原始钢卷号和ID
|
||||
List<String> originalCoilNos = new ArrayList<>();
|
||||
List<String> originalCoilIds = new ArrayList<>();
|
||||
@@ -568,20 +641,23 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
mergeStep.put("parent_coil_nos", String.join(",", originalCoilNos));
|
||||
mergeStep.put("parent_coil_ids", String.join(",", originalCoilIds));
|
||||
mergeStep.put("new_current_coil_no", mergedCoilBo.getCurrentCoilNo());
|
||||
mergeStep.put("operator", LoginHelper.getUsername()); // 操作者
|
||||
steps.add(mergeStep);
|
||||
|
||||
|
||||
contentMap.put("steps", steps);
|
||||
|
||||
// 将父钢卷ID也存储到顶层,方便快速查询
|
||||
contentMap.put("parent_coil_ids", String.join(",", originalCoilIds));
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String contentJson = objectMapper.writeValueAsString(contentMap);
|
||||
|
||||
|
||||
WmsGenerateRecordBo recordBo = new WmsGenerateRecordBo();
|
||||
recordBo.setContent(contentJson);
|
||||
recordBo.setSerialNumber(enterCoilNo + "-" + mergedCoilBo.getCurrentCoilNo());
|
||||
recordBo.setQrcodeType(0L);
|
||||
recordBo.setIsEnabled(0L);
|
||||
recordBo.setSize(200L);
|
||||
|
||||
|
||||
WmsGenerateRecordVo record = generateRecordService.insertByBo(recordBo);
|
||||
return record.getRecordId();
|
||||
} catch (Exception e) {
|
||||
@@ -598,14 +674,14 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
if (record == null) {
|
||||
throw new RuntimeException("二维码记录不存在");
|
||||
}
|
||||
|
||||
|
||||
// 解析现有content
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
Map<String, Object> contentMap = objectMapper.readValue(record.getContent(), Map.class);
|
||||
|
||||
|
||||
// 更新coilId
|
||||
contentMap.put("coil_id", String.valueOf(coilId));
|
||||
|
||||
|
||||
// 更新二维码记录
|
||||
String newContentJson = objectMapper.writeValueAsString(contentMap);
|
||||
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
|
||||
@@ -616,7 +692,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
throw new RuntimeException("更新二维码coilId失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 更新二维码内容(单个更新)
|
||||
*/
|
||||
@@ -624,24 +700,24 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
try {
|
||||
// 获取原钢卷信息
|
||||
WmsMaterialCoil oldCoil = baseMapper.selectById(bo.getCoilId());
|
||||
|
||||
|
||||
// 获取原二维码记录
|
||||
WmsGenerateRecordVo oldRecord = generateRecordService.queryById(qrcodeRecordId);
|
||||
if (oldRecord == null) {
|
||||
throw new RuntimeException("二维码记录不存在");
|
||||
}
|
||||
|
||||
|
||||
// 解析现有content
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
Map<String, Object> contentMap = objectMapper.readValue(oldRecord.getContent(), Map.class);
|
||||
|
||||
|
||||
// 获取现有steps
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> steps = (List<Map<String, Object>>) contentMap.get("steps");
|
||||
if (steps == null) {
|
||||
steps = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
// 添加新的step,记录钢卷号的变化
|
||||
Map<String, Object> newStep = new HashMap<>();
|
||||
newStep.put("step", steps.size() + 1);
|
||||
@@ -649,7 +725,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
newStep.put("old_current_coil_no", oldCoil.getCurrentCoilNo()); // 原当前钢卷号
|
||||
newStep.put("new_current_coil_no", bo.getCurrentCoilNo()); // 新当前钢卷号
|
||||
newStep.put("coil_id", String.valueOf(bo.getCoilId())); // 钢卷ID
|
||||
|
||||
newStep.put("operator", LoginHelper.getUsername()); // 操作者
|
||||
|
||||
// 判断操作类型
|
||||
if (bo.getHasMergeSplit() != null && bo.getHasMergeSplit() == 2) {
|
||||
newStep.put("operation", "合卷");
|
||||
@@ -660,12 +737,12 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
} else {
|
||||
newStep.put("operation", "更新");
|
||||
}
|
||||
|
||||
|
||||
steps.add(newStep);
|
||||
contentMap.put("steps", steps);
|
||||
// 更新当前钢卷号到最外层(方便快速查看)
|
||||
contentMap.put("current_coil_no", bo.getCurrentCoilNo());
|
||||
|
||||
|
||||
// 更新二维码记录
|
||||
String newContentJson = objectMapper.writeValueAsString(contentMap);
|
||||
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
|
||||
@@ -676,7 +753,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
throw new RuntimeException("更新二维码失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
@@ -707,89 +784,184 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
@Override
|
||||
public Map<String, Object> queryTrace(String enterCoilNo, String currentCoilNo) {
|
||||
try {
|
||||
// 1. 根据入场钢卷号查询二维码记录
|
||||
// 1. 查询所有相关的二维码记录(包括分卷后的独立二维码)
|
||||
List<WmsGenerateRecordVo> allQrRecords = new ArrayList<>();
|
||||
|
||||
// 首先查询主二维码(以入场钢卷号为序列号的)
|
||||
WmsGenerateRecordBo qrBo = new WmsGenerateRecordBo();
|
||||
qrBo.setSerialNumber(enterCoilNo);
|
||||
List<WmsGenerateRecordVo> qrRecords = generateRecordService.queryList(qrBo);
|
||||
List<WmsGenerateRecordVo> mainQrRecords = generateRecordService.queryList(qrBo);
|
||||
allQrRecords.addAll(mainQrRecords);
|
||||
|
||||
if (qrRecords.isEmpty()) {
|
||||
// 然后查询所有以该入场钢卷号开头的二维码(分卷后的二维码)
|
||||
WmsGenerateRecordBo splitQrBo = new WmsGenerateRecordBo();
|
||||
List<WmsGenerateRecordVo> allRecords = generateRecordService.queryList(splitQrBo);
|
||||
for (WmsGenerateRecordVo record : allRecords) {
|
||||
if (record.getSerialNumber() != null &&
|
||||
record.getSerialNumber().startsWith(enterCoilNo + "-") &&
|
||||
!allQrRecords.contains(record)) {
|
||||
allQrRecords.add(record);
|
||||
}
|
||||
}
|
||||
|
||||
if (allQrRecords.isEmpty()) {
|
||||
throw new RuntimeException("未找到对应的二维码记录");
|
||||
}
|
||||
|
||||
// 2. 合并所有二维码的steps信息,去重并重新编号
|
||||
Map<String, Map<String, Object>> uniqueSteps = new HashMap<>(); // 用于去重
|
||||
Set<String> allCoilNos = new HashSet<>();
|
||||
|
||||
// 取第一个(应该只有一个)
|
||||
WmsGenerateRecordVo qrRecord = qrRecords.get(0);
|
||||
|
||||
// 2. 解析二维码content中的steps
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> contentMap = objectMapper.readValue(qrRecord.getContent(), Map.class);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> steps = (List<Map<String, Object>>) contentMap.get("steps");
|
||||
|
||||
// 3. 从steps中提取所有钢卷号
|
||||
Set<String> coilNos = new HashSet<>();
|
||||
if (steps != null) {
|
||||
for (Map<String, Object> step : steps) {
|
||||
// 提取各种可能的钢卷号字段
|
||||
extractCoilNo(step, "current_coil_no", coilNos);
|
||||
extractCoilNo(step, "new_current_coil_no", coilNos);
|
||||
extractCoilNo(step, "old_current_coil_no", coilNos);
|
||||
extractCoilNo(step, "new_current_coil_nos", coilNos);
|
||||
extractCoilNo(step, "merged_from", coilNos);
|
||||
extractCoilNo(step, "parent_coil_nos", coilNos);
|
||||
// 提取钢卷ID字段
|
||||
extractCoilId(step, "coil_id", coilNos);
|
||||
extractCoilId(step, "old_coil_id", coilNos);
|
||||
extractCoilId(step, "parent_coil_ids", coilNos);
|
||||
for (WmsGenerateRecordVo qrRecord : allQrRecords) {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> contentMap = objectMapper.readValue(qrRecord.getContent(), Map.class);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> steps = (List<Map<String, Object>>) contentMap.get("steps");
|
||||
|
||||
if (steps != null) {
|
||||
for (Map<String, Object> step : steps) {
|
||||
// 创建唯一标识:操作类型 + 相关钢卷号
|
||||
String stepKey = createStepKey(step);
|
||||
|
||||
// 如果是新的步骤,添加到唯一步骤集合中
|
||||
if (!uniqueSteps.containsKey(stepKey)) {
|
||||
Map<String, Object> uniqueStep = new HashMap<>(step);
|
||||
uniqueStep.put("qrcode_serial", qrRecord.getSerialNumber());
|
||||
uniqueStep.put("qrcode_id", qrRecord.getRecordId());
|
||||
uniqueSteps.put(stepKey, uniqueStep);
|
||||
}
|
||||
|
||||
// 提取钢卷号
|
||||
extractCoilNo(step, "current_coil_no", allCoilNos);
|
||||
extractCoilNo(step, "new_current_coil_no", allCoilNos);
|
||||
extractCoilNo(step, "old_current_coil_no", allCoilNos);
|
||||
extractCoilNo(step, "new_current_coil_nos", allCoilNos);
|
||||
extractCoilNo(step, "merged_from", allCoilNos);
|
||||
extractCoilNo(step, "parent_coil_nos", allCoilNos);
|
||||
extractCoilId(step, "coil_id", allCoilNos);
|
||||
extractCoilId(step, "old_coil_id", allCoilNos);
|
||||
extractCoilId(step, "parent_coil_ids", allCoilNos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 如果指定了当前钢卷号,过滤出相关的钢卷号
|
||||
Set<String> filteredCoilNos = coilNos;
|
||||
// 转换为列表并按原始步骤号排序(保持时间顺序)
|
||||
List<Map<String, Object>> allSteps = new ArrayList<>(uniqueSteps.values());
|
||||
|
||||
// 按原始步骤号排序,保持实际操作的时间顺序
|
||||
allSteps.sort((a, b) -> {
|
||||
Integer stepA = (Integer) a.get("step");
|
||||
Integer stepB = (Integer) b.get("step");
|
||||
if (stepA == null) stepA = 0;
|
||||
if (stepB == null) stepB = 0;
|
||||
return stepA.compareTo(stepB);
|
||||
});
|
||||
|
||||
// 重新编号(保持连续性)
|
||||
for (int i = 0; i < allSteps.size(); i++) {
|
||||
allSteps.get(i).put("display_step", i + 1);
|
||||
// 保留原始步骤号用于调试
|
||||
allSteps.get(i).put("original_step", allSteps.get(i).get("step"));
|
||||
}
|
||||
|
||||
// 3. 如果指定了当前钢卷号,过滤出相关的钢卷号
|
||||
Set<String> filteredCoilNos = allCoilNos;
|
||||
if (currentCoilNo != null && !currentCoilNo.trim().isEmpty()) {
|
||||
final String filterValue = currentCoilNo; // 用于lambda的final变量
|
||||
filteredCoilNos = coilNos.stream()
|
||||
final String filterValue = currentCoilNo;
|
||||
filteredCoilNos = allCoilNos.stream()
|
||||
.filter(coilNo -> coilNo.contains(filterValue))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
// 5. 根据提取的钢卷号反向查询数据库
|
||||
|
||||
// 4. 根据提取的钢卷号反向查询数据库
|
||||
List<WmsMaterialCoilVo> result = new ArrayList<>();
|
||||
if (!filteredCoilNos.isEmpty()) {
|
||||
LambdaQueryWrapper<WmsMaterialCoil> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(WmsMaterialCoil::getEnterCoilNo, enterCoilNo);
|
||||
|
||||
|
||||
// 查询包含提取出的钢卷号的记录
|
||||
final Set<String> finalCoilNos = filteredCoilNos; // 用于lambda的final变量
|
||||
final Set<String> finalCoilNos = filteredCoilNos;
|
||||
lqw.and(wrapper -> {
|
||||
int count = 0;
|
||||
for (String coilNo : finalCoilNos) {
|
||||
if (count == 0) {
|
||||
wrapper.like(WmsMaterialCoil::getCurrentCoilNo, coilNo);
|
||||
wrapper.eq(WmsMaterialCoil::getCurrentCoilNo, coilNo);
|
||||
} else {
|
||||
wrapper.or().like(WmsMaterialCoil::getCurrentCoilNo, coilNo);
|
||||
wrapper.or().eq(WmsMaterialCoil::getCurrentCoilNo, coilNo);
|
||||
}
|
||||
count++;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
lqw.orderByAsc(WmsMaterialCoil::getCreateTime);
|
||||
result = baseMapper.selectVoList(lqw);
|
||||
|
||||
// 填充每个记录的关联对象信息(如库区)
|
||||
for (WmsMaterialCoilVo vo : result) {
|
||||
fillRelatedObjects(vo);
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 构建返回结果
|
||||
// 如果没有找到记录,尝试查询所有相关的钢卷(包括历史数据)
|
||||
if (result.isEmpty()) {
|
||||
LambdaQueryWrapper<WmsMaterialCoil> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(WmsMaterialCoil::getEnterCoilNo, enterCoilNo);
|
||||
lqw.orderByAsc(WmsMaterialCoil::getCreateTime);
|
||||
result = baseMapper.selectVoList(lqw);
|
||||
|
||||
// 填充每个记录的关联对象信息
|
||||
for (WmsMaterialCoilVo vo : result) {
|
||||
fillRelatedObjects(vo);
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 构建返回结果
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put("qrcode", qrRecord);
|
||||
resultMap.put("steps", steps);
|
||||
resultMap.put("records", result);
|
||||
|
||||
resultMap.put("qrcode", allQrRecords.get(0)); // 主二维码
|
||||
resultMap.put("all_qrcodes", allQrRecords); // 所有相关二维码
|
||||
resultMap.put("steps", allSteps); // 所有步骤
|
||||
resultMap.put("records", result); // 所有钢卷记录
|
||||
|
||||
return resultMap;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("溯源查询失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建步骤唯一标识
|
||||
*/
|
||||
private String createStepKey(Map<String, Object> step) {
|
||||
StringBuilder keyBuilder = new StringBuilder();
|
||||
|
||||
// 使用操作类型和主要标识符创建唯一key
|
||||
String operation = (String) step.get("operation");
|
||||
keyBuilder.append(operation).append("-");
|
||||
|
||||
// 根据操作类型使用不同的标识符
|
||||
if ("分卷".equals(operation)) {
|
||||
// 分卷:使用原钢卷号 + 分卷列表
|
||||
keyBuilder.append(step.get("old_current_coil_no")).append("->");
|
||||
keyBuilder.append(step.get("new_current_coil_nos"));
|
||||
} else if ("合卷".equals(operation)) {
|
||||
// 合卷:使用父钢卷列表 + 新钢卷号
|
||||
keyBuilder.append(step.get("parent_coil_nos")).append("->");
|
||||
keyBuilder.append(step.get("new_current_coil_no"));
|
||||
} else if ("新增".equals(operation)) {
|
||||
// 新增:使用当前钢卷号
|
||||
keyBuilder.append(step.get("current_coil_no"));
|
||||
} else {
|
||||
// 其他更新:使用原钢卷号 -> 新钢卷号
|
||||
keyBuilder.append(step.get("old_current_coil_no")).append("->");
|
||||
keyBuilder.append(step.get("new_current_coil_no"));
|
||||
}
|
||||
|
||||
return keyBuilder.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 从step中提取钢卷号
|
||||
*/
|
||||
@@ -808,7 +980,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 从step中提取钢卷ID
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user