diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductOffLineService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductOffLineService.java new file mode 100644 index 0000000..dfe30e0 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductOffLineService.java @@ -0,0 +1,15 @@ +package cn.estsh.i3plus.ext.mes.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesProductOffLine; + +/** + * @Description : 生产汇报 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/5/10 14:37 + * @Modify: + **/ +public interface IMesProductOffLineService extends IBaseMesService{ + + +} 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 d205ccb..8b107c4 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 @@ -1,7 +1,6 @@ package cn.estsh.i3plus.ext.mes.api.base; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog; /** * @Description: @@ -10,5 +9,5 @@ import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog; */ public interface IMesWorkOrderService extends IBaseMesService { - + void doProductReport(MesWorkOrder mesWorkOrder); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesProductOffLineController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesProductOffLineController.java new file mode 100644 index 0000000..d903ec1 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesProductOffLineController.java @@ -0,0 +1,19 @@ +package cn.estsh.i3plus.ext.mes.apiservice.controller.base; + +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.pojo.mes.bean.MesProductOffLine; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description : 生产汇报 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/5/10 14:36 + * @Modify: + **/ +@RestController +@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesProductOffLine") +public class MesProductOffLineController extends BaseMesController { + +} 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 aff40d9..83d2a36 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 @@ -1,5 +1,6 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.base; +import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.MesExcelTool; import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.platform.common.convert.ConvertBean; @@ -12,10 +13,8 @@ import cn.estsh.impp.framework.boot.util.RedisCacheTool; import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -25,6 +24,9 @@ import java.util.List; @RequestMapping(MesCommonConstant.MES_YANFEN + "/mesWorkOrder") public class MesWorkOrderController extends BaseMesController { + @Autowired + private IMesWorkOrderService mesWorkOrderService; + @PostMapping(value = "/import-mes-work-order") @ApiOperation(value = "导入数据") public ResultBean importMesWorkOrderExcel(@RequestParam("file") MultipartFile file, Integer type) { @@ -54,5 +56,22 @@ public class MesWorkOrderController extends BaseMesController { } } + @PostMapping(value = "/doProductReport") + @ApiOperation(value = "生产报工") + public ResultBean doProductReport(@RequestBody MesWorkOrder mesWorkOrder) { + try { + //新增初始化 + mesWorkOrder.setOrganizeCode(AuthUtil.getOrganizeCode()); + ConvertBean.serviceModelInitialize(mesWorkOrder, AuthUtil.getSessionUser().getUserName()); + mesWorkOrderService.doProductReport(mesWorkOrder); + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException e) { + return ResultBean.fail(e).build(); + } catch (Exception e) { + return ResultBean.fail(e); + } + } + } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductOffLineImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductOffLineImpl.java new file mode 100644 index 0000000..93b72cc --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductOffLineImpl.java @@ -0,0 +1,17 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.api.base.IMesProductOffLineService; +import cn.estsh.i3plus.pojo.mes.bean.MesProductOffLine; +import org.springframework.stereotype.Service; + +/** + * @Description : 生产汇报 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/5/10 14:40 + * @Modify: + **/ +@Service +public class MesProductOffLineImpl extends BaseMesService implements IMesProductOffLineService { + +} 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 cb9dcd9..ed740f6 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 @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.api.base.IMesProductOffLineService; import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderToSapService; import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException; @@ -8,20 +9,20 @@ import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil; import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.util.StringUtil; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToSap; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderToSapRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesBomRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProductVersionRepository; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ValidatorBean; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,6 +42,12 @@ public class MesWorkOrderService extends BaseMesService implements private IMesWorkOrderToSapService iMesWorkOrderToSapService; @Autowired private IMesPartService iMesPartService; + @Autowired + private MesProductVersionRepository mesProductVersionRDao; + @Autowired + private MesBomRepository mesBomRDao; + @Autowired + private IMesProductOffLineService mesProductOffLineService; @Override public MesWorkOrder insert(MesWorkOrder bean) { @@ -125,27 +132,28 @@ public class MesWorkOrderService extends BaseMesService implements MesWorkOrder result = baseRDao.getById(bean.getId()); //若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1 if (result.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) { - if(!Objects.equals(bean.getQty(), result.getQty())){ + if (!Objects.equals(bean.getQty(), result.getQty())) { MesException.throwMesBusiException(String.format("工单类型为【%s】 不需要修改数量", MesExtEnumUtil.ORDER_TYPE.SORT.getDescription())); } - }else{ + } else { //工单数量只能比原来的大 - if(bean.getQty() < result.getQty()){ + if (bean.getQty() < result.getQty()) { MesException.throwMesBusiException(String.format("工单数量不能小于工单源数量【%s】", result.getQty())); } //修改状态或者指令下发需要传给SAP - if(!Objects.equals(bean.getQty(), result.getQty())){ + if (!Objects.equals(bean.getQty(), result.getQty())) { sendToSap = true; } } - if(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue() == bean.getWorkOrderStatus()){ + if (MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue() == bean.getWorkOrderStatus() || + MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue() == bean.getWorkOrderStatus()) { sendToSap = true; } //在加工的工单不能修改物料信息 - if(result.getWorkOrderStatus() >= MesExtEnumUtil.ORDER_STATUS.process.getValue()){ - if(!Objects.equals(bean.getPartNo(), result.getPartNo())){ + if (result.getWorkOrderStatus() >= MesExtEnumUtil.ORDER_STATUS.process.getValue()) { + if (!Objects.equals(bean.getPartNo(), result.getPartNo())) { MesException.throwMesBusiException(String.format("工单状态为【%s】不允许修改物料", MesExtEnumUtil.ORDER_TYPE.valueOfDescription(result.getWorkOrderStatus()))); } @@ -159,12 +167,12 @@ public class MesWorkOrderService extends BaseMesService implements BeanUtils.copyProperties(result, workOrderLog, "id"); workOrderLogService.insert(workOrderLog); //关闭工单 - if(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue() == bean.getWorkOrderStatus()){ + if (MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue() == bean.getWorkOrderStatus()) { bean.setQty(0d); sendToSap = true; } //发送给SAP - if(sendToSap){ + if (sendToSap) { iMesWorkOrderToSapService.insert(bean); } @@ -174,19 +182,19 @@ public class MesWorkOrderService extends BaseMesService implements protected void setPackQueryBean(MesWorkOrder bean, DdlPackBean packBean) { - DdlPreparedPack.getStringLikerPack(bean.getOrderNo(),"orderNo",packBean); - DdlPreparedPack.getStringLikerPack(bean.getPartNameRdd(),"partNameRdd",packBean); - DdlPreparedPack.getStringEqualPack(bean.getPartNo(),"partNo",packBean); - DdlPreparedPack.getStringEqualPack(bean.getCustPartNo(),"custPartNo",packBean); - DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(),"workCenterCode",packBean); - DdlPreparedPack.getNumEqualPack(bean.getWorkOrderStatus(),"workOrderStatus",packBean); - DdlPreparedPack.getNumEqualPack(bean.getWorkOrderType(),"workOrderType",packBean); - DdlPreparedPack.getStringBiggerPack(bean.getCreateDateTimeStart(),"createDatetime",packBean); - DdlPreparedPack.getStringSmallerPack(bean.getCreateDateTimeEnd(),"createDatetime",packBean); - DdlPreparedPack.getStringBiggerPack(bean.getStartTimeStart(),"planStartTime",packBean); - DdlPreparedPack.getStringSmallerPack(bean.getStartTimeEnd(),"planStartTime",packBean); - DdlPreparedPack.getStringBiggerPack(bean.getEndTimeStart(),"planEndTime",packBean); - DdlPreparedPack.getStringSmallerPack(bean.getEndTimeEnd(),"planEndTime",packBean); + DdlPreparedPack.getStringLikerPack(bean.getOrderNo(), "orderNo", packBean); + DdlPreparedPack.getStringLikerPack(bean.getPartNameRdd(), "partNameRdd", packBean); + DdlPreparedPack.getStringEqualPack(bean.getPartNo(), "partNo", packBean); + DdlPreparedPack.getStringEqualPack(bean.getCustPartNo(), "custPartNo", packBean); + DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean); + DdlPreparedPack.getNumEqualPack(bean.getWorkOrderStatus(), "workOrderStatus", packBean); + DdlPreparedPack.getNumEqualPack(bean.getWorkOrderType(), "workOrderType", packBean); + DdlPreparedPack.getStringBiggerPack(bean.getCreateDateTimeStart(), "createDatetime", packBean); + DdlPreparedPack.getStringSmallerPack(bean.getCreateDateTimeEnd(), "createDatetime", packBean); + DdlPreparedPack.getStringBiggerPack(bean.getStartTimeStart(), "planStartTime", packBean); + DdlPreparedPack.getStringSmallerPack(bean.getStartTimeEnd(), "planStartTime", packBean); + DdlPreparedPack.getStringBiggerPack(bean.getEndTimeStart(), "planEndTime", packBean); + DdlPreparedPack.getStringSmallerPack(bean.getEndTimeEnd(), "planEndTime", packBean); } protected void onInsertBean(MesWorkOrder item) { @@ -231,7 +239,7 @@ public class MesWorkOrderService extends BaseMesService implements } } //物料名称不存在,从物料信息中获取 - if(StringUtil.isEmpty(item.getPartNameRdd())){ + if (StringUtil.isEmpty(item.getPartNameRdd())) { MesPart mesPart = iMesPartService.getPartByPartNo(item.getPartNo(), item.getOrganizeCode()); item.setPartNameRdd(mesPart.getPartName()); } @@ -242,4 +250,64 @@ public class MesWorkOrderService extends BaseMesService implements } + @Override + public void doProductReport(MesWorkOrder mesWorkOrder) { + //查询物料信息 + MesPart mesPart = iMesPartService.getPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); + //获取生产版本 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (null == mesProductVersion) { + MesException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo()); + } + //物料+生产版本获取bom信息 + ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesProductVersion.getProductVersion(), "bomVersion", ddlPackBean); + List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(mesBoms)) { + MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", + mesWorkOrder.getPartNo(), mesProductVersion.getProductVersion()); + } + //更新工单状态 + mesWorkOrder.setCompleteQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getCompleteQty())); + if (mesWorkOrder.getCompleteQty() >= mesWorkOrder.getQty()) { + mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else { + mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.process.getValue()); + } + update(mesWorkOrder); + + //生成条码 + GenSerialNoModel genSerialNoModel = new GenSerialNoModel("REPORT_SN"); + genSerialNoModel.setPartNo(mesWorkOrder.getPartNo()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), mesWorkOrder.getNum()).getResultList(); + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + MesProductOffLine newMesProductOffLine; + for (String sn : resultList) { + for (MesBom mesBom : mesBoms) { + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesWorkOrder.getPartNameRdd()); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartNameRdd(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(mesBom.getItemQty()); + newMesProductOffLine.setQty(1d); + newMesProductOffLine.setReportSn(sn); + newMesProductOffLine.setBomVersion(mesBom.getBomVersion()); + newMesProductOffLine.setSerialNumber(sn); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(mesWorkOrder.getOrderNo()); + newMesProductOffLine.setWorkCenterCode(mesWorkOrder.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(mesWorkOrder.getWorkCellCode()); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getCreateUser()); + mesProductOffLineList.add(newMesProductOffLine); + } + } + mesProductOffLineService.insertBatch(mesProductOffLineList); + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToSapServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToSapServiceImpl.java index 96169ca..6ef862a 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToSapServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderToSapServiceImpl.java @@ -3,7 +3,6 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderToSapService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToSap; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -15,7 +14,7 @@ public class MesWorkOrderToSapServiceImpl extends BaseMesService