备料计划同步高压MES优化-材料出库回写备料计划的情况下
This commit is contained in:
parent
c79c178e8d
commit
e0e80b925f
|
|
@ -1,28 +1,9 @@
|
|||
//
|
||||
// Source code recreated from a .class file by IntelliJ IDEA
|
||||
// (powered by FernFlower decompiler)
|
||||
//
|
||||
|
||||
package nc.bs.mmpac.pickm.bp.rewrite;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import nc.bs.mmpac.pickm.adapter.IC4DServiceAdapter;
|
||||
import nc.bs.mmpac.pickm.adapter.ReserveServiceAdapter;
|
||||
import nc.bs.mmpac.pickm.rule.batch.PickmAutoBatchBindRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmCheckBillStatusForRewritePickmRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmCheckMoStateForDeliveryRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmCheckUnClose4455When4DRewriteRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmFillVacancyWhenRewriteRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmRewriteNumFor4DRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.PickmRewriteOtherNumRule;
|
||||
import nc.bs.mmpac.pickm.rule.ic.*;
|
||||
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
|
||||
import nc.bs.uif2.validation.ValidationException;
|
||||
import nc.bs.uif2.validation.ValidationFailure;
|
||||
|
|
@ -45,8 +26,7 @@ import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum;
|
|||
import nc.vo.mmpac.pickm.param.PickmTransParamFor4D;
|
||||
import nc.vo.mmpac.pickm.util.base.PickmCloneUtil;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pub.ISuperVO;
|
||||
import nc.vo.pub.SuperVO;
|
||||
import nc.vo.pub.VOStatus;
|
||||
import nc.vo.pub.lang.UFDouble;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.pubapp.pattern.pub.MapList;
|
||||
|
|
@ -54,27 +34,42 @@ import nc.vo.util.BDPKLockUtil;
|
|||
import nc.vo.util.BDVersionValidationUtil;
|
||||
import nccloud.web.mmpac.pickm.service.SyncGyMesPickmUtil;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 材料出库单回写备料计划BP
|
||||
*
|
||||
* @author liddf
|
||||
* @version 2011-12-22 下午06:05:15
|
||||
* @since 6.1
|
||||
*/
|
||||
public class PickmRewriteNNum4DBP {
|
||||
|
||||
/**
|
||||
* 回写参数
|
||||
*/
|
||||
private MapList<String, PickmTransParamFor4D> paraCache;
|
||||
|
||||
public PickmRewriteNNum4DBP() {
|
||||
}
|
||||
/**
|
||||
* 回写处理
|
||||
*
|
||||
* @param paraMap
|
||||
* @param aggVOs
|
||||
*/
|
||||
public void rewriteNPlanNumAndNAccountNum4D(MapList<String, PickmTransParamFor4D> paraMap, AggPickmVO[] aggVOs)
|
||||
throws BusinessException {
|
||||
|
||||
public void rewriteNPlanNumAndNAccountNum4D(MapList<String, PickmTransParamFor4D> paraMap, AggPickmVO[] aggVOs) throws BusinessException {
|
||||
this.paraCache = paraMap;
|
||||
List<PickmQueryParamFor4D> paramList = new ArrayList();
|
||||
List<PickmItemVO> itemList = new ArrayList();
|
||||
AggPickmVO[] var5 = aggVOs;
|
||||
int var6 = aggVOs.length;
|
||||
|
||||
for(int var7 = 0; var7 < var6; ++var7) {
|
||||
AggPickmVO agg = var5[var7];
|
||||
PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO();
|
||||
PickmItemVO[] var10 = items;
|
||||
int var11 = items.length;
|
||||
|
||||
for(int var12 = 0; var12 < var11; ++var12) {
|
||||
PickmItemVO item = var10[var12];
|
||||
List<PickmQueryParamFor4D> paramList = new ArrayList<PickmQueryParamFor4D>();
|
||||
// // PK加锁
|
||||
// BDPKLockUtil.lockAggVO(aggVOs);
|
||||
// // TS校验
|
||||
// BDVersionValidationUtil.validateObject((Object[]) aggVOs);
|
||||
List<PickmItemVO> itemList = new ArrayList<PickmItemVO>();
|
||||
for (AggPickmVO agg : aggVOs) {
|
||||
PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO();
|
||||
for (PickmItemVO item : items) {
|
||||
itemList.add(item);
|
||||
if (paraMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isTrue(item.getBunibatch())) {
|
||||
PickmQueryParamFor4D param = new PickmQueryParamFor4D();
|
||||
|
|
@ -83,201 +78,241 @@ public class PickmRewriteNNum4DBP {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, List<PickmQueryOutParamFor4D>> bunibatchMap = IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode((PickmQueryParamFor4D[])paramList.toArray(new PickmQueryParamFor4D[0]));
|
||||
// 混批验证Map
|
||||
Map<String, List<PickmQueryOutParamFor4D>> bunibatchMap =
|
||||
IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode(
|
||||
paramList.toArray(new PickmQueryParamFor4D[0]));
|
||||
if (null != bunibatchMap) {
|
||||
// 混批校验
|
||||
this.validateBuniBatch(aggVOs, bunibatchMap);
|
||||
}
|
||||
// 加锁
|
||||
BDPKLockUtil.lockSuperVO(itemList.toArray(new PickmItemVO[0]));
|
||||
// 较验TS
|
||||
BDVersionValidationUtil.validateSuperVO(itemList.toArray(new PickmItemVO[0]));
|
||||
|
||||
BDPKLockUtil.lockSuperVO((SuperVO[])itemList.toArray(new PickmItemVO[0]));
|
||||
BDVersionValidationUtil.validateSuperVO((SuperVO[])itemList.toArray(new PickmItemVO[0]));
|
||||
// 处理前规则
|
||||
this.processBeforeRule(aggVOs);
|
||||
// 埋补偿
|
||||
// 埋回写补偿
|
||||
PickmSagasUtil.addSagaAndCompensate4DRewrite(aggVOs, this.paraCache);
|
||||
List<PickmHeadVO> headVOs = new ArrayList();
|
||||
List<PickmItemVO> itemVOs = new ArrayList();
|
||||
AggPickmVO[] var21 = aggVOs;
|
||||
int var24 = aggVOs.length;
|
||||
|
||||
for(int var27 = 0; var27 < var24; ++var27) {
|
||||
AggPickmVO aggVO = var21[var27];
|
||||
List<PickmHeadVO> headVOs = new ArrayList<PickmHeadVO>();
|
||||
List<PickmItemVO> itemVOs = new ArrayList<PickmItemVO>();
|
||||
for (AggPickmVO aggVO : aggVOs) {
|
||||
PickmHeadVO headVO = aggVO.getParentVO();
|
||||
if (null != headVO) {
|
||||
headVOs.add(headVO);
|
||||
Object[] items = aggVO.getChildren(PickmItemVO.class);
|
||||
if (MMArrayUtil.isNotEmpty(items)) {
|
||||
ISuperVO[] var33 = (ISuperVO[]) items;
|
||||
int var15 = items.length;
|
||||
|
||||
for(int var16 = 0; var16 < var15; ++var16) {
|
||||
Object obj = var33[var16];
|
||||
itemVOs.add((PickmItemVO)obj);
|
||||
for (Object obj : items) {
|
||||
itemVOs.add((PickmItemVO) obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新备料计划表头信息
|
||||
if (MMCollectionUtil.isNotEmpty(headVOs)) {
|
||||
BDPKLockUtil.lockSuperVO((SuperVO[])headVOs.toArray(new PickmHeadVO[0]));
|
||||
BDVersionValidationUtil.validateSuperVO((SuperVO[])headVOs.toArray(new PickmHeadVO[0]));
|
||||
List<PickmHeadVO> heads = new ArrayList();
|
||||
Iterator var25 = headVOs.iterator();
|
||||
|
||||
while(var25.hasNext()) {
|
||||
PickmHeadVO head = (PickmHeadVO)var25.next();
|
||||
if (head.getStatus() == 1) {
|
||||
// 加锁
|
||||
BDPKLockUtil.lockSuperVO(headVOs.toArray(new PickmHeadVO[0]));
|
||||
// 较验TS
|
||||
BDVersionValidationUtil.validateSuperVO(headVOs.toArray(new PickmHeadVO[0]));
|
||||
List<PickmHeadVO> heads = new ArrayList<PickmHeadVO>();
|
||||
for (PickmHeadVO head : headVOs) {
|
||||
if (head.getStatus() == VOStatus.UPDATED) {
|
||||
heads.add(head);
|
||||
}
|
||||
|
||||
// 更新备料计划表头信息
|
||||
if (MMCollectionUtil.isNotEmpty(heads)) {
|
||||
VOUpdate<PickmHeadVO> update = new VOUpdate();
|
||||
update.update((PickmHeadVO[])heads.toArray(new PickmHeadVO[0]));
|
||||
VOUpdate<PickmHeadVO> update = new VOUpdate<PickmHeadVO>();
|
||||
update.update(heads.toArray(new PickmHeadVO[0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新表体
|
||||
if (MMCollectionUtil.isNotEmpty(itemVOs)) {
|
||||
// 要更新的表体信息
|
||||
PickmItemVO[] updateItems = PickmRewriteUtil.getUpdateItemVOs(paraMap.keySet(), itemVOs);
|
||||
this.releaseReserve((PickmHeadVO[])headVOs.toArray(new PickmHeadVO[0]), updateItems);
|
||||
VOUpdate<PickmItemVO> update = new VOUpdate();
|
||||
PickmItemVO[] pickmItemVOS = update.update(updateItems);
|
||||
|
||||
//备料计划点击备料重算后调高压MES修改
|
||||
SyncGyMesPickmUtil pickmUtil = new SyncGyMesPickmUtil();
|
||||
pickmUtil.process(aggVOs);
|
||||
// 完成态的备料计划进行释放预留
|
||||
this.releaseReserve(headVOs.toArray(new PickmHeadVO[0]), updateItems);
|
||||
// 更新备料计划子行信息
|
||||
VOUpdate<PickmItemVO> update = new VOUpdate<PickmItemVO>();
|
||||
PickmItemVO[] resItemVOS = update.update(updateItems);
|
||||
// 备料计划子表修改后同步调用高压MES接口
|
||||
SyncGyMesPickmUtil pickmUtil = new SyncGyMesPickmUtil();
|
||||
pickmUtil.processMaterialOut(resItemVOS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 完成态的备料计划进行释放预留
|
||||
*
|
||||
* @param headVOs 备料计划表头信息
|
||||
* @param updateItems 要更新的备料计划表体信息
|
||||
* @throws BusinessException
|
||||
*/
|
||||
private void releaseReserve(PickmHeadVO[] headVOs, PickmItemVO[] updateItems) throws BusinessException {
|
||||
if (!MMValueCheck.isEmpty(headVOs)) {
|
||||
Set<String> hidSet = new HashSet();
|
||||
PickmHeadVO[] var4 = headVOs;
|
||||
int var5 = headVOs.length;
|
||||
|
||||
for(int var6 = 0; var6 < var5; ++var6) {
|
||||
PickmHeadVO hvo = var4[var6];
|
||||
if (MMValueCheck.isNotEmpty(hvo.getFbillstatus()) && FbillstatusEnum.FINISH_STATE.toIntValue() == hvo.getFbillstatus()) {
|
||||
hidSet.add(hvo.getCpickmid());
|
||||
}
|
||||
}
|
||||
|
||||
if (!MMValueCheck.isEmpty(hidSet)) {
|
||||
MMSqlBuilder sql = new MMSqlBuilder();
|
||||
sql.append(" and ");
|
||||
sql.append("cpickmid", (String[])hidSet.toArray(new String[0]));
|
||||
VOQuery<PickmItemVO> voQuery = new VOQuery(PickmItemVO.class);
|
||||
PickmItemVO[] ivos = (PickmItemVO[])voQuery.query(sql.toString(), (String)null);
|
||||
Set<String> bidSet = new HashSet();
|
||||
PickmItemVO[] var8 = ivos;
|
||||
int var9 = ivos.length;
|
||||
|
||||
for(int var10 = 0; var10 < var9; ++var10) {
|
||||
PickmItemVO ivo = var8[var10];
|
||||
bidSet.add(ivo.getCpickm_bid());
|
||||
}
|
||||
|
||||
this.releaseIDs((String[])bidSet.toArray(new String[0]), updateItems);
|
||||
// 判断要释放预留的备料计划表头信息是否为空
|
||||
if (MMValueCheck.isEmpty(headVOs)) {
|
||||
return;
|
||||
}
|
||||
// 表头IDSet
|
||||
Set<String> hidSet = new HashSet<String>();
|
||||
for (PickmHeadVO hvo : headVOs) {
|
||||
if (MMValueCheck.isNotEmpty(hvo.getFbillstatus())
|
||||
&& FbillstatusEnum.FINISH_STATE.toIntValue() == hvo.getFbillstatus().intValue()) {
|
||||
hidSet.add(hvo.getCpickmid());
|
||||
}
|
||||
}
|
||||
// 判断要释放预留的完成态备料计划表头IDSet是否为空
|
||||
if (MMValueCheck.isEmpty(hidSet)) {
|
||||
return;
|
||||
}
|
||||
// 组装sql
|
||||
MMSqlBuilder sql = new MMSqlBuilder();
|
||||
sql.append(" and ");
|
||||
sql.append(PickmItemVO.CPICKMID, hidSet.toArray(new String[0]));
|
||||
// 查询出所有完成态的备料计划子表信息
|
||||
VOQuery<PickmItemVO> voQuery = new VOQuery<PickmItemVO>(PickmItemVO.class);
|
||||
// 备料计划子表VOs
|
||||
PickmItemVO[] ivos = voQuery.query(sql.toString(), null);
|
||||
// 表体IDSet
|
||||
Set<String> bidSet = new HashSet<String>();
|
||||
for (PickmItemVO ivo : ivos) {
|
||||
bidSet.add(ivo.getCpickm_bid());
|
||||
}
|
||||
// 释放预留
|
||||
this.releaseIDs(bidSet.toArray(new String[0]), updateItems);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据子表IDs解除预留
|
||||
*
|
||||
* @param releasePickmbids 要释放预留子信息的备料计划子表BIDs
|
||||
* @param updateItems 备料计划表体VOs
|
||||
* @throws BusinessException
|
||||
*/
|
||||
private void releaseIDs(String[] releasePickmbids, PickmItemVO[] updateItems) throws BusinessException {
|
||||
// 按备料计划子表IDs查询出预留
|
||||
ReserveVO[] rvos = ReserveServiceAdapter.queryReserver(releasePickmbids);
|
||||
if (!MMValueCheck.isEmpty(rvos)) {
|
||||
Map<String, PickmItemVO> ivoMap = new HashMap();
|
||||
PickmItemVO[] var5 = updateItems;
|
||||
int var6 = updateItems.length;
|
||||
|
||||
int var7;
|
||||
for(var7 = 0; var7 < var6; ++var7) {
|
||||
PickmItemVO ivo = var5[var7];
|
||||
ivoMap.put(ivo.getCpickm_bid(), ivo);
|
||||
}
|
||||
|
||||
Set<String> releaseidSet = new HashSet();
|
||||
ReserveVO[] var12 = rvos;
|
||||
var7 = rvos.length;
|
||||
|
||||
for(int var13 = 0; var13 < var7; ++var13) {
|
||||
ReserveVO rvo = var12[var13];
|
||||
if (ivoMap.containsKey(rvo.getCreqbillbid())) {
|
||||
PickmItemVO ivo = (PickmItemVO)ivoMap.get(rvo.getCreqbillbid());
|
||||
ivo.setNatpastnum(UFDouble.ZERO_DBL);
|
||||
ivo.setNatpnum(UFDouble.ZERO_DBL);
|
||||
}
|
||||
|
||||
releaseidSet.add(rvo.getCreqbillbid());
|
||||
}
|
||||
|
||||
ReserveServiceAdapter.batchAdjustReserveWhenDeliver((String[])releaseidSet.toArray(new String[0]));
|
||||
// 判断预留信息是否为空
|
||||
if (MMValueCheck.isEmpty(rvos)) {
|
||||
return;
|
||||
}
|
||||
// 备料计划子行VOMap
|
||||
Map<String, PickmItemVO> ivoMap = new HashMap<String, PickmItemVO>();
|
||||
for (PickmItemVO ivo : updateItems) {
|
||||
ivoMap.put(ivo.getCpickm_bid(), ivo);
|
||||
}
|
||||
// 释放预留的idSet
|
||||
Set<String> releaseidSet = new HashSet<String>();
|
||||
for (ReserveVO rvo : rvos) {
|
||||
if (ivoMap.containsKey(rvo.getCreqbillbid())) {
|
||||
PickmItemVO ivo = ivoMap.get(rvo.getCreqbillbid());
|
||||
ivo.setNatpastnum(UFDouble.ZERO_DBL);
|
||||
ivo.setNatpnum(UFDouble.ZERO_DBL);
|
||||
}
|
||||
releaseidSet.add(rvo.getCreqbillbid());
|
||||
}
|
||||
// 释放预留
|
||||
ReserveServiceAdapter.batchAdjustReserveWhenDeliver(releaseidSet.toArray(new String[0]));
|
||||
}
|
||||
|
||||
/**
|
||||
* 混批校验
|
||||
*
|
||||
* @param aggs
|
||||
* @param bunibatchMap
|
||||
*/
|
||||
private void validateBuniBatch(AggPickmVO[] aggs, Map<String, List<PickmQueryOutParamFor4D>> bunibatchMap) {
|
||||
List<ValidationFailure> failures = new ArrayList();
|
||||
List<ValidationFailure> failures = new ArrayList<ValidationFailure>();
|
||||
// 回写备料计划子表行存在混批错误:
|
||||
failures.add(new ValidationFailure(PickmLangConsts.getErr_RewriteError()));
|
||||
AggPickmVO[] var4 = aggs;
|
||||
int var5 = aggs.length;
|
||||
|
||||
for(int var6 = 0; var6 < var5; ++var6) {
|
||||
AggPickmVO agg = var4[var6];
|
||||
PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO();
|
||||
PickmItemVO[] var9 = items;
|
||||
int var10 = items.length;
|
||||
|
||||
for(int var11 = 0; var11 < var10; ++var11) {
|
||||
PickmItemVO item = var9[var11];
|
||||
if (bunibatchMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isNotEmpty((Collection)bunibatchMap.get(item.getCpickm_bid())) && MMValueCheck.isTrue(((PickmQueryOutParamFor4D)((List)bunibatchMap.get(item.getCpickm_bid())).get(0)).getIsMixBatch())) {
|
||||
failures.add(new ValidationFailure(PickmLangConsts.getErr_PickmBidCannotBuniBantch(new String[]{agg.getParentVO().getVbillcode(), item.getVrowno()})));
|
||||
for (AggPickmVO agg : aggs) {
|
||||
PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO();
|
||||
for (PickmItemVO item : items) {
|
||||
// 判断备料计划是否允许混批
|
||||
if (bunibatchMap.containsKey(item.getCpickm_bid())
|
||||
&& MMValueCheck.isNotEmpty(bunibatchMap.get(item.getCpickm_bid()))
|
||||
&& MMValueCheck.isTrue(bunibatchMap.get(item.getCpickm_bid()).get(0).getIsMixBatch())) {
|
||||
// 备料计划单据号{0}第{0}行,领料或退料时不允许混批!
|
||||
failures.add(new ValidationFailure(PickmLangConsts.getErr_PickmBidCannotBuniBantch(new String[]{
|
||||
agg.getParentVO().getVbillcode(), item.getVrowno()
|
||||
})));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (failures.size() > 1) {
|
||||
ExceptionUtils.wrappException(new ValidationException(failures));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加前规则
|
||||
*
|
||||
* @param processer
|
||||
*/
|
||||
private void processBeforeRule(AggPickmVO[] aggVOs) {
|
||||
if (!MMArrayUtil.isEmpty(aggVOs)) {
|
||||
AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs);
|
||||
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule(true);
|
||||
sagasCheckrule.process(aggVOs);
|
||||
PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = new PickmCheckBillStatusForRewritePickmRule();
|
||||
pickmCheckBillStatusForRewritePickmRule.process(aggVOs);
|
||||
IRule<AggPickmVO> chkmostsRule = new PickmCheckMoStateForDeliveryRule();
|
||||
chkmostsRule.process(aggVOs);
|
||||
PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule();
|
||||
unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs);
|
||||
PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache);
|
||||
rewriteRule.process(aggVOs);
|
||||
PickmFillVacancyWhenRewriteRule fillVacancyRule = new PickmFillVacancyWhenRewriteRule();
|
||||
fillVacancyRule.process(aggVOs);
|
||||
PickmAutoBatchBindRule batchBindRule = new PickmAutoBatchBindRule(this.paraCache);
|
||||
batchBindRule.process(aggVOs);
|
||||
PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule();
|
||||
setPartsRule.process(aggVOs);
|
||||
PickmAutoChangeStateRule autoChangeStateRule = new PickmAutoChangeStateRule();
|
||||
autoChangeStateRule.process(aggVOs, originAggVOs);
|
||||
|
||||
if (MMArrayUtil.isEmpty(aggVOs)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 先保存一份原始VO
|
||||
AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs);
|
||||
// sagas 冻结校验
|
||||
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule<AggPickmVO>(true);
|
||||
sagasCheckrule.process(aggVOs);
|
||||
// 备料计划不能是自由态
|
||||
PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule =
|
||||
new PickmCheckBillStatusForRewritePickmRule();
|
||||
pickmCheckBillStatusForRewritePickmRule.process(aggVOs);
|
||||
// 校验生产订单状态规则
|
||||
IRule<AggPickmVO> chkmostsRule = new PickmCheckMoStateForDeliveryRule();
|
||||
chkmostsRule.process(aggVOs);
|
||||
// 检查,材料出库单回写时,判断是否有未关闭的出库申请单
|
||||
PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule();
|
||||
unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs);
|
||||
|
||||
// 处理数量回写
|
||||
PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache);
|
||||
rewriteRule.process(aggVOs);
|
||||
|
||||
// 倒挤处理
|
||||
PickmFillVacancyWhenRewriteRule fillVacancyRule = new PickmFillVacancyWhenRewriteRule();
|
||||
fillVacancyRule.process(aggVOs);
|
||||
|
||||
// 调用批次关联处理的rule
|
||||
PickmAutoBatchBindRule batchBindRule = new PickmAutoBatchBindRule(this.paraCache);
|
||||
batchBindRule.process(aggVOs);
|
||||
|
||||
// 进行成套数量、累计超额数量等联动值的重算
|
||||
PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule();
|
||||
setPartsRule.process(aggVOs);
|
||||
|
||||
// 调用更新状态rule:自动完成 or 自动取消完成
|
||||
PickmAutoChangeStateRule autoChangeStateRule = new PickmAutoChangeStateRule();
|
||||
autoChangeStateRule.process(aggVOs, originAggVOs);
|
||||
}
|
||||
|
||||
public void rewriteNPlanNumAndNAccountNum4DSagasCheck(MapList<String, PickmTransParamFor4D> paraMap, AggPickmVO[] aggVOs) throws BusinessException {
|
||||
/**
|
||||
* 前置校验 回写处理
|
||||
*
|
||||
* @param paraMap
|
||||
* @param aggVOs
|
||||
* @throws BusinessException
|
||||
*/
|
||||
public void rewriteNPlanNumAndNAccountNum4DSagasCheck(MapList<String, PickmTransParamFor4D> paraMap,
|
||||
AggPickmVO[] aggVOs) throws BusinessException {
|
||||
this.paraCache = paraMap;
|
||||
List<PickmQueryParamFor4D> paramList = new ArrayList();
|
||||
List<PickmItemVO> itemList = new ArrayList();
|
||||
AggPickmVO[] var5 = aggVOs;
|
||||
int var6 = aggVOs.length;
|
||||
|
||||
for(int var7 = 0; var7 < var6; ++var7) {
|
||||
AggPickmVO agg = var5[var7];
|
||||
PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO();
|
||||
PickmItemVO[] var10 = items;
|
||||
int var11 = items.length;
|
||||
|
||||
for(int var12 = 0; var12 < var11; ++var12) {
|
||||
PickmItemVO item = var10[var12];
|
||||
List<PickmQueryParamFor4D> paramList = new ArrayList<PickmQueryParamFor4D>();
|
||||
List<PickmItemVO> itemList = new ArrayList<PickmItemVO>();
|
||||
for (AggPickmVO agg : aggVOs) {
|
||||
PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO();
|
||||
for (PickmItemVO item : items) {
|
||||
itemList.add(item);
|
||||
if (paraMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isTrue(item.getBunibatch())) {
|
||||
PickmQueryParamFor4D param = new PickmQueryParamFor4D();
|
||||
|
|
@ -286,23 +321,38 @@ public class PickmRewriteNNum4DBP {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, List<PickmQueryOutParamFor4D>> bunibatchMap = IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode((PickmQueryParamFor4D[])paramList.toArray(new PickmQueryParamFor4D[0]));
|
||||
// 混批验证Map
|
||||
Map<String, List<PickmQueryOutParamFor4D>> bunibatchMap =
|
||||
IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode(
|
||||
paramList.toArray(new PickmQueryParamFor4D[0]));
|
||||
if (null != bunibatchMap) {
|
||||
// 混批校验
|
||||
this.validateBuniBatch(aggVOs, bunibatchMap);
|
||||
}
|
||||
|
||||
if (!MMArrayUtil.isEmpty(aggVOs)) {
|
||||
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule(true);
|
||||
sagasCheckrule.process(aggVOs);
|
||||
PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = new PickmCheckBillStatusForRewritePickmRule();
|
||||
pickmCheckBillStatusForRewritePickmRule.process(aggVOs);
|
||||
IRule<AggPickmVO> chkmostsRule = new PickmCheckMoStateForDeliveryRule();
|
||||
chkmostsRule.process(aggVOs);
|
||||
PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule();
|
||||
unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs);
|
||||
PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache);
|
||||
rewriteRule.process(aggVOs);
|
||||
// 处理前规则
|
||||
if (MMArrayUtil.isEmpty(aggVOs)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 先保存一份原始VO
|
||||
// AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs);
|
||||
// sagas 冻结校验
|
||||
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule<AggPickmVO>(true);
|
||||
sagasCheckrule.process(aggVOs);
|
||||
// 备料计划不能是自由态
|
||||
PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule =
|
||||
new PickmCheckBillStatusForRewritePickmRule();
|
||||
pickmCheckBillStatusForRewritePickmRule.process(aggVOs);
|
||||
// 校验生产订单状态规则
|
||||
IRule<AggPickmVO> chkmostsRule = new PickmCheckMoStateForDeliveryRule();
|
||||
chkmostsRule.process(aggVOs);
|
||||
// 检查,材料出库单回写时,判断是否有未关闭的出库申请单
|
||||
PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule();
|
||||
unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs);
|
||||
|
||||
// 处理数量回写
|
||||
PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache);
|
||||
rewriteRule.process(aggVOs);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,12 +24,10 @@ import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
|||
import nc.vo.org.OrgVO;
|
||||
import nc.vo.pmpub.project.ProjectHeadVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.scmpub.util.ArrayUtil;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
|
@ -41,8 +39,6 @@ import java.util.stream.Stream;
|
|||
public class SyncGyMesPickmUtil {
|
||||
private static final String LOG_INFO_NAME = "gymeslog";
|
||||
private static final Log logger = Log.getInstance(LOG_INFO_NAME);
|
||||
// 异步调用线程池
|
||||
private static final ExecutorService asyncExecutor = Executors.newFixedThreadPool(1);
|
||||
private Map<String, String> configParams;
|
||||
|
||||
public void process(AggPickmVO[] aggPickmVOS) {
|
||||
|
|
@ -54,7 +50,20 @@ public class SyncGyMesPickmUtil {
|
|||
buildSyncData(aggPickmVOS);
|
||||
} catch (Exception e) {
|
||||
logger.error("同步备料计划到高压MES系统失败: " + e.getMessage(), e);
|
||||
// ExceptionUtils.wrappException(e);
|
||||
ExceptionUtils.wrappException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void processMaterialOut(PickmItemVO[] updateItems) {
|
||||
if (ArrayUtil.isEmpty(updateItems)) {
|
||||
return;
|
||||
}
|
||||
configParams = MyHelper.getConfigParams("gy-config", null);
|
||||
try {
|
||||
buildSyncData1(updateItems);
|
||||
} catch (Exception e) {
|
||||
logger.error("同步备料计划到高压MES系统失败: " + e.getMessage(), e);
|
||||
ExceptionUtils.wrappException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -109,7 +118,6 @@ public class SyncGyMesPickmUtil {
|
|||
singleObj.put("productName", mrl.get("name")); // 产品名称
|
||||
|
||||
singleObj.put("processCode", "(物料的自定义字段)"); // 产品编码的工序(物料的自定义字段)
|
||||
// singleObj.put("requiredDate", pickmHeadVO.getDmakedate().toString()); // 需用日期
|
||||
String sql1 = " select user_name from sm_user where cuserid = '" + pickmHeadVO.getModifier() + "' ";
|
||||
String bipCreateBy = (String) baseDAO.executeQuery(sql1, new ColumnProcessor());
|
||||
|
||||
|
|
@ -133,8 +141,7 @@ public class SyncGyMesPickmUtil {
|
|||
itemObj.put("storageArea", stockMap.get("def16")); // 立库库区
|
||||
itemObj.put("cwarehouseid", stockMap.get("pk_stordoc")); // 仓库编码
|
||||
itemObj.put("requiredDate", item.getDrequiredate().toString()); // 需用日期
|
||||
// itemObj.put("bchkitemforwr", "Y"); // 完工齐套检查
|
||||
itemObj.put("bchkitemforwr",item.getBchkitemforwr().booleanValue()?"Y":"N"); // 完工齐套检查
|
||||
itemObj.put("bchkitemforwr", item.getBchkitemforwr().booleanValue() ? "Y" : "N"); // 完工齐套检查
|
||||
itemObj.put("quantityPerSet", item.getNunituseastnum() != null ? item.getNunituseastnum().doubleValue() : null); // 单套数量(单位用量)
|
||||
itemObj.put("reservedQuantity", item.getNatpastnum() != null ? item.getNatpastnum().doubleValue() : null); // 预留数量
|
||||
itemObj.put("cumulativePendingQuantity", item.getNshouldastnum() != null ? item.getNshouldastnum().doubleValue() : null); // 累计待发数量
|
||||
|
|
@ -171,9 +178,80 @@ public class SyncGyMesPickmUtil {
|
|||
list.put("list", jsonArray);
|
||||
}
|
||||
if (!list.isEmpty()) {
|
||||
// 异步推送数据,不阻塞主线程
|
||||
pushData(list);
|
||||
logger.error("gyMes-Pickm-异步任务已提交,主线程继续执行");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建同步数据-材料出库修改备料计划的情况
|
||||
*/
|
||||
private void buildSyncData1(PickmItemVO[] updateItems) throws BusinessException {
|
||||
HYPubBO hybo = new HYPubBO();
|
||||
JSONObject list = new JSONObject();
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
Set<String> hids = new HashSet<>();
|
||||
for (PickmItemVO updateItem : updateItems) {
|
||||
hids.add(updateItem.getCpickmid());
|
||||
}
|
||||
List<AggPickmVO> useVOs = new ArrayList<>();
|
||||
// 按 cpickmid 分组子表行,确保 childrenVO 填充完整
|
||||
Map<String, List<PickmItemVO>> itemGroupByHead = new HashMap<>();
|
||||
for (PickmItemVO item : updateItems) {
|
||||
itemGroupByHead.computeIfAbsent(item.getCpickmid(), k -> new ArrayList<>()).add(item);
|
||||
}
|
||||
for (String hid : hids) {
|
||||
AggPickmVO vo = new AggPickmVO();
|
||||
PickmHeadVO pickmHeadVO = (PickmHeadVO) hybo.queryByPrimaryKey(PickmHeadVO.class, hid);
|
||||
vo.setParentVO(pickmHeadVO);
|
||||
// 将 updateItems 中相同 cpickmid 的数据设置到 childrenVO 中
|
||||
List<PickmItemVO> items = itemGroupByHead.getOrDefault(hid, Collections.emptyList());
|
||||
if (!items.isEmpty()) {
|
||||
vo.setChildrenVO(items.toArray(new PickmItemVO[0]));
|
||||
useVOs.add(vo);
|
||||
}
|
||||
}
|
||||
if (useVOs.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (AggPickmVO vo : useVOs) {
|
||||
PickmHeadVO pickmHeadVO = vo.getParentVO();
|
||||
PickmItemVO[] itemVOS = (PickmItemVO[]) vo.getChildrenVO();
|
||||
// 判断备料计划的业务单元是否是高压公司,不是则跳过
|
||||
String pkOrg = pickmHeadVO.getPk_org();
|
||||
String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
|
||||
if (checkIfOrg(orgCode, configParams)) {
|
||||
continue;
|
||||
}
|
||||
// 期初、整单委外的单据不推MES,其余类型推MES
|
||||
String billType = pickmHeadVO.getVbusitype();
|
||||
if (checkBillType(billType, configParams)) {
|
||||
continue;
|
||||
}
|
||||
JSONObject singleObj = new JSONObject();
|
||||
// 创建子项数组
|
||||
JSONArray contentArray = new JSONArray();
|
||||
|
||||
singleObj.put("materialPreparationPlanNumber", pickmHeadVO.getVbillcode());// 备料计划单号
|
||||
singleObj.put("bipId", pickmHeadVO.getCpickmid());// 主键ID
|
||||
// 创建子项数组
|
||||
for (PickmItemVO item : itemVOS) {
|
||||
JSONObject itemObj = new JSONObject();
|
||||
itemObj.put("bipChildId", item.getCpickm_bid()); // 子项主键ID
|
||||
itemObj.put("bchkitemforwr", item.getBchkitemforwr().booleanValue() ? "Y" : "N"); // 完工齐套检查
|
||||
itemObj.put("quantityPerSet", item.getNunituseastnum() != null ? item.getNunituseastnum().doubleValue() : null); // 单套数量(单位用量)
|
||||
itemObj.put("reservedQuantity", item.getNatpastnum() != null ? item.getNatpastnum().doubleValue() : null); // 预留数量
|
||||
itemObj.put("cumulativePendingQuantity", item.getNshouldastnum() != null ? item.getNshouldastnum().doubleValue() : null); // 累计待发数量
|
||||
itemObj.put("cumulativeIssuedQuantity", item.getNaccoutastnum() != null ? item.getNaccoutastnum().doubleValue() : null); // 累计出库数量
|
||||
itemObj.put("totalQuantity", item.getNplanoutnum() != null ? item.getNplanoutnum().doubleValue() : null); // 总数量(计划出库主数量)
|
||||
contentArray.add(itemObj); // 将子项添加到数组
|
||||
}
|
||||
singleObj.put("itemList", contentArray); // 将子项数组添加到主对象
|
||||
jsonArray.add(singleObj);
|
||||
list.put("list", jsonArray);
|
||||
}
|
||||
if (!list.isEmpty()) {
|
||||
logger.error("gyMes-Pickm-领料修改备料计划开始同步高压MES");
|
||||
pushData(list);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -196,12 +274,38 @@ public class SyncGyMesPickmUtil {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送同步数据
|
||||
*/
|
||||
private void pushData(JSONObject param) throws BusinessException {
|
||||
// 转json字符串的时候保留null值
|
||||
String jsonStr = JSON.toJSONString(param,
|
||||
SerializerFeature.WriteMapNullValue,
|
||||
SerializerFeature.WriteNullStringAsEmpty
|
||||
);
|
||||
logger.error("gyMes-Pickm-param = " + jsonStr);
|
||||
String baseUrl = configParams.get("mesBaseUrl");
|
||||
String requestUrl = baseUrl + configParams.get("materialRequirementsUpdate");
|
||||
logger.error("gyMes-Pickm-url = " + requestUrl);
|
||||
String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr);
|
||||
JSONObject resultObj = JSONObject.parseObject(result);
|
||||
logger.error("gyMes-Pickm-res = " + result);
|
||||
|
||||
if (!"200".equals(resultObj.getString("code"))) {
|
||||
logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]");
|
||||
throw new BusinessException("备料计划推送高压MES错误:" + resultObj.getString("msg"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 异步推送同步数据
|
||||
* 注意:此方法立即返回,不会阻塞调用线程
|
||||
* 实际的HTTP请求在独立线程中执行,即使接口响应很慢也不会影响主任务
|
||||
*/
|
||||
private void pushData(JSONObject param) {
|
||||
private void pushDataAsync(JSONObject param) {
|
||||
// 异步调用线程池
|
||||
final ExecutorService asyncExecutor = Executors.newFixedThreadPool(1);
|
||||
// 复制配置参数,避免异步任务执行时configParams被修改
|
||||
final Map<String, String> configParamsCopy = new HashMap<>(configParams);
|
||||
|
||||
|
|
@ -226,7 +330,6 @@ public class SyncGyMesPickmUtil {
|
|||
|
||||
if (!"200".equals(resultObj.getString("code"))) {
|
||||
logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]");
|
||||
logger.error("备料计划推送高压MES失败:" + resultObj.getString("msg"));
|
||||
} else {
|
||||
logger.error("gyMes-Pickm-推送成功");
|
||||
}
|
||||
|
|
@ -253,8 +356,8 @@ public class SyncGyMesPickmUtil {
|
|||
return true;
|
||||
}
|
||||
|
||||
public static Map<String, MaterialPlanVO> queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg,
|
||||
String[] fields) {
|
||||
public Map<String, MaterialPlanVO> queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg,
|
||||
String[] fields) {
|
||||
Map<String, MaterialPlanVO> map = null;
|
||||
try {
|
||||
List<String> vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList();
|
||||
|
|
|
|||
Loading…
Reference in New Issue