From 2746f499401d716cdfbbefb82e3a364782f6b8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Thu, 10 Apr 2025 14:32:40 +0800 Subject: [PATCH] =?UTF-8?q?ic=5F=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3=E8=BD=AC=E6=8D=A2=E7=BB=93?= =?UTF-8?q?=E7=AE=97=E8=B4=A2=E5=8A=A1=E7=BB=84=E7=BB=87=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=BA=8F=E5=88=97=E5=8F=B7=E7=BF=BB=E8=AF=91=E5=BC=BA?= =?UTF-8?q?=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ic/m45/APIPurchaseInMaitainImpl.java | 284 ++++++++++++++++++ .../openapi/ic/util/ICAPILocationVOUtils.java | 259 ++++++++++++++++ 2 files changed, 543 insertions(+) create mode 100644 ic/src/private/nccloud/api/impl/ic/m45/APIPurchaseInMaitainImpl.java create mode 100644 ic/src/public/nccloud/openapi/ic/util/ICAPILocationVOUtils.java diff --git a/ic/src/private/nccloud/api/impl/ic/m45/APIPurchaseInMaitainImpl.java b/ic/src/private/nccloud/api/impl/ic/m45/APIPurchaseInMaitainImpl.java new file mode 100644 index 0000000..5a1826e --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m45/APIPurchaseInMaitainImpl.java @@ -0,0 +1,284 @@ +package nccloud.api.impl.ic.m45; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import nc.vo.ic.org.OrgInfoQuery; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; + +import nc.bs.scmpub.query.SCMBillQuery; +import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil; +import nc.pubimpl.ic.api.maintain.BillMaintainTool; +import nc.vo.ic.general.define.ICBillFlag; +import nc.vo.ic.general.define.ICBillHeadVO; +import nc.vo.ic.general.util.ICLocationUtil; +import nc.vo.ic.location.ICLocationVO; +import nc.vo.ic.m45.entity.PurchaseInBodyVO; +import nc.vo.ic.m45.entity.PurchaseInHeadVO; +import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.ic.pub.define.ICPubMetaNameConst; +import nc.vo.pub.BusinessException; +import nc.vo.pub.VOStatus; +import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule; +import nc.vo.scmpub.res.billtype.ICBillType; +import nccloud.api.ic.m45.IAPIPurchaseInMaitain; +import nccloud.api.impl.ic.m45.check.CheckPurchaseInSaveValidator; +import nccloud.api.impl.ic.m45.fill.PurchaseInSaveFillValue; +import nccloud.api.impl.ic.m45.fill.PurchaseInUpdateFillValue; +import nccloud.api.impl.ic.pub.check.CheckProhibitUpdateFields; +import nccloud.openapi.ic.util.ICAPILocationVOUtils; +import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; +import nccloud.openapi.scmpub.pub.TransferMapToVOTool; + +/** + * + * @Description: 库存采购入库单维护接口实现类 + * + * @author: 刘伟 + * @date: 2019-5-7 下午3:22:00 + * @version NCC1909 + */ +public class APIPurchaseInMaitainImpl implements IAPIPurchaseInMaitain { + + @Override + public PurchaseInVO[] save(List> paramList) + throws BusinessException { + // MapList转聚合VOList + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(paramList, PurchaseInVO.class); + PurchaseInVO[] vos = aggVOList.toArray(new PurchaseInVO[aggVOList.size()]); + // 设置货位序列号VO + ICAPILocationVOUtils.setLocationVO(ICBillType.PurchaseIn.getCode(), vos); + // 1、传入数据基本非空校验 + BillVOsCheckRule checker = + new BillVOsCheckRule(new CheckPurchaseInSaveValidator()); + checker.check(vos); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + // 翻译货位 + ICAPILocationVOUtils.translate(vos); + + //begin没取到财务组织导致的报错,在这里给财务组织赋值为库存组织 + for(PurchaseInVO vo : vos ) { + if(vo.getHead().getCfanaceorgoid()!=null) { + continue; + } + String cfinanceoid = (new OrgInfoQuery()).getFinanceOrgIDByCalBodyID(vo.getHead().getPk_org()); + String cfinancevid = (new OrgInfoQuery()).getFinanceOrgVIDByCalBodyID(vo.getHead().getPk_org()); + vo.getHead().setCfanaceorgoid(cfinanceoid); + vo.getHead().setCfanaceorgvid(cfinancevid); + } + //end + + // 3、其他数据填充 + new PurchaseInSaveFillValue().setDefaultValue(vos); + + BillMaintainTool tool = new BillMaintainTool( + PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); + return tool.insert(vos); + } + + @Override + public PurchaseInVO[] update(List> paramList) + throws BusinessException { + // MapList转聚合VOList + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(paramList, PurchaseInVO.class); + PurchaseInVO[] vos = aggVOList.toArray(new PurchaseInVO[aggVOList.size()]); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + Set bfields = new HashSet(); + PurchaseInHeadVO newVO = vos[0].getHead(); + String cgeneralhid = newVO.getCgeneralhid(); + if (StringUtils.isEmpty(cgeneralhid)) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", + "04008027-0380")/* @res "修改采购入库单请指定表头主键cgeneralhid值。" */); + } + SCMBillQuery queryTool = + new SCMBillQuery(PurchaseInVO.class); + PurchaseInVO[] purInVOs = queryTool.queryVOByIDs(new String[] { + cgeneralhid + }); + Map deleteLoc = + new HashMap(); + // 加载原始单据和货位信息 + PurchaseInVO[] originBills = queryTool.queryVOByIDs(new String[] { + cgeneralhid + }); + ICLocationUtil.loadLocationVOs(originBills); + if (ArrayUtils.isEmpty(purInVOs)) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", + "04008027-0381")/* @res "没找到要修改的入库单信息,请检查数据的表头主键cgeneralhid。" */); + } + else { + List headProFields = + CheckProhibitUpdateFields.getHeadProhibitFields("45"); + List bodyProFields = + CheckProhibitUpdateFields.getBodyProhibitFields("45"); + PurchaseInHeadVO origVO = purInVOs[0].getHead(); + if (origVO.getFbillflag() == null + || 0 != ((Integer) ICBillFlag.FREE.value()) + .compareTo((Integer) origVO.getFbillflag())) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", + "04008027-0329")/* @res "当前入库单编号:" */ + origVO.getVbillcode() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0362")/* @res "不是自由状态,不能修改" */); + } + origVO.setStatus(VOStatus.UPDATED); + for (String attr : newVO.getAttributeNames()) { + if (newVO.getAttributeValue(attr) == null) { + continue; + } + if (headProFields.contains(attr) && !newVO.getAttributeValue(attr) + .equals(origVO.getAttributeValue(attr))) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0363")/* @res "表头字段:" */ + attr + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0364")/* @res "不允许修改。" */ ); + } + origVO.setAttributeValue(attr, newVO.getAttributeValue(attr)); + } + for (PurchaseInVO orivo : originBills) { + PurchaseInBodyVO[] oribodys = orivo.getBodys(); + for (PurchaseInBodyVO oribody : oribodys) { + ICLocationVO[] locationVOs = oribody.getLocationVOs(); + if (null != locationVOs) { + deleteLoc.put(oribody.getCgeneralbid(), locationVOs); + } + } + } + if (vos[0].getBodys() != null) { + Map pkbs = + new HashMap(); + for (PurchaseInBodyVO origBvo : purInVOs[0].getBodys()) { + origBvo.setStatus(VOStatus.UPDATED); + pkbs.put(origBvo.getCgeneralbid(), origBvo); + } + for (PurchaseInBodyVO newBvo : vos[0].getBodys()) { + PurchaseInBodyVO roigBvo = pkbs.get(newBvo.getCgeneralbid()); + if (newBvo.getCgeneralbid() == null || roigBvo == null) { + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl + .getNCLangRes().getStrByID("4008027_0", "04008027-0382")/* + * @res + * "没有匹配到原始入库单表体信息,请检查数据的表体主键cgeneralbid。" + */); + } + for (String battr : newBvo.getAttributeNames()) { + if (newBvo.getAttributeValue(battr) == null) { + continue; + } + if (bodyProFields.contains(battr) + && !newBvo.getAttributeValue(battr) + .equals(roigBvo.getAttributeValue(battr))) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0366")/* @res "表体字段:" */ + battr + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0364")/* @res "不允许修改。" */ ); + } + roigBvo.setAttributeValue(battr, newBvo.getAttributeValue(battr)); + bfields.add(battr); + } + //设置货位序列号孙表,把原来的孙表删除,修改的货位置为新增 + if(null != newBvo.getLocationVOs()) { + List allloc = new ArrayList(); + if(null != deleteLoc && null != deleteLoc.get(roigBvo.getCgeneralbid())) { + for(ICLocationVO delloc : deleteLoc.get(roigBvo.getCgeneralbid())) { + delloc.setStatus(VOStatus.DELETED); + allloc.add(delloc); + } + } + for(ICLocationVO loc : newBvo.getLocationVOs()) { + loc.setStatus(VOStatus.NEW); + allloc.add(loc); + } + roigBvo.setLocationVOs(allloc.toArray(new ICLocationVO[allloc.size()])); + } + } + + } + } + // 翻译货位 + ICAPILocationVOUtils.translate(purInVOs); + // 其他数据填充 + new PurchaseInUpdateFillValue().setDefaultValue(purInVOs); + BillMaintainTool tool = new BillMaintainTool( + PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); + tool.doBeforeInsert(purInVOs); + return nc.bs.framework.common.NCLocator.getInstance() + .lookup(nc.itf.ic.m45.self.IPurchaseInMaintain.class) + .update(purInVOs, originBills); + } + + @Override + public void delete(PurchaseInVO[] vos) throws BusinessException { + nc.bs.framework.common.NCLocator.getInstance() + .lookup(nc.itf.ic.m45.self.IPurchaseInMaintain.class).delete(vos); + + } + + @Override + public PurchaseInVO[] sign(PurchaseInVO[] vos) throws BusinessException { + if (ArrayUtils.isEmpty(vos)) { + return null; + } + for (PurchaseInVO aggvo : vos) { + ICBillHeadVO parentVO = aggvo.getParentVO(); + if (parentVO.getFbillflag() == null + || 0 != ((Integer) ICBillFlag.FREE.value()) + .compareTo((Integer) parentVO.getFbillflag())) { + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4008027_0", "04008027-0329") + /* @res "当前入库单编号:" */ + parentVO.getVbillcode() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0330")/* @res "不是自由状态,不能签字" */); + } + if (aggvo.getChildrenVO() != null && aggvo.getChildrenVO().length > 0) { + if (aggvo.getChildrenVO()[0] + .getAttributeValue(ICPubMetaNameConst.NNUM) == null) { + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl + .getNCLangRes().getStrByID("4008027_0", "04008027-0329") + /* @res "当前入库单编号:" */ + parentVO.getVbillcode() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0331")/* @res "主数量为空,不能签字" */); + } + } + } + // 加载货位单品明细 + ICLocationUtil.loadLocationVOs(vos); + + return (PurchaseInVO[]) PfServiceScmUtil.processBatch("SIGN", "45", vos, + null, null); + } + + @Override + public PurchaseInVO[] unSign(PurchaseInVO[] vos) throws BusinessException { + if (ArrayUtils.isEmpty(vos)) { + return null; + } + for (PurchaseInVO aggvo : vos) { + ICBillHeadVO parentVO = aggvo.getParentVO(); + if (parentVO.getFbillflag() == null + || 0 != ((Integer) ICBillFlag.SIGN.value()) + .compareTo((Integer) parentVO.getFbillflag())) { + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4008027_0", "04008027-0329") + /* @res "当前入库单编号:" */ + parentVO.getVbillcode() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008027_0", "04008027-0332")/* @res "不是签字状态,不能取消签字" */); + } + } + return (PurchaseInVO[]) PfServiceScmUtil.processBatch("CANCELSIGN", "45", + vos, null, null); + } + +} diff --git a/ic/src/public/nccloud/openapi/ic/util/ICAPILocationVOUtils.java b/ic/src/public/nccloud/openapi/ic/util/ICAPILocationVOUtils.java new file mode 100644 index 0000000..c77d267 --- /dev/null +++ b/ic/src/public/nccloud/openapi/ic/util/ICAPILocationVOUtils.java @@ -0,0 +1,259 @@ +package nccloud.openapi.ic.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import nc.bs.framework.common.NCLocator; +import nc.itf.urmex.pub.IRMGlobalCache; +import nc.pubitf.sn.doc.param.SnDocQueryParam; +import nc.vo.bd.rack.RackVO; +import nc.vo.ic.general.define.ICBillBodyVO; +import nc.vo.ic.general.define.ICBillVO; +import nc.vo.ic.location.ICLocationVO; +import nc.vo.ic.pub.define.ICBillTableInfo; +import nc.vo.ic.pub.iadapter.sn.SnInterfaceAdapter; +import nc.vo.ic.pub.util.ValueCheckUtil; +import nc.vo.ml.NCLangRes4VoTransl; +import nc.vo.pub.BusinessException; +import nc.vo.pub.VOStatus; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.pub.MathTool; +import nc.vo.pubapp.pattern.pub.PubAppTool; +import nc.vo.scmpub.res.billtype.ICBillType; +import nc.vo.sn.doc.entity.SerialNoVO; + +/** + * @@description + * @author lanli6 + * @date 2023年2月15日 + * @version ncc1.0 + */ +public class ICAPILocationVOUtils { + + /* + * json格式实例: + * [{"ic_material_h":{"pk_org":"001","cwarehouseid":"ck03","cdptvid":"bm002", + * "vtrantypecode":"4D-01"}, + * "ic_material_b":[{"cmaterialvid":"物料001","castunitid":"BOX", + * "nshouldassistnum":2,"vchangerate":"1/1", + * "ic_loc":[{"clocationid":"00","vserialcode":"122001","csnunitid": "BOX" + * ,"nnum":"1","nassistnum":"1"}, + * {"clocationid":"00","vserialcode":"122001","csnunitid":"BOX","nnum":"1", + * "nassistnum":"1"}]}]}] + */ + + /** + * 货位明细表数据,json标识 + */ + public static String ic_loc = "ic_loc"; + + /** + * 把json转换为货位VO + * + * @param billtype 单据类型 + * @param bodyvo 表体VO + * @param bodyInfo 表体json数据 + */ + public static void setLocationVO(String billtype, ICBillVO[] aggVOList) { + for (ICBillVO aggvo : aggVOList) { + ICBillBodyVO[] bodys = aggvo.getBodys(); + for (ICBillBodyVO body : bodys) { + setbodyLocationVO(billtype, body); + } + } + } + + @SuppressWarnings("unchecked") + private static void setbodyLocationVO(String billtype, ICBillBodyVO body) { + // 获取货位明细map + List> locationMap = (List>) body + .getAttributeValue(ICAPILocationVOUtils.ic_loc); + if (locationMap == null) { + return; + } + ICBillType type = ICBillType.getICBillType(billtype); + // 创建货位VO数组 + ICLocationVO[] loc = new ICLocationVO[locationMap.size()]; + + // 一个map表示一行货位,遍历每一行货位 + int i = 0; + for (Map row : locationMap) { + if (row == null) { + continue; + } + // 获取相应单据类型对应的货位VO + loc[i] = ICBillTableInfo.getICBillTableInfo(type).createLocationVO(); + // 给货位VO的字段赋值 + for (Map.Entry location : row.entrySet()) { + if (location.getKey() != null) { + loc[i].setAttributeValue(location.getKey().trim(), + location.getValue()); + } + } + i++; + } + // 给表体设置货位VO + body.setLocationVOs(loc); + + } + + /** + * 翻译货位和序列号 + * @throws BusinessException + */ + public static void translate(ICBillVO[] billvos) throws BusinessException { + Set wareSet = new HashSet(); + Set locSet = new HashSet(); + List paramlist = new ArrayList(); + // 获取单据的组织、仓库、物料、货位号、序列号 + for (ICBillVO billvo : billvos) { + String pk_stordoc = billvo.getHead().getCwarehouseid(); + if (!PubAppTool.isNull(pk_stordoc)) { + wareSet.add(pk_stordoc); + } + for (ICBillBodyVO bodyvo : billvo.getChildrenVO()) { + ICLocationVO[] locs = bodyvo.getLocationVOs(); + if (ValueCheckUtil.isNullORZeroLength(locs)) { + continue; + } + + for (ICLocationVO lvo : locs) { + if(VOStatus.DELETED == lvo.getStatus()) { + continue; + } + SnDocQueryParam param = new SnDocQueryParam(); + param.setCmaterialvid(bodyvo.getCmaterialvid()); + if (!PubAppTool.isNull(lvo.getClocationid())) { + locSet.add(lvo.getClocationid()); + } + if (!PubAppTool.isNull(lvo.getVserialcode())) { + param.setSncode(lvo.getVserialcode()); + paramlist.add(param); + } + } + } + } + // 如果没有传序列号不处理孙表转换 +// if (ValueCheckUtil.isNullORZeroLength(paramlist)) { +// return; +// } + // 查询货位 + Map rackMap = getRack(wareSet, locSet); + // 查询序列号 + Map snMap =new HashMap<>(); + if (!ValueCheckUtil.isNullORZeroLength(paramlist)) { + snMap =getSerialNoVO(paramlist.toArray(new SnDocQueryParam[paramlist.size()])); + } + + // 设置翻译好的货位和序列号主键 + for (ICBillVO billvo : billvos) { + String pk_stordoc = billvo.getHead().getCwarehouseid(); + + for (ICBillBodyVO bodyvo : billvo.getChildrenVO()) { + String cmaterialvid = bodyvo.getCmaterialvid(); + + ICLocationVO[] locs = bodyvo.getLocationVOs(); + if (locs == null || locs.length == 0) { + continue; + } + for (ICLocationVO lvo : locs) { + if(VOStatus.DELETED == lvo.getStatus()) { + continue; + } + // 设置货位主键 + String clcode = lvo.getClocationid(); + if (!PubAppTool.isNull(clcode)) { + RackVO rackvo = rackMap.get(clcode + pk_stordoc); + if (null == rackvo) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008003_0", "04008001-0961", null, new String[] { + clcode + })/* @res "货位[{0}]不存在!" */); + } + + lvo.setClocationid(rackvo.getPk_rack()); + } + // 设置序列号主键 + String vserialcode = lvo.getVserialcode(); + if (!PubAppTool.isNull(vserialcode)) { + SerialNoVO snVO = snMap.get(vserialcode + cmaterialvid); + if (snVO == null) { + throw new BusinessException(NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4008001_0", "04008001-0962", null, new String[] { + vserialcode + })/* @res "序列号[{0}]不存在!" */); + } + if (MathTool.greaterThan(lvo.getNnum(), new UFDouble(1))) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008001_0", "04008001-0963")/* @res "序列号数量不能大于1" */); + } + if (MathTool.isZero(lvo.getNnum()) + || MathTool.isZero(lvo.getNassistnum())) { + throw new BusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4008001_0", "04008001-0964")/* @res "序列号数量不能为0" */); + } + + lvo.setPk_serialcode(snVO.getPk_serialno()); + } + // 补充货位序列号孙表的组织信息 + lvo.setCorpoid(bodyvo.getPk_org()); + lvo.setCorpvid(bodyvo.getPk_org_v()); + lvo.setPk_group(bodyvo.getPk_group()); + lvo.setPk_group(bodyvo.getPk_group()); + lvo.setStatus(VOStatus.NEW); + } + } + } + } + + /** + * 翻译货位 + * @param orgSet + * @param wareSet + * @param locSet + * @return rackMap + * @throws BusinessException + */ + private static Map getRack(Set wareSet, + Set locSet) throws BusinessException { + Map rackMap = new HashMap<>(); + // 如果没有传货位不处理主键转换 + if (ValueCheckUtil.isNullORZeroLength(locSet)) { + return rackMap; + } + // 根据code查询货位信息 + IRMGlobalCache cacheSvr = + NCLocator.getInstance().lookup(IRMGlobalCache.class); + rackMap = cacheSvr.getRackVO(locSet.toArray(new String[locSet.size()]), + wareSet.toArray(new String[wareSet.size()])); + // key:code+pk_stordoc + return rackMap; + } + + /** + * 翻译序列号 + * @param marSet + * @param serialSet + * @return snMap + */ + private static Map getSerialNoVO( + SnDocQueryParam[] snDoc) { + + Map snMap = new HashMap(); + SerialNoVO[] serialnovos = SnInterfaceAdapter.querySerialnos(snDoc); + for (SerialNoVO serialnovo : serialnovos) { + // key:code+cmaterialvid + String key = serialnovo.getVcode() + serialnovo.getCmaterialvid(); + snMap.put(key, serialnovo); + } + return snMap; + } + +}