流程备料计划生成流程生产订单和请购单

This commit is contained in:
lihao 2025-07-23 11:04:21 +08:00
parent 03408aad46
commit 343d967e15
6 changed files with 428 additions and 0 deletions

View File

@ -0,0 +1,129 @@
package nccloud.web.mmpac.pickm.action;
import nc.itf.ic.m4a.IGeneralInMaintain;
import nc.itf.mmpac.pickm.IPickmQueryService;
import nc.itf.pu.m20.IPraybillMaintain;
import nc.itf.uap.pf.busiflow.PfButtonClickContext;
import nc.util.mmf.busi.service.PFPubService;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.ic.m4a.entity.GeneralInVO;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pickm.entity.PickmItemVO;
import nc.vo.pu.m20.entity.PraybillHeaderVO;
import nc.vo.pu.m20.entity.PraybillVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.ISuperVO;
import nc.vo.pub.compiler.PfParameterVO;
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;
/**
* 备料计划转请购单
*/
public class PickmToBuyingreqAction implements ICommonAction {
@Override
public Object doAction(IRequest iRequest) {
String read = iRequest.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);
}
if (MMValueCheck.isEmpty(aggVOs)) {
/*@res "单据已被修改或删除,请刷新界面重新操作!"*/
ExceptionUtils.wrapBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0009"));
}
// AggPickmVO[] aggPickmVOS=processAggVOs(aggVOs);
// 转换数据
PraybillVO[] prayVOs = convertToGeneralInVO(processAggVOs(aggVOs), null);
IPraybillMaintain maintain= ServiceLocator.find(IPraybillMaintain.class);
PraybillVO[] insertVos = maintain.insert(prayVOs);
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("data", insertVos);
returnMap.put("success", true);
return returnMap;
} catch (Exception e) {
ExceptionUtils.wrapException(e);
}
return null;
}
private PraybillVO[] convertToGeneralInVO(AggregatedValueObject[] sourceBillVOs, PfParameterVO srcParaVo)
throws BusinessException {
// 来源交易类型或单据类型需要在单据类型中注册
String srcBillOrTranstype = "55A3";
// 目标交易类型或单据类型需要在单据类型中注册
String destBillOrTranstype = "20";
// classifyMode int型参数调用模式参照PfButtonClickContext中定义代码中调用为接口方式 ClassifyByItfdef
int classifyMode = PfButtonClickContext.ClassifyByItfdef;
PraybillVO[] inVOS = (PraybillVO[]) PFPubService.runChangeData(srcBillOrTranstype, destBillOrTranstype, sourceBillVOs, srcParaVo, classifyMode);
if (MMValueCheck.isEmpty(inVOS)) {
ExceptionUtils.wrapBusinessException("备料计划转换请购单失败");
}
for (PraybillVO inVO : inVOS) {
// 其它入库单的仓库交易类型取自业务参数设置的默认值
PraybillHeaderVO head = inVO.getHVO();
head.setCtrantypeid("0001A110000000001S1E");
// head.setCwarehouseid("");
}
return inVOS;
}
public AggPickmVO[] processAggVOs(AggPickmVO[] aggVOs) {
Map<Object, List<AggPickmVO>> groupMap = new HashMap<>();
for (AggPickmVO vo : aggVOs) {
Object pk_org = vo.getParentVO().getPk_org();
groupMap.computeIfAbsent(pk_org, k -> new ArrayList<>()).add(vo);
}
List<AggPickmVO> resultList = new ArrayList<>();
for (Map.Entry<Object, List<AggPickmVO>> entry : groupMap.entrySet()) {
List<AggPickmVO> group = entry.getValue();
// 修改1使用ISuperVO列表收集子对象
List<PickmItemVO> mergedChildren = new ArrayList<PickmItemVO>();
for (AggPickmVO vo : group) {
PickmItemVO[] items = (PickmItemVO[]) vo.getChildren(PickmItemVO.class);
if (items != null) {
for (PickmItemVO child : items) {
// CircularlyAccessibleValueObject 实现了 ISuperVO
mergedChildren.add(child);
}
}
}
AggPickmVO newVO = new AggPickmVO();
newVO.setParent(group.get(0).getParentVO());
// 修改2转换为ISuperVO数组
newVO.setChildren(PickmItemVO.class, mergedChildren.toArray(new PickmItemVO[0]));
resultList.add(newVO);
}
return resultList.toArray(new AggPickmVO[0]);
}
}

View File

@ -0,0 +1,129 @@
package nccloud.web.mmpac.pickm.action;
import nc.itf.mmpac.pickm.IPickmQueryService;
import nc.itf.mmpac.pmo.pac0002.IPMOMaintainService;
import nc.itf.pu.m20.IPraybillMaintain;
import nc.itf.uap.pf.busiflow.PfButtonClickContext;
import nc.util.mmf.busi.service.PFPubService;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pickm.entity.PickmItemVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
import nc.vo.pu.m20.entity.PraybillHeaderVO;
import nc.vo.pu.m20.entity.PraybillVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.compiler.PfParameterVO;
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;
public class PickmToPmo implements ICommonAction {
@Override
public Object doAction(IRequest iRequest) {
String read = iRequest.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);
}
if (MMValueCheck.isEmpty(aggVOs)) {
/*@res "单据已被修改或删除,请刷新界面重新操作!"*/
ExceptionUtils.wrapBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0009"));
}
PMOAggVO[] prayVOs = convertToGeneralInVO(processAggVOs(aggVOs), null);
IPMOMaintainService maintain= ServiceLocator.find(IPMOMaintainService.class);
PMOAggVO[] insertVos = maintain.insert(prayVOs);
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("data", insertVos);
returnMap.put("success", true);
return returnMap;
} catch (Exception e) {
ExceptionUtils.wrapException(e);
}
return null;
}
private PMOAggVO[] convertToGeneralInVO(AggregatedValueObject[] sourceBillVOs, PfParameterVO srcParaVo)
throws BusinessException {
// 来源交易类型或单据类型需要在单据类型中注册
String srcBillOrTranstype = "55A3";
// 目标交易类型或单据类型需要在单据类型中注册
String destBillOrTranstype = "55A2";
// classifyMode int型参数调用模式参照PfButtonClickContext中定义代码中调用为接口方式 ClassifyByItfdef
int classifyMode = PfButtonClickContext.ClassifyByItfdef;
PMOAggVO[] inVOS = (PMOAggVO[]) PFPubService.runChangeData(srcBillOrTranstype, destBillOrTranstype, sourceBillVOs, srcParaVo, classifyMode);
if (MMValueCheck.isEmpty(inVOS)) {
ExceptionUtils.wrapBusinessException("备料计划转换流程生产订单失败");
}
for (PMOAggVO inVO : inVOS) {
// 其它入库单的仓库交易类型取自业务参数设置的默认值
PMOHeadVO head = inVO.getParentVO();
head.setCtrantypeid("0001A110000000001S1E");
for (PMOItemVO itemVO: inVO.getChildrenVO()){
}
// head.setCwarehouseid("");
}
return inVOS;
}
public AggPickmVO[] processAggVOs(AggPickmVO[] aggVOs) {
Map<Object, List<AggPickmVO>> groupMap = new HashMap<>();
for (AggPickmVO vo : aggVOs) {
Object pk_org = vo.getParentVO().getPk_org();
groupMap.computeIfAbsent(pk_org, k -> new ArrayList<>()).add(vo);
}
List<AggPickmVO> resultList = new ArrayList<>();
for (Map.Entry<Object, List<AggPickmVO>> entry : groupMap.entrySet()) {
List<AggPickmVO> group = entry.getValue();
// 修改1使用ISuperVO列表收集子对象
List<PickmItemVO> mergedChildren = new ArrayList<PickmItemVO>();
for (AggPickmVO vo : group) {
PickmItemVO[] items = (PickmItemVO[]) vo.getChildren(PickmItemVO.class);
if (items != null) {
for (PickmItemVO child : items) {
// CircularlyAccessibleValueObject 实现了 ISuperVO
mergedChildren.add(child);
}
}
}
AggPickmVO newVO = new AggPickmVO();
newVO.setParent(group.get(0).getParentVO());
// 修改2转换为ISuperVO数组
newVO.setChildren(PickmItemVO.class, mergedChildren.toArray(new PickmItemVO[0]));
resultList.add(newVO);
}
return resultList.toArray(new AggPickmVO[0]);
}
}

View File

@ -257,6 +257,9 @@
<action>mmpac.pickm.replaceAutoMatch</action>
<action>mmpac.pickm.queryByCond</action>
<action>mmpac.pickm.convertOtherIn</action>
<action>mmpac.pickm.buyingreq</action>
<action>mmpac.pickm.pom</action>
<action>mmpac.pickm.pickmItemsQuery</action>
</actions>
</authorize>

View File

@ -161,4 +161,16 @@
<clazz>nccloud.web.mmpac.pickm.action.PickmToGeneralInAction
</clazz>
</action>
<action>
<name>mmpac.pickm.buyingreq</name>
<label>备料计划-请购</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmToBuyingreqAction
</clazz>
</action>
<action>
<name>mmpac.pickm.pom</name>
<label>备料计划-请购</label>
<clazz>nccloud.web.mmpac.pickm.action.PickmToPmo
</clazz>
</action>
</actions>

View File

@ -0,0 +1,74 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nc.bs.mmpac.pickm.rule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.ic.m4a.IGeneralInMaintain;
import nc.itf.pu.m20.IPraybillMaintain;
import nc.itf.uap.pf.busiflow.PfButtonClickContext;
import nc.util.mmf.busi.service.PFPubService;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.pu.m20.entity.PraybillHeaderVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.compiler.PfParameterVO;
import nc.vo.pu.m20.entity.PraybillVO;
import nccloud.framework.core.exception.ExceptionUtils;
import nccloud.framework.service.ServiceLocator;
import java.util.HashMap;
import java.util.Map;
public class ToBuyingreqRule implements IRule<AggPickmVO> {
public ToBuyingreqRule() {
}
public void process(AggPickmVO[] aggVOs) {
if (!MMValueCheck.isEmpty(aggVOs)) {
try {
PraybillVO[] prayVOs = convertToGeneralInVO(aggVOs, null);
IPraybillMaintain maintain= ServiceLocator.find(IPraybillMaintain.class);
PraybillVO[] insertVos = maintain.insert(prayVOs);
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("data", insertVos);
returnMap.put("success", true);
} catch (BusinessException e) {
throw new RuntimeException(e);
}
}
}
/**
* 方法功能描述批量执行VO转换若来源及目标单据类型没有注册或传入来源单据不能转换则抛出业务异常
*
* @param sourceBillVOs AggregatedValueObject[]型参数来源单据VO数组
* @param srcParaVo PfParameterVO型参数平台的运行参数类一般为NULL即可
* @return AggregatedValueObject[]型VO转换后的目标单据数组
* @throws BusinessException 若VO转换失败则抛出业务异常
*/
private PraybillVO[] convertToGeneralInVO(AggregatedValueObject[] sourceBillVOs, PfParameterVO srcParaVo)
throws BusinessException {
// 来源交易类型或单据类型需要在单据类型中注册
String srcBillOrTranstype = "55A3";
// 目标交易类型或单据类型需要在单据类型中注册
String destBillOrTranstype = "20";
// classifyMode int型参数调用模式参照PfButtonClickContext中定义代码中调用为接口方式 ClassifyByItfdef
int classifyMode = PfButtonClickContext.ClassifyByItfdef;
PraybillVO[] inVOS = (PraybillVO[]) PFPubService.runChangeData(srcBillOrTranstype, destBillOrTranstype, sourceBillVOs, srcParaVo, classifyMode);
if (MMValueCheck.isEmpty(inVOS)) {
ExceptionUtils.wrapBusinessException("备料计划转换请购单失败");
}
for (PraybillVO inVO : inVOS) {
// 其它入库单的仓库交易类型取自业务参数设置的默认值
PraybillHeaderVO head = inVO.getHVO();
head.setCtrantypeid("0001A110000000001S1E");
// head.setCwarehouseid("");
}
return inVOS;
}
}

View File

@ -0,0 +1,81 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nc.bs.mmpac.pickm.rule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.mmpac.pmo.pac0002.IPMOMaintainService;
import nc.itf.pu.m20.IPraybillMaintain;
import nc.itf.uap.pf.busiflow.PfButtonClickContext;
import nc.util.mmf.busi.service.PFPubService;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
import nc.vo.pu.m20.entity.PraybillHeaderVO;
import nc.vo.pu.m20.entity.PraybillVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.compiler.PfParameterVO;
import nccloud.framework.core.exception.ExceptionUtils;
import nccloud.framework.service.ServiceLocator;
import java.util.HashMap;
import java.util.Map;
public class ToPmoRule implements IRule<AggPickmVO> {
public ToPmoRule() {
}
public void process(AggPickmVO[] aggVOs) {
if (!MMValueCheck.isEmpty(aggVOs)) {
try {
PMOAggVO[] prayVOs = convertToGeneralInVO(aggVOs, null);
IPMOMaintainService maintain= ServiceLocator.find(IPMOMaintainService.class);
PMOAggVO[] insertVos = maintain.insert(prayVOs);
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("data", insertVos);
returnMap.put("success", true);
} catch (BusinessException e) {
throw new RuntimeException(e);
}
}
}
/**
* 方法功能描述批量执行VO转换若来源及目标单据类型没有注册或传入来源单据不能转换则抛出业务异常
*
* @param sourceBillVOs AggregatedValueObject[]型参数来源单据VO数组
* @param srcParaVo PfParameterVO型参数平台的运行参数类一般为NULL即可
* @return AggregatedValueObject[]型VO转换后的目标单据数组
* @throws BusinessException 若VO转换失败则抛出业务异常
*/
private PMOAggVO[] convertToGeneralInVO(AggregatedValueObject[] sourceBillVOs, PfParameterVO srcParaVo)
throws BusinessException {
// 来源交易类型或单据类型需要在单据类型中注册
String srcBillOrTranstype = "55A3";
// 目标交易类型或单据类型需要在单据类型中注册
String destBillOrTranstype = "55A2";
// classifyMode int型参数调用模式参照PfButtonClickContext中定义代码中调用为接口方式 ClassifyByItfdef
int classifyMode = PfButtonClickContext.ClassifyByItfdef;
PMOAggVO[] inVOS = (PMOAggVO[]) PFPubService.runChangeData(srcBillOrTranstype, destBillOrTranstype, sourceBillVOs, srcParaVo, classifyMode);
if (MMValueCheck.isEmpty(inVOS)) {
ExceptionUtils.wrapBusinessException("备料计划转换流程生产订单失败");
}
for (PMOAggVO inVO : inVOS) {
// 其它入库单的仓库交易类型取自业务参数设置的默认值
PMOHeadVO head = inVO.getParentVO();
head.setCtrantypeid("0001A110000000001S1E");
for (PMOItemVO itemVO: inVO.getChildrenVO()){
}
// head.setCwarehouseid("");
}
return inVOS;
}
}