备料计划转库存的其它入库

This commit is contained in:
mzr 2025-07-04 18:09:44 +08:00
parent d6edefa054
commit 8a6b127eed
2 changed files with 410 additions and 0 deletions

View File

@ -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<String, Object> 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<AggPickmVO> resultVO = new ArrayList<AggPickmVO>();
// 查询生产订单参数
List<MoQueryParam4Pickm> moParams = new ArrayList<MoQueryParam4Pickm>();
MapList<Integer, String> moidMap = new MapList<Integer, String>();
List<String> transTypeIds = new ArrayList<String>();
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<PickmItemVO> itemList = new ArrayList<PickmItemVO>();
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<String, Boolean> isWWPickm =
wwService.isWWPickmTransType(transTypeIds.toArray(new String[0]));
// 查询来源生产订单是否为完工或关闭态
Map<String, UFBoolean> ismoFinisOrClose = new HashMap<String, UFBoolean>();
// 来源生产订单信息为空
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<AggPickmVO> resultMoVO = new ArrayList<AggPickmVO>();
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]);
}
}

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<actions>
<action>
<name>mmpac.pickm.query</name>
<label>备料计划列表查询</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmListQueryAction</clazz>
</action>
<action>
<name>mmpac.pickm.queryCardInfo</name>
<label>备料计划卡片查询</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmCardQueryAction</clazz>
</action>
<action>
<name>mmpac.pickm.queryPage</name>
<label>备料计划列表查询 适配分页-翻页查询</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmListPageQueryAction</clazz>
</action>
<action>
<name>mmpac.pickm.addSave</name>
<label>备料计划新增保存</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmAddSaveAction</clazz>
</action>
<action>
<name>mmpac.pickm.editSave</name>
<label>备料计划修改保存</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmEditSaveAction</clazz>
</action>
<action>
<name>mmpac.pickm.saveCommit</name>
<label>备料计划保存提交</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmSaveCommitAction</clazz>
</action>
<action>
<name>mmpac.pickm.delete</name>
<label>备料计划列表删除</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmDeleteAction</clazz>
</action>
<action>
<name>mmpac.pickm.edit</name>
<label>备料计划编辑</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmEditAction</clazz>
</action>
<action>
<name>mmpac.pickm.copy</name>
<label>备料计划复制</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmCopyAction</clazz>
</action>
<action>
<name>mmpac.pickm.subItem</name>
<label>备料计划备料重算</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmSubItemAction</clazz>
</action>
<action>
<name>mmpac.pickm.commit</name>
<label>备料计划提交</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmCommitAction</clazz>
</action>
<action>
<name>mmpac.pickm.uncommit</name>
<label>备料计划收回</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmUnCommitAction</clazz>
</action>
<action>
<name>mmpac.pickm.finish</name>
<label>备料计划完成</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmFinishAction</clazz>
</action>
<action>
<name>mmpac.pickm.unfinish</name>
<label>备料计划取消完成</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmUnFinishAction</clazz>
</action>
<action>
<name>mmpac.pickm.printpermission</name>
<label>备料计划打印权限</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmPrintPermissionAction
</clazz>
</action>
<action>
<name>mmpac.pickm.print</name>
<label>备料计划打印</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmPrintAction</clazz>
</action>
<action>
<name>mmpac.pickm.backserialno</name>
<label>备料计划-退料序列号</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmBackSerialnoAction</clazz>
</action>
<action>
<name>mmpac.pickm.backSnAddline</name>
<label>备料计划-退料序列号增行</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmBackSerialnoAddLineAction
</clazz>
</action>
<action>
<name>mmpac.pickm.backdeliver</name>
<label>备料计划-退料处理</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmBackDeliverAction</clazz>
</action>
<action>
<name>mmpac.pickm.setbackdelivercomput</name>
<label>备料计划-成套退料计算</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmSetBackDeliverComput
</clazz>
</action>
<action>
<name>mmpac.pickm.takeover</name>
<label>备料计划-接收(取消接收)处理</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmTakeOverAction</clazz>
</action>
<action>
<name>mmpac.pickm.checktoreqpickm</name>
<label>备料计划-备料处理</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmToReqpickmAction</clazz>
</action>
<action>
<name>mmpac.pickm.checktodeliver</name>
<label>备料计划-领料处理</label>
<clazz>nccloud.web.mmpac.pickm.query.PickmDeliverAction</clazz>
</action>
<action>
<name>mmpac.pickm.noitemdeliver</name>
<label>备料计划-无备料领料处理</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmNoitemDeliverAction</clazz>
</action>
<action>
<name>mmpac.pickm.replace</name>
<label>备料计划-替代</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmReplaceAction</clazz>
</action>
<action>
<name>mmpac.pickm.replaceAutoMatch</name>
<label>备料计划-替代自动匹配</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmReplaceAutoMatchAction
</clazz>
</action>
<action>
<name>mmpac.pickm.deleteline</name>
<label>备料计划-删行后</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmDeleteLineAction</clazz>
</action>
<action>
<name>mmpac.pickm.reserveCheck</name>
<label>备料计划-预留</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmReserveCheckAction</clazz>
</action>
<action>
<name>mmpac.pickm.checktoDirectTrans</name>
<label>备料计划-直接备料处理</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmDirectTransAction</clazz>
</action>
<action>
<name>mmpac.pickm.queryByCond</name>
<label>备料计划查询-数据穿透</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmQueryByConditionAction
</clazz>
</action>
<action>
<name>mmpac.pickm.convertOtherIn</name>
<label>备料计划-借料入库</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmToGeneralInAction
</clazz>
</action>
</actions>