From 3a1ecd62e277b42e4194cd29e288bbd5369ef4a1 Mon Sep 17 00:00:00 2001 From: jun Date: Wed, 19 Jun 2024 20:53:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=B8=85=E5=8D=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/ext/mes/api/base/IMesBomService.java | 7 + .../ext/mes/api/base/IMesWorkOrderService.java | 10 + .../mes/api/base/IMesWorkOrderToWmsService.java | 21 + .../controller/base/MesWorkOrderController.java | 10 +- .../apiservice/serviceimpl/base/MesBomService.java | 93 ++- .../base/MesEquipmentProdParamCfgServiceImpl.java | 2 +- .../serviceimpl/base/MesWorkCenterService.java | 1 + .../serviceimpl/base/MesWorkOrderService.java | 722 ++++++++++++++------- .../base/MesWorkOrderToWmsServiceImpl.java | 44 ++ .../ext/mes/apiservice/utils/BeanMapUtilsExt.java | 47 ++ 10 files changed, 710 insertions(+), 247 deletions(-) create mode 100644 modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderToWmsService.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToWmsServiceImpl.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/utils/BeanMapUtilsExt.java diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesBomService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesBomService.java index d13d438..6df084a 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesBomService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesBomService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.api.base; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.mes.bean.MesBom; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; import io.swagger.annotations.ApiOperation; import java.util.List; @@ -32,5 +33,11 @@ public interface IMesBomService extends IBaseMesService { @ApiOperation(value = "查询BOM树结构") ListPager queryMesDataTree(MesBom bom, Pager pager); + @ApiOperation(value = "查询bom信息") + List findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion); + + @ApiOperation(value = "递归查询bom数据") + List findBomList(String organizeCode, MesPart mesPart, String bomVersion); + } diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java index a161f1f..f59b7cc 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.api.base; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.model.MesWorkOrderModel; import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; +import io.swagger.annotations.ApiOperation; import java.util.List; @@ -13,15 +14,24 @@ import java.util.List; */ public interface IMesWorkOrderService extends IBaseMesService { + @ApiOperation("工单导入") + void saveMesWorkOrderExcel(List mesWorkOrderList); + + @ApiOperation(value = "生产报工") void doProductReport(MesWorkOrder mesWorkOrder); + @ApiOperation(value = "生产报工(武汉)") void doProductReportExt(MesWorkOrder mesWorkOrder); + @ApiOperation("非排序工单导入前删除") void deleteUnSortOrder(String userName, String organizeCode, List partNoList); + @ApiOperation("汇总工单给SAP") List sumMesWorkOrderQtyToSap(String organizeCode); + @ApiOperation("ccscTest") List queryMesWorkOrderProcessToSap(String organizeCode); + @ApiOperation("反向冲销") void doReportWorkReversal(WmsProductModel model); } diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderToWmsService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderToWmsService.java new file mode 100644 index 0000000..e394bb4 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderToWmsService.java @@ -0,0 +1,21 @@ +package cn.estsh.i3plus.ext.mes.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesBom; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToWms; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @Description : 工单发送给WMS数据 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/18 19:58 + * @Modify: + **/ +public interface IMesWorkOrderToWmsService extends IBaseMesService { + + @ApiOperation(value = "发送工单给Wms") + List saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List mesBomList); +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java index 978458d..f20e677 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java @@ -29,6 +29,7 @@ import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @Api(description = "工单主页面") @@ -72,7 +73,7 @@ public class MesWorkOrderController extends BaseMesController { mesWorkOrder.setOrganizeCode(organizeCode); mesWorkOrderList.add(mesWorkOrder); } - baseService.insertBatch(mesWorkOrderList); + mesWorkOrderService.saveMesWorkOrderExcel(mesWorkOrderList); return ResultBean.success("导入成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException e) { @@ -86,6 +87,10 @@ public class MesWorkOrderController extends BaseMesController { @ApiOperation(value = "生产报工") public ResultBean doProductReport(@RequestBody MesWorkOrder mesWorkOrder) { try { + //属性校验 + if(Objects.isNull(mesWorkOrder.getNum()) || mesWorkOrder.getNum() <= 0){ + MesException.throwMesBusiException("数量不能小于等于0"); + } //新增初始化 mesWorkOrder.setOrganizeCode(AuthUtil.getOrganizeCode()); ConvertBean.serviceModelInitialize(mesWorkOrder, AuthUtil.getSessionUser().getUserName()); @@ -106,6 +111,9 @@ public class MesWorkOrderController extends BaseMesController { ValidatorBean.checkNotNull(mesWorkOrder.getId(),"工单id不能为空"); ValidatorBean.checkNotNull(mesWorkOrder.getNum(),"报工数量不能为空"); ValidatorBean.checkNotZero(mesWorkOrder.getNum(),"报工数量不能为0"); + if(Objects.isNull(mesWorkOrder.getNum()) || mesWorkOrder.getNum() <= 0){ + MesException.throwMesBusiException("数量不能小于等于0"); + } mesWorkOrder.setOrganizeCode(AuthUtilExt.getOrganizeCode()); ConvertBean.serviceModelUpdate(mesWorkOrder, AuthUtilExt.getUserName()); //新增初始化 diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBomService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBomService.java index bd6b7ed..3b75ed8 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBomService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBomService.java @@ -1,7 +1,10 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.IMesBomService; +import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException; import cn.estsh.i3plus.ext.mes.pojo.model.MesBomTreeModel; +import cn.estsh.i3plus.platform.common.tool.MathOperation; +import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.platform.common.util.MesConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; @@ -10,14 +13,18 @@ import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesBom; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.util.ValidatorBean; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.List; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; @Service @Slf4j @@ -80,6 +87,88 @@ public class MesBomService extends BaseMesService implements IMesBomServ return new ListPager<>(resultList, pager); } + public List findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean); + DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean); + DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); + List mesBoms = baseRDao.findByHqlWhere(ddlPackBean); + if (org.apache.commons.collections.CollectionUtils.isEmpty(mesBoms)) { + MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion); + } + MesBom next = mesBoms.iterator().next(); + //如果存在多个bomCode取最新的一个 + return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode()); + } + + @Override + public List findBomList(String organizeCode, MesPart mesPart, String bomVersion) { + List bomData = new ArrayList<>(); + // 递归展开 BOM + expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData); + + if (bomData.size() == 0) { + MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo()); + } + + Iterator iterator = bomData.iterator(); + while (iterator.hasNext()) { + MesBom item = iterator.next(); + // 删除虚零件 + if (Objects.equals("X", item.getPartType())) { + iterator.remove(); + } else { + item.setPartNo(mesPart.getPartNo()); + item.setPartName(mesPart.getPartName()); + } + } + + Map summaryBomMap = new HashMap<>(); + + for (MesBom item : bomData) { + String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(), + item.getItemPartNo().toUpperCase().trim()); + if (!summaryBomMap.containsKey(key)) { + summaryBomMap.put(key, item); + } else { + MesBom tempItem = summaryBomMap.get(key); + // 子零件重复的累加数量 + tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty())); + } + } + // 返回汇总数据 + return new ArrayList<>(summaryBomMap.values()); + } + + /** + * 递归展开 BOM + * + * @param organizeCode 工厂代码 + * @param partNo 父零件号 + * @param bomData 存放 BOM 数据的集合 + */ + private void expendBomChild(String organizeCode, String partNo, String bomVersion, List bomData) { + List bomDetails = this.findMesBomByPartNoAndBomVersion(partNo, organizeCode, bomVersion); + + for (MesBom item : bomDetails) { + MesBom newItem = new MesBom(); + BeanUtils.copyProperties(item, newItem); + // 处理父零件用量不为 1 的情况 + if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) { + Double rateQty = MathOperation.div(newItem.getItemQty(), newItem.getQty(), 8); + newItem.setQty(1.0); + newItem.setItemQty(rateQty); + } + // 加入到 BOM 清单中 + bomData.add(newItem); + // 如果有子阶,继续递归 + if (Objects.equals("X", item.getPartType())) { + expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData); + } + } + } + /** * 递归查询bom * diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesEquipmentProdParamCfgServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesEquipmentProdParamCfgServiceImpl.java index 710f3f3..a6063f6 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesEquipmentProdParamCfgServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesEquipmentProdParamCfgServiceImpl.java @@ -28,7 +28,7 @@ public class MesEquipmentProdParamCfgServiceImpl extends BaseMesService implemen DdlPreparedPack.getStringLikerPack(bean.getErpWorkCenter(), "erpWorkCenter", packBean); DdlPreparedPack.getStringLikerPack(bean.getWorkCenterCode(), "workCenterCode", packBean); DdlPreparedPack.getStringLikerPack(bean.getWorkCenterName(), "workCenterName", packBean); + DdlPreparedPack.getNumEqualPack(bean.getCenterType(), "centerType", packBean); } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index 8fe242e..449c558 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.*; import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesWorkOrderDao; import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException; +import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanMapUtilsExt; import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.apiservice.util.DateUtil; @@ -30,8 +31,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -47,7 +46,7 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesProductVersionRepository mesProductVersionRDao; @Autowired - private MesBomRepository mesBomRDao; + private IMesBomService mesBomService; @Autowired private IMesProductOffLineService mesProductOffLineService; @Autowired @@ -76,6 +75,12 @@ public class MesWorkOrderService extends BaseMesService implements private IMesPartSapService mesPartSapService; @Autowired private MesMoveRepository mesMoveRDao; + @Autowired + private IMesWorkOrderToWmsService mesWorkOrderToWmsService; + @Autowired + private MesPartSapRepository mesPartSapRDao; + @Autowired + private MesPartProdGroupRepository mesPartProdGroupRDao; @Override public MesWorkOrder insert(MesWorkOrder bean) { @@ -89,36 +94,33 @@ public class MesWorkOrderService extends BaseMesService implements DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"produceSeq"}, orderPackBean); MesWorkOrder result = baseRDao.getByProperty(orderPackBean); + //生成工单号 + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); + List orderList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList(); + String orderNo = orderList.get(0); + orderPackBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean); + if (baseRDao.isExitByHql(orderPackBean)) { + MesException.throwMesBusiException("单号流水码生成重复"); + } - GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); //若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1 if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) { Long produceSeq = 0L; if (null != result && result.getProduceSeq() != null) { produceSeq = (long) Math.toIntExact(result.getProduceSeq()); } - - //生成工单号 - genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); - List resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList(); - MesWorkOrder copyMesWorkOrder = new MesWorkOrder(); BeanUtils.copyProperties(bean, copyMesWorkOrder); copyMesWorkOrder.setProduceSeq((long) (produceSeq + 1)); - copyMesWorkOrder.setQty(1D); - copyMesWorkOrder.setWorkOrderNo(resultList.get(0)); + copyMesWorkOrder.setWorkOrderNo(orderNo); copyMesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); ConvertBean.serviceModelInitialize(copyMesWorkOrder, bean.getCreateUser()); baseRDao.insert(copyMesWorkOrder); workOrderLogService.saveMesWorkOrderLog(copyMesWorkOrder); return bean; - } else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { - //生成工单号 - genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); - } else { - //生成工单号 - genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); + } else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.BTO.getValue()) { Long produceSeq = 0L; if (null != result && result.getProduceSeq() != null) { produceSeq = (long) Math.toIntExact(result.getProduceSeq()); @@ -127,10 +129,8 @@ public class MesWorkOrderService extends BaseMesService implements GenSerialNoModel orderSeqSerialNoModel = new GenSerialNoModel(MesCommonConstant.ORDER_NO_BTO_SEQ); List resultList = syncFuncService.syncSerialNo(orderSeqSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList(); bean.setWorkOrderSeq(resultList.get(0)); -// bean.setOrderSeq(Integer.parseInt(resultList.get(0))); } - List resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList(); - bean.setWorkOrderNo(resultList.get(0)); + bean.setWorkOrderNo(orderNo); bean.setQty(bean.getQty()); bean.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); ConvertBean.serviceModelInitialize(bean, bean.getCreateUser()); @@ -153,9 +153,9 @@ public class MesWorkOrderService extends BaseMesService implements //更新工单数量 if (!bean.getQty().equals(result.getQty()) && result.getWorkOrderStatus() > MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { MesException.throwMesBusiException(String.format("工单状态为【%s】不允许更新工单数量", MesExtEnumUtil.ORDER_STATUS.valueOfDescription(result.getWorkOrderStatus()))); - }else{ + } else { result.setQty(bean.getQty()); - result.setUnCompleteQty(MathOperation.sub(bean.getQty(),result.getReportedQty())); + result.setUnCompleteQty(MathOperation.sub(bean.getQty(), result.getReportedQty())); } } //在加工的工单不能修改物料信息 @@ -167,7 +167,16 @@ public class MesWorkOrderService extends BaseMesService implements } //更新状态 - if(result.getWorkOrderStatus().intValue() != bean.getWorkOrderStatus().intValue()){ + if (result.getWorkOrderStatus().intValue() != bean.getWorkOrderStatus().intValue()) { + if (result.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.CREATE.getValue() + && bean.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { + //校验物料生产版本是否存在 + MesProductVersion mesProductVersion = checkMesProductVersion(result); + //获取bom信息 + List bomList = mesBomService.findMesBomByPartNoAndBomVersion(result.getPartNo(), result.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + //发送工单信息给WMS + mesWorkOrderToWmsService.insertBatch(mesWorkOrderToWmsService.saveMesWorkOrderToWms(result, bomList)); + } result.setWorkOrderStatus(bean.getWorkOrderStatus()); } //修改工单,工单标识需要改为未同步 @@ -196,10 +205,11 @@ public class MesWorkOrderService extends BaseMesService implements DdlPreparedPack.getStringSmallerPack(bean.getEndTimeEnd(), "planEndTime", packBean); packBean.setOrderByStr(" order by createDatetime desc,workOrderSeq asc,workOrderNo asc "); } + @Override protected void setBeanModel(List mesWorkOrderList) { //查询工作中心名称 - if(CollectionUtils.isEmpty(mesWorkOrderList)){ + if (CollectionUtils.isEmpty(mesWorkOrderList)) { return; } MesWorkOrder mesWorkOrder = mesWorkOrderList.iterator().next(); @@ -207,10 +217,10 @@ public class MesWorkOrderService extends BaseMesService implements DdlPreparedPack.getInPackList(mesWorkOrderList.stream().map(MesWorkOrder::getWorkCenterCode).filter(workCenterCode -> !StringUtils.isEmpty(workCenterCode)).distinct().collect(Collectors.toList()), "workCenterCode", ddlPackBean); List mesWorkCenterList = mesWorkCenterRDao.findByHqlWhere(ddlPackBean); if (CollectionUtils.isEmpty(mesWorkCenterList)) { - return; + return; } Map mesWorkCenterMap = mesWorkCenterList.stream().collect(Collectors.toMap(MesWorkCenter::getWorkCenterCode, MesWorkCenter::getWorkCenterName)); - mesWorkOrderList.forEach(t->{ + mesWorkOrderList.forEach(t -> { t.setWorkCenterName(mesWorkCenterMap.get(t.getWorkCenterCode())); }); @@ -223,7 +233,6 @@ public class MesWorkOrderService extends BaseMesService implements ValidatorBean.checkNotNull(item.getWorkOrderType(), "工单类型不能为空"); ValidatorBean.checkNotNull(item.getWorkCenterCode(), "产线不能为空"); ValidatorBean.checkNotNull(item.getPartNo(), "零件号不能为空"); - ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空"); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); @@ -233,30 +242,36 @@ public class MesWorkOrderService extends BaseMesService implements MesException.throwMesBusiException("产线【%s】不存在", item.getWorkCenterCode()); } item.setErpWorkCenter(mesWorkCenter.getErpWorkCenter()); + //客户物料信息 + if (StringUtil.isEmpty(item.getCustPartNo())) { + getCustomerPart(item); + } //校验标识 //若工单类型为排序 + List saveMesWorkOrderToWms = new ArrayList<>(); if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) { ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空"); + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.SORT.getValue())) { + MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } //若工单类型为排序 标识为 N E P S - if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag())&& - !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag())&& - !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag())&& - !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())){ + if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) { MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】、【%s】 标识", - item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue() - , MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(), - MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(), - MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue())); - } - if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) { - packPlanTime(item); - } - //生产版本为空 - if (StringUtil.isEmpty(item.getProductVersion())) { - MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter); - item.setProductVersion(mesProductVersion.getProductVersion()); + item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue() + , MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(), + MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(), + MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue())); } - + //获取生产版本 + MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter); + item.setProductVersion(mesProductVersion.getProductVersion()); + //获取bom信息 + List bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); if (!StringUtil.isEmpty(item.getVinCode())) { //校验vin号是否重复 ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); @@ -265,51 +280,68 @@ public class MesWorkOrderService extends BaseMesService implements MesException.throwMesBusiException("vin号【%s】重复", item.getVinCode()); } } - + //排序工单数量为1 + item.setQty(1d); //校验零件生产组信息 - if (StringUtil.isEmpty(item.getPartProdGroupCode())) { - MesPartProdGroup mesPartProdGroup = getMesPartProdGroup(item); + MesPartProdGroup mesPartProdGroup = null; + if(StringUtil.isEmpty(item.getPartProdGroupCode())){ + mesPartProdGroup = getMesPartProdGroup(item); item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode()); item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName()); + }else{ + ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(item.getPartProdGroupCode(), "partProdGroupCode", ddlPackBean); + mesPartProdGroup = mesPartProdGroupRDao.getByProperty(ddlPackBean); } - //排序工单数量为1 - item.setQty(1d); - item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()); + //自动发布 + if (CommonEnumUtil.VALID == mesPartProdGroup.getIsAutoRelease()) { + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + //发送工单信息给WMS + saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList)); + } else { + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()); + } } else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空"); ValidatorBean.checkNotNull(item.getProductVersion(), "生产版本不能为空"); - if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag())&& - !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag())&& - !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())){ + if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) { + MesException.throwMesBusiException("生产数量不能小于等于0"); + } + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) { + MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } + if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) { MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】 标识", item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue() , MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue())); } - if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) { - packPlanTime(item); - } - if (StringUtil.isEmpty(item.getCustPartNo())) { - getCustomerPart(item); - } //校验物料生产版本是否存在 - checkMesProductVersion(item, mesWorkCenter); + MesProductVersion mesProductVersion = checkMesProductVersion(item); + //获取bom信息 + List bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + //发送工单信息给WMS + saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList)); + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); } else { ValidatorBean.checkNotNull(item.getPlanStartTime(), "计划开始时间不能为空"); ValidatorBean.checkNotNull(item.getPlanEndTime(), "计划结束时间不能为空"); - //生产版本为空 - if (StringUtil.isEmpty(item.getProductVersion())) { - MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter); - item.setProductVersion(mesProductVersion.getProductVersion()); - } - if (StringUtil.isEmpty(item.getCustPartNo())) { - getCustomerPart(item); + if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) { + MesException.throwMesBusiException("生产数量不能小于等于0"); } - //拼接 -// item.setPlanStartTime(item.getPlanStartTime() + " " + "00:00:00"); -// item.setPlanEndTime(item.getPlanEndTime() + " " + "23:59:59"); + //获取生产版本 + MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter); + item.setProductVersion(mesProductVersion.getProductVersion()); + //获取bom信息 + List bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + //发送工单信息给WMS + saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList)); item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); } //物料名称不存在,从物料信息中获取 @@ -321,7 +353,10 @@ public class MesWorkOrderService extends BaseMesService implements item.setProduceTime(TimeTool.getToday()); } item.setUnCompleteQty(item.getQty()); - + //保存发送WMS数据 + if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) { + mesWorkOrderToWmsService.insertBatch(saveMesWorkOrderToWms); + } } private MesPartProdGroup getMesPartProdGroup(MesWorkOrder item) { @@ -344,19 +379,20 @@ public class MesWorkOrderService extends BaseMesService implements MesCustomerPart customerPart = mesCustomerPartRDao.getByProperty(ddlPackBean); if (!Objects.isNull(customerPart)) { item.setCustPartNo(customerPart.getCustPartNo()); - item.setCustomerPartName(customerPart.getCustPartName()); } } - private void checkMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) { + private MesProductVersion checkMesProductVersion(MesWorkOrder item) { DdlPackBean ddlPackBean; ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean); - DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean); + DdlPreparedPack.getStringEqualPack(item.getErpWorkCenter(), "workCenterCode", ddlPackBean); DdlPreparedPack.getStringEqualPack(item.getProductVersion(), "productVersion", ddlPackBean); - if (!mesProductVersionRDao.isExitByHql(ddlPackBean)) { - MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), mesWorkCenter.getWorkCenterCode(), item.getProductVersion()); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesProductVersion)) { + MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion()); } + return mesProductVersion; } private MesProductVersion getMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) { @@ -373,8 +409,7 @@ public class MesWorkOrderService extends BaseMesService implements return mesProductVersion; } - private void packPlanTime(MesWorkOrder item) { - DdlPackBean ddlPackBean; + private void packPlanTime(MesWorkOrder item, Map> mesShiftMap) { ValidatorBean.checkNotNull(item.getPlanDate(), "计划日期不能为空"); ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空"); //工单导入:计划时间不能为当天之前日期 @@ -388,10 +423,8 @@ public class MesWorkOrderService extends BaseMesService implements MesException.throwMesBusiException("计划日期格式异常"); } //查询班次信息 - ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(item.getWorkCenterCode(), "workCenterCode", ddlPackBean); - DdlPreparedPack.getStringEqualPack(item.getShiftCode(), "shiftCode", ddlPackBean); - MesShift mesShift = mesShiftRDao.getByProperty(ddlPackBean); + List mesShifts = mesShiftMap.get(item.getWorkCenterCode() + item.getShiftCode()); + MesShift mesShift = CollectionUtils.isEmpty(mesShifts) ? null : mesShifts.iterator().next(); if (Objects.isNull(mesShift)) { MesException.throwMesBusiException("产线【%s】班次【%s】信息不存在", item.getWorkCenterCode(), item.getShiftCode()); } @@ -411,6 +444,313 @@ public class MesWorkOrderService extends BaseMesService implements } @Override + public void saveMesWorkOrderExcel(List mesWorkOrderList) { + MesWorkOrder next = mesWorkOrderList.iterator().next(); + //属性校验&字段填充 + List mesWorkOrderToWmsList = checkData(mesWorkOrderList, next.getOrganizeCode()); + //生成工单号 + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); + List orderList = syncFuncService.syncSerialNo(genSerialNoModel, next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList(); + //查询工单是否已经存在 + DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(next.getOrganizeCode()); + DdlPreparedPack.getInPackList(orderList, "workOrderNo", orderPackBean); + if (baseRDao.isExitByHql(orderPackBean)) { + MesException.throwMesBusiException("单号已存在"); + } + //BTO序号 + List seqList = new ArrayList<>(); + if (MesExtEnumUtil.ORDER_TYPE.BTO.getValue() == next.getWorkOrderType()) { + GenSerialNoModel orderSeqSerialNoModel = new GenSerialNoModel(MesCommonConstant.ORDER_NO_BTO_SEQ); + seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel, next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList(); + } + List mesWorkOrderLogList = new ArrayList<>(); + int index = 0; + for (MesWorkOrder item : mesWorkOrderList) { + //获取相同类型 相同标识 生产序号最大值的 + orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); + DdlPreparedPack.getNumEqualPack(item.getWorkOrderStatus(), "workOrderStatus", orderPackBean); + DdlPreparedPack.getStringEqualPack(item.getOrderFlag(), "orderFlag", orderPackBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"produceSeq"}, orderPackBean); + MesWorkOrder result = baseRDao.getByProperty(orderPackBean); + + //若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1 + if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) { + Long produceSeq = 0L; + if (null != result && result.getProduceSeq() != null) { + produceSeq = (long) Math.toIntExact(result.getProduceSeq()); + } + MesWorkOrder copyMesWorkOrder = new MesWorkOrder(); + BeanUtils.copyProperties(item, copyMesWorkOrder); + copyMesWorkOrder.setProduceSeq((long) (produceSeq + 1)); + copyMesWorkOrder.setWorkOrderNo(orderList.get(index)); + copyMesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser()); + index++; + baseRDao.insert(copyMesWorkOrder); + //保存记录 + MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); + BeanUtils.copyProperties(item, workOrderLog, "id"); + mesWorkOrderLogList.add(workOrderLog); + continue; + } else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.BTO.getValue()) { + Long produceSeq = 0L; + if (null != result && result.getProduceSeq() != null) { + produceSeq = (long) Math.toIntExact(result.getProduceSeq()); + } + item.setProduceSeq(produceSeq + 1); + item.setWorkOrderSeq(seqList.get(index)); + } + item.setWorkOrderNo(orderList.get(index)); + item.setQty(item.getQty()); + item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelInitialize(item, item.getCreateUser()); + baseRDao.insert(item); + index++; + //保存记录 + MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); + BeanUtils.copyProperties(item, workOrderLog, "id"); + mesWorkOrderLogList.add(workOrderLog); + } + //保存发送WMS数据 + if (CollectionUtils.isNotEmpty(mesWorkOrderToWmsList)) { + mesWorkOrderToWmsService.insertBatch(mesWorkOrderToWmsList); + } + //保存工单记录 + if (CollectionUtils.isNotEmpty(mesWorkOrderLogList)) { + workOrderLogService.insertBatch(mesWorkOrderLogList); + } + } + + private List checkData(List mesWorkOrderList, String organizeCode) { + String nowDate = TimeTool.getNowTime(true); + //获取产线信息 + List workCenterCodeList = mesWorkOrderList.stream().map(MesWorkOrder::getWorkCenterCode).distinct().collect(Collectors.toList()); + Map workCenterMap = BeanMapUtilsExt.getBeanMap(mesWorkCenterRDao, "workCenterCode", organizeCode, workCenterCodeList, "产线信息"); + //获取班次信息 + List mesShiftList = getMesShifts(organizeCode, nowDate, workCenterCodeList); + Map> mesShiftMap = mesShiftList.stream().collect(Collectors.groupingBy(t -> t.getWorkCenterCode() + t.getShiftCode())); + //获取生产版本 + List partNoList = mesWorkOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList()); + List mesProductVersionList = BeanMapUtilsExt.getBeanList(mesProductVersionRDao, "partNo", organizeCode, partNoList, "生产版本信息"); + Map> mesProductVersionMap = mesProductVersionList.stream().collect(Collectors.groupingBy(t -> t.getWorkCenterCode() + t.getPartNo())); + //客户物料信息 + Map mesCustomerPartMap = null; + try { + mesCustomerPartMap = BeanMapUtilsExt.getBeanMap(mesCustomerPartRDao, "erpPartNo", organizeCode, partNoList, "客户物料信息"); + } catch (Exception e) { + mesCustomerPartMap = null; + } + //获取物料信息 + Map mesPartSapMap = BeanMapUtilsExt.getBeanMap(mesPartSapRDao, "partNo", organizeCode, partNoList, "物料信息"); + //获取获取vin号 + List vinCodeList = mesWorkOrderList.stream().map(MesWorkOrder::getVinCode).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(vinCodeList)) { + List mesWorkOrders = null; + try { + mesWorkOrders = BeanMapUtilsExt.getBeanList(baseRDao, "vinCode", organizeCode, vinCodeList, "生产工单"); + } catch (Exception e) { + } + if (!CollectionUtils.isEmpty(mesWorkOrders)) { + List list = mesWorkOrders.stream().map(MesWorkOrder::getVinCode).collect(Collectors.toList()); + MesException.throwMesBusiException("vin号【%s】已存在", list); + } + } + + //BOM信息 + Map> mesBomMap = new HashMap<>(); + //vin号 + Map vinCodeMap = new HashMap<>(); + //零件生产组 + Map mesPartProdGroupMap = new HashMap<>(); + //发送wms数据 + List mesWorkOrderToWmsList = new ArrayList<>(); + for (MesWorkOrder item : mesWorkOrderList) { + // 数据校验 + ValidatorBean.checkNotNull(item.getWorkOrderType(), "工单类型不能为空"); + ValidatorBean.checkNotNull(item.getWorkCenterCode(), "产线不能为空"); + ValidatorBean.checkNotNull(item.getPartNo(), "零件号不能为空"); + + ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空"); + MesWorkCenter mesWorkCenter = workCenterMap.get(item.getWorkCenterCode()); + + if (Objects.isNull(mesWorkCenter)) { + MesException.throwMesBusiException("产线【%s】不存在", item.getWorkCenterCode()); + } + item.setErpWorkCenter(mesWorkCenter.getErpWorkCenter()); + //获取客户物料信息 + MesCustomerPart customerPart = null == mesCustomerPartMap ? null : mesCustomerPartMap.get(item.getPartNo()); + if (!Objects.isNull(customerPart)) { + item.setCustPartNo(customerPart.getCustPartNo()); + item.setCustomerPartName(customerPart.getCustPartName()); + } + //物料名称不存在,从物料信息中获取 + MesPartSap mesPart = mesPartSapMap.get(item.getPartNo()); + if (Objects.isNull(mesPart)) { + MesException.throwMesBusiException("物料【%s】信息不存在", item.getPartNo()); + } + item.setPartName(mesPart.getPartName()); + item.setUnit(mesPart.getUnit()); + //生产时间新增取当天 + if (StringUtil.isEmpty(item.getProduceTime())) { + item.setProduceTime(TimeTool.getToday()); + } + //若工单类型为排序 + if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) { + ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空"); + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.SORT.getValue())) { + MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } + //若工单类型为排序 标识为 N E P S + if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) { + MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】、【%s】 标识", + item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue() + , MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(), + MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(), + MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue())); + } + //计划开始时间,计划结束时间拼接 + packPlanTime(item, mesShiftMap); + //获取生产版本 + List mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo()); + if (CollectionUtils.isEmpty(mesProductVersions)) { + MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(), + mesWorkCenter.getErpWorkCenter()); + } + MesProductVersion mesProductVersion = mesProductVersions.iterator().next(); + item.setProductVersion(mesProductVersion.getProductVersion()); + //发送工单信息给WMS + List mesBomList = null; + if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) { + mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList()); + } else { + //获取bom信息 + mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList); + } + + if (!StringUtil.isEmpty(item.getVinCode())) { + if (vinCodeMap.containsKey(item.getVinCode())) { + MesException.throwMesBusiException("vin号【%s】重复", item.getVinCode()); + } else { + vinCodeMap.put(item.getVinCode(), item.getVinCode()); + } + } + + //校验零件生产组信息 + MesPartProdGroup mesPartProdGroup; + if (mesPartProdGroupMap.containsKey(item.getWorkCenterCode() + item.getPartNo())) { + mesPartProdGroup = mesPartProdGroupMap.get(item.getWorkCenterCode() + item.getPartNo()); + } else { + mesPartProdGroup = getMesPartProdGroup(item); + mesPartProdGroupMap.put(item.getWorkCenterCode() + item.getPartNo(), mesPartProdGroup); + } + item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode()); + item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName()); + //排序工单数量为1 + item.setQty(1d); + //自动发布 + if (CommonEnumUtil.VALID == mesPartProdGroup.getIsAutoRelease()) { + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + //发送工单信息给WMS + mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList)); + } else { + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()); + } + } else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { + ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空"); + ValidatorBean.checkNotNull(item.getProductVersion(), "生产版本不能为空"); + if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) { + MesException.throwMesBusiException("生产数量不能小于等于0"); + } + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) { + MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } + if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) && + !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) { + MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】 标识", + item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue() + , MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(), + MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue())); + } + //拼接时间 + packPlanTime(item, mesShiftMap); + //校验物料生产版本是否存在 + List mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo()); + if (CollectionUtils.isEmpty(mesProductVersions)) { + MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(), + mesWorkCenter.getErpWorkCenter()); + } + List versionList = mesProductVersions.stream().filter(t -> Objects.equals(item.getProductVersion(), t.getProductVersion())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(versionList)) { + MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), mesWorkCenter.getWorkCenterCode(), item.getProductVersion()); + } + MesProductVersion mesProductVersion = versionList.iterator().next(); + //获取bom信息 + List mesBomList = null; + if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) { + mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList()); + } else { + //获取bom信息 + mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList); + } + //发送工单信息给WMS + mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList)); + + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + } else { + ValidatorBean.checkNotNull(item.getPlanStartTime(), "计划开始时间不能为空"); + ValidatorBean.checkNotNull(item.getPlanEndTime(), "计划结束时间不能为空"); + if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) { + MesException.throwMesBusiException("生产数量不能小于等于0"); + } + //获取生产版本 + List mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo()); + if (CollectionUtils.isEmpty(mesProductVersions)) { + MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(), + mesWorkCenter.getErpWorkCenter()); + } + MesProductVersion mesProductVersion = mesProductVersions.iterator().next(); + item.setProductVersion(mesProductVersion.getProductVersion()); + //获取bom信息 + List mesBomList = null; + if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) { + mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList()); + } else { + //获取bom信息 + mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList); + } + //发送工单信息给WMS + mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList)); + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + } + item.setUnCompleteQty(item.getQty()); + } + return mesWorkOrderToWmsList; + } + + private List getMesShifts(String organizeCode, String nowDate, List workCenterCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workCenterCodeList, "workCenterCode", packBean); + DdlPreparedPack.getStringSmallerPack(nowDate, "beginDate", packBean); + DdlPreparedPack.getStringBiggerPack(nowDate, "endDate", packBean); + List mesShiftList = mesShiftRDao.findByHqlWhere(packBean); + if (CollectionUtils.isEmpty(mesShiftList)) { + MesException.throwMesBusiException("有效期内的班次信息不存在"); + } + return mesShiftList; + } + + @Override public void doProductReport(MesWorkOrder mesWorkOrder) { MesWorkOrder mesWorkOrderDb = baseRDao.getById(mesWorkOrder.getId()); if (Objects.isNull(mesWorkOrderDb)) { @@ -428,7 +768,7 @@ public class MesWorkOrderService extends BaseMesService implements //获取生产版本 MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); //物料+生产版本获取bom信息 - List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + List mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //报工类型 if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) { mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrderDb.getReportedQty())); @@ -456,85 +796,15 @@ public class MesWorkOrderService extends BaseMesService implements updateMesWorkOrder(mesWorkOrderDb); //生成条码 - List resultList = getStringList(mesWorkOrder); + String sn = getStringList(mesWorkOrder); //保存数据 List mesProductOffLineList = new ArrayList<>(); - for (String sn : resultList) { - for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); - } + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); } mesProductOffLineService.insertBatch(mesProductOffLineList); } - - public List getBomList(String organizeCode, MesPart mesPart, String bomVersion) { - List bomData = new ArrayList<>(); - // 递归展开 BOM - expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData); - - if (bomData.size() == 0) { - MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo()); - } - - Iterator iterator = bomData.iterator(); - while (iterator.hasNext()) { - MesBom item = iterator.next(); - // 删除虚零件 - if (Objects.equals("X", item.getPartType())) { - iterator.remove(); - } else { - item.setPartNo(mesPart.getPartNo()); - item.setPartName(mesPart.getPartName()); - } - } - - Map summaryBomMap = new HashMap<>(); - - for (MesBom item : bomData) { - String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(), - item.getItemPartNo().toUpperCase().trim()); - if (!summaryBomMap.containsKey(key)) { - summaryBomMap.put(key, item); - } else { - MesBom tempItem = summaryBomMap.get(key); - // 子零件重复的累加数量 - tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty())); - } - } - // 返回汇总数据 - return new ArrayList<>(summaryBomMap.values()); - } - - - /** - * 递归展开 BOM - * - * @param organizeCode 工厂代码 - * @param partNo 父零件号 - * @param bomData 存放 BOM 数据的集合 - */ - private void expendBomChild(String organizeCode, String partNo, String bomVersion, List bomData) { - List bomDetails = getMesBoms(partNo, organizeCode, bomVersion); - - for (MesBom item : bomDetails) { - MesBom newItem = new MesBom(); - BeanUtils.copyProperties(item, newItem); - // 处理父零件用量不为 1 的情况 - if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) { - Double rateQty = divide(newItem.getItemQty(), newItem.getQty(), 8); - newItem.setQty(1.0); - newItem.setItemQty(rateQty); - } - // 加入到 BOM 清单中 - bomData.add(newItem); - // 如果有子阶,继续递归 - if (Objects.equals("X", item.getPartType())) { - expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData); - } - } - } - @Override public void doProductReportExt(MesWorkOrder mesWorkOrderNew) { MesWorkOrder mesWorkOrder = baseRDao.getById(mesWorkOrderNew.getId()); @@ -572,9 +842,9 @@ public class MesWorkOrderService extends BaseMesService implements //获取生产版本 MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder); //物料+生产版本获取bom信息 - List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + List mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //生成条码 - List resultList = getStringList(mesWorkOrderNew); + String sn = getStringList(mesWorkOrderNew); //保存数据 List mesProductOffLineList = new ArrayList<>(); List mesMoveList = new ArrayList<>(); @@ -596,7 +866,7 @@ public class MesWorkOrderService extends BaseMesService implements isReport = true; isMove = true; } else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { - customerSupplyMove(mesWorkOrder, mesProductVersion, mesBoms, resultList, mesProductOffLineList, mesMoveList); + customerSupplyMove(mesWorkOrderNew, mesProductVersion, mesBoms, sn, mesProductOffLineList, mesMoveList); } else { log.info("工单{}排序加工规则报工类型未维护", mesWorkOrder.getWorkOrderNo()); return; @@ -605,29 +875,26 @@ public class MesWorkOrderService extends BaseMesService implements if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()) { //查询SAP物料信息 MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); - for (String sn : resultList) { - //成品汇报 - if (isReport) { - for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); - } - } - //成品移库 - if (isMove) { - MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d, sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue()); - move.setMatnr(mesWorkOrder.getPartNo()); - mesMoveList.add(move); + //成品汇报 + if (isReport) { + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false)); } } + //成品移库 + if (isMove) { + MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), mesWorkOrderNew.getNum(), sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue()); + move.setMatnr(mesWorkOrder.getPartNo()); + mesMoveList.add(move); + } } } else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) { MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); - if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()) { - for (String sn : resultList) { - for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false)); - } + if (MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == mesProdRuleNoSortCfg.getReportType()) { + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false)); } + } } else { log.info("工单{}排序规则不属于排序工单和非排序工单", mesWorkOrder.getWorkOrderNo()); @@ -666,7 +933,7 @@ public class MesWorkOrderService extends BaseMesService implements //获取生产版本 MesProductVersion mesProductVersion = getMesProductVersion(model); //获取bom - List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + List mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //保存数据 List mesProductOffLineList = new ArrayList<>(); for (MesBom mesBom : mesBoms) { @@ -690,6 +957,7 @@ public class MesWorkOrderService extends BaseMesService implements newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); newMesProductOffLine.setItemQty(MathOperation.mul(model.getQty(), mesBom.getItemQty())); + newMesProductOffLine.setWorkCenterCode(mesProductVersion.getWorkCenterCode()); newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); newMesProductOffLine.setQty(model.getQty()); @@ -718,7 +986,7 @@ public class MesWorkOrderService extends BaseMesService implements return mesProductVersion; } - private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, List resultList, List mesProductOffLineList, List mesMoveList) { + private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, String sn, List mesProductOffLineList, List mesMoveList) { boolean isItemMove; boolean isItemReport; MesMoveRule moveRule; @@ -730,39 +998,37 @@ public class MesWorkOrderService extends BaseMesService implements Map> mesPartSapMap = getPartSapMap(mesWorkOrder, itemPartNoList); //获取物料信息 Map> itemPartMap = getItemPartMap(mesWorkOrder, itemPartNoList); - for (String sn : resultList) { - for (MesBom mesBom : mesBoms) { - isItemReport = false; - isItemMove = false; - moveRule = null; - if (itemPartMap.containsKey(mesBom.getItemPartNo())) { - MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); - if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) { - moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next(); - if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) { - isItemMove = true; - isItemReport = true; - } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) { - isItemReport = true; - } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) { - isItemMove = true; - } + for (MesBom mesBom : mesBoms) { + isItemReport = false; + isItemMove = false; + moveRule = null; + if (itemPartMap.containsKey(mesBom.getItemPartNo())) { + MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); + if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) { + moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next(); + if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) { + isItemMove = true; + isItemReport = true; + } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) { + isItemReport = true; + } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) { + isItemMove = true; } } - //汇报 - if (isItemReport) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true)); - } - //移库 - if (isItemMove) { - MesPartSap mesPartSap = null; - if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) { - mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next(); - } - MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue()); - move.setMatnr(mesBom.getItemPartNo()); - mesMoveList.add(move); + } + //汇报 + if (isItemReport) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true)); + } + //移库 + if (isItemMove) { + MesPartSap mesPartSap = null; + if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) { + mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next(); } + MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue()); + move.setMatnr(mesBom.getItemPartNo()); + mesMoveList.add(move); } } } @@ -790,26 +1056,12 @@ public class MesWorkOrderService extends BaseMesService implements return mesProdRuleSortCfg; } - private List getStringList(MesWorkOrder mesWorkOrder) { + private String getStringList(MesWorkOrder mesWorkOrder) { GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.REPORT_SN); - List resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), mesWorkOrder.getNum()).getResultList(); - return resultList; + List resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), 1).getResultList(); + return resultList.iterator().next(); } - private List getMesBoms(String partNo, String organizeCode, String bomVersion) { - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); - DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean); - DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean); - DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); - List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); - if (CollectionUtils.isEmpty(mesBoms)) { - MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion); - } - MesBom next = mesBoms.iterator().next(); - //如果存在多个bomCode取最新的一个 - return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode()); - } private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); @@ -836,10 +1088,10 @@ public class MesWorkOrderService extends BaseMesService implements newMesProductOffLine.setReportSn(sn); newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); - newMesProductOffLine.setItemQty(mesBom.getItemQty()); + newMesProductOffLine.setItemQty(MathOperation.mul(mesWorkOrder.getNum(), mesBom.getItemQty())); newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); - newMesProductOffLine.setQty(1d); + newMesProductOffLine.setQty(Double.valueOf(mesWorkOrder.getNum())); newMesProductOffLine.setBomVersion(mesWorkOrder.getProductVersion()); newMesProductOffLine.setSerialNumber(sn); newMesProductOffLine.setUnit(mesBom.getUnit()); @@ -893,20 +1145,4 @@ public class MesWorkOrderService extends BaseMesService implements return move; } - /** - * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。 - * - * @param dividend 被除数 - * @param divisor 除数 - * @param scale 表示表示需要精确到小数点以后几位。 - * @return 两个参数的商 - */ - public Double divide(Double dividend, Double divisor, Integer scale) { - if (scale < 0) { - throw new IllegalArgumentException("The scale must be a positive integer or zero"); - } - BigDecimal b1 = new BigDecimal(Double.toString(dividend)); - BigDecimal b2 = new BigDecimal(Double.toString(divisor)); - return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); - } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToWmsServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToWmsServiceImpl.java new file mode 100644 index 0000000..45bba95 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToWmsServiceImpl.java @@ -0,0 +1,44 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderToWmsService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.MathOperation; +import cn.estsh.i3plus.pojo.mes.bean.MesBom; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToWms; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description : 工单发送给WMS数据 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/18 19:58 + * @Modify: + **/ +@Service +@Slf4j +public class MesWorkOrderToWmsServiceImpl extends BaseMesService implements IMesWorkOrderToWmsService { + + @Override + public List saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List mesBomList) { + List mesWorkOrderToWmsList = new ArrayList<>(); + MesWorkOrderToWms mesWorkOrderToWms = null; + for (MesBom mesBom : mesBomList) { + mesWorkOrderToWms = new MesWorkOrderToWms(); + BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id"); + mesWorkOrderToWms.setUnit(mesBom.getUnit()); + mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo()); + mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName()); + mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit()); + mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty())); + ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser()); + mesWorkOrderToWmsList.add(mesWorkOrderToWms); + } + return mesWorkOrderToWmsList; + } +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/utils/BeanMapUtilsExt.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/utils/BeanMapUtilsExt.java new file mode 100644 index 0000000..187ae13 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/utils/BeanMapUtilsExt.java @@ -0,0 +1,47 @@ +package cn.estsh.i3plus.ext.mes.apiservice.utils; + +import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import org.apache.commons.beanutils.BeanUtils; +import org.springframework.util.CollectionUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BeanMapUtilsExt { + + public static Map getBeanMap(BaseRepository repository, String columnName, String organizeCode, List dataList, String remindMsg) { + Map beanMap = new HashMap(); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(dataList, columnName, packBean); + DdlPreparedPack.getOrderBy(null,null,packBean); + List baseDataList = repository.findByHqlWhere(packBean); + if (!CollectionUtils.isEmpty(baseDataList)) { + for (T object : baseDataList) { + try { + String keyData = BeanUtils.getProperty(object, columnName); + beanMap.put(keyData, object); + } catch (Exception var11) { + MesException.throwMesBusiException(remindMsg + "转换异常"); + } + } + } else { + MesException.throwMesBusiException(remindMsg + "信息存在"); + } + return beanMap; + } + + public static List getBeanList(BaseRepository repository, String columnName, String organizeCode, List dataList, String remindMsg) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(dataList, columnName, packBean); + DdlPreparedPack.getOrderBy(null,null,packBean); + List baseDataList = repository.findByHqlWhere(packBean); + if (CollectionUtils.isEmpty(baseDataList)) { + MesException.throwMesBusiException(remindMsg + "信息存在"); + } + return baseDataList; + } +}