From 8a6b127eedf7497d14166f823c5aa133a62e1d2d Mon Sep 17 00:00:00 2001 From: mzr Date: Fri, 4 Jul 2025 18:09:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E6=96=99=E8=AE=A1=E5=88=92=E8=BD=AC?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=9A=84=E5=85=B6=E5=AE=83=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickm/action/PickmToGeneralInAction.java | 246 ++++++++++++++++++ .../pickm/config/action/pickm_action.xml | 164 ++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 mmpac/src/client/nccloud/web/mmpac/pickm/action/PickmToGeneralInAction.java create mode 100644 mmpac/src/client/yyconfig/modules/mmpac/pickm/config/action/pickm_action.xml diff --git a/mmpac/src/client/nccloud/web/mmpac/pickm/action/PickmToGeneralInAction.java b/mmpac/src/client/nccloud/web/mmpac/pickm/action/PickmToGeneralInAction.java new file mode 100644 index 0000000..6be9fab --- /dev/null +++ b/mmpac/src/client/nccloud/web/mmpac/pickm/action/PickmToGeneralInAction.java @@ -0,0 +1,246 @@ +package nccloud.web.mmpac.pickm.action; + +import nc.itf.ic.m4a.IGeneralInMaintain; +import nc.itf.mmpac.pickm.IPickmQueryService; +import nc.itf.mmpac.pickm.IPickmTransTypeService; +import nc.itf.uap.pf.busiflow.PfButtonClickContext; +import nc.pubitf.mmpac.mo.pickm.IMoPubService4Pickm; +import nc.util.mmf.busi.service.PFPubService; +import nc.util.mmf.framework.base.MMMapUtil; +import nc.util.mmf.framework.base.MMNumberUtil; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.material.prod.MaterialProdModeEnum; +import nc.vo.ic.m4a.entity.GeneralInHeadVO; +import nc.vo.ic.m4a.entity.GeneralInVO; +import nc.vo.mmpac.mo.param.MoQueryParam4Pickm; +import nc.vo.mmpac.pickm.consts.PickmLangConsts; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum; +import nc.vo.mmpac.pickm.enumeration.FitemsourceEnum; +import nc.vo.mmpac.pickm.enumeration.FsourcetypeEnum; +import nc.vo.pub.AggregatedValueObject; +import nc.vo.pub.BusinessException; +import nc.vo.pub.compiler.PfParameterVO; +import nc.vo.pub.lang.UFBoolean; +import nc.vo.pubapp.pattern.pub.MapList; +import nc.vo.scmpub.res.billtype.ICBillType; +import nccloud.dto.mmpac.pickm.pub.entity.PickmQueryInfoDTO; +import nccloud.framework.core.exception.ExceptionUtils; +import nccloud.framework.core.json.IJson; +import nccloud.framework.service.ServiceLocator; +import nccloud.framework.web.action.itf.ICommonAction; +import nccloud.framework.web.container.IRequest; +import nccloud.framework.web.json.JsonFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备料计划转库存的其它入库 + * + * @author mzr + * @date 2025/7/4 + */ +public class PickmToGeneralInAction implements ICommonAction { + @Override + public Object doAction(IRequest request) { + String read = request.read(); + IJson json = JsonFactory.create(); + try { + // 获取请求查询信息 + PickmQueryInfoDTO paramDTO = json.fromJson(read, PickmQueryInfoDTO.class); + // 获取主键 + String[] cpickmids = paramDTO.getCpickmids(); + String[] cpickmbids = paramDTO.getCpickmbids(); + if (MMValueCheck.isEmpty(cpickmids) && (null == cpickmbids || cpickmbids.length == 0)) { + return null; + } + AggPickmVO[] aggVOs = null; + IPickmQueryService service = ServiceLocator.find(IPickmQueryService.class); + if (MMValueCheck.isNotEmpty(cpickmids)) { + aggVOs = service.queryBillsByPks(cpickmids); + } else if (MMValueCheck.isNotEmpty(cpickmbids)) { + aggVOs = service.queryAggPickmVObyBid(cpickmbids); + } + if (MMValueCheck.isEmpty(aggVOs)) { + /*@res "单据已被修改或删除,请刷新界面重新操作!"*/ + ExceptionUtils.wrapBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0009")); + } + // 过滤 + AggPickmVO[] filterVOs = this.filterAggPickmVOForDirectTrans(aggVOs); + if (MMValueCheck.isEmpty(filterVOs)) { + ExceptionUtils.wrapBusinessException(PickmLangConsts.getErrNoDataToReqPickm()); + } + // 转换数据 + GeneralInVO[] inVOS = convertToGeneralInVO(filterVOs, null); + // 其它入库新增 + IGeneralInMaintain generalInMaintain = ServiceLocator.find(IGeneralInMaintain.class); + GeneralInVO[] insertVos = generalInMaintain.insert(inVOS); + Map returnMap = new HashMap<>(); + returnMap.put("data", insertVos); + returnMap.put("success", true); + return returnMap; + } catch (Exception e) { + ExceptionUtils.wrapException(e); + } + return null; + } + + /** + * 方法功能描述:批量执行VO转换,若来源及目标单据类型没有注册或传入来源单据不能转换,则抛出业务异常 + * + * @param sourceBillVOs AggregatedValueObject[]型参数,来源单据VO数组 + * @param srcParaVo PfParameterVO型参数,平台的运行参数类,一般为NULL即可 + * @return AggregatedValueObject[]型VO转换后的目标单据数组 + * @throws BusinessException 若VO转换失败,则抛出业务异常 + */ + private GeneralInVO[] convertToGeneralInVO(AggregatedValueObject[] sourceBillVOs, PfParameterVO srcParaVo) + throws BusinessException { + // 来源交易类型或单据类型,需要在单据类型中注册 + String srcBillOrTranstype = "55A3"; + // 目标交易类型或单据类型,需要在单据类型中注册 + String destBillOrTranstype = ICBillType.GeneralIn.getCode(); + // classifyMode int型参数,调用模式,参照PfButtonClickContext中定义,代码中调用为接口方式 ClassifyByItfdef + int classifyMode = PfButtonClickContext.ClassifyByItfdef; + GeneralInVO[] inVOS = (GeneralInVO[]) PFPubService.runChangeData(srcBillOrTranstype, destBillOrTranstype, sourceBillVOs, srcParaVo, classifyMode); + if (MMValueCheck.isEmpty(inVOS)) { + ExceptionUtils.wrapBusinessException("备料计划转换其它入库失败"); + } + for (GeneralInVO inVO : inVOS) { + // 其它入库单的仓库、交易类型取自【业务参数设置】的默认值 + GeneralInHeadVO head = inVO.getHead(); + head.setCtrantypeid("01"); + head.setVtrantypecode("01"); + } + return inVOS; + } + + /* + * 过滤备料计划 完成态,非生产,来源生产订单完工或关闭,表体非发料,非备料,可执行量<0 + */ + private AggPickmVO[] filterAggPickmVOForDirectTrans(AggPickmVO[] aggvos) throws BusinessException { + if (aggvos == null) { + return null; + } + List resultVO = new ArrayList(); + // 查询生产订单参数 + List moParams = new ArrayList(); + MapList moidMap = new MapList(); + List transTypeIds = new ArrayList(); + for (AggPickmVO aggvo : aggvos) { + PickmHeadVO head = aggvo.getParentVO(); + // 完成态 + if (FbillstatusEnum.FINISH_STATE.equalsValue(head.getFbillstatus())) { + continue; + } + // 表体为空 + if (MMValueCheck.isEmpty(aggvo.getChildren(PickmItemVO.class))) { + continue; + } + + // 行判断是否符合 + PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class); + List itemList = new ArrayList(); + for (PickmItemVO item : items) { + // 发料为否 + if (!MMValueCheck.isTrue(item.getBcandeliver())) { + continue; + } + // 备料来源不是备料 + if (!FitemsourceEnum.PREPARE.equalsValue(item.getFitemsource())) { + continue; + } + // 2、需求主数量>0; + // 需求主数量=计划出库数量-累计出库数量-累计委外数量-累计待转数量-累计入库数量-预留; + if (!MMNumberUtil.isGtZero(MMNumberUtil.sub(item.getNplanoutnum(), item.getNaccoutnum(), + item.getNatpnum(), item.getNpscnum(), item.getNtransnum(), item.getNtransinnum()))) { + continue; + } + itemList.add(item); + } + if (MMValueCheck.isEmpty(itemList)) { + continue; + } + AggPickmVO vo = new AggPickmVO(); + vo.setParent(head); + vo.setChildren(PickmItemVO.class, itemList.toArray(new PickmItemVO[0])); + resultVO.add(vo); + transTypeIds.add(head.getVbusitypeid()); + // 如果来源于生产订单,构造查询生产订单参数 + if (FsourcetypeEnum.MOBILL_STATE.equalsValue(head.getFsourcetype())) { + // 流程 + if (MaterialProdModeEnum.PRODMODE_PROD.equalsValue(head.getFprodmode())) { + moidMap.put(head.getFprodmode(), head.getCsourcebillrowid()); + } + // 离散 + if (MaterialProdModeEnum.PRODMODE_SEPPROD.equalsValue(head.getFprodmode())) { + moidMap.put(head.getFprodmode(), head.getCsourcebillid()); + } + } + } + // 过滤后结果为空 + if (MMValueCheck.isEmpty(resultVO)) { + return null; + } + // 交易类型 + IPickmTransTypeService wwService = ServiceLocator + .find(IPickmTransTypeService.class); + Map isWWPickm = + wwService.isWWPickmTransType(transTypeIds.toArray(new String[0])); + // 查询来源生产订单是否为完工或关闭态 + Map ismoFinisOrClose = new HashMap(); + // 来源生产订单信息为空 + if (!MMMapUtil.isEmpty(moidMap)) { + // 构造查询生产订单参数 + for (Integer prodmode : moidMap.keySet()) { + MoQueryParam4Pickm param = new MoQueryParam4Pickm(); + param.setProdMode(prodmode); + param.setIds(moidMap.get(prodmode).toArray(new String[0])); + moParams.add(param); + } + IMoPubService4Pickm moService = ServiceLocator + .find(IMoPubService4Pickm.class); + ismoFinisOrClose = + moService.getMOItemFinishOrCloseStatus(moParams.toArray(new MoQueryParam4Pickm[0])); + + } + // 循环上一轮结果,过滤来源生产订单为关闭或完工的备料 计划 + List resultMoVO = new ArrayList(); + for (AggPickmVO aggvo : resultVO) { + PickmHeadVO head = aggvo.getParentVO(); + // 交易类型非生产 + if (isWWPickm.containsKey(head.getVbusitypeid()) + && MMValueCheck.isTrue(isWWPickm.get(head.getVbusitypeid()))) { + continue; + } + // 如果不是来源于生产订单,构造查询生产订单参数 + if (!FsourcetypeEnum.MOBILL_STATE.equalsValue(head.getFsourcetype())) { + resultMoVO.add(aggvo); + continue; + } + String moid = ""; + // 流程 + if (MaterialProdModeEnum.PRODMODE_PROD.equalsValue(head.getFprodmode())) { + moid = head.getCsourcebillrowid(); + } + // 离散 + if (MaterialProdModeEnum.PRODMODE_SEPPROD.equalsValue(head.getFprodmode())) { + moid = head.getCsourcebillid(); + } + // 来源生产订单为完工或关闭态 + if (MMValueCheck.isNotEmpty(ismoFinisOrClose) && ismoFinisOrClose.containsKey(moid) + && MMValueCheck.isTrue(ismoFinisOrClose.get(moid))) { + continue; + } + resultMoVO.add(aggvo); + } + if (MMValueCheck.isEmpty(resultMoVO)) { + return null; + } + return resultMoVO.toArray(new AggPickmVO[0]); + } +} diff --git a/mmpac/src/client/yyconfig/modules/mmpac/pickm/config/action/pickm_action.xml b/mmpac/src/client/yyconfig/modules/mmpac/pickm/config/action/pickm_action.xml new file mode 100644 index 0000000..48ed412 --- /dev/null +++ b/mmpac/src/client/yyconfig/modules/mmpac/pickm/config/action/pickm_action.xml @@ -0,0 +1,164 @@ + + + + mmpac.pickm.query + + nccloud.web.mmpac.pickm.action.PickmListQueryAction + + + mmpac.pickm.queryCardInfo + + nccloud.web.mmpac.pickm.action.PickmCardQueryAction + + + mmpac.pickm.queryPage + + nccloud.web.mmpac.pickm.action.PickmListPageQueryAction + + + mmpac.pickm.addSave + + nccloud.web.mmpac.pickm.action.PickmAddSaveAction + + + mmpac.pickm.editSave + + nccloud.web.mmpac.pickm.action.PickmEditSaveAction + + + mmpac.pickm.saveCommit + + nccloud.web.mmpac.pickm.action.PickmSaveCommitAction + + + mmpac.pickm.delete + + nccloud.web.mmpac.pickm.action.PickmDeleteAction + + + mmpac.pickm.edit + + nccloud.web.mmpac.pickm.action.PickmEditAction + + + mmpac.pickm.copy + + nccloud.web.mmpac.pickm.action.PickmCopyAction + + + mmpac.pickm.subItem + + nccloud.web.mmpac.pickm.action.PickmSubItemAction + + + mmpac.pickm.commit + + nccloud.web.mmpac.pickm.action.PickmCommitAction + + + mmpac.pickm.uncommit + + nccloud.web.mmpac.pickm.action.PickmUnCommitAction + + + mmpac.pickm.finish + + nccloud.web.mmpac.pickm.action.PickmFinishAction + + + mmpac.pickm.unfinish + + nccloud.web.mmpac.pickm.action.PickmUnFinishAction + + + mmpac.pickm.printpermission + + nccloud.web.mmpac.pickm.action.PickmPrintPermissionAction + + + + mmpac.pickm.print + + nccloud.web.mmpac.pickm.action.PickmPrintAction + + + mmpac.pickm.backserialno + + nccloud.web.mmpac.pickm.action.PickmBackSerialnoAction + + + mmpac.pickm.backSnAddline + + nccloud.web.mmpac.pickm.action.PickmBackSerialnoAddLineAction + + + + mmpac.pickm.backdeliver + + nccloud.web.mmpac.pickm.action.PickmBackDeliverAction + + + mmpac.pickm.setbackdelivercomput + + nccloud.web.mmpac.pickm.action.PickmSetBackDeliverComput + + + + mmpac.pickm.takeover + + nccloud.web.mmpac.pickm.action.PickmTakeOverAction + + + mmpac.pickm.checktoreqpickm + + nccloud.web.mmpac.pickm.action.PickmToReqpickmAction + + + mmpac.pickm.checktodeliver + + nccloud.web.mmpac.pickm.query.PickmDeliverAction + + + mmpac.pickm.noitemdeliver + + nccloud.web.mmpac.pickm.action.PickmNoitemDeliverAction + + + mmpac.pickm.replace + + nccloud.web.mmpac.pickm.action.PickmReplaceAction + + + mmpac.pickm.replaceAutoMatch + + nccloud.web.mmpac.pickm.action.PickmReplaceAutoMatchAction + + + + mmpac.pickm.deleteline + + nccloud.web.mmpac.pickm.action.PickmDeleteLineAction + + + mmpac.pickm.reserveCheck + + nccloud.web.mmpac.pickm.action.PickmReserveCheckAction + + + mmpac.pickm.checktoDirectTrans + + nccloud.web.mmpac.pickm.action.PickmDirectTransAction + + + mmpac.pickm.queryByCond + + nccloud.web.mmpac.pickm.action.PickmQueryByConditionAction + + + + mmpac.pickm.convertOtherIn + + nccloud.web.mmpac.pickm.action.PickmToGeneralInAction + + + \ No newline at end of file