Browse Source

2025-09-01 pc属性变动、拆合组托优化

master
fengyuan_yang 1 year ago
parent
commit
811f436aad
  1. 171
      src/main/java/com/gaotao/modules/labelSplitMerge/service/impl/LabelSplitMergeServiceImpl.java
  2. 12
      src/main/java/com/gaotao/modules/propertyChange/controller/PropertyChangeController.java
  3. 4
      src/main/java/com/gaotao/modules/propertyChange/dao/PropertyChangeMapper.java
  4. 4
      src/main/java/com/gaotao/modules/propertyChange/service/PropertyChangeService.java
  5. 162
      src/main/java/com/gaotao/modules/propertyChange/service/impl/PropertyChangeServiceImpl.java
  6. 1
      src/main/resources/mapper/labelSplitMerge/LabelSplitMergeMapper.xml
  7. 10
      src/main/resources/mapper/propertyChange/PropertyChangeMapper.xml

171
src/main/java/com/gaotao/modules/labelSplitMerge/service/impl/LabelSplitMergeServiceImpl.java

@ -1,14 +1,13 @@
package com.gaotao.modules.labelSplitMerge.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gaotao.modules.base.data.BuData;
import com.gaotao.modules.labelSplitMerge.dao.LabelSplitMergeMapper;
import com.gaotao.modules.labelSplitMerge.entity.LabelSplitMergeEntity;
import com.gaotao.modules.labelSplitMerge.service.LabelSplitMergeService;
import com.gaotao.modules.trans.entity.TransDetail;
import com.gaotao.modules.trans.entity.TransDetailDto;
import com.gaotao.modules.trans.entity.TransHeader;
import com.gaotao.modules.trans.entity.TransNoControl;
import com.gaotao.modules.trans.entity.*;
import com.gaotao.modules.trans.service.TransDetailService;
import com.gaotao.modules.trans.service.TransDetailSubService;
import com.gaotao.modules.trans.service.TransHeaderService;
import com.gaotao.modules.trans.service.TransNoControlService;
import org.slf4j.Logger;
@ -47,6 +46,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
@Autowired
private TransNoControlService transNoControlService;
@Autowired
private TransDetailSubService transDetailSubService;
@Override
public Map<String, Object> getStockInfoByLabelCode(String labelCode, String site, String warehouseId) {
logger.info("根据标签条码获取库存信息,标签条码: {}, 站点: {}, 仓库: {}", labelCode, site, warehouseId);
@ -114,7 +116,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
insertParams.put("site", site);
insertParams.put("buNo", buNo);
insertParams.put("rollNo", newLabelCode);
insertParams.put("parentRollNo", originalLabelCode);
insertParams.put("parentRollNo", newLabelCode);
insertParams.put("partNo", partNo);
insertParams.put("labelTypeTb", params.get("labelTypeTb"));
insertParams.put("labelType", params.get("labelType"));
@ -122,8 +124,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
insertParams.put("locationId", locationId);
insertParams.put("batchNo", batchNo);
insertParams.put("wdr", params.get("wdr"));
insertParams.put("statusTb", "在库");
insertParams.put("status", "在库");
insertParams.put("statusTb", params.get("statusTb"));
insertParams.put("status", params.get("status"));
insertParams.put("firstInDate", new Date());
insertParams.put("latestInDate", new Date());
insertParams.put("activeDate", new Date());
@ -144,7 +146,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
}
// 5. 生成标签变动事务记录
generateSplitTransaction(site, buNo, warehouseId, originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity);
generateSplitTransaction(site, buNo, warehouseId, originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, locationId);
Map<String, Object> result = new HashMap<>();
result.put("newLabelCode", newLabelCode);
@ -176,6 +178,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
String batchNo = (String) params.get("batchNo");
String locationId = (String) params.get("locationId");
String operator = (String) params.get("operator");
String status = (String) params.get("status");
String statusTb = (String) params.get("statusTb");
Float targetQuantity = Float.parseFloat(params.get("targetQuantity").toString());
Float sourceQuantity = Float.parseFloat(params.get("sourceQuantity").toString());
@ -199,8 +203,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
updateTargetParams.put("rollNo", targetLabelCode);
updateTargetParams.put("site", site);
updateTargetParams.put("warehouseId", warehouseId);
updateTargetParams.put("status", "出库");
updateTargetParams.put("statusTb", "出库");
updateTargetParams.put("status", status);
updateTargetParams.put("statusTb", statusTb);
updateTargetParams.put("outQty", targetQuantity); // 记录目标标签的出库数量
int updateTargetCount = labelSplitMergeMapper.updateInventoryStatus(updateTargetParams);
@ -209,7 +213,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
}
// 4. 生成标签变动事务记录
generateMergeTransaction(site, buNo, warehouseId, sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity);
generateMergeTransaction(site, buNo, warehouseId, sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, locationId);
logger.info("标签合并成功,源标签: {}, 目标标签: {}, 合并数量: {}", sourceLabelCode, targetLabelCode, sourceQuantity);
return true;
@ -224,7 +228,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
* 生成标签拆分事务记录
*/
private void generateSplitTransaction(String site, String buNo, String warehouseId, String originalLabelCode,
String newLabelCode, String partNo, String batchNo, Float splitQuantity, Float remainingQuantity) {
String newLabelCode, String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String locationCode) {
logger.info("开始生成标签拆分事务记录,原标签: {}, 新标签: {}", originalLabelCode, newLabelCode);
try {
@ -233,24 +237,23 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
transDetailDto.setSite(site);
transDetailDto.setRemark("标签拆分 - 原标签: " + originalLabelCode + ", 新标签: " + newLabelCode);
transDetailDto.setOrderref1(originalLabelCode); // 原标签条码
transDetailDto.setOrderref2(newLabelCode); // 新标签条码
transDetailDto.setOrderref3(warehouseId); // 仓库ID
// 使用TransHeaderService的genTrans方法生成事务头
// CF = 拆分 (Cha Fen)
TransHeader transHeader = transHeaderService.genTrans(transDetailDto, "CF", warehouseId, buNo);
if (transHeader == null) {
throw new RuntimeException("生成标签拆分事务头记录失败");
}
logger.info("标签拆分事务头记录生成成功,事务单号: {}", transHeader.getTransno());
// 生成事务明细记录
generateSplitTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, site);
generateSplitTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, site, buNo);
logger.info("标签拆分事务记录生成完成,事务单号: {}, 原标签: {}, 新标签: {}", transHeader.getTransno(), originalLabelCode, newLabelCode);
logger.info("标签拆分事务记录生成完成,事务单号: {}, 原标签: {}, 新标签: {}",
transHeader.getTransno(), originalLabelCode, newLabelCode);
// 生成事务子明细记录
addSubTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, batchNo, splitQuantity, remainingQuantity, site, buNo, warehouseId, locationCode);
logger.info("标签拆分事务子记录生成完成,事务单号: {}", transHeader.getTransno());
} catch (Exception e) {
logger.error("生成标签拆分事务记录失败", e);
@ -258,11 +261,12 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
}
}
/**
* 生成标签合并事务记录
*/
private void generateMergeTransaction(String site, String buNo, String warehouseId, String sourceLabelCode,
String targetLabelCode, String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity) {
String targetLabelCode, String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String locationCode) {
logger.info("开始生成标签合并事务记录,源标签: {}, 目标标签: {}", sourceLabelCode, targetLabelCode);
try {
@ -271,24 +275,23 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
transDetailDto.setSite(site);
transDetailDto.setRemark("标签合并 - 源标签: " + sourceLabelCode + ", 目标标签: " + targetLabelCode);
transDetailDto.setOrderref1(sourceLabelCode); // 源标签条码
transDetailDto.setOrderref2(targetLabelCode); // 目标标签条码
transDetailDto.setOrderref3(warehouseId); // 仓库ID
// 使用TransHeaderService的genTrans方法生成事务头
// HB = 合并 (He Bing)
TransHeader transHeader = transHeaderService.genTrans(transDetailDto, "HB", warehouseId, buNo);
if (transHeader == null) {
throw new RuntimeException("生成标签合并事务头记录失败");
}
logger.info("标签合并事务头记录生成成功,事务单号: {}", transHeader.getTransno());
// 生成事务明细记录
generateMergeTransactionDetails(transHeader.getTransno(), sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site);
generateMergeTransactionDetails(transHeader.getTransno(), sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site, buNo);
logger.info("标签合并事务记录生成完成,事务单号: {}, 源标签: {}, 目标标签: {}", transHeader.getTransno(), sourceLabelCode, targetLabelCode);
logger.info("标签合并事务记录生成完成,事务单号: {}, 源标签: {}, 目标标签: {}",
transHeader.getTransno(), sourceLabelCode, targetLabelCode);
// 生成事务子明细记录
addSubTransactionDetails2(transHeader.getTransno(), sourceLabelCode, targetLabelCode, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site, buNo, warehouseId, locationCode);
logger.info("标签拆分事务子记录生成完成,事务单号: {}", transHeader.getTransno());
} catch (Exception e) {
logger.error("生成标签合并事务记录失败", e);
@ -299,10 +302,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
/**
* 生成标签拆分事务明细记录
*/
private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode,
String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String site) {
private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode,
String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String site, String buNo) {
logger.info("开始生成标签拆分事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>();
// 原标签明细记录减少数量
@ -315,7 +317,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
originalDetail.setBatchno(batchNo);
originalDetail.setDirection("-"); // 减少方向
originalDetail.setOrderref1(originalLabelCode); // 原标签条码
originalDetail.setOrderref2(partNo); // 物料编码
originalDetail.setOrderref2(buNo); // bu
originalDetail.setOrderref3(batchNo); // 批次号
originalDetail.setRemark("标签拆分 - 原标签减少数量: " + splitQuantity);
transDetailList.add(originalDetail);
@ -330,26 +332,65 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
newDetail.setBatchno(batchNo);
newDetail.setDirection("+"); // 增加方向
newDetail.setOrderref1(newLabelCode); // 新标签条码
newDetail.setOrderref2(partNo); // 物料编码
newDetail.setOrderref2(buNo); // bu
newDetail.setOrderref3(batchNo); // 批次号
newDetail.setRemark("标签拆分 - 新标签增加数量: " + splitQuantity);
transDetailList.add(newDetail);
// 批量保存事务明细记录
if (!transDetailList.isEmpty()) {
boolean success = transDetailService.saveBatch(transDetailList);
if (!success) {
throw new RuntimeException("标签拆分事务明细记录保存失败");
}
logger.info("标签拆分事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
boolean success = transDetailService.saveBatch(transDetailList);
if (!success) {
throw new RuntimeException("标签拆分事务明细记录保存失败");
}
logger.info("标签拆分事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
}
/**
* 添加子明细数据
*/
private void addSubTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, String batchNo, Float splitQuantity,
Float remainingQuantity, String site, String buNo, String warehouseId, String locationCode) {
logger.info("开始添加子明细数据,事务单号: {}", transNo);
List<TransDetailSub> subDetailList = new ArrayList<>();
TransDetailSub originalSubDetail = new TransDetailSub();
originalSubDetail.setSite(site);
originalSubDetail.setTransNo(transNo);
originalSubDetail.setItemNo(1.0);
originalSubDetail.setSubNo(originalLabelCode);
originalSubDetail.setSubQty(Double.valueOf(splitQuantity));
originalSubDetail.setDirection("-");
originalSubDetail.setOrderRef2(buNo);
originalSubDetail.setOrderRef3(batchNo);
originalSubDetail.setOrderRef4(warehouseId);
originalSubDetail.setOrderRef5(locationCode);
subDetailList.add(originalSubDetail);
TransDetailSub newSubDetail = new TransDetailSub();
newSubDetail.setSite(site);
newSubDetail.setTransNo(transNo);
newSubDetail.setItemNo(2.0);
newSubDetail.setSubNo(newLabelCode);
newSubDetail.setSubQty(Double.valueOf(splitQuantity));
newSubDetail.setDirection("+");
newSubDetail.setOrderRef2(buNo);
newSubDetail.setOrderRef3(batchNo);
newSubDetail.setOrderRef4(warehouseId);
newSubDetail.setOrderRef5(locationCode);
subDetailList.add(newSubDetail);
boolean success = transDetailSubService.saveBatch(subDetailList);
if (!success) {
throw new RuntimeException("子明细记录保存失败");
}
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size());
}
/**
* 生成标签合并事务明细记录
*/
private void generateMergeTransactionDetails(String transNo, String sourceLabelCode, String targetLabelCode,
String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String site) {
String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String site, String buNo) {
logger.info("开始生成标签合并事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>();
@ -364,7 +405,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
targetDetail.setBatchno(batchNo);
targetDetail.setDirection("-"); // 减少方向
targetDetail.setOrderref1(targetLabelCode); // 目标标签条码
targetDetail.setOrderref2(partNo); // 物料编码
targetDetail.setOrderref2(buNo); // bu
targetDetail.setOrderref3(batchNo); // 批次号
targetDetail.setRemark("标签合并 - 目标标签被合并,数量: " + targetQuantity);
transDetailList.add(targetDetail);
@ -379,18 +420,56 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
sourceDetail.setBatchno(batchNo);
sourceDetail.setDirection("+"); // 增加方向
sourceDetail.setOrderref1(sourceLabelCode); // 源标签条码
sourceDetail.setOrderref2(partNo); // 物料编码
sourceDetail.setOrderref2(buNo); // bu
sourceDetail.setOrderref3(batchNo); // 批次号
sourceDetail.setRemark("标签合并 - 源标签获得合并后总数量: " + mergedQuantity);
transDetailList.add(sourceDetail);
// 批量保存事务明细记录
if (!transDetailList.isEmpty()) {
boolean success = transDetailService.saveBatch(transDetailList);
if (!success) {
throw new RuntimeException("标签合并事务明细记录保存失败");
}
logger.info("标签合并事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
boolean success = transDetailService.saveBatch(transDetailList);
if (!success) {
throw new RuntimeException("标签合并事务明细记录保存失败");
}
logger.info("标签合并事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
}
/**
* 添加子明细数据
*/
private void addSubTransactionDetails2(String transNo, String sourceLabelCode, String targetLabelCode, String batchNo, Float sourceQuantity,
Float targetQuantity, Float mergedQuantity, String site, String buNo, String warehouseId, String locationCode) {
logger.info("开始添加子明细数据,事务单号: {}", transNo);
List<TransDetailSub> subDetailList = new ArrayList<>();
TransDetailSub originalSubDetail = new TransDetailSub();
originalSubDetail.setSite(site);
originalSubDetail.setTransNo(transNo);
originalSubDetail.setItemNo(1.0);
originalSubDetail.setSubNo(sourceLabelCode);
originalSubDetail.setSubQty(Double.valueOf(targetQuantity));
originalSubDetail.setDirection("-");
originalSubDetail.setOrderRef2(buNo);
originalSubDetail.setOrderRef3(batchNo);
originalSubDetail.setOrderRef4(warehouseId);
originalSubDetail.setOrderRef5(locationCode);
subDetailList.add(originalSubDetail);
TransDetailSub newSubDetail = new TransDetailSub();
newSubDetail.setSite(site);
newSubDetail.setTransNo(transNo);
newSubDetail.setItemNo(2.0);
newSubDetail.setSubNo(targetLabelCode);
newSubDetail.setSubQty(Double.valueOf(mergedQuantity));
newSubDetail.setDirection("+");
newSubDetail.setOrderRef2(buNo);
newSubDetail.setOrderRef3(batchNo);
newSubDetail.setOrderRef4(warehouseId);
newSubDetail.setOrderRef5(locationCode);
subDetailList.add(newSubDetail);
boolean success = transDetailSubService.saveBatch(subDetailList);
if (!success) {
throw new RuntimeException("子明细记录保存失败");
}
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size());
}
}

12
src/main/java/com/gaotao/modules/propertyChange/controller/PropertyChangeController.java

@ -2,6 +2,7 @@ package com.gaotao.modules.propertyChange.controller;
import com.gaotao.common.utils.R;
import com.gaotao.modules.propertyChange.service.PropertyChangeService;
import com.gaotao.modules.toolman.entity.Location;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -10,6 +11,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
@ -44,11 +46,9 @@ public class PropertyChangeController {
if (labelCode == null || labelCode.trim().isEmpty()) {
return R.error("标签条码不能为空");
}
if (site == null || site.trim().isEmpty()) {
return R.error("站点不能为空");
}
if (warehouseId == null || warehouseId.trim().isEmpty()) {
return R.error("仓库ID不能为空");
}
@ -115,6 +115,14 @@ public class PropertyChangeController {
if (!hasLocationChange && !hasProductionDateChange && !hasExpiryDateChange) {
return R.error("没有检测到属性变动,请修改后再提交");
}
if (hasLocationChange) {
// 如果变动了库位检查新库位是否存在且可用
List<Location> locationInfo = propertyChangeService.getLocationInfoByWarehouseId(site, buNo, warehouseId, newLocationId);
if (locationInfo.isEmpty()) {
return R.error("新库位不存在或不属于当前仓库,请检查库位号");
}
}
// 设置操作人这里可以从session或token中获取
params.put("operator", "PDA用户"); // 实际项目中应该获取真实用户信息

4
src/main/java/com/gaotao/modules/propertyChange/dao/PropertyChangeMapper.java

@ -2,9 +2,11 @@ package com.gaotao.modules.propertyChange.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gaotao.modules.propertyChange.entity.PropertyChangeEntity;
import com.gaotao.modules.toolman.entity.Location;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
@ -33,4 +35,6 @@ public interface PropertyChangeMapper extends BaseMapper<PropertyChangeEntity> {
* @return 更新行数
*/
int updateStockProperties(@Param("params") Map<String, Object> params);
List<Location> getLocationInfoByWarehouseId(@Param("site") String site, @Param("buNo") String buNo, @Param("warehouseId") String warehouseId, @Param("newLocationId") String newLocationId);
}

4
src/main/java/com/gaotao/modules/propertyChange/service/PropertyChangeService.java

@ -2,7 +2,9 @@ package com.gaotao.modules.propertyChange.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gaotao.modules.propertyChange.entity.PropertyChangeEntity;
import com.gaotao.modules.toolman.entity.Location;
import java.util.List;
import java.util.Map;
/**
@ -28,4 +30,6 @@ public interface PropertyChangeService extends IService<PropertyChangeEntity> {
* @return 操作结果
*/
boolean savePropertyChange(Map<String, Object> params);
List<Location> getLocationInfoByWarehouseId(String site, String buNo, String warehouseId, String newLocationId);
}

162
src/main/java/com/gaotao/modules/propertyChange/service/impl/PropertyChangeServiceImpl.java

@ -5,10 +5,13 @@ import com.gaotao.common.utils.DateUtils;
import com.gaotao.modules.propertyChange.dao.PropertyChangeMapper;
import com.gaotao.modules.propertyChange.entity.PropertyChangeEntity;
import com.gaotao.modules.propertyChange.service.PropertyChangeService;
import com.gaotao.modules.toolman.entity.Location;
import com.gaotao.modules.trans.entity.TransDetail;
import com.gaotao.modules.trans.entity.TransDetailDto;
import com.gaotao.modules.trans.entity.TransDetailSub;
import com.gaotao.modules.trans.entity.TransHeader;
import com.gaotao.modules.trans.service.TransDetailService;
import com.gaotao.modules.trans.service.TransDetailSubService;
import com.gaotao.modules.trans.service.TransHeaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -19,11 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 属性变动服务实现类
@ -45,6 +44,9 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
@Autowired
private TransDetailService transDetailService;
@Autowired
private TransDetailSubService transDetailSubService;
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
@ -114,8 +116,7 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
}
// 3. 生成标签变动事务记录
generatePropertyChangeTransaction(site, buNo, warehouseId, labelCode, partNo, batchNo, quantity,
oldLocationId, newLocationId, oldProductionDateStr, newProductionDateStr, oldExpiryDateStr, newExpiryDateStr);
generatePropertyChangeTransaction(site, buNo, warehouseId, labelCode, partNo, batchNo, quantity, oldLocationId, newLocationId, oldProductionDateStr, newProductionDateStr, oldExpiryDateStr, newExpiryDateStr);
logger.info("属性变动保存成功,标签条码: {}", labelCode);
return true;
@ -125,6 +126,12 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
}
}
@Override
public List<Location> getLocationInfoByWarehouseId(String site, String buNo, String warehouseId, String newLocationId) {
List<Location> locationList = propertyChangeMapper.getLocationInfoByWarehouseId(site, buNo, warehouseId, newLocationId);
return locationList;
}
/**
* 生成属性变动事务记录
*/
@ -150,25 +157,37 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
transDetailDto.setSite(site);
transDetailDto.setRemark(changeDesc.toString());
transDetailDto.setOrderref1(labelCode); // 标签条码
transDetailDto.setOrderref2(partNo); // 物料编码
transDetailDto.setOrderref3(warehouseId); // 仓库ID
// 使用TransHeaderService的genTrans方法生成事务头
// PC = Property Change 属性变动
TransHeader transHeader = transHeaderService.genTrans(transDetailDto, "PC", warehouseId, buNo);
if (transHeader == null) {
throw new RuntimeException("生成属性变动事务头记录失败");
}
logger.info("属性变动事务头记录生成成功,事务单号: {}", transHeader.getTransno());
List<Map<String, Object>> labels = new ArrayList<>();
Map<String, Object> labelInfo = new HashMap<>();
labelInfo.put("labelCode", labelCode);
labelInfo.put("partNo", partNo);
labelInfo.put("batchNo", batchNo);
labelInfo.put("quantity", quantity);
labelInfo.put("oldLocationId", oldLocationId);
labelInfo.put("newLocationId", newLocationId);
labelInfo.put("oldProductionDate", oldProductionDate);
labelInfo.put("newProductionDate", newProductionDate);
labelInfo.put("oldExpiryDate", oldExpiryDate);
labelInfo.put("newExpiryDate", newExpiryDate);
labels.add(labelInfo);
// 生成事务明细记录
generatePropertyChangeTransactionDetails(transHeader.getTransno(), labelCode, partNo, batchNo, quantity,
oldLocationId, newLocationId, oldProductionDate, newProductionDate, oldExpiryDate, newExpiryDate, site);
List<TransDetail> transDetailList = generatePropertyChangeTransactionDetails2(transHeader.getTransno(), labels, site, buNo);
logger.info("属性变动事务记录生成完成,事务单号: {}, 标签条码: {}", transHeader.getTransno(), labelCode);
logger.info("属性变动事务记录生成完成,事务单号: {}, 标签条码: {}",
transHeader.getTransno(), labelCode);
// 生成事务子明细记录
addSubTransactionDetails(transHeader.getTransno(), labels, site, buNo, transDetailList, warehouseId);
logger.info("属性变动事务子记录生成完成,事务单号: {}", transHeader.getTransno());
} catch (Exception e) {
logger.error("生成属性变动事务记录失败", e);
@ -179,11 +198,11 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
/**
* 生成属性变动事务明细记录
*/
private void generatePropertyChangeTransactionDetails(String transNo, String labelCode, String partNo, String batchNo, Float quantity,
String oldLocationId, String newLocationId, String oldProductionDate, String newProductionDate, String oldExpiryDate, String newExpiryDate, String site) {
private void generatePropertyChangeTransactionDetails(String transNo, String labelCode, String partNo, String batchNo, Float quantity, String oldLocationId, String newLocationId,
String oldProductionDate, String newProductionDate, String oldExpiryDate, String newExpiryDate, String site) {
logger.info("开始生成属性变动事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>();
double itemNo = 1.0; // 行号从1开始
// 库位变动明细
@ -246,4 +265,113 @@ public class PropertyChangeServiceImpl extends ServiceImpl<PropertyChangeMapper,
logger.info("属性变动事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
}
}
/**
* 生成属性变动事务明细记录
*/
private List<TransDetail> generatePropertyChangeTransactionDetails2(String transNo, List<Map<String, Object>> labels ,String site, String buNo) {
logger.info("开始生成属性变动事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>();
// 统计每个partNo的数量总和
Map<String, BigDecimal> partNoQuantityMap = new HashMap<>();
for (Map<String, Object> label : labels) {
String partNo = (String) label.get("partNo");
Object quantityObj = label.get("quantity");
BigDecimal quantity = BigDecimal.ZERO;
if (quantityObj != null) {
if (quantityObj instanceof BigDecimal) {
quantity = (BigDecimal) quantityObj;
} else if (quantityObj instanceof Number) {
quantity = new BigDecimal(quantityObj.toString());
} else {
quantity = new BigDecimal(quantityObj.toString());
}
}
partNoQuantityMap.put(partNo, partNoQuantityMap.getOrDefault(partNo, BigDecimal.ZERO).add(quantity));
}
// 构建合并后的事务明细
double itemNo = 1.0;
for (Map.Entry<String, BigDecimal> entry : partNoQuantityMap.entrySet()) {
String partNo = entry.getKey();
BigDecimal quantity = entry.getValue();
TransDetail transDetail = new TransDetail();
transDetail.setSite(site);
transDetail.setTransno(transNo);
transDetail.setItemno(itemNo);
transDetail.setPartno(partNo);
transDetail.setTransqty(quantity);
transDetail.setDirection("M");
transDetail.setOrderref2(buNo);
transDetail.setRemark("属性变动");
transDetailList.add(transDetail);
itemNo += 1.0;
}
// 批量保存事务明细记录
if (!transDetailList.isEmpty()) {
boolean success = transDetailService.saveBatch(transDetailList);
if (!success) {
throw new RuntimeException("事务明细记录保存失败");
}
logger.info("事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size());
}
return transDetailList;
}
/**
* 添加子明细数据
* @param transNo 事务单号
* @param labels 标签列表
* @param site 站点
* @param buNo 业务单元
* @param transDetailList 明细记录列表用于获取正确的 itemNo
*/
private void addSubTransactionDetails(String transNo, List<Map<String, Object>> labels, String site, String buNo, List<TransDetail> transDetailList, String warehouseId) {
logger.info("开始添加子明细数据,事务单号: {}, 标签数量: {}", transNo, labels.size());
// 创建 partNo itemNo 的映射
Map<String, Double> partNoToItemNoMap = new HashMap<>();
for (TransDetail detail : transDetailList) {
partNoToItemNoMap.put(detail.getPartno(), detail.getItemno());
}
List<TransDetailSub> subDetailList = new ArrayList<>();
for (Map<String, Object> label : labels) {
String partNo = (String) label.get("partNo");
String labelCode = (String) label.get("labelCode"); // subNo
String batchNo = (String) label.get("batchNo"); // orderRef3
String locationCode = (label.get("newLocationId") != null && !((String)label.get("newLocationId")).isEmpty()) ? (String) label.get("newLocationId") : (String) label.get("oldLocationId"); // orderRef5
Object quantityObj = label.get("quantity"); // 标签数量
Double quantity = quantityObj == null ? 0.0 : Double.parseDouble(quantityObj.toString());
// 获取对应的明细 itemNo
Double itemNo = partNoToItemNoMap.get(partNo);
if (itemNo == null) {
logger.warn("未找到物料 {} 对应的明细记录,跳过该标签 {}", partNo, labelCode);
continue;
}
TransDetailSub transDetail = new TransDetailSub();
transDetail.setSite(site);
transDetail.setTransNo(transNo);
transDetail.setItemNo(itemNo); // 使用明细的 itemNo
transDetail.setSubNo(labelCode);
transDetail.setSubQty(quantity);
transDetail.setDirection("M");
transDetail.setOrderRef2(buNo);
transDetail.setOrderRef3(batchNo);
transDetail.setOrderRef4(warehouseId);
transDetail.setOrderRef5(locationCode);
subDetailList.add(transDetail);
}
if (!subDetailList.isEmpty()) {
boolean success = transDetailSubService.saveBatch(subDetailList);
if (!success) {
throw new RuntimeException("子明细记录保存失败");
}
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size());
}
}
}

1
src/main/resources/mapper/labelSplitMerge/LabelSplitMergeMapper.xml

@ -16,6 +16,7 @@
s.roll_no as labelCode,
s.in_qty as labelQuantity,
s.status,
s.status_tb as statusTb,
s.manufacture_date as productionDate,
s.expired_date as expiryDate,
s.freeze_flag as freezeFlag,

10
src/main/resources/mapper/propertyChange/PropertyChangeMapper.xml

@ -51,4 +51,14 @@
AND warehouse_id = #{params.warehouseId}
</update>
<select id="getLocationInfoByWarehouseId" resultType="com.gaotao.modules.toolman.entity.Location">
SELECT
site,
bu_no as buNo,
wareHouseID as warehouseId,
locationID as locationId,
locationName as locationName
FROM location
WHERE site = #{site} and bu_no = #{buNo} and wareHouseID = #{warehouseId} and locationID = #{newLocationId} AND Active = 'Y'
</select>
</mapper>
Loading…
Cancel
Save