备料计划转库存的其它入库-增加过滤条件和配置项获取

This commit is contained in:
mzr 2025-07-15 20:27:19 +08:00
parent 30c0f6f86e
commit 721f442b73
1 changed files with 57 additions and 121 deletions

View File

@ -1,34 +1,31 @@
package nccloud.web.mmpac.pickm.action;
import nc.bs.dao.BaseDAO;
import nc.bs.uapbd.util.MyHelper;
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.jdbc.framework.processor.ColumnProcessor;
import nc.pubitf.para.SysInitQuery;
import nc.util.mmf.busi.service.PFPubService;
import nc.util.mmf.framework.base.MMMapUtil;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.bd.material.prod.MaterialProdModeEnum;
import nc.vo.fi.pub.SqlUtils;
import nc.vo.ic.m4a.entity.GeneralInBodyVO;
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.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.billtype.BilltypeVO;
import nc.vo.pub.compiler.PfParameterVO;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.pub.MapList;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.scmpub.res.billtype.ICBillType;
import nccloud.baseapp.core.log.NCCForUAPLogger;
import nccloud.commons.lang.StringUtils;
import nccloud.dto.mmpac.pickm.pub.entity.PickmQueryInfoDTO;
import nccloud.framework.core.exception.ExceptionUtils;
import nccloud.framework.core.json.IJson;
@ -37,9 +34,8 @@ 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.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -49,6 +45,16 @@ import java.util.Map;
* @date 2025/7/4
*/
public class PickmToGeneralInAction implements ICommonAction {
public BaseDAO dao;
public BaseDAO getDao() {
if (dao == null) {
dao = new BaseDAO();
}
return dao;
}
@Override
public Object doAction(IRequest request) {
String read = request.read();
@ -73,11 +79,8 @@ public class PickmToGeneralInAction implements ICommonAction {
/*@res "单据已被修改或删除,请刷新界面重新操作!"*/
ExceptionUtils.wrapBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0009"));
}
// 过滤 todo
/*AggPickmVO[] filterVOs = this.filterAggPickmVO(aggVOs);
if (MMValueCheck.isEmpty(filterVOs)) {
ExceptionUtils.wrapBusinessException(PickmLangConsts.getErrNoDataToReqPickm());
}*/
// 过滤
this.filterAggPickmVO(aggVOs);
// 转换数据
GeneralInVO[] inVOS = convertToGeneralInVO(aggVOs, null);
for (GeneralInVO inVO : inVOS) {
@ -87,12 +90,13 @@ public class PickmToGeneralInAction implements ICommonAction {
if (body.getNnum() == null) {
body.setNnum(UFDouble.ZERO_DBL);
}
NCCForUAPLogger.debug("cgeneralbid.nnum = " + body.getNnum());
// NCCForUAPLogger.debug("cgeneralbid.nnum = " + body.getNnum());
}
}
// 其它入库新增
IGeneralInMaintain generalInMaintain = ServiceLocator.find(IGeneralInMaintain.class);
GeneralInVO[] insertVos = generalInMaintain.insert(inVOS);
// NCCForUAPLogger.debug("vbillcode = " + insertVos[0].getHead().getVbillcode());
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("data", insertVos);
returnMap.put("success", true);
@ -123,133 +127,65 @@ public class PickmToGeneralInAction implements ICommonAction {
if (MMValueCheck.isEmpty(inVOS)) {
ExceptionUtils.wrapBusinessException("备料计划转换其它入库失败");
}
String pkOrg = inVOS[0].getParentVO().getPk_org();
String typeCode = SysInitQuery.getParaString(pkOrg, "ICIN_TYPE");
String warehouseId = SysInitQuery.getParaString(pkOrg, "ICIN_CK");
if (StringUtils.isEmpty(typeCode) || StringUtils.isEmpty(warehouseId)) {
ExceptionUtils.wrapBusinessException("当前组织缺失参数配置,请前往 [业务参数设置-组织] 配置仓库或入库类型参数");
}
for (GeneralInVO inVO : inVOS) {
String pk_billtypeid = MyHelper.transferField(BilltypeVO.TABLENAME, BilltypeVO.PK_BILLTYPE_ID, BilltypeVO.PK_BILLTYPECODE, "4A-01");
String pk_billtypeid = MyHelper.transferField(BilltypeVO.TABLENAME, BilltypeVO.PK_BILLTYPE_ID, BilltypeVO.PK_BILLTYPECODE, typeCode);
// String code = MyHelper.transferField(StordocVO.getDefaultTableName(),
// StordocVO.CODE, StordocVO.PK_STORDOC, "");
// 其它入库单的仓库交易类型取自业务参数设置的默认值
GeneralInHeadVO head = inVO.getHead();
// head.setCtrantypeid("0001A110000000001S1E");
head.setCtrantypeid(pk_billtypeid);
head.setVtrantypecode("4A-01");
// 变压器公司的008借料库
head.setCwarehouseid("1001A110000002HYPMCB");
head.setVtrantypecode(typeCode);
head.setCwarehouseid(warehouseId);
}
return inVOS;
}
/*
* 过滤备料计划 审批通过=1上游生产订单行是投放状态已生成的不能再生成
* fitemstatus 行状态 自由=0,审批通过=4,投放=1,完工=2,关闭=3
*/
private AggPickmVO[] filterAggPickmVO(AggPickmVO[] aggvos) throws BusinessException {
if (aggvos == null) {
return null;
private void filterAggPickmVO(AggPickmVO[] aggVos) throws BusinessException {
if (aggVos == null) {
return;
}
List<AggPickmVO> resultVO = new ArrayList<>();
// 查询生产订单参数
List<MoQueryParam4Pickm> moParams = new ArrayList<>();
MapList<Integer, String> moidMap = new MapList<>();
List<String> transTypeIds = new ArrayList<>();
for (AggPickmVO aggvo : aggvos) {
for (AggPickmVO aggvo : aggVos) {
PickmHeadVO head = aggvo.getParentVO();
// 完成态
if (FbillstatusEnum.FINISH_STATE.equalsValue(head.getFbillstatus())) {
continue;
if (!FbillstatusEnum.AUDIT_STATE.equalsValue(head.getFbillstatus())) {
ExceptionUtils.wrapBusinessException("请选择审核通过的备料计划");
}
// 表体为空
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;
}
itemList.add(item);
String[] pickmBidArray = Arrays.stream(items)
.map(PickmItemVO::getCpickm_bid)
.toArray(String[]::new);
String bidStr = SqlUtils.getInStr("csourcebillbid", pickmBidArray, true);
String countSql = "SELECT count(1) FROM ic_generalin_b"
+ " WHERE dr = 0 and " + bidStr;
Integer num = (Integer) getDao().executeQuery(countSql, new ColumnProcessor());
if (num > 0) {
ExceptionUtils.wrapBusinessException("存在已生成其它入库的行");
}
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());
SqlBuilder sqlBuilder = new SqlBuilder();
sqlBuilder.append(" select fitemstatus");
sqlBuilder.append(" from mm_mo");
sqlBuilder.append(" where dr = 0");
sqlBuilder.append(" and ");
sqlBuilder.append("cmoid", head.getCsourcebillrowid());// 来源生产订单明细id
Integer fitemstatus = (Integer) getDao().executeQuery(sqlBuilder.toString(), new ColumnProcessor());
if (fitemstatus != 1) {
ExceptionUtils.wrapBusinessException("上游的生产订单行需要为投放状态");
}
}
}
// 过滤后结果为空
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<>();
// 来源生产订单信息为空
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<>();
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 (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]);
}
}