补丁合并

This commit is contained in:
lihao 2026-01-19 10:40:10 +08:00
parent cef7e53894
commit 677fb310df
3 changed files with 1480 additions and 298 deletions

View File

@ -1,13 +1,7 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nc.bs.mmpac.pickm.rule.rebuild;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -18,6 +12,7 @@ import nc.bs.mmpac.pickm.rule.subitems.PickmSubItemBuilderControler;
import nc.itf.mmpac.pickm.IPickmQueryService;
import nc.jdbc.framework.generator.SequenceGenerator;
import nc.mmpac.pacpub.utils.PACMDKeyUtil;
import nc.pubitf.para.SysInitQuery;
import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMMapUtil;
import nc.util.mmf.framework.base.MMNumberUtil;
@ -27,72 +22,139 @@ import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pickm.entity.PickmItemVO;
import nc.vo.mmpac.pickm.enumeration.FreplaceinfoEnum;
import nc.vo.pub.BusinessException;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.pub.MapList;
import nc.vo.pubapp.util.VORowNoUtils;
/**
* 备料重算算法
*
* @since 6.31
* @version 2013-7-17 下午01:38:36
* @author baijl
*/
public class PickmSubItemReBuilid {
private static final String[] updateAttributes = new String[]{"fitemtype", "fitemsource", "cbunitid", "cbastunitid", "vbchangerate", "drequiredate", "bcontroll", "nquotnum", "nquotastnum", "vpmoprocessno", "vdmoprocessno", "vprocesscode", "cwkid", "cfeedid", "cdeliverorgid", "cdeliverorgvid", "coutstockid", "csupplyorgid", "csupplyorgvid", "cinstockid", "pk_batchcode", "vbatchcode", "cstockmanid", "nplanoutnum", "nplanoutastnum", "bcandeliver", "bcanreplace", "pk_realsubs", "freplacetype", "nreplaceorder", "vreplacequotiety", "creplacesrcid", "creplacescheme", "vgroupratio", "bgroupkey", "vreplacegroup", "cgroupkeyrowid", "freplaceinfo", "fbackflushtype", "fbackflushtime", "fsupplytype", "vbmatchcode", "bmainmaterial", "bkitmaterial", "bcustomermaterial", "bprojectmaterial", "bupwardround", "nunitnum", "nunitastnum", "bautobuilt", "cbombid", "crtopacid", "vbbomversion", "vbbomversionnumber", "vbpbomversion", "vbpbomversionnumber", "nunituseastnum", "nunitusenum", "clocationid", "ctplcustomerid", "cvmivenderid", "ndissipationum", "nwithdissipationum", "nwithdissipatioastnum", "nnormaloutnum", "vbackflushtype", "boverissue", "bunibatch", "nfixshrinknum", "nfixshrinkastnum", "bchkitemforwr"};
// 需要同步的字段
private static final String[] updateAttributes = new String[] {
// 子项类型备料来源主单位单位
PickmItemVO.FITEMTYPE, PickmItemVO.FITEMSOURCE, PickmItemVO.CBUNITID, PickmItemVO.CBASTUNITID,
// 换算率需用日期控制主定额用量
PickmItemVO.VBCHANGERATE, PickmItemVO.DREQUIREDATE, PickmItemVO.BCONTROLL, PickmItemVO.NQUOTNUM,
// 定额用量流程需用工序离散需用工序工序类型编码工作中心
PickmItemVO.NQUOTASTNUM, PickmItemVO.VPMOPROCESSNO, PickmItemVO.VDMOPROCESSNO, PickmItemVO.VPROCESSCODE,
PickmItemVO.CWKID,
// 投料点发料组织VID发料组织oid发料仓库
PickmItemVO.CFEEDID, PickmItemVO.CDELIVERORGID, PickmItemVO.CDELIVERORGVID, PickmItemVO.COUTSTOCKID,
// 供应组织oid供应组织vid供应仓库
PickmItemVO.CSUPPLYORGID, PickmItemVO.CSUPPLYORGVID, PickmItemVO.CINSTOCKID,
// 库存批次id库存批次号库管员
PickmItemVO.PK_BATCHCODE, PickmItemVO.VBATCHCODE, PickmItemVO.CSTOCKMANID,
// 计划出库主数量计划出库数量发料可替代
PickmItemVO.NPLANOUTNUM, PickmItemVO.NPLANOUTASTNUM, PickmItemVO.BCANDELIVER, PickmItemVO.BCANREPLACE,
// 实际替代关系替代类型替代顺序替代系数
PickmItemVO.PK_REALSUBS, PickmItemVO.FREPLACETYPE, PickmItemVO.NREPLACEORDER, PickmItemVO.VREPLACEQUOTIETY,
PickmItemVO.CREPLACESRCID,
// 组合替代相关信息替代方案替代系数替代组号关键料关键料行
PickmItemVO.CREPLACESCHEME, PickmItemVO.VGROUPRATIO, PickmItemVO.BGROUPKEY, PickmItemVO.VREPLACEGROUP,
PickmItemVO.CGROUPKEYROWID,
// 替代信息倒冲方式倒冲实际供应方式
PickmItemVO.FREPLACEINFO, PickmItemVO.FBACKFLUSHTYPE, PickmItemVO.FBACKFLUSHTIME, PickmItemVO.FSUPPLYTYPE,
// 配套组号主要材料齐料客户专用料
PickmItemVO.VBMATCHCODE, PickmItemVO.BMAINMATERIAL, PickmItemVO.BKITMATERIAL, PickmItemVO.BCUSTOMERMATERIAL,
// 项目专用料向上取整主单位定额单位定额
PickmItemVO.BPROJECTMATERIAL, PickmItemVO.BUPWARDROUND, PickmItemVO.NUNITNUM, PickmItemVO.NUNITASTNUM,
// 系统生成BOM明细工艺路线生成BOM版本
PickmItemVO.BAUTOBUILT, PickmItemVO.CBOMBID, PickmItemVO.CRTOPACID, PickmItemVO.VBBOMVERSION,
// 生成BOM版本号包装BOM版本包装BOM版本号
PickmItemVO.VBBOMVERSIONNUMBER, PickmItemVO.VBPBOMVERSION, PickmItemVO.VBPBOMVERSIONNUMBER,
// 单位用量单位主用量货位货主客户
PickmItemVO.NUNITUSEASTNUM, PickmItemVO.NUNITUSENUM, PickmItemVO.CLOCATIONID, PickmItemVO.CTPLCUSTOMERID,
// 寄存供应商损耗系数,含损耗主数量
PickmItemVO.CVMIVENDERID, PickmItemVO.NDISSIPATIONUM, PickmItemVO.NWITHDISSIPATIONUM,
// 含损耗数量限额标记数量倒冲类型
PickmItemVO.NWITHDISSIPATIOASTNUM, PickmItemVO.NNORMALOUTNUM, PickmItemVO.VBACKFLUSHTYPE,
// 超额领料不允许混批固定损耗主数量固定损耗数量
PickmItemVO.BOVERISSUE, PickmItemVO.BUNIBATCH, PickmItemVO.NFIXSHRINKNUM, PickmItemVO.NFIXSHRINKASTNUM,
// 完工齐套检查
PickmItemVO.BCHKITEMFORWR, "vbdef1", "vbdef2", "vbdef3", "vbdef4", "vbdef5", "vbdef6", "vbdef7", "vbdef8",
"vbdef9", "vbdef10", "vbdef11", "vbdef12", "vbdef13", "vbdef14", "vbdef15", "vbdef16", "vbdef17", "vbdef18",
"vbdef19", "vbdef20", "vbnote", "vbdef45","vbdef46","vbdef47","vbdef48","vbdef49","vbdef50","vbdef51","vbdef52" };// 2025年12月23日15点40分--添加图号+版本号 vbdef45
// 是否生产订单触发
private boolean isFromMO;
private Map<String, AggPickmVO> preAggVOMap = new HashMap();
/**
* 存放旧备料计划聚合VOkey为备料计划主键
*/
private Map<String, AggPickmVO> preAggVOMap = new HashMap<String, AggPickmVO>();
public PickmSubItemReBuilid(boolean isMo) {
this.isFromMO = isMo;
}
public void reBuilder(AggPickmVO[] vos) throws BusinessException {
if (!MMValueCheck.isEmpty(vos)) {
Map<String, UFDouble> realSubNumMap = new HashMap();
if (MMValueCheck.isEmpty(vos)) {
return;
}
// 删除实际替代关系
// PickmRewritePLORealSub.DeletePLORealSub(vos);
Map<String, UFDouble> realSubNumMap = new HashMap<String, UFDouble>();
// 后端或生产订单按钮触发
if (this.isFromMO) {
for (AggPickmVO vo : vos) {
PickmItemVO[] itemVOs = (PickmItemVO[]) vo.getChildren(PickmItemVO.class);
if (!MMArrayUtil.isEmpty(itemVOs)) {
if (MMArrayUtil.isEmpty(itemVOs)) {
continue;
}
for (PickmItemVO itemVO : itemVOs) {
if (!MMValueCheck.isEmpty(itemVO.getPk_realsubs())) {
if (!MMValueCheck.isEmpty(realSubNumMap) && realSubNumMap.containsKey(itemVO.getPk_realsubs())) {
realSubNumMap.put(itemVO.getPk_realsubs(), MMNumberUtil.add(new UFDouble[]{(UFDouble)realSubNumMap.get(itemVO.getPk_realsubs()), itemVO.getNplanoutnum()}));
} else {
if (MMValueCheck.isEmpty(realSubNumMap)
|| !realSubNumMap.containsKey(itemVO.getPk_realsubs())) {
realSubNumMap.put(itemVO.getPk_realsubs(), itemVO.getNplanoutnum());
}
}
}
}
}
} else {
List<String> hids = new ArrayList();
realSubNumMap.put(itemVO.getPk_realsubs(), MMNumberUtil
.add(realSubNumMap.get(itemVO.getPk_realsubs()), itemVO.getNplanoutnum()));
}
}
}
}
}
// 前端触发
else {
List<String> hids = new ArrayList<String>();
for (AggPickmVO vo : vos) {
if (MMValueCheck.isNotEmpty(vo.getParentVO().getCpickmid())) {
hids.add(vo.getParentVO().getCpickmid());
}
}
if (MMValueCheck.isNotEmpty(hids)) {
PickmQueryItemsByPKsBP query = new PickmQueryItemsByPKsBP();
PickmItemVO[] itemVOs = query.queryItemsByHeadPks((String[])hids.toArray(new String[0]));
PickmItemVO[] itemVOs = query.queryItemsByHeadPks(hids.toArray(new String[0]));
if (MMValueCheck.isNotEmpty(itemVOs)) {
for (PickmItemVO itemVO : itemVOs) {
if (!MMValueCheck.isEmpty(itemVO.getPk_realsubs())) {
if (!MMValueCheck.isEmpty(realSubNumMap) && realSubNumMap.containsKey(itemVO.getPk_realsubs())) {
realSubNumMap.put(itemVO.getPk_realsubs(), MMNumberUtil.add(new UFDouble[]{(UFDouble)realSubNumMap.get(itemVO.getPk_realsubs()), itemVO.getNplanoutnum()}));
} else {
if (MMValueCheck.isEmpty(realSubNumMap)
|| !realSubNumMap.containsKey(itemVO.getPk_realsubs())) {
realSubNumMap.put(itemVO.getPk_realsubs(), itemVO.getNplanoutnum());
} else {
realSubNumMap.put(itemVO.getPk_realsubs(), MMNumberUtil
.add(realSubNumMap.get(itemVO.getPk_realsubs()), itemVO.getNplanoutnum()));
}
}
}
}
}
}
IPickmQueryService service= ((IPickmQueryService) NCLocator.getInstance()
.lookup(IPickmQueryService.class));
// 缓存备料计划旧VO
this.createPreAggMap(vos);
List<AggPickmVO> newBuildVOs = new ArrayList();
List<AggPickmVO> newPSCVOs = new ArrayList();
// 调用生成子项算法生成新的备料计划表体(生产和全程委外)
List<AggPickmVO> newBuildVOs = new ArrayList<AggPickmVO>();
// 生成的全新备料计划表体工序委外
List<AggPickmVO> newPSCVOs = new ArrayList<AggPickmVO>();
for (AggPickmVO aggvo : vos) {
if ("55E3".equals(aggvo.getParentVO().getVsourcebilltype())) {
AggPickmVO newAggVO = new AggPickmVO();
@ -112,59 +174,83 @@ public class PickmSubItemReBuilid {
}
}
if (!MMValueCheck.isEmpty(newPSCVOs)) {
// 工序委外
PSCPickmSubItemBuilderControler subPSItemBuilder = new PSCPickmSubItemBuilderControler();
AggPickmVO[] aggvos = subPSItemBuilder.process((AggPickmVO[])newPSCVOs.toArray(new AggPickmVO[0]), UFBoolean.TRUE);
AggPickmVO[] aggvos = subPSItemBuilder.process(newPSCVOs.toArray(new AggPickmVO[0]), UFBoolean.TRUE);
// 进行匹配重算算法
for (AggPickmVO aggvo : aggvos) {
AggPickmVO preaggvo = (AggPickmVO)this.preAggVOMap.get(aggvo.getPrimaryKey());
AggPickmVO preaggvo = this.preAggVOMap.get(aggvo.getPrimaryKey());
this.matchItem(preaggvo, aggvo);
}
}
if (!MMValueCheck.isEmpty(newBuildVOs)) {
// 生产和全程委外
PickmSubItemBuilderControler subItemBuilder = new PickmSubItemBuilderControler();
if (MMValueCheck.isNotEmpty(realSubNumMap)) {
subItemBuilder.setRealSubNum(realSubNumMap);
}
AggPickmVO[] aggvos = subItemBuilder.process((AggPickmVO[])newBuildVOs.toArray(new AggPickmVO[0]), this.isFromMO);
AggPickmVO[] aggvos = subItemBuilder.process(newBuildVOs.toArray(new AggPickmVO[0]), this.isFromMO);
// 进行匹配重算算法
if (MMValueCheck.isNotEmpty(aggvos)) {
for (AggPickmVO aggvo : aggvos) {
AggPickmVO preaggvo = (AggPickmVO)this.preAggVOMap.get(aggvo.getPrimaryKey());
AggPickmVO preaggvo = this.preAggVOMap.get(aggvo.getPrimaryKey());
this.matchItem(preaggvo, aggvo);
String k ="10";
}
}
}
}
}
/**
* 备料计划匹配算法
*
* @param preaggvo 旧备料计划聚合VO
* @param newaggvo 新备料计划聚合VO
*/
private void matchItem(AggPickmVO preaggvo, AggPickmVO newaggvo) {
Map<String, PickmItemVO> preItemMap = this.getItemMap(preaggvo);
MapList<String, PickmItemVO> newItemMap = this.getMD5ItemMap(newaggvo);
List<String> userBuiltItemIDs = this.getUserBuiltItemIDs(preaggvo);
// 如果旧表体为空 则新生成的所有子项都是新增
if (MMValueCheck.isEmpty(preaggvo.getChildren(PickmItemVO.class))) {
if (!MMValueCheck.isEmpty(newaggvo.getChildren(PickmItemVO.class))) {
preaggvo.setChildrenVO(this.getNewItems(preaggvo.getParentVO().getCpickmid(), (PickmItemVO[])newaggvo.getChildrenVO()));
if (MMValueCheck.isEmpty(newaggvo.getChildren(PickmItemVO.class))) {
return;
}
preaggvo.setChildrenVO(
this.getNewItems(preaggvo.getParentVO().getCpickmid(), (PickmItemVO[]) newaggvo.getChildrenVO()));
return;
}
} else {
PickmItemVO[] preItems = (PickmItemVO[]) preaggvo.getChildren(PickmItemVO.class);
Map<String, String> idMap = new HashMap();
Map<String, String> noIdMap = new HashMap();
Map<String, String> idMap = new HashMap<String, String>();
Map<String, String> noIdMap = new HashMap<String, String>();
for (PickmItemVO item : preItems) {
// 自制表体维持原状不考虑
if (!MMValueCheck.isTrue(item.getBautobuilt())) {
if (!MMValueCheck.isEmpty(item.getCreplacesrcid()) && (!MMValueCheck.isNotEmpty(userBuiltItemIDs) || !userBuiltItemIDs.contains(item.getCreplacesrcid()))) {
this.setDeleteItemValue(item);
// 非替代料
if (MMValueCheck.isEmpty(item.getCreplacesrcid())) {
continue;
}
// 自制表体的替代行
if (MMValueCheck.isNotEmpty(userBuiltItemIDs) && userBuiltItemIDs.contains(item.getCreplacesrcid())) {
continue;
}
// 非自制表体的替代行
this.setDeleteItemValue(item);
continue;
}
} else {
String key = this.getMatchKey(item);
if (!MMMapUtil.isEmpty(newItemMap) && newItemMap.containsKey(key)) {
// 只在旧行存在新行不存在
if (MMMapUtil.isEmpty(newItemMap) || !newItemMap.containsKey(key)) {
this.setDeleteItemValue(item);
// 只在旧表体存在的替代料行
this.setReplItemValue(item, preItemMap);
continue;
}
// 新旧行都存在
if (newItemMap.containsKey(key)) {
List<PickmItemVO> newItems = newItemMap.get(key);
Iterator var15 = newItems.iterator();
if (var15.hasNext()) {
PickmItemVO newItem = (PickmItemVO)var15.next();
for (PickmItemVO newItem : newItems) {
if (MMValueCheck.isNotEmpty(newItem.getCpickm_bid())) {
if (MMValueCheck.isNotEmpty(item.getCpickm_bid())) {
idMap.put(newItem.getCpickm_bid(), item.getCpickm_bid());
@ -172,197 +258,227 @@ public class PickmSubItemReBuilid {
item.setCpickm_bid(newItem.getCpickm_bid());
}
}
if (FreplaceinfoEnum.REPLACED.equalsValue(newItem.getFreplaceinfo()) && MMValueCheck.isEmpty(newItem.getCgroupkeyrowid())) {
if (FreplaceinfoEnum.REPLACED.equalsValue(newItem.getFreplaceinfo())
&& MMValueCheck.isEmpty(newItem.getCgroupkeyrowid())) {
if (MMValueCheck.isEmpty(item.getCpickm_bid())) {
item.setCpickm_bid(newItem.getCpickm_bid());
}
noIdMap.put(newItem.getVrowno(), item.getCpickm_bid());
}
if (MMValueCheck.isNotEmpty(newItem.getCreplacesrcid()) && MMValueCheck.isTrue(newItem.getBgroupkey())) {
if (MMValueCheck.isNotEmpty(newItem.getCreplacesrcid())
&& MMValueCheck.isTrue(newItem.getBgroupkey())) {
if (MMValueCheck.isEmpty(item.getCpickm_bid())) {
item.setCpickm_bid(newItem.getCpickm_bid());
}
noIdMap.put(newItem.getCreplacesrcid() + newItem.getVreplacegroup(), item.getCpickm_bid());
}
this.updatePreItem(item, newItem);
newItemMap.get(key).remove(newItem);
break;
}
if (MMValueCheck.isEmpty(newItemMap.get(key))) {
newItemMap.remove(key);
}
}
} else {
this.setDeleteItemValue(item);
this.setReplItemValue(item, preItemMap);
}
}
}
// 对新行有旧行没有的数据要添加到旧行中并添加序号
if (MMValueCheck.isNotEmpty(newItemMap)) {
PickmItemVO[] items = preItems;
for (String key : newItemMap.keySet()) {
items = this.addNewItem(items, (PickmItemVO[])newItemMap.get(key).toArray(new PickmItemVO[0]), noIdMap);
items = this.addNewItem(items, newItemMap.get(key).toArray(new PickmItemVO[0]), noIdMap);
}
preaggvo.setChildrenVO(items);
}
if (!MMValueCheck.isEmpty(preaggvo.getChildrenVO())) {
Map<String, String> idNoMap = new HashMap();
if (MMValueCheck.isEmpty(preaggvo.getChildrenVO())) {
return;
}
Map<String, String> idNoMap = new HashMap<String, String>();
for (PickmItemVO item : (PickmItemVO[]) preaggvo.getChildrenVO()) {
if (MMValueCheck.isNotEmpty(item.getCpickm_bid())) {
idNoMap.put(item.getCpickm_bid(), item.getVrowno());
}
}
for (PickmItemVO item : (PickmItemVO[]) preaggvo.getChildrenVO()) {
if (MMValueCheck.isNotEmpty(item.getCgroupkeyrowid())) {
if (MMValueCheck.isNotEmpty(idMap) && idMap.containsKey(item.getCgroupkeyrowid())) {
item.setCgroupkeyrowid((String)idMap.get(item.getCgroupkeyrowid()));
item.setCgroupkeyrowid(idMap.get(item.getCgroupkeyrowid()));
} else if (MMValueCheck.isNotEmpty(noIdMap) && noIdMap.containsKey(item.getCgroupkeyrowid())) {
item.setCgroupkeyrowid((String)noIdMap.get(item.getCgroupkeyrowid()));
item.setCgroupkeyrowid(noIdMap.get(item.getCgroupkeyrowid()));
}
}
if (MMValueCheck.isNotEmpty(item.getCreplacesrcid())) {
if (MMValueCheck.isNotEmpty(idMap) && idMap.containsKey(item.getCreplacesrcid())) {
item.setCreplacesrcid((String)idMap.get(item.getCreplacesrcid()));
item.setCreplacesrcid(idMap.get(item.getCreplacesrcid()));
} else if (MMValueCheck.isNotEmpty(noIdMap) && noIdMap.containsKey(item.getCreplacesrcid())) {
item.setCreplacesrcid((String)noIdMap.get(item.getCreplacesrcid()));
item.setCreplacesrcid(noIdMap.get(item.getCreplacesrcid()));
}
if (idNoMap.containsKey(item.getCreplacesrcid())) {
if (MMValueCheck.isEmpty(item.getVreplacegroup())) {
item.setVbnote(PickmLangConsts.getReplace_ISEQNUMBER(new String[]{(String)idNoMap.get(item.getCreplacesrcid())}));
item.setVbnote(PickmLangConsts
.getReplace_ISEQNUMBER(new String[] { idNoMap.get(item.getCreplacesrcid()) }));
} else {
item.setVbnote(PickmLangConsts.getRepBodyNote_Group_Msg((String)idNoMap.get(item.getCreplacesrcid())));
}
item.setVbnote(PickmLangConsts.getRepBodyNote_Group_Msg(idNoMap.get(item.getCreplacesrcid())));
}
}
}
}
}
}
private PickmItemVO[] getNewItems(String cpickmid, PickmItemVO[] items) {
for (PickmItemVO item : items) {
item.setCpickmid(cpickmid);
}
return items;
}
/**
* 得到用户自制的非替代表体行ID
*
* @param preaggvo
* @return
*/
private List<String> getUserBuiltItemIDs(AggPickmVO preaggvo) {
if (MMValueCheck.isEmpty(preaggvo.getChildren(PickmItemVO.class))) {
return null;
} else {
List<String> ids = new ArrayList();
}
List<String> ids = new ArrayList<String>();
PickmItemVO[] preItems = (PickmItemVO[]) preaggvo.getChildren(PickmItemVO.class);
for (PickmItemVO item : preItems) {
if (!MMValueCheck.isTrue(item.getBautobuilt()) && MMValueCheck.isEmpty(item.getCreplacesrcid())) {
// 自制表体
if (!MMValueCheck.isTrue(item.getBautobuilt())) {
// 非替代行
if (MMValueCheck.isEmpty(item.getCreplacesrcid())) {
ids.add(item.getCpickm_bid());
}
}
return ids;
}
return ids;
}
private void updatePreItem(PickmItemVO preItemVO, PickmItemVO newItemVO) {
if (preItemVO.getStatus() != 2) {
preItemVO.setStatus(1);
if (preItemVO.getStatus() != VOStatus.NEW) {
preItemVO.setStatus(VOStatus.UPDATED);
}
for(String attr : updateAttributes) {
// 同步字段
for (String attr : PickmSubItemReBuilid.updateAttributes) {
if(attr.equals("vbdef16")){
continue;
}
preItemVO.setAttributeValue(attr, newItemVO.getAttributeValue(attr));
}
}
private PickmItemVO[] addNewItem(PickmItemVO[] preItems, PickmItemVO[] newItems, Map<String, String> noIdMap) {
List<PickmItemVO> returnItems = new ArrayList();
List<PickmItemVO> returnItems = new ArrayList<PickmItemVO>();
UFDouble vrowno = UFDouble.ZERO_DBL;
for (PickmItemVO preItem : preItems) {
// 补全行号
vrowno = MMNumberUtil.max(vrowno, VORowNoUtils.getUFDouble(preItem.getVrowno()));
returnItems.add(preItem);
}
String newRowno = vrowno.toString();
for (PickmItemVO newItem : newItems) {
String oldNo = newItem.getVrowno();
if (FreplaceinfoEnum.REPLACED.equalsValue(newItem.getFreplaceinfo()) && MMValueCheck.isEmpty(newItem.getCgroupkeyrowid())) {
if (FreplaceinfoEnum.REPLACED.equalsValue(newItem.getFreplaceinfo())
&& MMValueCheck.isEmpty(newItem.getCgroupkeyrowid())) {
if (MMValueCheck.isEmpty(newItem.getCpickm_bid())) {
newItem.setCpickm_bid((new SequenceGenerator()).generate());
newItem.setCpickm_bid(new SequenceGenerator().generate());
}
noIdMap.put(oldNo, newItem.getCpickm_bid());
}
if (MMValueCheck.isNotEmpty(newItem.getCreplacesrcid()) && MMValueCheck.isTrue(newItem.getBgroupkey())) {
if (MMValueCheck.isEmpty(newItem.getCpickm_bid())) {
newItem.setCpickm_bid((new SequenceGenerator()).generate());
newItem.setCpickm_bid(new SequenceGenerator().generate());
}
noIdMap.put(newItem.getCreplacesrcid() + newItem.getVreplacegroup(), newItem.getCpickm_bid());
}
newRowno = VORowNoUtils.getRowNoAfterByRule(newRowno.toString(), 10);
// 新行号
newRowno = VORowNoUtils.getRowNoAfterByRule(newRowno.toString(), VORowNoUtils.STEP_VALUE);
newItem.setCpickmid(preItems[0].getCpickmid());
newItem.setStatus(2);
newItem.setStatus(VOStatus.NEW);
newItem.setVrowno(newRowno);
returnItems.add(newItem);
}
return returnItems.toArray(new PickmItemVO[0]);
return (PickmItemVO[])returnItems.toArray(new PickmItemVO[0]);
}
/**
* 只在旧表体存在的替代料行 a) 替代料计划出库主数量变更为0 b) 取消替代料与主料的关联
*
* @param item
* @param preItemMap
*/
private void setReplItemValue(PickmItemVO item, Map<String, PickmItemVO> preItemMap) {
if (item.getCreplacesrcid() != null && preItemMap.containsKey(item.getCreplacesrcid())) {
if (((PickmItemVO)preItemMap.get(item.getCreplacesrcid())).getCbombid() != null || ((PickmItemVO)preItemMap.get(item.getCreplacesrcid())).getCrtopacid() != null) {
item.setCreplacesrcid((String)null);
item.setPk_realsubs((String)null);
item.setNreplaceorder((Integer)null);
item.setVreplacequotiety((String)null);
// 没有替代关系的话返回
if (item.getCreplacesrcid() == null || !preItemMap.containsKey(item.getCreplacesrcid())) {
return;
}
// 主料不是系统生成的不处理
if (preItemMap.get(item.getCreplacesrcid()).getCbombid() == null
&& preItemMap.get(item.getCreplacesrcid()).getCrtopacid() == null) {
return;
}
// 替代来源
item.setCreplacesrcid(null);
// 实际替代关系
item.setPk_realsubs(null);
// 替代顺序
item.setNreplaceorder(null);
// 替代系数
item.setVreplacequotiety(null);
}
private void setDeleteItemValue(PickmItemVO item) {
if (item.getStatus() != 2) {
item.setStatus(1);
// 设为修改态
if (item.getStatus() != VOStatus.NEW) {
item.setStatus(VOStatus.UPDATED);
}
// 单位定位为0
item.setNunitnum(UFDouble.ZERO_DBL);
item.setNunitastnum(UFDouble.ZERO_DBL);
// 定额用量为0
item.setNquotnum(UFDouble.ZERO_DBL);
item.setNquotastnum(UFDouble.ZERO_DBL);
// 单位用量为0
item.setNunitusenum(UFDouble.ZERO_DBL);
item.setNunituseastnum(UFDouble.ZERO_DBL);
// 计划出库主数量
item.setNplanoutnum(UFDouble.ZERO_DBL);
item.setNplanoutastnum(UFDouble.ZERO_DBL);
// 固定损耗主数量
item.setNfixshrinknum(UFDouble.ZERO_DBL);
item.setNfixshrinkastnum(UFDouble.ZERO_DBL);
// 损耗系数
item.setNdissipationum(UFDouble.ZERO_DBL);
item.setVreplacequotiety((String)null);
item.setCreplacesrcid((String)null);
item.setNreplaceorder((Integer)null);
item.setVreplacequotiety((String)null);
item.setFreplaceinfo((Integer)null);
// 替代信息
// 替代系数
item.setVreplacequotiety(null);
// 替代来源
item.setCreplacesrcid(null);
// 替代顺序
item.setNreplaceorder(null);
// 替代系数
item.setVreplacequotiety(null);
// 替代信息
item.setFreplaceinfo(null);
UFBoolean needDelete = UFBoolean.FALSE;
try {
needDelete = SysInitQuery.getParaBoolean(item.getPk_org(), "Beiliao_Shanhang_001");
} catch (BusinessException e) {
e.printStackTrace();
}
// 项目当备料计划行的计划出库数量=0且累计待发数量=0且累计出库数量=0时将此备料计划行删除
if (needDelete.booleanValue() && MMNumberUtil.isNullOrZero(item.getNaccoutnum())
&& MMNumberUtil.isNullOrZero(item.getNshouldnum())
&& MMNumberUtil.isNullOrZero(item.getNplanoutnum())) {
item.setStatus(VOStatus.DELETED);
}
// 备注
item.setVbnote(PickmLangConsts.getMSG_RebuildDeleteItem());
}
@ -370,124 +486,133 @@ public class PickmSubItemReBuilid {
for (AggPickmVO aggvo : aggvos) {
this.preAggVOMap.put(aggvo.getPrimaryKey(), aggvo);
}
}
private Map<String, PickmItemVO> getItemMap(AggPickmVO aggvo) {
if (MMValueCheck.isEmpty(aggvo.getChildren(PickmItemVO.class))) {
return null;
} else {
}
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
Map<String, PickmItemVO> itemMap = new HashMap();
Map<String, PickmItemVO> itemMap = new HashMap<String, PickmItemVO>();
for (PickmItemVO item : items) {
// 将新增的表体行数据过滤掉
if (item.getCpickm_bid() != null) {
itemMap.put(item.getCpickm_bid(), item);
}
}
return itemMap;
}
}
private MapList<String, PickmItemVO> getMD5ItemMap(AggPickmVO aggvo) {
if (MMValueCheck.isEmpty(aggvo.getChildren(PickmItemVO.class))) {
return null;
} else {
}
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
MapList<String, PickmItemVO> itemMap = new MapList();
MapList<String, PickmItemVO> itemMap = new MapList<String, PickmItemVO>();
for (PickmItemVO item : items) {
String key = this.getMatchKey(item);
itemMap.put(key, item);
}
return itemMap;
}
}
/**
* 获得匹配KEY因为字段太长用MD5加密
*
* @param item
* @return
*/
private String getMatchKey(PickmItemVO item) {
StringBuffer key = new StringBuffer();
// BOM类型
if (item.getFbomtype() != null) {
key.append(item.getFbomtype());
} else {
key.append("~");
}
// BOM行号
if (item.getVbomrowno() != null) {
key.append(item.getVbomrowno());
} else {
key.append("~");
}
if (item.getCbombid() != null) {
key.append(item.getCbombid());
} else {
key.append("~");
}
// 工序号
if (item.getVprocessno() != null) {
key.append(item.getVprocessno());
} else {
key.append("~");
}
// 工序耗料行号
if (item.getOpacprocessno() != null) {
key.append(item.getOpacprocessno());
} else {
key.append("~");
}
// 物料VID
if (item.getCbmaterialvid() != null) {
key.append(item.getCbmaterialvid());
} else {
key.append("~");
}
// 辅单位
if (item.getCbastunitid() != null) {
key.append(item.getCbastunitid());
} else {
key.append("~");
}
// 项目
if (item.getCbprojectid() != null) {
key.append(item.getCbprojectid());
} else {
key.append("~");
}
// 生产厂商
if (item.getCbproductorid() != null) {
key.append(item.getCbproductorid());
} else {
key.append("~");
}
// 供应商
if (item.getCbvendorid() != null) {
key.append(item.getCbvendorid());
} else {
key.append("~");
}
// 客户
if (item.getCbcustomerid() != null) {
key.append(item.getCbcustomerid());
} else {
key.append("~");
}
// 特征码
if (item.getCbffileid() != null) {
key.append(item.getCbffileid());
} else {
key.append("~");
}
for(int i = 1; i < 11; ++i) {
for (int i = 1; i < 11; i++) {
if (item.getAttributeValue("vbfree" + i) != null) {
key.append(item.getAttributeValue("vbfree" + i));
} else {
key.append("~");
}
}
// 为工序委外备料计划增加来源备料计划行ID维度
if (item.getVpscsrcpickmbid() != null) {
key.append(item.getCbvendorid());
} else {
key.append("~");
}
return PACMDKeyUtil.getMD5String(key.toString());
}
}

View File

@ -7,11 +7,8 @@ package nc.bs.mmpac.pickm.rule.subitems.transfer;
import java.util.ArrayList;
import java.util.List;
import nc.bs.framework.common.NCLocator;
import nc.bs.mmpac.pickm.rule.subitems.PickmSubItemBuilderUtils;
import nc.bs.mmpac.pickm.rule.subitems.cache.PickmSubItemBuilderDateCache;
import nc.itf.mmpac.pickm.IPickmQueryService;
import nc.util.mmf.framework.base.MMNumberUtil;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.bd.bom.bom0202.enumeration.ControlEnum;
@ -21,7 +18,6 @@ import nc.vo.bd.bom.bom0202.paramvo.BomItemResultVOForPickm;
import nc.vo.bd.bom.bom0202.paramvo.BomWipParamForPickm;
import nc.vo.bd.bom.bom0202.paramvo.dpac.ResultForMoVO;
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.entity.PickmTransTypeVO;
@ -33,7 +29,6 @@ import nc.vo.pub.lang.UFDateTime;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.calculator.HslParseUtil;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nccloud.pubitf.arap.openapi.IGatheringbillOpenService;
public class PickmSubItemTransferFromBom extends PickmSubItemTransfer {
public PickmSubItemTransferFromBom(PickmSubItemBuilderDateCache cache) {
@ -67,6 +62,7 @@ public class PickmSubItemTransferFromBom extends PickmSubItemTransfer {
List<PickmItemVO> pickmFormWipList = new ArrayList();
if (!FsourcetypeEnum.WWBILL_STATE.equalsValue(pickmHeadVO.getFsourcetype()) && MMValueCheck.isNotEmpty(bomItem.getBomwipparams())) {
UFDouble bodyNum = UFDouble.ZERO_DBL;
for(BomWipParamForPickm wipPara : bomItem.getBomwipparams()) {
bodyNum = MMNumberUtil.add(new UFDouble[]{bodyNum, wipPara.getNnum()});
}
@ -91,7 +87,7 @@ public class PickmSubItemTransferFromBom extends PickmSubItemTransfer {
}
}
private PickmItemVO createSubItem(PickmHeadVO pickmHeadVO, BomItemResultVOForPickm bomVO, BomItemParamForPickm bomItem) throws BusinessException {
private PickmItemVO createSubItem(PickmHeadVO pickmHeadVO, BomItemResultVOForPickm bomVO, BomItemParamForPickm bomItem) {
PickmItemVO pickmItemVO = new PickmItemVO();
pickmItemVO.setStatus(2);
this.setBaseInfo(pickmHeadVO, pickmItemVO, bomVO, bomItem);
@ -101,10 +97,6 @@ public class PickmSubItemTransferFromBom extends PickmSubItemTransfer {
this.setOrgAndStock(pickmHeadVO, pickmItemVO, bomItem);
this.setFreeItem(pickmItemVO, bomItem);
this.setVdefItem(pickmItemVO, bomItem);
if(pickmHeadVO.getCpickmid() != null) {
//20251202 备料重算取消更新备料计划子表自定义项已下达数量
// this.setVbdef16(pickmHeadVO,pickmItemVO, bomItem);
}
return pickmItemVO;
}
@ -124,30 +116,23 @@ public class PickmSubItemTransferFromBom extends PickmSubItemTransfer {
pickmItemVO.setVbdef13(bomItem.getVdef13());
pickmItemVO.setVbdef14(bomItem.getVdef14());
pickmItemVO.setVbdef15(bomItem.getVdef15());
// pickmItemVO.setVbdef16("15");
// pickmItemVO.setVbdef16(bomItem.getVdef16());
pickmItemVO.setVbdef17(bomItem.getVdef17());
pickmItemVO.setVbdef18(bomItem.getVdef18());
pickmItemVO.setVbdef19(bomItem.getVdef19());
pickmItemVO.setVbdef20(bomItem.getVdef20());
pickmItemVO.setVbnote(bomItem.getVnote());
//2025年12月23日15点41分--添加图号+版本号--vbdef45
pickmItemVO.setAttributeValue("vbdef45",bomItem.getVdef45());
pickmItemVO.setAttributeValue("vbdef46",bomItem.getVdef46());
pickmItemVO.setAttributeValue("vbdef47",bomItem.getVdef47());
pickmItemVO.setAttributeValue("vbdef48",bomItem.getVdef48());
pickmItemVO.setAttributeValue("vbdef49",bomItem.getVdef49());
pickmItemVO.setAttributeValue("vbdef50",bomItem.getVdef50());
pickmItemVO.setAttributeValue("vbdef51",bomItem.getVdef51());
pickmItemVO.setAttributeValue("vbdef52",bomItem.getVdef52());
}
private void setVbdef16(PickmHeadVO pickmHeadVO, PickmItemVO pickmItemVO, BomItemParamForPickm bomItem) throws BusinessException {
IPickmQueryService service= ((IPickmQueryService) NCLocator.getInstance()
.lookup(IPickmQueryService.class));
AggPickmVO aggPickmVO = service.querySingleBillByPk(pickmHeadVO.getCpickmid());
PickmItemVO[] pickmItemVOs = (PickmItemVO[])aggPickmVO.getChildrenVO();
if (pickmItemVOs != null && pickmItemVOs.length > 0) {
for (PickmItemVO pickmItemVO1 : pickmItemVOs) {
if(null != pickmItemVO.getCbombid() && null != pickmItemVO1.getCbombid()){
if(pickmItemVO1.getCbombid().equals(pickmItemVO.getCbombid())) {
// pickmItemVO.setVbdef16(pickmItemVO1.getVbdef16());
// pickmItemVO.setVbnote(pickmItemVO1.getVbnote());
}
}
}
}
// pickmItemVO.setVbdef16("15");
}
private void setOrgAndStock(PickmHeadVO pickmHeadVO, PickmItemVO pickmItemVO, BomItemParamForPickm bomItemVO) {
PickmTransferSourceFactory factory = new PickmTransferSourceFactory(this.subItemdateCache);
factory.setSouceInfo(pickmHeadVO, pickmItemVO, bomItemVO.getIleadtimenum(), (String)null, (UFDateTime)null);

File diff suppressed because it is too large Load Diff