diff --git a/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java new file mode 100644 index 0000000..000d3f4 --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java @@ -0,0 +1,272 @@ +package nccloud.api.impl.ic.m4d; + +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 org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; + +import nc.bs.framework.common.NCLocator; +import nc.bs.scmpub.query.SCMBillQuery; +import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil; +import nc.pubimpl.ic.api.maintain.BillMaintainTool; +import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI; +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.m4d.entity.MaterialOutBodyVO; +import nc.vo.ic.m4d.entity.MaterialOutHeadVO; +import nc.vo.ic.m4d.entity.MaterialOutVO; +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.m4d.IAPIMaterialOutMaintain; +import nccloud.api.impl.ic.m4d.check.CheckMaterialOutSaveValidator; +import nccloud.api.impl.ic.m4d.fill.MaterialOutSaveFillValue; +import nccloud.api.impl.ic.m4d.fill.MaterialOutUpdateFillValue; +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-17 上午10:49:30 + * @version NCC1909 + */ + +public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{ + + @Override + public MaterialOutVO[] save(List> paramList) throws BusinessException { + // MapList转聚合VOList + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class); + MaterialOutVO[] vos = + aggVOList.toArray(new MaterialOutVO[aggVOList.size()]); + // 设置货位序列号VO + ICAPILocationVOUtils.setLocationVO(ICBillType.MaterialOut.getCode(),vos); + // 1、传入数据基本非空校验 + BillVOsCheckRule checker = + new BillVOsCheckRule(new CheckMaterialOutSaveValidator()); + checker.check(vos); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + // 翻译货位 + ICAPILocationVOUtils.translate(vos); + //其他数据填充 + new MaterialOutSaveFillValue().setDefaultValue(vos); + + IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); + //设置每行行号 + setMaterialOutRowNum(vos); + return materialOut.insertBills(vos); + } + + private void setMaterialOutRowNum(MaterialOutVO[] vos) { + for (int i = 0; i < vos.length; i++) { + MaterialOutVO vo = vos[i]; + MaterialOutBodyVO[] bodys = vo.getBodys(); + if (bodys != null && bodys.length > 0) { + for (int j = 0; j < bodys.length; j++) { + MaterialOutBodyVO body = bodys[j]; + body.setCrowno(String.valueOf((j +1)*10)); + } + } + } + } + + @Override + public MaterialOutVO[] update(List> paramList) throws BusinessException { + // MapList转聚合VOList + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + MaterialOutVO[] vos = + aggVOList.toArray(new MaterialOutVO[aggVOList.size()]); + // 设置货位序列号VO + ICAPILocationVOUtils.setLocationVO(ICBillType.MaterialOut.getCode(),vos); + MaterialOutHeadVO newVO = vos[0].getHead(); + String cgeneralhid = newVO.getCgeneralhid(); + if(StringUtils.isEmpty(cgeneralhid)){ + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0391")/*@res "修改材料出库单请指定表头主键cgeneralhid值。"*/); + } + SCMBillQuery queryTool = + new SCMBillQuery(MaterialOutVO.class); + MaterialOutVO[] materialOutVOs = queryTool.queryVOByIDs(new String[]{cgeneralhid}); + Map deleteLoc = + new HashMap(); + // 加载原始单据和货位信息 + MaterialOutVO[] originBills = queryTool.queryVOByIDs(new String[] { + cgeneralhid + }); + ICLocationUtil.loadLocationVOs(originBills); + if(ArrayUtils.isEmpty(materialOutVOs)){ + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0360")/*@res "没找到要修改的出库单信息,请检查数据的表头主键cgeneralhid。"*/); + }else{ + List headProFields = CheckProhibitUpdateFields.getHeadProhibitFields("4D"); + List bodyProFields = CheckProhibitUpdateFields.getBodyProhibitFields("4D"); + MaterialOutHeadVO origVO = materialOutVOs[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-0361")/*@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 (MaterialOutVO orivo : originBills) { + MaterialOutBodyVO[] oribodys = orivo.getBodys(); + for (MaterialOutBodyVO oribody : oribodys) { + ICLocationVO[] locationVOs = oribody.getLocationVOs(); + if (null != locationVOs) { + deleteLoc.put(oribody.getCgeneralbid(), locationVOs); + } + } + } + if(vos[0].getBodys() != null){ + Map pkbs = new HashMap(); + for(MaterialOutBodyVO origBvo : materialOutVOs[0].getBodys()){ + origBvo.setStatus(VOStatus.UPDATED); + pkbs.put(origBvo.getCgeneralbid(), origBvo); + } + for(MaterialOutBodyVO newBvo : vos[0].getBodys()){ + MaterialOutBodyVO roigBvo = pkbs.get(newBvo.getCgeneralbid()); + if(newBvo.getCgeneralbid() == null || roigBvo == null){ + throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0365")/*@res "没有匹配到原始出库单表体信息,请检查数据的表体主键cgeneralbid。"*/); + } + Set bfields = new HashSet(); + 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(materialOutVOs); + //其他数据填充 + new MaterialOutUpdateFillValue().setDefaultValue(materialOutVOs,bfields); + } + } + } + BillMaintainTool tool = + new BillMaintainTool(MaterialOutVO.class, + ICBillType.MaterialOut.getCode()); + tool.doBeforeInsert(materialOutVOs); + return NCLocator.getInstance() + .lookup(nc.itf.ic.m4d.IMaterialOutMaintain.class).update(materialOutVOs,originBills); + } + + @Override + public MaterialOutVO[] delete(MaterialOutVO[] vos) throws BusinessException { + if(ArrayUtils.isEmpty(vos)){ + return null; + } + for(MaterialOutVO 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-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0367")/*@res "不是自由状态,不能删除"*/); + } + } + return (MaterialOutVO[]) PfServiceScmUtil.processBatch("DELETE", "4D", vos, null, null); + } + + @Override + public MaterialOutVO[] sign(MaterialOutVO[] vos) throws BusinessException { + if(ArrayUtils.isEmpty(vos)){ + return null; + } + for(MaterialOutVO 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-0361")/*@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-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0392")/*@res "总数量为空,不能签字"*/); + } + } + + } + ICLocationUtil.loadLocationVOs(vos); + return (MaterialOutVO[]) PfServiceScmUtil.processBatch("SIGN", "4D", vos, null, null); + } + + @Override + public MaterialOutVO[] unSign(MaterialOutVO[] vos) throws BusinessException { + if(ArrayUtils.isEmpty(vos)){ + return null; + } + for(MaterialOutVO 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-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0332")/*@res "不是签字状态,不能取消签字"*/); + } + } + return (MaterialOutVO[]) PfServiceScmUtil.processBatch("CANCELSIGN", "4D", vos, null, null); + } + + @Override + public MaterialOutVO[] saveByRef(List> paramList) throws BusinessException{ + + // MapList转聚合VOList + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class); + MaterialOutVO[] vos = + aggVOList.toArray(new MaterialOutVO[aggVOList.size()]); + // 1、传入数据基本非空校验 + BillVOsCheckRule checker = + new BillVOsCheckRule(new CheckMaterialOutSaveValidator()); + checker.check(vos); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); + return materialOut.insertBills(vos); + } + +}