From ef4c7c251754aac7506e596c86c69ec9e6232d8c Mon Sep 17 00:00:00 2001 From: yxw Date: Tue, 28 Nov 2023 19:31:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8C=85=E8=A3=85=E6=9D=A1?= =?UTF-8?q?=E7=A0=81=E7=8E=B0=E5=93=81=E7=A5=A8=E6=89=93=E5=8D=B0=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/base/SxWorkOrderExtController.java | 36 ++++----- .../serviceimpl/base/SxWorkOrderExtService.java | 92 ++++++++++++++-------- .../method/JxPrintPackageAndSpotTicketService.java | 82 +++++++++++++++++++ .../mes/pcn/pojo/model/GenerateWorkOrderDto.java | 6 ++ 4 files changed, 164 insertions(+), 52 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/print/method/JxPrintPackageAndSpotTicketService.java diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxWorkOrderExtController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxWorkOrderExtController.java index 3fe680a..baa5114 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxWorkOrderExtController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxWorkOrderExtController.java @@ -144,29 +144,29 @@ public class SxWorkOrderExtController extends MesPcnBaseController { RLock lock = (RLock) redisMesPcn.getFairLock(key); try { - - ValidatorBean.checkNotNull(workOrderNo, "工单号不能为空"); - ValidatorBean.checkNotNull(qty, "报工数量不能为空"); - ValidatorBean.checkNotNull(organizeCode, "工厂代码不能为空"); - ValidatorBean.checkNotNull(userName, "用户名不能为空"); - - try { - if (!lock.tryLock(20, 180, TimeUnit.SECONDS)) { - LOGGER.info("PCN对工单进行手动报工操作:尝试锁定JOB:工厂代码[{}]等待超时,超时原因:当前JOB正在执行不能并发操作", organizeCode); - return ResultBean.fail(ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.QMS.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("PCN对工单进行手动报工操作:尝试锁定工单[%s]等待超时,请重试!超时原因:相同工单不能并发操作", workOrderNo) - .build()); - } - } catch (Exception e) { - LOGGER.info("PCN对工单进行手动报工操作:尝试锁定JOB:工厂代码[{}]等待超时,超时原因:当前JOB正在执行不能并发操作,失败原因:[{}]", organizeCode, e.getMessage()); + if (!lock.tryLock(20, 180, TimeUnit.SECONDS)) { + LOGGER.info("PCN对工单进行手动报工操作:尝试锁定JOB:工厂代码[{}]等待超时,超时原因:当前正在执行不能并发操作", organizeCode); return ResultBean.fail(ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.QMS.getCode()) .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("PCN对工单进行手动报工操作:尝试锁定工单[%s]操作失败,请重试!失败原因:[%s]", workOrderNo, e.getMessage()) + .setErrorDetail("PCN对工单进行手动报工操作:尝试锁定工单[%s]等待超时,请重试!超时原因:相同工单不能并发操作", workOrderNo) .build()); } + } catch (Exception e) { + LOGGER.info("PCN对工单进行手动报工操作:尝试锁定JOB:工厂代码[{}]等待超时,超时原因:当前正在执行不能并发操作,失败原因:[{}]", organizeCode, e.getMessage()); + return ResultBean.fail(ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.QMS.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("PCN对工单进行手动报工操作:尝试锁定工单[%s]操作失败,请重试!失败原因:[%s]", workOrderNo, e.getMessage()) + .build()); + } + + try { + + ValidatorBean.checkNotNull(workOrderNo, "工单号不能为空"); + ValidatorBean.checkNotNull(qty, "报工数量不能为空"); + ValidatorBean.checkNotNull(organizeCode, "工厂代码不能为空"); + ValidatorBean.checkNotNull(userName, "用户名不能为空"); workOrderExtService.doManualReport(workOrderNo, qty, organizeCode, userName); return ResultBean.success("手动报工成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxWorkOrderExtService.java index ba0c993..0a14763 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxWorkOrderExtService.java @@ -149,11 +149,11 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { @Transactional(rollbackFor = Exception.class) public void insertManualGenerate(GenerateWorkOrderDto workOrderDto) { MesWorkOrderExt mesWorkOrderExt = new MesWorkOrderExt(); - Double qty = workOrderDto.getQty(); - Double planQty = workOrderDto.getPlanQty(); - if (planQty > qty) { - throw new BaseImppException("计划返工数量不能大于计划生产数量"); - } + + checkReworkQty(workOrderDto); + + checkReworkOrderBindSn(workOrderDto); + BeanUtils.copyProperties(workOrderDto, mesWorkOrderExt); String userName = AuthUtil.getSessionUser().getUserName(); String organizeCode = AuthUtil.getOrganize().getOrganizeCode(); @@ -162,35 +162,41 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { insertNewWorkOrder(mesWorkOrderExt); } + private List checkReworkOrderBindSn(GenerateWorkOrderDto workOrderDto) { + + if (StringUtils.isEmpty(workOrderDto.getProduceSnStart()) || StringUtils.isEmpty(workOrderDto.getProduceSnEnd())) return null; + + List produceSnExtList = new ArrayList<>(); + + + + return produceSnExtList; + } + + private void checkReworkQty(GenerateWorkOrderDto workOrderDto) { + Double qty = workOrderDto.getQty(); + Double planQty = workOrderDto.getPlanQty(); + if (planQty > qty) { + throw new BaseImppException("计划返工数量不能大于计划生产数量"); + } + } + private void insertNewWorkOrder(MesWorkOrderExt mesWorkOrderExt) { String organizeCode = AuthUtil.getOrganize().getOrganizeCode(); Integer workOrderType = mesWorkOrderExt.getWorkOrderType(); - MesPartExt partExt = partExtService.getPartExt(organizeCode, mesWorkOrderExt.getPartNo()); - if (partExt == null) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("物料【】号不存在", mesWorkOrderExt.getPartNo()) - .build(); - } + MesPartExt partExt = getMesPartExt(mesWorkOrderExt, organizeCode); //如果是返工工单 设置是否生成条码为不生成 if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderType) { mesWorkOrderExt.setSnCreateStatus(MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.NO_CREATE.getValue()); } else { //不是返工工单 //判断物料是否需要生成条码 - //if (!ObjectUtils.isEmpty(partExt)) - Integer isCreateSn = partExt.getIsCreateSn(); - if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == isCreateSn) { - mesWorkOrderExt.setSnCreateStatus(MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue()); - } else { - mesWorkOrderExt.setSnCreateStatus(MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.NO_CREATE.getValue()); - } + if (partExt.getIsCreateSn() != null && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == partExt.getIsCreateSn()) mesWorkOrderExt.setSnCreateStatus(MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue()); + else mesWorkOrderExt.setSnCreateStatus(MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.NO_CREATE.getValue()); } mesWorkOrderExt.setWorkOrderStatus(MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue()); mesWorkOrderExt.setOrganizeCode(organizeCode); -// mesWorkOrderExt.setSeq(getSeqMax() + 1); mesWorkOrderExt.setSeq(MathOperation.add(getWorkOrderExtMaxSeq(organizeCode, 1), new Double(1))); ConvertBean.modelInitialize(mesWorkOrderExt, AuthUtil.getSessionUser()); @@ -200,6 +206,18 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { insertMesWorkOrderLog(workOrderExt); } + private MesPartExt getMesPartExt(MesWorkOrderExt mesWorkOrderExt, String organizeCode) { + MesPartExt partExt = partExtService.getPartExt(organizeCode, mesWorkOrderExt.getPartNo()); + if (partExt == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("物料编码[%s]不存在", mesWorkOrderExt.getPartNo()) + .build(); + } + return partExt; + } + private synchronized Double getWorkOrderExtMaxSeq(String organizeCode, Integer count) { Double maxSeq = new Double(0); try { @@ -219,6 +237,7 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { maxSeq = JsonUtilTool.decode(JSONObject.toJSONString(resultObject), Double.class); } } catch (Exception e) { + log.error("getWorkOrderExtMaxSeq --- 获取最大序列号失败原因:{}", e.toString()); } DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.SEQ}, packBean); @@ -325,19 +344,7 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { } //根据产线获取产线信息 - MesWorkCenter mesWorkCenter = workCenterRepository.getByProperty( - new String[]{"workCenterCode", "organizeCode", "isValid", "isDeleted"}, - new Object[]{excelWorkOrderDto.getWorkCenterCode(), organizeCode, - CommonEnumUtil.IS_VAILD.VAILD.getValue(), - CommonEnumUtil.IS_DEAL.NO.getValue()}); - - if (mesWorkCenter == null) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("第【%s】行的产线代码【%s】在产线信息中不存在数据", i, excelWorkOrderDto.getWorkCenterCode()) - .build(); - } + MesWorkCenter mesWorkCenter = getMesWorkCenter(i, organizeCode, excelWorkOrderDto); MesWorkOrderExt mesWorkOrderExt = new MesWorkOrderExt(); @@ -359,6 +366,23 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService { } } + private MesWorkCenter getMesWorkCenter(Integer i, String organizeCode, ExcelWorkOrderDto excelWorkOrderDto) { + MesWorkCenter mesWorkCenter = workCenterRepository.getByProperty( + new String[]{"workCenterCode", "organizeCode", "isValid", "isDeleted"}, + new Object[]{excelWorkOrderDto.getWorkCenterCode(), organizeCode, + CommonEnumUtil.IS_VAILD.VAILD.getValue(), + CommonEnumUtil.IS_DEAL.NO.getValue()}); + + if (mesWorkCenter == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("第【%s】行的产线代码【%s】在产线信息中不存在数据", i, excelWorkOrderDto.getWorkCenterCode()) + .build(); + } + return mesWorkCenter; + } + /** * 调整工作顺序 * diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/print/method/JxPrintPackageAndSpotTicketService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/print/method/JxPrintPackageAndSpotTicketService.java new file mode 100644 index 0000000..9c3e410 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/print/method/JxPrintPackageAndSpotTicketService.java @@ -0,0 +1,82 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.print.method; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxPrintTemplateMethodService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.PackageExtModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxPrintTemplateModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description 嘉兴现品票打印数据(工厂内部使用) + * @Author: wangjie + * @CreateDate: 2020/6/22 9:38 AM + * @Description: + **/ +@Slf4j +@Service +public class JxPrintPackageAndSpotTicketService extends SxPrintDispatchService implements ISxPrintTemplateMethodService { + + @Autowired + private ISxWorkOrderExtService sxWorkOrderExtService; + + @Override + public List> exec(SxPrintTemplateModel printModel) { + List> resultMapList = null; + List packList = printModel.getPackList(); + + List workOrderNoList = packList.stream().filter(o -> null != o).map(PackageExtModel::getWorkOrderNo).collect(Collectors.toList()); + Map startTimeMap = new HashMap<>(); + for (String workOrderNo : workOrderNoList) { + if (StringUtils.isEmpty(workOrderNo)) { + continue; + } + MesWorkOrderExt workOrderExt = sxWorkOrderExtService.getWorkOrderExtByOrderNo(printModel.getOrganizeCode(), workOrderNo); + if (null == workOrderExt) { + continue; + } + String[] dateArr = workOrderExt.getStartTime().substring(2, 7).split("-"); + startTimeMap.put(workOrderNo, new StringJoiner(".").add(dateArr[1]).add(dateArr[0]).toString()); + } + + for (PackageExtModel pack : packList) { + if (null == pack) { + continue; + } + if (CollectionUtils.isEmpty(resultMapList)) { + resultMapList = new ArrayList<>(); + } + Map resultMap = new HashMap<>(); + + resultMap.put(MesPcnExtConstWords.PART_NO, pack.getPartNo()); + + resultMap.put(MesPcnExtConstWords.PART_NAME, pack.getPartNameRdd()); + + resultMap.put(MesPcnExtConstWords.PACKAGENO, pack.getPackageNo()); + + if (!StringUtils.isEmpty(pack.getPrinterCode())) { + resultMap.put(MesPcnExtConstWords.PRINTER_CODE, pack.getPrinterCode()); + } + // 一维码 + resultMap.put(MesPcnExtConstWords.BAR_CODE, pack.getPackageNo()); + // 二维码 + resultMap.put(MesPcnExtConstWords.QR_CODE, pack.getPackageNo()); + + // 生产日期 + resultMap.put(MesPcnExtConstWords.YEAR_MONTH_DAY, pack.getWorkTime()); + resultMap.put(MesPcnExtConstWords.QTY, pack.getQty()); + + resultMapList.add(resultMap); + } + return resultMapList; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/GenerateWorkOrderDto.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/GenerateWorkOrderDto.java index 0570844..27e9033 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/GenerateWorkOrderDto.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/GenerateWorkOrderDto.java @@ -58,4 +58,10 @@ public class GenerateWorkOrderDto { @ApiParam("Erp库存地") private String erpWarehouse; + @ApiParam("产品条码起始") + private String produceSnStart; + + @ApiParam("产品条码截至") + private String produceSnEnd; + }