diff --git a/uapbd/src/private/nc/impl/bd/bom/bom0202/BomBillMaintainServiceImpl.java b/uapbd/src/private/nc/impl/bd/bom/bom0202/BomBillMaintainServiceImpl.java
new file mode 100644
index 0000000..ef29bc6
--- /dev/null
+++ b/uapbd/src/private/nc/impl/bd/bom/bom0202/BomBillMaintainServiceImpl.java
@@ -0,0 +1,730 @@
+package nc.impl.bd.bom.bom0202;
+
+import nc.bs.bd.bom.bom0202.bp.BomDataValidatorBP;
+import nc.bs.bd.bom.bom0202.bp.BomDeleteBP;
+import nc.bs.bd.bom.bom0202.bp.BomInsertBP;
+import nc.bs.bd.bom.bom0202.bp.BomInsertCommitBP;
+import nc.bs.bd.bom.bom0202.bp.BomPubBP;
+import nc.bs.bd.bom.bom0202.bp.BomUpdateBP;
+import nc.bs.bd.bom.bom0202.bp.BomUpdateCommitBP;
+import nc.bs.dao.BaseDAO;
+import nc.bs.dao.DAOException;
+import nc.bs.framework.common.NCLocator;
+import nc.bs.ml.NCLangResOnserver;
+import nc.bs.pubapp.AppBsContext;
+import nc.bs.uap.lock.PKLock;
+import nc.impl.pubapp.pattern.data.bill.BillUpdate;
+import nc.impl.pubapp.pattern.data.bill.tool.BillTransferTool;
+import nc.impl.pubapp.pattern.data.vo.VOQuery;
+import nc.itf.bd.bom.bom0202.IBomBillMaintainService;
+import nc.itf.bd.bom.bom0202.IBomBillQueryService;
+import nc.mmbd.utils.factoryparam.MMBDFactoryParameter;
+import nc.util.mmf.framework.base.MMArrayUtil;
+import nc.util.mmf.framework.base.MMValueCheck;
+import nc.util.mmf.framework.db.MMSqlBuilder;
+import nc.util.mmf.framework.gc.GCBillTransferTool;
+import nc.vo.bd.bom.bom0202.entity.AggBomVO;
+import nc.vo.bd.bom.bom0202.entity.BomActivityVO;
+import nc.vo.bd.bom.bom0202.entity.BomItemVO;
+import nc.vo.bd.bom.bom0202.entity.BomOutputsVO;
+import nc.vo.bd.bom.bom0202.entity.BomUseOrgVO;
+import nc.vo.bd.bom.bom0202.entity.BomVO;
+import nc.vo.bd.bom.bom0202.enumeration.BomCategoryEnum;
+import nc.vo.bd.bom.bom0202.enumeration.BomTypeEnum;
+import nc.vo.bd.bom.bom0202.enumeration.FBomBillstatusEnum;
+import nc.vo.bd.bom.bom0202.enumeration.VersionTypeEnum;
+import nc.vo.bd.bom.bom0202.message.MMBDLangConstBom0202;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.VOStatus;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pubapp.pattern.exception.ExceptionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 生产BOM维护的持久化类
+ *
+ * 提供了基本的增删改操作
+ *
+ * 创建日期:2010-1-15
+ *
+ * @author:zhoujuna
+ */
+public class BomBillMaintainServiceImpl implements IBomBillMaintainService {
+ /**
+ * 构造函数
+ */
+
+ @Override
+ public void deleteBoms(AggBomVO[] objs) throws BusinessException {
+
+ if (objs == null || objs.length == 0) {
+ return;
+ }
+ try {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(objs);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ BomDeleteBP bp = new BomDeleteBP();
+ bp.delete(fullBills);
+ } catch (Exception ex) {
+ ExceptionUtils.marsh(ex);
+ }
+ }
+
+ @Override
+ public AggBomVO[] insertBom(AggBomVO[] aggVO) throws BusinessException {
+ return this.insertBomForEcn(aggVO, true);
+ }
+
+ @Override
+ public AggBomVO[] insertBomForEcn(AggBomVO[] aggVO, boolean checkEcn) throws BusinessException {
+ return this.insertBomForEcnAndRepls(aggVO, checkEcn, null);
+ }
+
+ @Override
+ public AggBomVO[] insertBomForEcnAndRepls(AggBomVO[] aggVO, boolean checkEcn, String[] orgins)
+ throws BusinessException {
+ // TODO Auto-generated method stub
+ try {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggVO);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ BomInsertBP bp = new BomInsertBP();
+ AggBomVO[] returnVOs = bp.insert(fullBills, checkEcn, orgins, false);
+ for (int i = 0; i < returnVOs.length; i++) {
+ aggVO[i].setParent(returnVOs[i].getParent());
+ aggVO[i].setChildren(BomItemVO.class, returnVOs[i].getChildrenVO());
+ aggVO[i].setChildren(BomOutputsVO.class, returnVOs[i].getChildren(BomOutputsVO.class));
+ aggVO[i].setChildren(BomUseOrgVO.class, returnVOs[i].getChildren(BomUseOrgVO.class));
+ }
+ return aggVO;
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+
+ }
+ return null;
+ }
+
+ @Override
+ public AggBomVO[] updateBom(AggBomVO[] aggVO) throws BusinessException {
+ return this.updateBomForEcn(aggVO, true);
+ }
+
+ @Override
+ public AggBomVO[] updateBomForEcn(AggBomVO[] aggVO, boolean checkEcn) throws BusinessException {
+ return this.updateBomForBomTree(aggVO, checkEcn, false, false);
+ }
+
+ @Override
+ public AggBomVO[] updateBomForEcn(AggBomVO[] aggVO,Map rownoMap, boolean checkEcn) throws BusinessException {
+ return this.updateBomForBomTree(aggVO,rownoMap,checkEcn, false, false);
+ }
+
+ @Override
+ public void validateBom(AggBomVO[] aggvos) throws BusinessException {
+ BomDataValidatorBP bp = new BomDataValidatorBP();
+ bp.validate(aggvos);
+
+ }
+
+ @Override
+ public AggBomVO[] updateBomForBomTree(AggBomVO[] aggVO, boolean isCheckEcn, boolean isFromBom, boolean isEcn)
+ throws BusinessException {
+ if (MMArrayUtil.isEmpty(aggVO)) {
+ return null;
+ }
+ try {
+ // 检查该BOM是否被删除,因为如果BOM树状维护将BOM删除了,不允许修改该条记录
+ Set bomids = new HashSet();
+ for (AggBomVO vo : aggVO) {
+ bomids.add(vo.getPrimaryKey());
+ }
+ Set checkResult = BomPubBP.getBomID(bomids.toArray(new String[] {}));
+ this.fillActivityVO(aggVO);
+ if (checkResult != null && checkResult.size() < bomids.size()) {
+ ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getBOM_DELETED());
+ }
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggVO);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ // 获得修改前vo
+ AggBomVO[] originBills = transTool.getOriginBills();
+ BomUpdateBP bp = new BomUpdateBP();
+ return bp.update(fullBills, originBills, isCheckEcn, isFromBom, isEcn);
+ } catch (Exception e) {
+ ExceptionUtils.wrappException(e);
+ }
+ return null;
+ }
+
+ @Override
+ public AggBomVO[] updateBomForBomTree(AggBomVO[] aggVO,Map rownoMap, boolean isCheckEcn, boolean isFromBom, boolean isEcn)
+ throws BusinessException {
+ if (MMArrayUtil.isEmpty(aggVO)) {
+ return null;
+ }
+ try {
+ // 检查该BOM是否被删除,因为如果BOM树状维护将BOM删除了,不允许修改该条记录
+ Set bomids = new HashSet();
+ for (AggBomVO vo : aggVO) {
+ bomids.add(vo.getPrimaryKey());
+ }
+ Set checkResult = BomPubBP.getBomID(bomids.toArray(new String[] {}));
+ this.fillActivityVO(aggVO);
+ if (checkResult != null && checkResult.size() < bomids.size()) {
+ ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getBOM_DELETED());
+ }
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggVO);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ // 获得修改前vo
+ AggBomVO[] originBills = transTool.getOriginBills();
+ BomUpdateBP bp = new BomUpdateBP();
+ bp.setRownoMap(rownoMap);
+ return bp.update(fullBills, originBills, isCheckEcn, isFromBom, isEcn);
+ } catch (Exception e) {
+ ExceptionUtils.wrappException(e);
+ }
+ return null;
+ }
+
+ private void fillActivityVO(AggBomVO[] aggVO) {
+ for (AggBomVO aggBomVO : aggVO) {
+
+ if (MMValueCheck.isNotEmpty(aggBomVO.getChildren(BomActivityVO.class))) {
+ continue;
+ }
+
+ // 如果没有编辑过物料作业量,那么Model中数据为空,所以要把重查一下数据。
+ String pk_group = aggBomVO.getParent().getAttributeValue(BomVO.PK_GROUP).toString();
+ String pk_org = aggBomVO.getParent().getAttributeValue(BomVO.PK_ORG).toString();
+ BomActivityVO[] actVOs = null;
+ try {
+ actVOs = this.getBomBillQueryService().getBomActivityVOsByBomId(pk_group, pk_org,
+ aggBomVO.getPrimaryKey());
+ } catch (BusinessException e) {
+ ExceptionUtils.wrappException(e);
+ }
+ List actList = new ArrayList();
+ if (MMArrayUtil.isNotEmpty(actVOs)) {
+ for (BomActivityVO vo : actVOs) {
+ if (MMValueCheck.isNotEmpty(vo.getNstandardwknum())) {
+ vo.setStatus(VOStatus.UNCHANGED);
+ actList.add(vo);
+ }
+ }
+ aggBomVO.setChildren(BomActivityVO.class, actList.toArray(new BomActivityVO[] {}));
+ }
+ }
+
+ }
+
+ @Override
+ public AggBomVO[] commitBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException {
+ try {
+
+ return new BillUpdate().update(clientFullVOs, originBills);
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ return null;
+
+ }
+ }
+
+ @Override
+ public AggBomVO[] uncommitBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException {
+ try {
+
+ return new BillUpdate().update(clientFullVOs, originBills);
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ return null;
+
+ }
+ }
+
+ @Override
+ public AggBomVO[] auditBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException {
+ Map newBomMap = new HashMap<>();
+ for (AggBomVO vo: clientFullVOs){
+ BomVO headVO = (BomVO) vo.getParent();
+ newBomMap.put(vo.getPrimaryKey(), headVO.getFbillstatus());
+ }
+ try {
+ // 审批默认BOM后需要把已有的有效默认BOM取消默认
+ for (AggBomVO aggvo : originBills) {
+ if (Integer.valueOf(FBomBillstatusEnum.IAPPROVE).equals(newBomMap.get(aggvo.getPrimaryKey()))){
+ BomVO head = (BomVO) aggvo.getParent();
+ if (!head.getHbdefault().booleanValue()) {
+ continue;
+ }
+ if (BomCategoryEnum.NORMAL_BOM.equalsValue(head.getHfbomcategory())) {
+ // 根据组织+物料+物料版本+BOM类型+有效无效更新原来的默认BOM为非默认;审批更新有效的
+ ArrayList defaultPks = this.isBomOrCfgBomDefaultVersionExist(head.getPk_org(),
+ head.getHcmaterialid(), head.getHcmaterialvid(), head.getFbomtype(),
+ VersionTypeEnum.AVAILABLE.toIntValue());
+ if (MMValueCheck.isNotEmpty(defaultPks)) {
+ defaultPks.remove(head.getCbomid());// pk去掉当前审批的这条数据pk
+ this.CancelBomOrCfgBomDefaultVersion(defaultPks);
+ }
+ } else {
+ List defaultpks = this.isOrderBomDefaultVersionExist(head.getPk_org(),
+ head.getVsobillcode(), head.getVsobillno(), head.getFbomtype());
+ if (MMValueCheck.isNotEmpty(defaultpks)) {
+ defaultpks.remove(head.getCbomid());// pk去掉当前审批的这条数据pk
+ this.CancelBomOrCfgBomDefaultVersion(defaultpks);
+ }
+ }
+ }
+ }
+ return new BillUpdate().update(clientFullVOs, originBills);
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ return null;
+
+ }
+ }
+
+ @Override
+ public AggBomVO[] unauditBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException {
+ try {
+ // 取消审批默认BOM后需要把已有的无效默认BOM取消默认
+ for (AggBomVO aggvo : originBills) {
+ BomVO head = (BomVO) aggvo.getParent();
+ if (!head.getHbdefault().booleanValue()) {
+ continue;
+ }
+ /**
+ * delete by qianzhx 取消审批不做任何的取消默认操作
+ */
+ // 根据组织+物料+物料版本+BOM类型+有效无效更新原来的默认BOM为非默认;取消审批更新无效的
+ // ArrayList defaultPks =
+ // this.isBomOrCfgBomDefaultVersionExist(head.getPk_org(),
+ // head.getHcmaterialid(),
+ // head.getHcmaterialvid(), head.getFbomtype(),
+ // VersionTypeEnum.UNAVAILABLE.toIntValue());
+ // if (MMValueCheck.isNotEmpty(defaultPks)) {
+ // defaultPks.remove(head.getCbomid());
+ // this.CancelBomOrCfgBomDefaultVersion(defaultPks);
+ // }
+ }
+ // 取消审批后把bom版本类型变为无效版本
+ for (AggBomVO aggvo : clientFullVOs) {
+ BomVO head = (BomVO) aggvo.getParent();
+ // head.setHbdefault(UFBoolean.FALSE);
+ head.setHfversiontype(VersionTypeEnum.UNAVAILABLE.toIntValue());
+ head.setStatus(VOStatus.UPDATED);
+ // ArrayList cbomids = new ArrayList();
+ // cbomids.add(head.getCbomid());3
+
+ // this.updateVersiontype(cbomids);
+ }
+ return new BillUpdate().update(clientFullVOs, originBills);
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ return null;
+
+ }
+ }
+
+ @SuppressWarnings("boxing")
+ @Override
+ // 停用
+ public AggBomVO[] seal(AggBomVO[] object) throws BusinessException {
+
+ BomVO[] headvo = new BomVO[object.length];
+ for (int i = 0; i < object.length; i++) {
+ headvo[i] = (BomVO) object[i].getParentVO();
+
+ try {
+ if (headvo == null || headvo.length == 0) {
+ return null;
+ }
+ // 校验是否启用工程变更管理,是否默认版本 || UFBoolean.TRUE.equals(headvo[0].getHbdefault())
+ // 如果是标准BOM启用工程变更,那么不支持修改
+ String pkorg = headvo[i].getAttributeValue(BomVO.PK_ORG).toString();
+ boolean isNormalBom = headvo[i].getHfbomcategory() == BomCategoryEnum.NORMAL_BOM.toIntValue();
+ //1130需求变更,定制BOM不走工程变更
+ boolean isCustBom=MMValueCheck.isTrue(headvo[i].getHbcustomized());
+ // 配置BOM不支持ECN,所以先对BOM类型做判断
+ if (!isCustBom&&isNormalBom && !headvo[i].getFbomtype().equals(BomTypeEnum.CONFIGBOM.toIntValue())
+ && this.isMMECN001Control(pkorg)) {
+ ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getUnsupportUnEditWhenMMDB001Control());
+ return null;
+ }
+ if (headvo[i].getFbillstatus().intValue() != FBomBillstatusEnum.APPROVE.toIntValue()) {
+ ExceptionUtils.wrappBusinessException(NCLangResOnserver.getInstance().getString("1014362_0", null,
+ "01014362-0465", null, new String[] { headvo[i].getVbillcode() })
+// .getStrByID("1014362_0","01014362-0465")/* BOM状态不是审批通过,无法启用/停用! */
+ );
+ } else if (headvo[i].getHfversiontype().intValue() == VersionTypeEnum.UNAVAILABLE.toIntValue()) {
+ ExceptionUtils.wrappBusinessException(NCLangResOnserver.getInstance().getString("1014362_0", null,
+ "01014362-0466", null, new String[] { headvo[i].getVbillcode() })
+// getStrByID("1014362_0","01014362-0466")/* BOM已经是无效版本,无需停用! */
+ );
+ }
+ // else if (UFBoolean.TRUE.equals(headvo[0].getHbdefault())) {
+ // ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getUnsupportEditWhenbdefault());
+ // return null;
+ // }
+ headvo[i].setHbdefault(UFBoolean.FALSE);
+ headvo[i].setHfversiontype(VersionTypeEnum.UNAVAILABLE.toIntValue());
+ headvo[i].setStatus(VOStatus.UPDATED);
+
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ }
+ }
+ // 持久化
+ BillTransferTool transferTool = new BillTransferTool(object);
+ AggBomVO[] originBills = transferTool.getOriginBills();
+ BillUpdate bo = new BillUpdate();
+ bo.update(object, originBills);
+ PKLock.getInstance().releaseDynamicLocks();
+
+ return object;
+ // return null;
+
+ }
+
+ @SuppressWarnings("boxing")
+ @Override
+ public AggBomVO[] unSeal(AggBomVO[] object) throws BusinessException {
+
+ BomVO[] headvo = new BomVO[object.length];
+ for (int i = 0; i < object.length; i++) {
+ headvo[i] = (BomVO) object[i].getParentVO();
+ try {
+ if (headvo == null || headvo.length == 0) {
+ return null;
+ }
+ // 校验是否启用工程变更管理
+ // 如果是正常非订单BOM,启用工程变更后,不支持修改
+ String pkorg = headvo[i].getAttributeValue(BomVO.PK_ORG).toString();
+ boolean isNormalBom = headvo[i].getHfbomcategory() == BomCategoryEnum.NORMAL_BOM.toIntValue();
+ //1130需求变更,定制BOM不走工程变更
+ boolean isCustBom=MMValueCheck.isTrue(headvo[i].getHbcustomized());
+ if (!isCustBom&&isNormalBom && !headvo[i].getFbomtype().equals(BomTypeEnum.CONFIGBOM.toIntValue())
+ && this.isMMECN001Control(pkorg)) {
+ ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getUnsupportUnEditWhenMMDB001Control());
+ return null;
+ }
+ if (headvo[i].getFbillstatus().intValue() != FBomBillstatusEnum.APPROVE.toIntValue()) {
+ ExceptionUtils.wrappBusinessException(NCLangResOnserver.getInstance().getString("1014362_0", null,
+ "01014362-0465", null, new String[] { headvo[i].getVbillcode() })
+
+// getStrByID("1014362_0","01014362-0465")/* BOM状态不是审批通过,无法启用/停用! */
+ );
+ } else if (headvo[i].getHfversiontype().intValue() == VersionTypeEnum.AVAILABLE.toIntValue()) {
+ ExceptionUtils.wrappBusinessException(NCLangResOnserver.getInstance().getString("1014362_0", null,
+ "01014362-0467", null, new String[] { headvo[i].getVbillcode() })
+
+// getStrByID("1014362_0","01014362-0467")/* BOM已经是有效版本,无需启用! */
+ );
+ }
+ headvo[i].setHfversiontype(VersionTypeEnum.AVAILABLE.toIntValue());
+ headvo[i].setStatus(VOStatus.UPDATED);
+
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ }
+ }
+ // 持久化
+ BillTransferTool transferTool = new BillTransferTool(object);
+ AggBomVO[] originBills = transferTool.getOriginBills();
+ BillUpdate bo = new BillUpdate();
+ bo.update(object, originBills);
+ PKLock.getInstance().releaseDynamicLocks();
+ return object;
+
+ }
+
+ private boolean isMMECN001Control(String pk_org) {
+ boolean isMMECN001_Contrl = false;
+ isMMECN001_Contrl = MMBDFactoryParameter.isAlterCtrl(pk_org);
+ return isMMECN001_Contrl;
+ }
+
+ @Override
+ public AggBomVO[] insertBomWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove)
+ throws BusinessException {
+ try {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggvos);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ BomInsertBP bp = new BomInsertBP();
+ AggBomVO[] returnVOs = bp.insert(fullBills, isCheckEcn, isOnApprove);
+ for (int i = 0; i < returnVOs.length; i++) {
+ aggvos[i].setParent(returnVOs[i].getParent());
+ aggvos[i].setChildren(BomItemVO.class, returnVOs[i].getChildrenVO());
+ aggvos[i].setChildren(BomOutputsVO.class, returnVOs[i].getChildren(BomOutputsVO.class));
+ aggvos[i].setChildren(BomUseOrgVO.class, returnVOs[i].getChildren(BomUseOrgVO.class));
+ }
+ return aggvos;
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+
+ }
+ return null;
+ }
+
+ @Override
+ public AggBomVO[] insertCommitBomWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException {
+ BomInsertCommitBP bp = new BomInsertCommitBP();
+ AggBomVO[] result = bp.insertCommit(aggvos,isCheckEcn,isOnApprove);
+ return result;
+ }
+
+ @Override
+ public AggBomVO[] insertCommitBomWithParam_RequiresNew(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException {
+ BomInsertCommitBP bp = new BomInsertCommitBP();
+ AggBomVO[] result = bp.insertCommit(aggvos,isCheckEcn,isOnApprove);
+ return result;
+ }
+ @Override
+ public AggBomVO[] updateBomWithParam(AggBomVO[] aggvos, boolean isFromBom, boolean isecn, boolean isCheckEcn,
+ boolean isOnApprove) throws BusinessException {
+ if (MMArrayUtil.isEmpty(aggvos)) {
+ return null;
+ }
+ try {
+ // 检查该BOM是否被删除,因为如果BOM树状维护将BOM删除了,不允许修改该条记录
+ Set bomids = new HashSet();
+ for (AggBomVO vo : aggvos) {
+ bomids.add(vo.getPrimaryKey());
+ }
+ Set checkResult = BomPubBP.getBomID(bomids.toArray(new String[] {}));
+ if (checkResult != null && checkResult.size() < bomids.size()) {
+ ExceptionUtils.wrappBusinessException(MMBDLangConstBom0202.getBOM_DELETED());
+ }
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggvos);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ // 获得修改前vo
+ AggBomVO[] originBills = transTool.getOriginBills();
+ BomUpdateBP bp = new BomUpdateBP();
+ return bp.update(fullBills, originBills, isCheckEcn, isOnApprove, isFromBom, isecn);
+ } catch (Exception e) {
+ ExceptionUtils.marsh(e);
+ }
+ return null;
+ }
+
+ @Override
+ public AggBomVO[] updateCommitBomWithParam(AggBomVO[] aggvos, boolean isFromBom, boolean isecn, boolean isCheckEcn, boolean isOnApprove) throws BusinessException {
+ BomUpdateCommitBP bp = new BomUpdateCommitBP();
+ AggBomVO[] result = bp.updateCommit(aggvos,isFromBom,isecn,isCheckEcn,isOnApprove);
+ return result;
+ }
+
+ @Override
+ public void deleteBomsWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove)
+ throws BusinessException {
+
+ if (aggvos == null || aggvos.length == 0) {
+ return;
+ }
+ try {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggvos);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ BomDeleteBP bp = new BomDeleteBP();
+ bp.delete(fullBills, isCheckEcn, isOnApprove);
+ } catch (Exception ex) {
+ ExceptionUtils.marsh(ex);
+ }
+ }
+
+ /**
+ * 根据bom主键,更新默认字段为否
+ *
+ * @param cbomid
+ */
+ private void CancelBomOrCfgBomDefaultVersion(List cbomids) {
+ if (MMValueCheck.isEmpty(cbomids)) {
+ return;
+ }
+ BaseDAO dao = new BaseDAO();
+ MMSqlBuilder sql = new MMSqlBuilder();
+ sql.append(" update ");
+ sql.append(BomVO.TABLE_NAME);
+ sql.set();
+ sql.append(BomVO.HBDEFAULT, UFBoolean.FALSE);
+ sql.where();
+ sql.append(BomVO.CBOMID, cbomids);
+ try {
+ dao.executeUpdate(sql.toString());
+ } catch (DAOException e) {
+ ExceptionUtils.wrappException(e);
+ }
+ }
+
+ /**
+ * 根据bom主键,更新版本类型为无效版本
+ *
+ * @param cbomid
+ */
+ private void updateVersiontype(ArrayList cbomids) {
+ if (MMValueCheck.isEmpty(cbomids)) {
+ return;
+ }
+ BaseDAO dao = new BaseDAO();
+ MMSqlBuilder sql = new MMSqlBuilder();
+ sql.append(" update ");
+ sql.append(BomVO.TABLE_NAME);
+ sql.set();
+ sql.append(BomVO.HFVERSIONTYPE, VersionTypeEnum.UNAVAILABLE.toIntValue());
+ sql.where();
+ sql.append(BomVO.CBOMID, cbomids);
+ try {
+ dao.executeUpdate(sql.toString());
+ } catch (DAOException e) {
+ ExceptionUtils.wrappException(e);
+ }
+ }
+
+ private List isOrderBomDefaultVersionExist(String pk_org, String vsobillcode, String vsobillno,
+ Integer fbomtype) {
+ if (fbomtype == 3) {
+ return null;
+ }
+ if (MMValueCheck.isEmpty(vsobillcode) || MMValueCheck.isEmpty(vsobillno)) {
+ return null;
+ }
+ VOQuery queryService = new VOQuery(BomVO.class, new String[] { BomVO.CBOMID });
+ MMSqlBuilder sql = new MMSqlBuilder();
+ sql.and();
+ sql.append(BomVO.PK_GROUP, AppBsContext.getInstance().getPkGroup());
+ sql.and();
+ sql.append(BomVO.PK_ORG, pk_org);
+ sql.and();
+ sql.append(BomVO.VSOBILLCODE, vsobillcode);
+ sql.and();
+ sql.append(BomVO.VSOBILLNO, vsobillno);
+ sql.and();
+ sql.append(BomVO.FBOMTYPE, fbomtype.intValue());
+ sql.and();
+ sql.append(BomVO.HFBOMCATEGORY, 2);
+ sql.and();
+ sql.append(BomVO.HBDEFAULT, "Y");
+ sql.and();
+ sql.append(BomVO.HFVERSIONTYPE, VersionTypeEnum.AVAILABLE.toIntValue());// 查询有效的bom
+ sql.appendDr();
+
+ BomVO[] bomVOs = queryService.query(sql.toString(), null);
+ List result = new ArrayList();
+ for (BomVO bomVO : bomVOs) {
+ result.add(bomVO.getCbomid());
+ }
+ if (MMValueCheck.isNotEmpty(result)) {
+ return result;
+ }
+ return null;
+
+ }
+
+ /**
+ * 判断指定条件的BOM/配置BOM的无效/有效的默认版本是否存在
+ *
+ * @param pkGroup 集团主键
+ * @param pkOrg 组织主键
+ * @param materialVid 物料版本主键
+ * @param version Bom版本号
+ * @return 已存在BOM无效默认版本pk
+ */
+ public ArrayList isBomOrCfgBomDefaultVersionExist(String pkOrg, String cmaterialoid, String materialVid,
+ Integer bomtype, Integer hfversiontype) {
+ VOQuery queryService = new VOQuery(BomVO.class, new String[] { BomVO.CBOMID });
+ MMSqlBuilder sql = new MMSqlBuilder();
+ sql.and();
+ sql.append(BomVO.PK_GROUP, AppBsContext.getInstance().getPkGroup());
+ sql.and();
+ sql.append(BomVO.PK_ORG, pkOrg);
+ sql.and();
+ sql.append(BomVO.HCMATERIALID, cmaterialoid);
+ if (materialVid == null) {
+ sql.and();
+ sql.append(BomVO.HCMATERIALVID, "~");
+ } else {
+ sql.and();
+ sql.append(BomVO.HCMATERIALVID, materialVid);
+ }
+ sql.and();
+ sql.append(BomVO.FBOMTYPE, bomtype);
+ sql.and();
+ sql.append(BomVO.HFBOMCATEGORY, 1);
+ sql.and();
+ sql.append(BomVO.HBDEFAULT, "Y");
+ sql.and();
+ sql.append(BomVO.HBCUSTOMIZED, "N");// 是否定制值为否
+ sql.and();
+ sql.append(BomVO.HFVERSIONTYPE, hfversiontype);
+ sql.appendDr();
+
+ BomVO[] bomVOs = queryService.query(sql.toString(), null);
+ ArrayList cbomids = new ArrayList();
+ if (MMValueCheck.isNotEmpty(bomVOs)) {
+ for (BomVO bomvo : bomVOs) {
+ if (MMValueCheck.isNotEmpty(bomvo)) {
+ cbomids.add(bomvo.getCbomid());
+ }
+ }
+ return cbomids;
+ }
+ return null;
+
+ }
+
+ @Override
+ public void updateBomForBomCopy0214(AggBomVO[] aggvos, AggBomVO[] origins, boolean isCheckEcn) {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggvos);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ // 获得修改前vo
+ AggBomVO[] originBills = transTool.getOriginBills();
+ Set ids = new HashSet();
+ for (AggBomVO aggBomVO : originBills) {
+ ids.add(aggBomVO.getPrimaryKey());
+ }
+
+ BomUpdateBP updatebp = new BomUpdateBP();
+ updatebp.update(fullBills, origins, false, false, false, ids.toArray(new String[0]), false);
+
+ }
+
+ private IBomBillQueryService getBomBillQueryService() {
+ return NCLocator.getInstance().lookup(IBomBillQueryService.class);
+ }
+
+ @Override
+ public void deleteCustomizedBom(AggBomVO[] aggvos) throws BusinessException {
+ if (aggvos == null || aggvos.length == 0) {
+ return;
+ }
+ try {
+ // 加锁 + 检查ts
+ GCBillTransferTool transTool = new GCBillTransferTool(aggvos);
+ // 补全前台VO
+ AggBomVO[] fullBills = transTool.getClientFullInfoBill();
+ BomDeleteBP bp = new BomDeleteBP();
+ bp.deleteCustomizedBom(fullBills);
+ } catch (Exception ex) {
+ ExceptionUtils.marsh(ex);
+ }
+ }
+
+}
diff --git a/uapbd/src/private/nccloud/api/impl/mmbd/bom/APIBomBusinessServiceImpl.java b/uapbd/src/private/nccloud/api/impl/mmbd/bom/APIBomBusinessServiceImpl.java
index 024f16d..6948466 100644
--- a/uapbd/src/private/nccloud/api/impl/mmbd/bom/APIBomBusinessServiceImpl.java
+++ b/uapbd/src/private/nccloud/api/impl/mmbd/bom/APIBomBusinessServiceImpl.java
@@ -143,9 +143,37 @@ public class APIBomBusinessServiceImpl implements IAPIBomBusinessService {
if (commitAggvoList.isEmpty() && addAggvoList.isEmpty()) {
return ResultMessageUtil.exceptionToJSON("BOM保存失败,不存在单据状态不为【空/自由/审批通过】的数据", "999");
} else if (commitAggvoList.isEmpty() && !addAggvoList.isEmpty()) {
- result = service.insertBom((AggBomVO[]) list.toArray(new AggBomVO[0]));
+ result = service.insertBom((AggBomVO[]) addAggvoList.toArray(new AggBomVO[0]));
} else if (!commitAggvoList.isEmpty() && addAggvoList.isEmpty()) {
- result = service.insertCommitBomWithParam((AggBomVO[]) list.toArray(new AggBomVO[0]), true, true);
+ List newAggVOList = new ArrayList<>();
+ if("plm".equals(userCode)){
+ for(AggBomVO aggvo:commitAggvoList){
+ result = service.insertCommitBomWithParam(new AggBomVO[]{aggvo}, true, true);
+ newAggVOList.add(result[0]);
+ }
+ return ResultMessageUtil.toJSON(newAggVOList.toArray(new AggBomVO[0]), "BOM保存成功");
+ }else if("dlkght".equals(userCode)){
+ for(AggBomVO aggvo:commitAggvoList){
+ try {
+ result = service.insertCommitBomWithParam_RequiresNew(new AggBomVO[]{aggvo}, true, true);
+ newAggVOList.add(result[0]);
+ }catch (Exception e){
+ if(e.getMessage()!=null){
+ if(e.getMessage().length()>100){
+ aggvo.getParent().setAttributeValue("hvdef2",e.getMessage().substring(0,100));
+ }else{
+ aggvo.getParent().setAttributeValue("hvdef2",e.getMessage().substring(0,e.getMessage().length()-1));
+ }
+ }else{
+ Throwable unmarsh = ExceptionUtils.unmarsh(e);
+ aggvo.getParent().setAttributeValue("hvdef2", "异常"+unmarsh.getMessage());
+ }
+
+ newAggVOList.add(aggvo);
+ }
+ }
+ return ResultMessageUtil.toJSON(newAggVOList.toArray(new AggBomVO[0]), "100999","BOM保存提交成功部分成功部分失败",true);
+ }
} else {
return ResultMessageUtil.exceptionToJSON("BOM保存失败,新增不允许单据状态自由或者空和审批通过同时存在", "999");
}
diff --git a/uapbd/src/public/nc/itf/bd/bom/bom0202/IBomBillMaintainService.java b/uapbd/src/public/nc/itf/bd/bom/bom0202/IBomBillMaintainService.java
new file mode 100644
index 0000000..4bc60a9
--- /dev/null
+++ b/uapbd/src/public/nc/itf/bd/bom/bom0202/IBomBillMaintainService.java
@@ -0,0 +1,205 @@
+package nc.itf.bd.bom.bom0202;
+
+import nc.vo.bd.bom.bom0202.entity.AggBomVO;
+import nc.vo.pub.BusinessException;
+
+import java.util.Map;
+
+/**
+ * 生产bom维护的持久化接口
+ *
+ * 继承自默认的IAggMaintainService
+ *
+ * 创建日期:2010-1-15 有事务的服务
+ *
+ * @author:zhoujuna
+ */
+public interface IBomBillMaintainService {
+ /**
+ * BOM批量删除接口
+ *
+ * @param aggvos
+ * @throws BusinessException
+ */
+ void deleteBoms(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM新增接口
+ *
+ * @param aggvos 新增BOM数组
+ * @return 保存后的BOM
+ * @throws BusinessException
+ */
+ AggBomVO[] insertBom(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM新增接口(带参数:是否支持ECN,是否支持审批流)
+ *
+ * @param aggvos
+ * @param isCheckEcn
+ * @param isOnApprove
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] insertBomWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException;
+
+
+ AggBomVO[] insertCommitBomWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException;
+ AggBomVO[] insertCommitBomWithParam_RequiresNew(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException;
+
+ /**
+ * BOM修改接口
+ *
+ * @param aggvos 修改BOM数组
+ * @return 保存后的BOM数组
+ * @throws BusinessException
+ */
+ AggBomVO[] updateBom(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM修改接口 (带参数:是否支持ECN;是否支持审批流)
+ *
+ * @param aggvos
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] updateBomWithParam(AggBomVO[] aggvos, boolean isFromBom, boolean isecn, boolean isCheckEcn,
+ boolean isOnApprove) throws BusinessException;
+
+ AggBomVO[] updateCommitBomWithParam(AggBomVO[] aggvos, boolean isFromBom, boolean isecn, boolean isCheckEcn,
+ boolean isOnApprove) throws BusinessException;
+
+ /**
+ * Bom提供给工程变更单的对话框在点击确定后进行数据校验
+ *
+ * @param aggvos
+ * @throws BusinessException
+ */
+ void validateBom(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM新增接口,是否需要考虑检查启用工程变更
+ *
+ * @param aggvos
+ * @param checkEcn
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] insertBomForEcn(AggBomVO[] aggvos, boolean checkEcn) throws BusinessException;
+
+ /**
+ * BOM新增接口,是否需要考虑检查启用工程变更,替代方案替代物料是否分配
+ *
+ * @param aggvos
+ * @param checkEcn
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] insertBomForEcnAndRepls(AggBomVO[] aggvos, boolean checkEcn, String[] orgins) throws BusinessException;
+
+ /**
+ * BOM修改接口,是否需要考虑检查启用工程变更
+ *
+ * @param aggvos 修改BOM数组
+ * @return 保存后的BOM数组
+ * @throws BusinessException
+ */
+ AggBomVO[] updateBomForEcn(AggBomVO[] aggVO, boolean checkEcn) throws BusinessException;
+
+ AggBomVO[] updateBomForEcn(AggBomVO[] aggVO, Map rownoMap, boolean checkEcn) throws BusinessException;
+
+
+ /**
+ * BOM修改接口,是否需要考虑来自bom和bomtree修改保存
+ *
+ * @param aggVO 修改BOM数组
+ * @param 保存时是否判断启用工程变更
+ * @param 是否来自bom
+ * @param 界面录入的组织是否启用工程变更
+ * @return 保存后的BOM数组
+ * @throws BusinessException
+ */
+ AggBomVO[] updateBomForBomTree(AggBomVO[] aggVO, boolean checkEcn, boolean isFromBom, boolean isEcn)
+ throws BusinessException;
+
+ AggBomVO[] updateBomForBomTree(AggBomVO[] aggVO,Map rownoMap, boolean checkEcn, boolean isFromBom, boolean isEcn)
+ throws BusinessException;
+
+ /**
+ * 提交BOM
+ *
+ * @param clientFullVOs
+ * @param originBills
+ * @return
+ * @throws BusinessException
+ */
+ public AggBomVO[] commitBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException;
+
+ /**
+ * 收回BOM
+ *
+ * @param clientFullVOs
+ * @param originBills
+ * @return
+ * @throws BusinessException
+ */
+ public AggBomVO[] uncommitBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException;
+
+ /**
+ * 审批BOM
+ *
+ * @param clientFullVOs
+ * @param originBills
+ * @return
+ * @throws BusinessException
+ */
+ public AggBomVO[] auditBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException;
+
+ /**
+ * 弃审BOM
+ *
+ * @param clientFullVOs
+ * @param originBills
+ * @return
+ * @throws BusinessException
+ */
+ public AggBomVO[] unauditBom(AggBomVO[] clientFullVOs, AggBomVO[] originBills) throws BusinessException;
+
+ /**
+ * BOM的停用
+ *
+ * @param aggvos
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] seal(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM的启用
+ *
+ * @param aggvos
+ * @return
+ * @throws BusinessException
+ */
+ AggBomVO[] unSeal(AggBomVO[] aggvos) throws BusinessException;
+
+ /**
+ * BOM批量删除接口(带参数:是否支持ECN,是否支持审批流)
+ *
+ * @param aggvos
+ */
+ void deleteBomsWithParam(AggBomVO[] aggvos, boolean isCheckEcn, boolean isOnApprove) throws BusinessException;
+
+ /**
+ * 由于业务日志需要,调整跨组织bom复制覆盖原版本走该接口
+ *
+ * @param aggvos
+ * @param origins
+ * @param isCheckEcn
+ */
+ void updateBomForBomCopy0214(AggBomVO[] aggvos, AggBomVO[] origins, boolean isCheckEcn);
+ /**
+ * 定制BOM删除
+ */
+ void deleteCustomizedBom(AggBomVO[] aggvos)throws BusinessException;;
+}