|
|
|
@ -28,9 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.text.DecimalFormat;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -561,6 +559,10 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public int updateMesBaseBarcodeInfo(MesBaseBarcodeInfo mesBaseBarcodeInfo) {
|
|
|
|
|
MesBaseBarcodeInfo dbBaseBarcodeInfo = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoByBarcodeId(mesBaseBarcodeInfo.getBarcodeId());
|
|
|
|
|
if (StringUtils.isNotEmpty(dbBaseBarcodeInfo.getPrintFlag()) && dbBaseBarcodeInfo.getPrintFlag().equals(MesConstants.MES_BARCODE_PRINT_FLAG_YES)) {
|
|
|
|
|
throw new ServiceException("此条码已经打印,不能修改");
|
|
|
|
|
}
|
|
|
|
|
mesBaseBarcodeInfo.setUpdateBy(SecurityUtils.getUsername());
|
|
|
|
|
mesBaseBarcodeInfo.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
return mesBaseBarcodeInfoMapper.updateMesBaseBarcodeInfo(mesBaseBarcodeInfo);
|
|
|
|
@ -721,7 +723,7 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
|
|
|
|
|
|
|
|
|
|
PrintContentVo printMaterialSpec = new PrintContentVo();
|
|
|
|
|
printMaterialSpec.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_SPEC);
|
|
|
|
|
if(StringUtils.isNotEmpty(mesBaseBarcodeInfo.getBarcodeSpec())) {
|
|
|
|
|
if (StringUtils.isNotEmpty(mesBaseBarcodeInfo.getBarcodeSpec())) {
|
|
|
|
|
printMaterialSpec.setValue(mesBaseBarcodeInfo.getBarcodeSpec().replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
|
|
|
|
|
}
|
|
|
|
|
printMaterialSpec.setType(PrintContentVo.TYPE_TEXT);
|
|
|
|
@ -1606,6 +1608,220 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改合并采购订单生成原材料条码
|
|
|
|
|
*
|
|
|
|
|
* @param mesBaseBarcodeInfo 条码信息
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public int updateMergeRawBarcode(MesBaseBarcodeInfo mesBaseBarcodeInfo) {
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
String userName = SecurityUtils.getUsername();
|
|
|
|
|
String barcodeInfo = mesBaseBarcodeInfo.getBarcodeInfo();
|
|
|
|
|
|
|
|
|
|
//修改后的合并信息
|
|
|
|
|
List<MesSaleOrderRelate> mesSaleOrderRelateList = mesBaseBarcodeInfo.getMesSaleOrderRelateList();
|
|
|
|
|
|
|
|
|
|
//数据库中的合并信息
|
|
|
|
|
MesSaleOrderRelate querySaleOrderRelateByBarcodeInfo = new MesSaleOrderRelate();
|
|
|
|
|
querySaleOrderRelateByBarcodeInfo.setBarcodeInfo(barcodeInfo);
|
|
|
|
|
List<MesSaleOrderRelate> dbMesSaleOrderRelateList = mesSaleOrderRelateMapper.selectMesSaleOrderRelateList(querySaleOrderRelateByBarcodeInfo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将两个列表的 id 转换为 HashSet
|
|
|
|
|
HashSet<String> set1Ids = mesSaleOrderRelateList.stream()
|
|
|
|
|
.map(MesSaleOrderRelate::getBindIndex)
|
|
|
|
|
.collect(Collectors.toCollection(HashSet::new));
|
|
|
|
|
HashSet<String> set2Ids = dbMesSaleOrderRelateList.stream()
|
|
|
|
|
.map(MesSaleOrderRelate::getBindIndex)
|
|
|
|
|
.collect(Collectors.toCollection(HashSet::new));
|
|
|
|
|
|
|
|
|
|
// 计算交集
|
|
|
|
|
set1Ids.retainAll(set2Ids);
|
|
|
|
|
|
|
|
|
|
// 从 dbMesSaleOrderRelateList 中移除交集部分 (移除后就是删除的信息)
|
|
|
|
|
dbMesSaleOrderRelateList.removeIf(item -> set1Ids.contains(item.getBindIndex()));
|
|
|
|
|
|
|
|
|
|
// 从 mesSaleOrderRelateList 中移除交集部分(移除后就是要增加信息)
|
|
|
|
|
mesSaleOrderRelateList.removeIf(item -> set1Ids.contains(item.getBindIndex()));
|
|
|
|
|
|
|
|
|
|
//获取此条码信息物料信息的bom信息
|
|
|
|
|
MesMaterialBom queryVirtualMaterialBom = new MesMaterialBom();
|
|
|
|
|
queryVirtualMaterialBom.setParentId(0L);
|
|
|
|
|
queryVirtualMaterialBom.setMaterialId(mesBaseBarcodeInfo.getMaterialId());
|
|
|
|
|
List<MesMaterialBom> virtualMaterialBoms = mesMaterialBomMapper.selectMesMaterialBomList(queryVirtualMaterialBom);
|
|
|
|
|
|
|
|
|
|
if (virtualMaterialBoms == null || virtualMaterialBoms.isEmpty()) {
|
|
|
|
|
throw new ServiceException("此条码物料信息生产bom有误");
|
|
|
|
|
}
|
|
|
|
|
if (virtualMaterialBoms.size() > 2) {
|
|
|
|
|
throw new ServiceException("此条码的物料信息生产bom多于1个");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MesMaterialBom virtualMaterialBom = virtualMaterialBoms.get(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//删除绑定信息
|
|
|
|
|
this.handleToDeletedMesSaleOrderRelates(dbMesSaleOrderRelateList, mesBaseBarcodeInfo, virtualMaterialBom,
|
|
|
|
|
userName, currentDate);
|
|
|
|
|
|
|
|
|
|
//新增的绑定信息
|
|
|
|
|
StringBuilder errorMsgBuilder = this.handleInsertSaleOrderRelates(mesSaleOrderRelateList,mesBaseBarcodeInfo, virtualMaterialBom, userName, currentDate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (errorMsgBuilder.length() > 0) {
|
|
|
|
|
throw new ServiceException(errorMsgBuilder.toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//生成条码
|
|
|
|
|
mesBaseBarcodeInfo.setUpdateBy(userName);
|
|
|
|
|
mesBaseBarcodeInfo.setUpdateTime(currentDate);
|
|
|
|
|
|
|
|
|
|
mesBaseBarcodeInfoMapper.updateMesBaseBarcodeInfo(mesBaseBarcodeInfo);
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void handleToDeletedMesSaleOrderRelates(List<MesSaleOrderRelate> toDeteledSaleOrderList, MesBaseBarcodeInfo mesBaseBarcodeInfo,
|
|
|
|
|
MesMaterialBom virtualMaterialBom, String userName, Date currentDate) {
|
|
|
|
|
for (MesSaleOrderRelate toDeletedSaleOrderRelate : toDeteledSaleOrderList) {
|
|
|
|
|
Long relateSaleOrderId = toDeletedSaleOrderRelate.getRelateSaleOrderId();
|
|
|
|
|
MesSaleOrder saleOrder = mesSaleOrderMapper.selectMesSaleOrderBySaleOrderId(relateSaleOrderId);
|
|
|
|
|
Long erpMaterialId = saleOrder.getMaterialId();
|
|
|
|
|
|
|
|
|
|
//获取销售订单的物料,parent是条码信息虚拟物料ID的bom信息
|
|
|
|
|
MesMaterialBom queryMaterialBom = new MesMaterialBom();
|
|
|
|
|
queryMaterialBom.setErpMaterialId(erpMaterialId);
|
|
|
|
|
queryMaterialBom.setParentId(virtualMaterialBom.getMaterialBomId());
|
|
|
|
|
List<MesMaterialBom> mesMaterialBoms = mesMaterialBomMapper.selectMesMaterialBomList(queryMaterialBom);
|
|
|
|
|
if (mesMaterialBoms == null || mesMaterialBoms.isEmpty()) {
|
|
|
|
|
throw new ServiceException("删除的物料信息生产bom有误");
|
|
|
|
|
}
|
|
|
|
|
if (mesMaterialBoms.size() > 2) {
|
|
|
|
|
throw new ServiceException("删除的物料信息生产bom多于1个");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MesMaterialBom mesMaterialBom = mesMaterialBoms.get(0);
|
|
|
|
|
mesMaterialBom.setParentId(0L);
|
|
|
|
|
mesMaterialBom.setAncestors("0");
|
|
|
|
|
mesMaterialBom.setUpdateTime(currentDate);
|
|
|
|
|
mesMaterialBom.setUpdateBy(userName);
|
|
|
|
|
mesMaterialBomMapper.updateMesMaterialBom(mesMaterialBom);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Long orderBindId = toDeletedSaleOrderRelate.getOrderBindId();
|
|
|
|
|
MesOrderBind dbOrderBind = mesOrderBindMapper.selectMesOrderBindByOrderBindId(orderBindId);
|
|
|
|
|
//更新采购订单和销售订单绑定信息的条码数量
|
|
|
|
|
dbOrderBind.setBarcodeAmount(dbOrderBind.getBarcodeAmount().subtract(BigDecimal.ONE));
|
|
|
|
|
dbOrderBind.setUpdateTime(currentDate);
|
|
|
|
|
dbOrderBind.setUpdateBy(userName);
|
|
|
|
|
|
|
|
|
|
mesOrderBindMapper.updateMesOrderBind(dbOrderBind);
|
|
|
|
|
|
|
|
|
|
mesSaleOrderRelateMapper.deleteMesSaleOrderRelateBySaleOrderRelateId(toDeletedSaleOrderRelate.getSaleOrderRelateId());
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public StringBuilder handleInsertSaleOrderRelates(List<MesSaleOrderRelate> toInsertedSaleOrderRelateList,MesBaseBarcodeInfo baseBarcodeInfo,
|
|
|
|
|
MesMaterialBom virtualMaterialBom, String userName, Date currentDate) {
|
|
|
|
|
StringBuilder errorMsgBuilder = new StringBuilder();
|
|
|
|
|
List<MesMaterialBom> toUpdatedMaterialBoms = new ArrayList<>();
|
|
|
|
|
for (MesSaleOrderRelate mesSaleOrderRelate : toInsertedSaleOrderRelateList) {
|
|
|
|
|
if (mesSaleOrderRelate.getOrderAmount() == null || mesSaleOrderRelate.getOrderAmount().compareTo(BigDecimal.ONE) != 0) {
|
|
|
|
|
throw new ServiceException("请选择采购数量为1的采购订单信息");
|
|
|
|
|
}
|
|
|
|
|
Long orderBindId = mesSaleOrderRelate.getOrderBindId();
|
|
|
|
|
MesOrderBind dbOrderBind = mesOrderBindMapper.selectMesOrderBindByOrderBindId(orderBindId);
|
|
|
|
|
if (dbOrderBind.getBindAmount().compareTo(BigDecimal.ONE) != 0) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:订单绑定数量需要为1;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
if (dbOrderBind.getBarcodeAmount().compareTo(BigDecimal.ONE) >= 0) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:已经生成条码,不能再次选择;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Long relateSaleOrderId = mesSaleOrderRelate.getRelateSaleOrderId();
|
|
|
|
|
MesSaleOrderRelate querySaleOrderRelate = new MesSaleOrderRelate();
|
|
|
|
|
querySaleOrderRelate.setRelateSaleOrderId(relateSaleOrderId);
|
|
|
|
|
List<MesSaleOrderRelate> mesSaleOrderRelates = mesSaleOrderRelateMapper.selectMesSaleOrderRelateList(querySaleOrderRelate);
|
|
|
|
|
//把之前的barcodeinfo关联的排除掉
|
|
|
|
|
if (mesSaleOrderRelates != null && !mesSaleOrderRelates.isEmpty()) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:销售订单已经合并关联过;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MesSaleOrder saleOrder = mesSaleOrderMapper.selectMesSaleOrderBySaleOrderId(relateSaleOrderId);
|
|
|
|
|
BigDecimal saleOrderAmount = saleOrder.getOrderAmount();
|
|
|
|
|
BigDecimal availableAmount = mesSaleOrderRelate.getRelateSaleOrderAmount();
|
|
|
|
|
|
|
|
|
|
if (availableAmount.compareTo(BigDecimal.ONE) != 0) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:需要选择可用数量为1的信息;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!saleOrder.getIsRelease().equals(MesConstants.MES_SALE_ORDER_IS_RELEASE_TO_PUBLISH)) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:销售订单已经发布生产任务,不能合并;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (saleOrderAmount.compareTo(availableAmount) != 0) {
|
|
|
|
|
errorMsgBuilder.append(String.format("序号%s:需要选择销售订单数量为1的信息;", mesSaleOrderRelate.getIndex()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//purchaseorder可以不用判断,主要看生成条码的数量
|
|
|
|
|
|
|
|
|
|
Long erpMaterialId = saleOrder.getMaterialId();
|
|
|
|
|
MesMaterialBom queryMaterialBom = new MesMaterialBom();
|
|
|
|
|
queryMaterialBom.setErpMaterialId(erpMaterialId);
|
|
|
|
|
queryMaterialBom.setActiveFlag(MesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_NORMAL);
|
|
|
|
|
queryMaterialBom.setParentId(0L);
|
|
|
|
|
List<MesMaterialBom> mesMaterialBoms = mesMaterialBomMapper.selectMesMaterialBomList(queryMaterialBom);
|
|
|
|
|
if (mesMaterialBoms == null || mesMaterialBoms.isEmpty()) {
|
|
|
|
|
errorMsgBuilder.append("序号").append(mesSaleOrderRelate.getIndex()).append(":销售订单成品没有配置bom信息[成品编号:")
|
|
|
|
|
.append(mesSaleOrderRelate.getProductCode()).append("成品名称:").append(mesSaleOrderRelate.getProductName())
|
|
|
|
|
.append("成品规格").append(mesSaleOrderRelate.getProductSpec()).append("; ");
|
|
|
|
|
} else if (mesMaterialBoms.size() > 1) {
|
|
|
|
|
errorMsgBuilder.append("序号").append(mesSaleOrderRelate.getIndex()).append(":销售订单成品配置bom信息多余一条[成品编号:")
|
|
|
|
|
.append(mesSaleOrderRelate.getProductCode()).append("成品名称:").append(mesSaleOrderRelate.getProductName())
|
|
|
|
|
.append("成品规格").append(mesSaleOrderRelate.getProductSpec()).append("; ");
|
|
|
|
|
} else {
|
|
|
|
|
MesMaterialBom mesMaterialBom = mesMaterialBoms.get(0);
|
|
|
|
|
toUpdatedMaterialBoms.add(mesMaterialBom);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新采购订单和销售订单绑定信息的条码数量
|
|
|
|
|
dbOrderBind.setBarcodeAmount(dbOrderBind.getBarcodeAmount().add(availableAmount));
|
|
|
|
|
dbOrderBind.setUpdateTime(currentDate);
|
|
|
|
|
dbOrderBind.setUpdateBy(userName);
|
|
|
|
|
|
|
|
|
|
mesOrderBindMapper.updateMesOrderBind(dbOrderBind);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//将新增的采购订单对应销售订单的成品bom信息的parentid改为此条码信息虚拟物料ID
|
|
|
|
|
toUpdatedMaterialBoms.forEach(umb -> {
|
|
|
|
|
umb.setParentId(virtualMaterialBom.getMaterialBomId());
|
|
|
|
|
umb.setAncestors(umb.getAncestors() + "," + umb.getParentId());
|
|
|
|
|
umb.setTopFlag(MesConstants.MES_MATERIAL_BOM_TOP_FLAG_NO);
|
|
|
|
|
umb.setUpdateBy(userName);
|
|
|
|
|
umb.setUpdateTime(currentDate);
|
|
|
|
|
mesMaterialBomMapper.updateMesMaterialBom(umb);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
toInsertedSaleOrderRelateList.forEach(msor -> {
|
|
|
|
|
msor.setSaleOrderId(baseBarcodeInfo.getSaleOrderId());
|
|
|
|
|
msor.setBarcodeInfo(baseBarcodeInfo.getBarcodeInfo());
|
|
|
|
|
msor.setVirtualMaterialId(baseBarcodeInfo.getMaterialId());
|
|
|
|
|
});
|
|
|
|
|
mesSaleOrderRelateMapper.batchMesSaleOrderRelate(toInsertedSaleOrderRelateList);
|
|
|
|
|
|
|
|
|
|
return errorMsgBuilder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// public MesPurchaseOrder insertVirtualPurchaseOrder(Long materialId, String barcodeInfo, BigDecimal sumOrderAmount,
|
|
|
|
|
// List<MesPurchaseOrderRelate> mesPurchaseOrderRelates,String userName, Date currentDate) {
|
|
|
|
|
// MesPurchaseOrder virtualPurchaseOrder = new MesPurchaseOrder();
|
|
|
|
|