web,app,后端更改二维码唯一

This commit is contained in:
2025-11-05 22:18:10 +08:00
parent f7dad6a1f4
commit 8117421531
6 changed files with 466 additions and 174 deletions

View File

@@ -62,7 +62,7 @@ public class WmsMaterialCoilController extends BaseController {
*/
@GetMapping("/{coilId}")
public R<WmsMaterialCoilVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long coilId) {
@PathVariable("coilId") Long coilId) {
return R.ok(iWmsMaterialCoilService.queryById(coilId));
}
@@ -105,7 +105,7 @@ public class WmsMaterialCoilController extends BaseController {
@Log(title = "钢卷物料表", businessType = BusinessType.DELETE)
@DeleteMapping("/{coilIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] coilIds) {
@PathVariable("coilIds") Long[] coilIds) {
return toAjax(iWmsMaterialCoilService.deleteWithValidByIds(Arrays.asList(coilIds), true));
}

View File

@@ -22,7 +22,6 @@ import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.vo.WmsBomItemVo;
import com.klp.domain.bo.WmsBomItemBo;
import com.klp.domain.WmsMaterialCoil;
import com.klp.domain.WmsStock;
import com.klp.domain.bo.WmsStockBo;
import com.klp.domain.vo.WmsStockVo;
import com.klp.mapper.WmsMaterialCoilMapper;
@@ -31,9 +30,11 @@ import com.klp.service.IWmsMaterialCoilService;
import com.klp.service.IWmsStockService;
import com.klp.service.IWmsGenerateRecordService;
import com.klp.service.IWmsWarehouseService;
import com.klp.service.IWmsActualWarehouseService;
import com.klp.service.IWmsRawMaterialService;
import com.klp.service.IWmsProductBomService;
import com.klp.service.IWmsBomItemService;
import com.klp.domain.vo.WmsActualWarehouseVo;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
@@ -61,6 +62,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
private final IWmsStockService stockService;
private final IWmsGenerateRecordService generateRecordService;
private final IWmsWarehouseService warehouseService;
private final IWmsActualWarehouseService actualWarehouseService;
private final IWmsRawMaterialService rawMaterialService;
private final IWmsProductBomService productBomService;
private final IWmsBomItemService bomItemService;
@@ -97,6 +99,14 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
vo.setNextWarehouse(nextWarehouse);
}
// 查询实际库区信息
if (vo.getActualWarehouseId() != null) {
WmsActualWarehouseVo actualWarehouse = actualWarehouseService.queryById(vo.getActualWarehouseId());
if (actualWarehouse != null) {
vo.setActualWarehouseName(actualWarehouse.getActualWarehouseName());
}
}
// 查询二维码信息
if (vo.getQrcodeRecordId() != null) {
WmsGenerateRecordVo qrcodeRecord = generateRecordService.queryById(vo.getQrcodeRecordId());
@@ -354,7 +364,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 单个更新
* 单个更新(正常更新,不产生新记录,二维码不变)
*/
private Boolean updateBySingle(WmsMaterialCoilBo bo) {
// 查询原钢卷
@@ -363,56 +373,36 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
throw new RuntimeException("原钢卷不存在");
}
// 判断warehouseId是否发生变化
boolean warehouseChanged = bo.getWarehouseId() != null &&
!bo.getWarehouseId().equals(oldCoil.getWarehouseId());
Long qrcodeRecordId;
if (warehouseChanged) {
// 如果库区发生变化,生成新的二维码
qrcodeRecordId = generateQrcodeForUpdate(oldCoil, bo);
} else {
// 如果库区未变化,更新原二维码内容
updateQrcodeContent(oldCoil.getQrcodeRecordId(), bo);
qrcodeRecordId = oldCoil.getQrcodeRecordId();
// 直接更新原记录不产生新记录不修改dataType
WmsMaterialCoil updateCoil = BeanUtil.toBean(bo, WmsMaterialCoil.class);
// 确保关键字段不丢失
if (updateCoil.getEnterCoilNo() == null) {
updateCoil.setEnterCoilNo(oldCoil.getEnterCoilNo());
}
// 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(qrcodeRecordId); // 使用新的或原有的二维码ID
// 确保关键字段不丢失(入场钢卷号始终不变)
newCoil.setEnterCoilNo(oldCoil.getEnterCoilNo()); // 入场钢卷号始终不变
if (newCoil.getSupplierCoilNo() == null) {
newCoil.setSupplierCoilNo(oldCoil.getSupplierCoilNo()); // 保留厂家原料卷号
if (updateCoil.getSupplierCoilNo() == null) {
updateCoil.setSupplierCoilNo(oldCoil.getSupplierCoilNo());
}
if (newCoil.getItemType() == null) {
newCoil.setItemType(oldCoil.getItemType());
if (updateCoil.getQrcodeRecordId() == null) {
updateCoil.setQrcodeRecordId(oldCoil.getQrcodeRecordId());
}
if (newCoil.getItemId() == null) {
newCoil.setItemId(oldCoil.getItemId());
if (updateCoil.getWarehouseId() == null) {
updateCoil.setWarehouseId(oldCoil.getWarehouseId());
}
// 确保warehouseId有值如果前端没传使用原值
if (newCoil.getWarehouseId() == null) {
newCoil.setWarehouseId(oldCoil.getWarehouseId());
newCoil.setActualWarehouseId(oldCoil.getActualWarehouseId());
if (updateCoil.getActualWarehouseId() == null) {
updateCoil.setActualWarehouseId(oldCoil.getActualWarehouseId());
}
validEntityBeforeSave(newCoil);
boolean flag = baseMapper.insert(newCoil) > 0;
validEntityBeforeSave(updateCoil);
// 直接更新记录coilId不变
boolean flag = baseMapper.updateById(updateCoil) > 0;
if (flag) {
bo.setCoilId(newCoil.getCoilId());
// 无论库区是否变化都需要更新二维码中的current_coil_id
updateQrcodeCoilId(qrcodeRecordId, newCoil.getCoilId());
// 更新二维码内容添加新的step
updateQrcodeContentForNormalUpdate(oldCoil, bo);
}
return flag;
}
@@ -543,9 +533,17 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
throw new RuntimeException("分卷操作需要原钢卷信息");
}
// 1. 将原始钢卷更新为历史数据(已在上面完成
// 1. 将原始钢卷的二维码标记为失效status=0
if (oldCoil.getQrcodeRecordId() != null) {
WmsGenerateRecordBo oldQrBo = new WmsGenerateRecordBo();
oldQrBo.setRecordId(oldCoil.getQrcodeRecordId());
oldQrBo.setStatus(0); // 0=失效
generateRecordService.updateByBo(oldQrBo);
}
// 2. 将原始钢卷标记为历史数据(已在上面完成)
// 2. 为每个分卷后的子钢卷生成独立的二维码并插入数据库
// 3. 为每个分卷后的子钢卷生成独立的二维码并插入数据库
for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) {
WmsMaterialCoil newCoil = BeanUtil.toBean(newCoilBo, WmsMaterialCoil.class);
newCoil.setCoilId(null);
@@ -578,13 +576,25 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
} else if (isMerge) {
// 合卷将bo作为合卷后的新钢卷newCoils中的对象作为参与合卷的原始钢卷
// 1. 将参与合卷的原始钢卷更新为历史数据
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
for (WmsMaterialCoilBo originalCoilBo : bo.getNewCoils()) {
if (originalCoilBo.getCoilId() != null) {
LambdaUpdateWrapper<WmsMaterialCoil> originalUpdateWrapper = new LambdaUpdateWrapper<>();
originalUpdateWrapper.eq(WmsMaterialCoil::getCoilId, originalCoilBo.getCoilId())
.set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据
baseMapper.update(null, originalUpdateWrapper);
WmsMaterialCoil originalCoil = baseMapper.selectById(originalCoilBo.getCoilId());
if (originalCoil != null) {
// 标记二维码为失效
if (originalCoil.getQrcodeRecordId() != null) {
WmsGenerateRecordBo oldQrBo = new WmsGenerateRecordBo();
oldQrBo.setRecordId(originalCoil.getQrcodeRecordId());
oldQrBo.setStatus(0); // 0=失效
generateRecordService.updateByBo(oldQrBo);
}
// 标记钢卷为历史数据
LambdaUpdateWrapper<WmsMaterialCoil> originalUpdateWrapper = new LambdaUpdateWrapper<>();
originalUpdateWrapper.eq(WmsMaterialCoil::getCoilId, originalCoilBo.getCoilId())
.set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据
baseMapper.update(null, originalUpdateWrapper);
}
}
}
@@ -821,21 +831,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 更新二维码内容(单个更新
* 更新二维码内容(正常更新添加step
*/
private void updateQrcodeContent(Long qrcodeRecordId, WmsMaterialCoilBo bo) {
private void updateQrcodeContentForNormalUpdate(WmsMaterialCoil oldCoil, WmsMaterialCoilBo bo) {
try {
// 获取原钢卷信息
WmsMaterialCoil oldCoil = baseMapper.selectById(bo.getCoilId());
// 获取原二维码记录
WmsGenerateRecordVo oldRecord = generateRecordService.queryById(qrcodeRecordId);
WmsGenerateRecordVo oldRecord = generateRecordService.queryById(oldCoil.getQrcodeRecordId());
if (oldRecord == null) {
throw new RuntimeException("二维码记录不存在");
}
// 解析现有content
ObjectMapper objectMapper = new ObjectMapper();
@SuppressWarnings("unchecked")
Map<String, Object> contentMap = objectMapper.readValue(oldRecord.getContent(), Map.class);
// 获取现有steps
@@ -845,39 +853,29 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
steps = new ArrayList<>();
}
// 添加新的step记录钢卷号的变化
// 添加新的step记录更新信息
Map<String, Object> newStep = new HashMap<>();
newStep.put("step", steps.size() + 1);
newStep.put("action", "更新");
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", "合卷");
newStep.put("parent_coil_nos", bo.getParentCoilNos());
} else if (bo.getHasMergeSplit() != null && bo.getHasMergeSplit() == 1) {
newStep.put("operation", "分卷");
newStep.put("new_current_coil_nos", bo.getCurrentCoilNo());
} else {
newStep.put("operation", "更新");
}
newStep.put("operation", "更新");
newStep.put("old_current_coil_no", oldCoil.getCurrentCoilNo());
newStep.put("new_current_coil_no", bo.getCurrentCoilNo());
newStep.put("coil_id", String.valueOf(bo.getCoilId()));
newStep.put("operator", LoginHelper.getUsername());
newStep.put("update_time", new java.util.Date());
steps.add(newStep);
contentMap.put("steps", steps);
// 更新当前钢卷号到最外层(方便快速查看)
// 更新当前钢卷号
contentMap.put("current_coil_no", bo.getCurrentCoilNo());
// 更新当前钢卷ID注意这里需要获取新插入的钢卷ID但在这个方法中还没有新ID
// 所以这个方法只在库区不变化时调用此时钢卷ID不变
// contentMap.put("current_coil_id", String.valueOf(bo.getCoilId())); // 保持当前ID不变
// current_coil_id保持不变因为coilId没有变化
// 更新二维码记录
String newContentJson = objectMapper.writeValueAsString(contentMap);
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
updateBo.setRecordId(qrcodeRecordId);
updateBo.setRecordId(oldCoil.getQrcodeRecordId());
updateBo.setContent(newContentJson);
generateRecordService.updateByBo(updateBo);
} catch (Exception e) {