diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesBoxingErrorProofingService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesBoxingErrorProofingService.java new file mode 100644 index 0000000..1e5da3b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesBoxingErrorProofingService.java @@ -0,0 +1,38 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @Description : MES装箱防错 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/7 14:34 + * @Modify: + **/ +public interface IMesBoxingErrorProofingService { + + + @ApiOperation(value = "查询包装明细") + ListPager queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager); + + @ApiOperation(value = "扫描") + MesPackage doScan(MesPackageDetail mesPackageDetail); + + @ApiOperation(value = "保存包装明细") + void saveMesPackageDetails(List mesPackage, String userName); + + @ApiOperation(value = "更新包装表") + void updateMesPackage(MesPackage mesPackage); + + @ApiOperation(value = "更新包装明细") + void updateMesPackageDetails(MesPackageDetail mesPackage); + + @ApiOperation(value = "解锁") + void unLock(String organizeCode, String userName, String pwd); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesBoxingErrorProofingController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesBoxingErrorProofingController.java new file mode 100644 index 0000000..53d2e76 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesBoxingErrorProofingController.java @@ -0,0 +1,145 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; + + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesBoxingErrorProofingService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail; +import cn.estsh.impp.framework.boot.auth.AuthUtil; +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 cn.estsh.impp.framework.boot.util.ValidatorBean; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@Api(tags = "装箱防错") +@RequestMapping(MesCommonConstant.MES_YANFEN + "/boxing-error-proofing") +@Slf4j +public class MesBoxingErrorProofingController { + + @Autowired + private IMesBoxingErrorProofingService mesBoxingErrorProofingService; + + + @GetMapping("/mes-package-details/query") + @ApiOperation(value = "查询包装明细") + public ResultBean queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager) { + + try { + ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空"); + + mesPackage.setOrganizeCode(AuthUtil.getOrganizeCode()); + ListPager partInspectionListPager = mesBoxingErrorProofingService.queryMesPackageDetailByPager(mesPackage, pager); + return ResultBean.success("查询成功").setListPager(partInspectionListPager); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/do-scan") + @ApiOperation(value = "扫描") + public ResultBean doScan(MesPackageDetail mesPackageDetail) { + + try { + ValidatorBean.checkNotNull(mesPackageDetail.getPackageNo(), "箱条码不能为空"); + + mesPackageDetail.setOrganizeCode(AuthUtil.getOrganizeCode()); + ConvertBean.serviceModelInitialize(mesPackageDetail, AuthUtil.getSessionUser().getUserName()); + MesPackage mesPackage = mesBoxingErrorProofingService.doScan(mesPackageDetail); + return ResultBean.success("扫描成功").setResultObject(mesPackage); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + + @PostMapping("/mes-package-details/saveAll") + @ApiOperation(value = "保存包装明细") + public ResultBean saveMesPackageDetails(@RequestBody List mesPackageDetailList) { + try { + //属性校验 + mesPackageDetailList.forEach(mesPackageDetail -> { + ValidatorBean.checkNotNull(mesPackageDetail.getPackageNo(), "箱条码不能为空"); + }); + String userName = AuthUtil.getSessionUser().getUserName(); + mesBoxingErrorProofingService.saveMesPackageDetails(mesPackageDetailList, userName); + return ResultBean.success("保存成功"); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @PutMapping("/mes-package/update") + @ApiOperation(value = "更新包装表") + public ResultBean updateMesPackage(MesPackage mesPackage) { + + try { + //属性校验 + ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空"); + ValidatorBean.checkNotNull(mesPackage.getIsSealed(), "是否封箱不能为空"); + + mesPackage.setOrganizeCode(AuthUtil.getOrganizeCode()); + ConvertBean.serviceModelUpdate(mesPackage, AuthUtil.getSessionUser().getUserName()); + mesBoxingErrorProofingService.updateMesPackage(mesPackage); + return ResultBean.success("保存成功"); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @PutMapping("/mes-package-details/update") + @ApiOperation(value = "更新包装明细") + public ResultBean updateMesPackageDetails(MesPackageDetail mesPackage) { + + try { + //属性校验 + ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空"); + ValidatorBean.checkNotNull(mesPackage.getSerialNumber(), "替换条码不能为空"); + ValidatorBean.checkNotNull(mesPackage.getOldSerialNumber(), "替换源条码不能为空"); + + ConvertBean.serviceModelUpdate(mesPackage, AuthUtil.getSessionUser().getUserName()); + mesBoxingErrorProofingService.updateMesPackageDetails(mesPackage); + return ResultBean.success("保存成功"); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/unLock") + @ApiOperation(value = "解锁") + public ResultBean unLock(String pwd) { + try { + //属性校验 + ValidatorBean.checkNotNull(pwd, "密码不能为空"); + + mesBoxingErrorProofingService.unLock(AuthUtil.getOrganizeCode(), AuthUtil.getSessionUser().getUserName(), pwd); + 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/MesBoxingErrorProofingService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java new file mode 100644 index 0000000..2e35c9f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java @@ -0,0 +1,417 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesBoxingErrorProofingService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.CheckTool; +import cn.estsh.i3plus.platform.common.tool.MathOperation; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +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.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Description : MES装箱防错 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/7 14:33 + * @Modify: + **/ +@Service +@Slf4j +public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingService { + + @Autowired + private MesPackageRepository mesPackageRDao; + + @Autowired + private MesPartRepository partRDao; + + @Autowired + private MesPackingDefineRepository mesPackingDefineRDao; + + @Autowired + private MesPackingDefineDetailsRepository mesPackingDefineDetailsRDao; + + @Autowired + private MesPackageDetailRepository mesPackageDetailRDao; + + @Autowired + private IMesConfigService configService; + + @Autowired + private MesPackageResultRepository mesPackageResultRDao; + + @Override + public ListPager queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager) { + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackage.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPackage.getPackageNo(), "packageNo", packBean); + pager = PagerHelper.getPager(pager, mesPackageDetailRDao.findByHqlWhereCount(packBean)); + List resultList = mesPackageDetailRDao.findByHqlWherePage(packBean, pager); + return new ListPager<>(resultList, pager); + } + + @Override + public MesPackage doScan(MesPackageDetail mesPackageDetail) { + //扫描的是包装 + if (mesPackageDetail.getIsScanPackageBoolean()) { + checkNotNull(mesPackageDetail); + MesPackage mesPackage = getMesPackage(mesPackageDetail.getOrganizeCode(), mesPackageDetail.getPackageNo()); + if (Objects.nonNull(mesPackage)) { + return mesPackage; + } + //获取包装定义 + MesPackingDefine packingDefine = getMesPackingDefine(mesPackageDetail); + //解析获取信息保存 + if (StringUtils.isEmpty(packingDefine.getSplitChar())) { + MesPcnException.throwMesBusiException("箱类别代号【%s】分隔符不能为空", packingDefine.getPackCode()); + } + String[] split = mesPackageDetail.getPackageNo().split("\\" + packingDefine.getSplitChar()); + //获取序列号 + checkSerial(packingDefine, split); + //工厂校验 + checkOrganizeCode(mesPackageDetail, packingDefine, split); + //获取物料信息是否存在 + MesPart mesPart = getMesPart(mesPackageDetail, packingDefine, split); + //获取数量信息是否存在 + Double qty = getQty(packingDefine, split); + MesPackage packages = getMesPackage(mesPackageDetail, mesPart, qty, packingDefine); + return mesPackageRDao.insert(packages); + } else { + checkNotNull(mesPackageDetail); + //校验过程条码是否存在 + if (StringUtils.isEmpty(mesPackageDetail.getSerialNumber())) { + MesPcnException.throwMesBusiException("过程条码不允许为空"); + } + //校验包装条码信息 + MesPackage mesPackage = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode()); + //校验是否重复扫描 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), "serialNumber", ddlPackBean); + if (mesPackageDetailRDao.isExitByHql(ddlPackBean)) { + MesPcnException.throwMesBusiException("零件条码【%s】已存在该箱,不允许重复扫描", mesPackageDetail.getSerialNumber()); + } + //校验是否已关闭 + if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) { + MesPcnException.throwMesBusiException("箱条码已封箱,不允许扫描零件条码"); + } + //获取包装定义明细 + ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPackage.getPackageSn(), "packCode", ddlPackBean); + List defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(defineDetails)) { + MesPcnException.throwMesBusiException("箱类别代号【%s】包装定义明细未维护", mesPackage.getPackageSn()); + } + //校验是否包含 + String partNo = getPartNo(mesPackageDetail, mesPackage, defineDetails); + //物料信息 + MesPart mesPart = getPart(mesPackageDetail.getOrganizeCode(), partNo); + //包装规格明细 + MesPackageDetail saveMesPackageDetail = getPackageDetail(mesPackageDetail, mesPart); + if (mesPackageDetail.getIsMemoryBoolean()) { + //保存包装明细 + mesPackageDetailRDao.insert(saveMesPackageDetail); + //更新包装表 + updateMesPackage(mesPackage, mesPackageDetail.getModifyUser(), 1d, false); + } + mesPackage.setMesPackageDetail(saveMesPackageDetail); + return mesPackage; + } + } + + + @Override + public void saveMesPackageDetails(List mesPackageDetailList, String userName) { + MesPackageDetail packageDetail = mesPackageDetailList.iterator().next(); + int qty = mesPackageDetailList.size(); + //校验包装条码信息 + MesPackage mesPackage = getMesPackageAndCheck(packageDetail.getPackageNo(), packageDetail.getOrganizeCode()); + //去掉重复零件条码 + checkSerialNumber(mesPackageDetailList, packageDetail, userName); + //保存包装明细 + mesPackageDetailRDao.saveAll(mesPackageDetailList); + //更新包装表 + updateMesPackage(mesPackage, userName, qty, false); + } + + @Override + public void updateMesPackage(MesPackage mesPackage) { + String userName = mesPackage.getModifyUser(); + if (Objects.isNull(CommonEnumUtil.TRUE_OR_FALSE.valueOfDescription(mesPackage.getIsSealed()))) { + MesPcnException.throwMesBusiException("是否封箱不能为空"); + } + //查询包装条码信息 + MesPackage mesPackageDb = getMesPackageAndCheck(mesPackage.getPackageNo(), mesPackage.getOrganizeCode()); + if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) { + if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackageDb.getIsSealed()) { + MesPcnException.throwMesBusiException("包装条码【%s】状态为已关箱,请勿重复操作", mesPackage.getPackageNo()); + } + //关箱 + updateMesPackage(mesPackageDb, mesPackage.getModifyUser(), 0d, true); + } else if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackage.getIsSealed()) { + if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) { + MesPcnException.throwMesBusiException("包装条码【%s】状态不为已关箱,不需要拆箱", mesPackage.getPackageNo()); + } + //拆箱 + unboxing(mesPackage, userName, mesPackageDb); + } + } + + @Override + public void updateMesPackageDetails(MesPackageDetail mesPackageDetail) { + //查询包装条码信息 + MesPackage mesPackageDb = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode()); + if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) { + MesPcnException.throwMesBusiException("包装条码【%s】不为已关箱状态,不允许操作替换条码", mesPackageDetail.getPackageNo()); + } + //校验是否重复扫描 + List mesPackageDetails = getMesPackageDetailList(mesPackageDetail); + + for (MesPackageDetail packageDetail : mesPackageDetails) { + //替换条码是否已经存在 + if (packageDetail.getSerialNumber().equals(mesPackageDetail.getSerialNumber())) { + MesPcnException.throwMesBusiException("零件条码【%s】已存在存在", mesPackageDetail.getSerialNumber()); + } + //替换条码 + if (packageDetail.getSerialNumber().equals(mesPackageDetail.getOldSerialNumber())) { + packageDetail.setSerialNumber(mesPackageDetail.getSerialNumber()); + packageDetail.setOldSerialNumber(mesPackageDetail.getOldSerialNumber()); + ConvertBean.serviceModelUpdate(packageDetail, mesPackageDetail.getModifyUser()); + } + } + mesPackageDetailRDao.saveAll(mesPackageDetails); + } + + private List getMesPackageDetailList(MesPackageDetail mesPackageDetail) { + String[] serialNumberList = new String[]{mesPackageDetail.getSerialNumber(), mesPackageDetail.getOldSerialNumber()}; + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean); + DdlPreparedPack.getInPackArray(serialNumberList, "serialNumber", ddlPackBean); + List mesPackageDetails = mesPackageDetailRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(mesPackageDetails)) { + MesPcnException.throwMesBusiException("零件条码【%s】不存在", mesPackageDetail.getOldSerialNumber()); + } + return mesPackageDetails; + } + + @Override + public void unLock(String organizeCode, String userName, String pwd) { + String cfgValue = configService.getCfgValue(organizeCode, MesCommonConstant.BOXING_ERROR_PROOFING_PWD); + if (!Objects.equals(cfgValue, pwd)) { + MesPcnException.throwMesBusiException("解锁失败密码错误"); + } + } + + private void unboxing(MesPackage mesPackage, String userName, MesPackage mesPackageDb) { + //更新包装表 + mesPackageDb.setQty(0d); + mesPackageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelUpdate(mesPackageDb, userName); + mesPackageRDao.update(mesPackageDb); + + //软删包装明细 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackage.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesPackage.getPackageNo(), "packageNo", ddlPackBean); + mesPackageDetailRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "isDeleted"}, + new Object[]{userName, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}, + ddlPackBean); + } + + + private MesPackage getMesPackageAndCheck(String packageNo, String organizeCode) { + MesPackage mesPackageDb = getMesPackage(organizeCode, packageNo); + if (Objects.isNull(mesPackageDb)) { + MesPcnException.throwMesBusiException("包装条码【%s】信息不存在", packageNo); + } + return mesPackageDb; + } + + private void checkSerialNumber(List mesPackageDetailList, MesPackageDetail packageDetail, String userName) { + List mesPackageDetails = getMesPackageDetailList(packageDetail.getOrganizeCode(), packageDetail.getPackageNo()); + if (!CollectionUtils.isEmpty(mesPackageDetails)) { + List serialNumberList = mesPackageDetails.stream().map(MesPackageDetail::getSerialNumber).collect(Collectors.toList()); + for (MesPackageDetail mesPackageDetail : mesPackageDetailList) { + if (serialNumberList.contains(mesPackageDetail.getSerialNumber())) { + mesPackageDetailList.remove(mesPackageDetail); + } + ConvertBean.serviceModelInitialize(mesPackageDetail, userName); + } + } + } + + + private void updateMesPackage(MesPackage mesPackage, String userName, double qty, boolean close) { + mesPackage.setQty(MathOperation.add(mesPackage.getQty(), qty)); + if (mesPackage.getPackSpecQty() <= mesPackage.getQty() || close) { + mesPackage.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + mesPackage.setLotNo(TimeTool.getToday()); + //数据写入接口表回传wms + saveMesPackageResult(mesPackage, userName); + } + ConvertBean.serviceModelUpdate(mesPackage, userName); + mesPackageRDao.update(mesPackage); + } + + private void saveMesPackageResult(MesPackage mesPackage, String userName) { + MesPackageResult mesPackageResult; + List mesPackageResultList = new ArrayList<>(); + List mesPackageDetailList = getMesPackageDetailList(mesPackage.getOrganizeCode(), mesPackage.getPackageNo()); + for (MesPackageDetail mesPackageDetail : mesPackageDetailList) { + mesPackageResult = new MesPackageResult(mesPackageDetail, mesPackage.getQty()); + ConvertBean.serviceModelInitialize(mesPackageResult, userName); + mesPackageResultList.add(mesPackageResult); + } + mesPackageResultRDao.saveAll(mesPackageResultList); + } + + private List getMesPackageDetailList(String organizeCode, String packageNo) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(packageNo, "packageNo", ddlPackBean); + List mesPackageDetails = mesPackageDetailRDao.findByHqlWhere(ddlPackBean); + return mesPackageDetails; + } + + private MesPackageDetail getPackageDetail(MesPackageDetail mesPackageDetail, MesPart mesPart) { + MesPackageDetail saveMesPackageDetail = new MesPackageDetail(); + saveMesPackageDetail.setPackageNo(mesPackageDetail.getPackageNo()); + saveMesPackageDetail.setSerialNumber(mesPackageDetail.getSerialNumber()); + saveMesPackageDetail.setPartNo(mesPart.getPartNo()); + saveMesPackageDetail.setPartName(mesPart.getPartName()); + saveMesPackageDetail.setQty(1d); + saveMesPackageDetail.setOrganizeCode(mesPackageDetail.getOrganizeCode()); + ConvertBean.serviceModelInitialize(saveMesPackageDetail, mesPackageDetail.getCreateUser()); + return saveMesPackageDetail; + } + + private String getPartNo(MesPackageDetail mesPackageDetail, MesPackage mesPackage, List defineDetails) { + String packageBarcodeRule; + String partNo = null; + for (MesPackingDefineDetails defineDetail : defineDetails) { + //条码规则为空 + if (StringUtils.isEmpty(defineDetail.getPackageBarcodeRule())) { + MesPcnException.throwMesBusiException("箱类别代号【%s】零件号【%s】条码规则未维护", mesPackage.getPackageSn(), defineDetail.getPartNo()); + } + packageBarcodeRule = defineDetail.getPackageBarcodeRule().replace("*", ""); + //包含箱条码 + if (mesPackageDetail.getSerialNumber().contains(packageBarcodeRule)) { + partNo = defineDetail.getPartNo(); + break; + } + } + if (Objects.isNull(partNo)) { + MesPcnException.throwMesBusiException("零件条码【%s】未匹配到符合条码规则的数据", mesPackage.getSerialNumber()); + } + return partNo; + } + + private void checkNotNull(MesPackageDetail mesPackageDetail) { + if (StringUtils.isEmpty(mesPackageDetail.getPackageNo())) { + MesPcnException.throwMesBusiException("包装编码不能为空"); + } + if (StringUtils.isEmpty(mesPackageDetail.getScanType())) { + MesPcnException.throwMesBusiException("客户条码规则不能为空"); + } + } + + private void checkSerial(MesPackingDefine packingDefine, String[] split) { + if (StringUtils.isEmpty(packingDefine.getSerialIdIndex()) || packingDefine.getSerialIdIndex() > split.length + || StringUtils.isEmpty(split[packingDefine.getSerialIdIndex() - 1])) { + MesPcnException.throwMesBusiException("序列号所在位置不存在"); + } + String serialNo = split[packingDefine.getSerialIdIndex() - 1]; + } + + private void checkOrganizeCode(MesPackageDetail mesPackageDetail, MesPackingDefine packingDefine, String[] split) { + if (StringUtils.isEmpty(packingDefine.getOrganizeIndex()) || packingDefine.getOrganizeIndex() > split.length + || StringUtils.isEmpty(split[packingDefine.getOrganizeIndex() - 1])) { + MesPcnException.throwMesBusiException("工厂所在位置不存在"); + } + String organizeCode = split[packingDefine.getOrganizeIndex() - 1]; + if (!Objects.equals(organizeCode, mesPackageDetail.getOrganizeCode())) { + MesPcnException.throwMesBusiException("箱条码工厂【%s】和当前工厂【%s】不匹配", organizeCode, mesPackageDetail.getOrganizeCode()); + } + } + + private MesPart getMesPart(MesPackageDetail mesPackageDetail, MesPackingDefine packingDefine, String[] split) { + if (StringUtils.isEmpty(packingDefine.getPartNoIndex()) || packingDefine.getPartNoIndex() > split.length + || StringUtils.isEmpty(split[packingDefine.getPartNoIndex() - 1])) { + MesPcnException.throwMesBusiException("物料号所在位置不存在"); + } + MesPart mesPart = getPart(mesPackageDetail.getOrganizeCode(), split[packingDefine.getPartNoIndex() - 1]); + return mesPart; + } + + private MesPart getPart(String organizeCode, String partNo) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean); + MesPart mesPart = partRDao.getByProperty(packBean); + if (Objects.isNull(mesPart)) { + MesPcnException.throwMesBusiException("物料【%s】信息不存在", partNo); + } + return mesPart; + } + + private Double getQty(MesPackingDefine packingDefine, String[] split) { + if (StringUtils.isEmpty(packingDefine.getQtyIndex()) || packingDefine.getQtyIndex() > split.length + || StringUtils.isEmpty(split[packingDefine.getQtyIndex() - 1])) { + MesPcnException.throwMesBusiException("数量所在位置不存在"); + } + //校验是否数字 + if (!CheckTool.isNumber(split[packingDefine.getQtyIndex() - 1])) { + MesPcnException.throwMesBusiException("数量所在位置不为数字类型"); + } + return Double.parseDouble(split[packingDefine.getQtyIndex() - 1]); + } + + private MesPackage getMesPackage(MesPackageDetail mesPackageDetail, MesPart mesPart, Double qty, MesPackingDefine packingDefine) { + //保存包装信息 + MesPackage packages = new MesPackage(); + packages.setPackageNo(mesPackageDetail.getPackageNo()); + packages.setPartNo(mesPart.getPartNo()); + packages.setPartName(mesPart.getPartName()); + packages.setPackSpecQty(qty); + packages.setQty(0d); + packages.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + packages.setPrintStatus(MesPcnEnumUtil.PACKAGE_PRINT_STATUS.UNPRINTED.getValue()); + packages.setPackageSn(packingDefine.getPackCode()); + packages.setOrganizeCode(mesPackageDetail.getOrganizeCode()); + ConvertBean.serviceModelInitialize(packages, mesPackageDetail.getCreateUser()); + return packages; + } + + private MesPackage getMesPackage(String organizeCode, String packageNo) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(packageNo, "packageNo", packBean); + return mesPackageRDao.getByProperty(packBean); + } + + private MesPackingDefine getMesPackingDefine(MesPackageDetail mesPackageDetail) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode()); + DdlPreparedPack.getNumEqualPack(mesPackageDetail.getScanType(), "scanType", packBean); + MesPackingDefine packingDefine = mesPackingDefineRDao.getByProperty(packBean); + if (Objects.isNull(packingDefine)) { + MesPcnException.throwFlowException("客户条码规则在包装定义界面未维护"); + } + return packingDefine; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java index 16748bd..be6b998 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java @@ -26,6 +26,8 @@ public class MesCommonConstant { public static final String SPOT_CHECK_ORDER_NO_RULE = "SPOT_CHECK_ORDER_NO_RULE"; //生成重新点检单据号 public static final String SPOT_CHECK_ORDER_NO_COPY_RULE = "SPOT_CHECK_ORDER_NO_COPY_RULE"; + //装箱防错密码 + public static final String BOXING_ERROR_PROOFING_PWD = "BOXING_ERROR_PROOFING_PWD"; }