diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesCutRawErrorProofingService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesCutRawErrorProofingService.java new file mode 100644 index 0000000..8f59a4b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesCutRawErrorProofingService.java @@ -0,0 +1,31 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutMaterial; +import io.swagger.annotations.ApiOperation; + +/** + * @Description : + * @Reference : + * @Author : + * @CreateDate : 2024-04-26 15:37 + * @Modify: + **/ +public interface IMesCutRawErrorProofingService { + + @ApiOperation(value = "扫描裁片工单或条码(第一次扫工单,第二次扫条码)") + MesCutRawErrorProofingModel doScanSn(MesCutRawErrorProofingModel model); + + @ApiOperation(value = "展示原材料信息") + ListPager queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager); + + @ApiOperation(value = "查询条码长度") + MesCutUpdateRawLengthModel queryLengthBySn(MesCutRawErrorProofingModel model); + + @ApiOperation(value = "修改条码长度") + void doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesCutRawErrorProofingController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesCutRawErrorProofingController.java new file mode 100644 index 0000000..321ae83 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesCutRawErrorProofingController.java @@ -0,0 +1,82 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesCutRawErrorProofingService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.util.ResultBean; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description: 裁片原材料防错 + * @Author: gsz + * @Date: 2024/5/25 18:16 + * @Modify: + */ +@RestController +@RequestMapping(MesCommonConstant.MES_YANFEN + "/cut-raw-error-proofing") +public class MesCutRawErrorProofingController { + + @Autowired + private IMesCutRawErrorProofingService cutRawErrorProofingService; + + @PostMapping("/scan-sn") + @ApiOperation(value = "扫描裁片工单/原材料条码") + public ResultBean doScanSn(MesCutRawErrorProofingModel model) { + try { + return ResultBean.success("扫描成功").setResultObject(cutRawErrorProofingService.doScanSn(model)); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/query-work-order-cut-material-by-pager") + @ApiOperation(value = "展示原材料信息") + public ResultBean queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager) { + try { + return ResultBean.success("查询成功") + .setListPager(cutRawErrorProofingService.queryWorkOrderMaterialByPager(cutWorkOrderNo, organizeCode, pager)); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/query-length-by-sn") + @ApiOperation(value = "查询条码长度") + public ResultBean queryLengthByScanSn(MesCutRawErrorProofingModel model) { + try { + return ResultBean.success("查询成功").setResultObject(cutRawErrorProofingService.queryLengthBySn(model)); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @PostMapping("/update-raw-length") + @ApiOperation(value = "修改原材料条码长度") + public ResultBean doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model) { + try { + + cutRawErrorProofingService.doUpdateLengthByScanSn(model); + + return ResultBean.success("保存成功"); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java new file mode 100644 index 0000000..7651773 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java @@ -0,0 +1,201 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesCutRawErrorProofingService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +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.MesMaterialSn; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutMaterial; +import cn.estsh.i3plus.pojo.mes.repository.MesMaterialSnRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutMaterialRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @PROJECT_NAME: i3plus-mes-yfai + * @DESCRIPTION: + * @USER: xinwang.yi + * @DATE: 2024-09-04 9:54 + */ +@Service +public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingService { + + public static final int CUR_SCAN_TYPE_BY_ORDER_SN = 1; + public static final int CUR_SCAN_TYPE_BY_RAW_SN = 2; + + @Autowired + private MesWorkOrderCutRepository workOrderCutRepository; + + @Autowired + private MesWorkOrderCutMaterialRepository workOrderCutMaterialRepository; + + @Autowired + private MesMaterialSnRepository materialSnRepository; + + @Override + public MesCutRawErrorProofingModel doScanSn(MesCutRawErrorProofingModel model) { + + MesCutRawErrorProofingModel result = new MesCutRawErrorProofingModel(); + result.setCutWorkOrderNo(model.getCutWorkOrderNo()); + // 为 1 则为裁片工单码 + if (model.getCurScanType() == null || model.getCurScanType() == CUR_SCAN_TYPE_BY_ORDER_SN) { + + MesWorkOrderCut workOrderCutDb = getMesWorkOrderCut(model); + + if (workOrderCutDb == null) MesPcnException.throwMesBusiException("裁片工单【%s】不存在", model.getSn()); + + if (workOrderCutDb.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue()) MesPcnException.throwMesBusiException("裁片工单【%s】状态不为【%s】", model.getSn(), MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue()); + + result.setCurScanType(CUR_SCAN_TYPE_BY_RAW_SN); + result.setCutWorkOrderNo(workOrderCutDb.getCutWorkOrderNo()); + result.setIsRedirect(CommonEnumUtil.FALSE); + + } else { + + // 校验条码有效性 + + String[] valueArray = model.getSn().split("\\|"); + + int valueLength = valueArray.length; + + if (valueLength < 5) MesPcnException.throwMesBusiException("条码【%s】长度少于5", model.getSn()); + if (valueLength > 9) MesPcnException.throwMesBusiException("条码【%s】长度超出9", model.getSn()); + + List workOrderCutMaterialList = getWorkOrderCutMaterialList(model); + + Map workOrderCutMaterialMap = workOrderCutMaterialList.stream() + .collect(Collectors.toMap(MesWorkOrderCutMaterial::getPartNo, Function.identity(), (x, y) -> y)); + + // 物料编码 + String partNo = valueArray[3]; + // 原材料长度 + String lengthStr = valueArray[4]; + + Double length; + + if (!workOrderCutMaterialMap.containsKey(partNo)) MesPcnException.throwMesBusiException("扫描条码【%s】物料【%s】不在裁片方案原材料中", model.getSn(), partNo); + + // 为 2 则为条码 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean); + MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean); + + MesWorkOrderCutMaterial workOrderCutMaterial = workOrderCutMaterialMap.get(partNo); + + if (materialSnDb != null) { + if (materialSnDb.getSurplusLength() == 0) MesPcnException.throwMesBusiException("条码【%s】已无剩余长度", model.getSn()); + length = materialSnDb.getSurplusLength(); + ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName()); + } else { + length = Double.parseDouble(lengthStr); + materialSnDb = new MesMaterialSn(); + ConvertBean.serviceModelInitialize(materialSnDb, model.getUserName()); + materialSnDb.setOrganizeCode(model.getOrganizeCode()); + materialSnDb.setSn(model.getSn()); + materialSnDb.setPartNo(partNo); + materialSnDb.setLength(length); + materialSnDb.setSurplusLength(length); + } + + // 已扫描长度 + Double useLength = workOrderCutMaterial.getScanLength(); + if (useLength.compareTo(length) > 0) { + materialSnDb.setSurplusLength(0.0); + workOrderCutMaterial.setScanLength(workOrderCutMaterial.getScanLength() + length); + result.setIsRedirect(CommonEnumUtil.FALSE); + result.setShowInfo("长度不足,请继续扫描条码"); + } else { + materialSnDb.setSurplusLength(length - useLength); + // 已满足扫描总长度 修改工单状态为已校验原材料 + DdlPackBean packBean1 = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getCutWorkOrderNo(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + MesWorkOrderCut workOrderCut = workOrderCutRepository.getByProperty(packBean1); + workOrderCut.setWorkOrderStatus(MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue()); + ConvertBean.serviceModelUpdate(workOrderCut, model.getUserName()); + workOrderCutRepository.save(workOrderCut); + + workOrderCutMaterial.setScanLength(workOrderCutMaterial.getMaterialDosage()); + + result.setIsRedirect(CommonEnumUtil.VALID); + } + + ConvertBean.serviceModelUpdate(workOrderCutMaterial, model.getUserName()); + workOrderCutMaterialRepository.save(workOrderCutMaterial); + ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName()); + materialSnRepository.save(materialSnDb); + + } + + return result; + } + + @Override + public ListPager queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager) { + if (StringUtils.isEmpty(cutWorkOrderNo)) return new ListPager<>(new ArrayList<>(), pager); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + pager = PagerHelper.getPager(pager, workOrderCutMaterialRepository.findByHqlWhereCount(packBean)); + return new ListPager(workOrderCutMaterialRepository.findByHqlPage(packBean, pager), pager); + } + + @Override + public MesCutUpdateRawLengthModel queryLengthBySn(MesCutRawErrorProofingModel model) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean); + MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean); + MesCutUpdateRawLengthModel result = new MesCutUpdateRawLengthModel(); + BeanUtils.copyProperties(materialSnDb, result); + return result; + } + + @Override + public void doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model) { + + if (StringUtils.isEmpty(model.getSn())) return; + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean); + MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean); + + if (materialSnDb == null) MesPcnException.throwMesBusiException("条码【%s】不存在", model.getSn()); + + if (materialSnDb.getSurplusLength() < model.getSubLength()) MesPcnException.throwMesBusiException("条码【%s】减去长度【%s】大于剩余长度", materialSnDb.getSurplusLength(), model.getSubLength()); + + materialSnDb.setSurplusLength(materialSnDb.getSurplusLength() - model.getSubLength()); + ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName()); + materialSnRepository.save(materialSnDb); + + } + + private List getWorkOrderCutMaterialList(MesCutRawErrorProofingModel model) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getCutWorkOrderNo(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + return workOrderCutMaterialRepository.findByHqlWhere(packBean); + } + + private MesWorkOrderCut getMesWorkOrderCut(MesCutRawErrorProofingModel model) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + return workOrderCutRepository.getByProperty(packBean); + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutRawErrorProofingModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutRawErrorProofingModel.java new file mode 100644 index 0000000..0a53790 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutRawErrorProofingModel.java @@ -0,0 +1,30 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +@Data +public class MesCutRawErrorProofingModel { + + @ApiParam("裁片工单号") + private String cutWorkOrderNo; + + @ApiParam("当前扫描类型:1-工单;2-条码") + private Integer curScanType; + + @ApiParam("当前扫描条码") + private String sn; + + @ApiParam("是否跳转页面") + private Integer isRedirect; + + @ApiParam("工厂代码") + private String organizeCode; + + @ApiParam("操作人") + private String userName; + + @ApiParam("提示信息") + private String showInfo; + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutUpdateRawLengthModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutUpdateRawLengthModel.java new file mode 100644 index 0000000..f59fd2f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesCutUpdateRawLengthModel.java @@ -0,0 +1,32 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +@Data +public class MesCutUpdateRawLengthModel { + + @ApiParam("裁片工单号") + private String cutWorkOrderNo; + + @ApiParam("条码") + private String sn; + + @ApiParam("物料号") + private String partNo; + + @ApiParam("剩余长度") + private Double surplusLength; + + @ApiParam("减去长度") + private Double subLength; + + @ApiParam("修改原因") + private String modifyReason; + + @ApiParam("操作人") + private String userName; + + @ApiParam("工厂代码") + private String organizeCode; +}