(BPPlugInPoint.UpdateBP, this);
+ PurchaseInVO[] retVOs = updateBP.update(vos, originVOs);
+ return retVOs;
+ }
+
+ private void fillCvendorid(PurchaseInVO[] vos) {
+ String cvendor = null;
+ String cvendorvid = null;
+ for (PurchaseInVO vo : vos) {
+ // 取表头供应商
+ cvendor = vo.getHead().getCvendorid();
+ //取表头供应商vid
+ cvendorvid = vo.getHead().getCvendorvid();
+
+ // 为表体供应商赋值
+ for (PurchaseInBodyVO body : vo.getBodys()) {
+ if (StringUtil.isStringEqual(cvendor, body.getCvendorid())) {
+ continue;
+ }
+ body.setCvendorid(cvendor);
+ body.setCvendorvid(cvendorvid);
+ if (VOStatus.UNCHANGED == body.getStatus()) {
+ // 此处必须判断状态,不能全部设为UPDATED,否则删行后,再新增行,保存会报错
+ body.setStatus(VOStatus.UPDATED);
+ }
+
+ }
+ }
+ }
+
+}
diff --git a/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java b/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java
new file mode 100644
index 0000000..d7c138e
--- /dev/null
+++ b/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java
@@ -0,0 +1,121 @@
+package nc.bs.ic.m4d.insert;
+
+import nc.bs.ic.general.insert.IInsertBP;
+import nc.bs.ic.general.insert.rule.after.InsertAfterEventRule;
+import nc.bs.ic.general.insert.rule.after.RewriteQCInsertRule;
+import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue;
+import nc.bs.ic.general.insert.rule.before.InsertBeforeEventRule;
+import nc.bs.ic.general.rule.after.AfterInsertRuleForRewriteSpecial;
+import nc.bs.ic.general.rule.after.AtpAfterUpdate;
+import nc.bs.ic.general.rule.before.CtplcustomeridCheck;
+import nc.bs.ic.m45.insert.rule.PurchaseInProjectRule;
+import nc.bs.ic.m4d.base.BPPlugInPoint;
+import nc.bs.ic.m4d.base.MaterialOutCheckRule;
+import nc.bs.ic.m4d.base.MaterialOutValueProcRule;
+import nc.bs.ic.m4d.base.MaterialOutWarehouseAttriCheck;
+import nc.bs.ic.m4d.base.PurchaseInDateCheck;
+import nc.bs.ic.m4d.insert.rule.*;
+import nc.bs.ic.pub.base.ICAroundProcesser;
+import nc.bs.ic.pub.base.IInsertRuleProvider;
+import nc.bs.scmpub.rule.CrossRuleValidateRule;
+import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
+import nc.vo.ic.general.define.MetaNameConst;
+import nc.vo.ic.m4d.entity.MaterialOutVO;
+
+/**
+ *
+ * 材料出库单新增BP:
+ *
+ *
+ *
+ *
+ * @version 6.0
+ * @since 6.0
+ * @author chennn
+ * @time 2010-4-19 上午09:51:08
+ */
+public class InsertBP implements IInsertBP,
+ IInsertRuleProvider {
+
+ @Override
+ public void addAfterRule(MaterialOutVO[] vos,
+ AroundProcesser processor) {
+ /*
+ * 放在现存量更新规则之后,因为回写销售订单,发货单时,如果出库数量等于订单数量,
+ * 订单自动行关闭,行关闭会执行预留解除,导致现存量更新时,处理预留业务产生错误
+ */
+ ((ICAroundProcesser) processor).addAfterRuleAt(
+ new UpdRewriteWorkOrder(), AtpAfterUpdate.class);
+ processor.addAfterRule(new InsReWriteSapplyBillRule());// 回写出库申请申请
+ processor.addAfterRule(new InsReWriteBuyingReqRule());// 回写物资需求申请
+ // 回写项目管理备料表,放在回写出库申请之前,为了解决以下问题:
+ // 不能计算预占量的问题,根本原因是因为出库申请的行关闭状态导致。
+ // 之前出库单先回写出库申请,再回写备料备料表,回写备料表时,项目管理要查询当前出库申请的行状态是否关闭,根据该状态计算预占量。
+ // 这样就不能区分此状态是因为出库单保存回写的还是出库单保存前就是关闭的
+ ((ICAroundProcesser) processor).addAfterRuleAt(
+ new InsReWritePIM(), InsReWriteSapplyBillRule.class);
+
+ // 回写资产的领用单
+ processor.addAfterRule(new InsRewriteRM());
+
+ // 回写紧急放行单
+ processor.addAfterRule(new RewriteQCInsertRule());
+
+ /*
+ * 放在现存量更新规则之后,因为回写销售订单,发货单时,如果出库数量等于订单数量,
+ * 订单自动行关闭,行关闭会执行预留解除,导致现存量更新时,处理预留业务产生错误
+ */
+ ((ICAroundProcesser) processor).addAfterRuleAt(
+ new InsRewriteMMPAC(), AtpAfterUpdate.class);
+
+ // 回写生产报告
+ processor.addAfterRule(new InsRewriteWR());
+
+ //回写发货单
+ processor.addAfterRule(new ReWriteSOInsertRule());
+
+ // 工序完工报告倒冲时,回写备料计划
+ processor.addAfterRule(new InsRewriteMMSFC());
+ // 回写计划独立需求
+ processor.addAfterRule(new InsertRewriteMMDP());
+ // 回写特殊单据
+ processor
+ .addAfterRule(new AfterInsertRuleForRewriteSpecial());
+
+ ((ICAroundProcesser) processor).replaceAfterRuleAt(
+ new InsAfterfEventRuleFor4D(), InsertAfterEventRule.class);
+
+ }
+
+ @Override
+ public void addBeforeRule(MaterialOutVO[] vos,
+ AroundProcesser processor) {
+ processor.addBeforeRule(new MaterialOutValueProcRule());
+ processor.addBeforeRule(new MaterialOutCheckRule());
+ // 利润中心校验规则
+ processor.addBeforeRule(new CheckCliabilityValue(MetaNameConst.CIOLIABILITYOID,MetaNameConst.CLIABILITYOID));
+ //processor.addBeforeRule(new CheckBiliValue());//“领料利润中心有值时,出库利润中心不能为空”
+ processor.addBeforeRule(new CtplcustomeridCheck());//表体“货主客户”与“寄存供应商”不能同时存在
+ processor.addBeforeRule(new MaterialOutWarehouseAttriCheck());
+ // 材料出库参照采购入库业务日期校验
+ processor.addBeforeRule(new PurchaseInDateCheck());
+ // 交叉校验规则
+ processor.addBeforeRule(new CrossRuleValidateRule());
+
+ ((ICAroundProcesser) processor).replaceBeforeRuleAt(
+ new InsBeforeEventRuleFor4D(), InsertBeforeEventRule.class);
+
+ //2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目,采购入库单保存时(包含接口导入)清除行项目,材料出库单保存时(包含接口导入)清除行项目
+ processor.addBeforeRule(new MaterialOutProjectRule());
+ }
+
+ @Override
+ public MaterialOutVO[] insert(MaterialOutVO[] bills) {
+ M4dInsertBPTemplate insertBP =
+ new M4dInsertBPTemplate(BPPlugInPoint.InsertBP, this);
+ return insertBP.insert(bills);
+ }
+
+}
diff --git a/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutProjectRule.java b/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutProjectRule.java
new file mode 100644
index 0000000..44e82b9
--- /dev/null
+++ b/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutProjectRule.java
@@ -0,0 +1,77 @@
+package nc.bs.ic.m4d.insert.rule;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.ic.pub.base.ICRule;
+import nc.jdbc.framework.processor.MapListProcessor;
+import nc.vo.ic.general.define.ICBillBodyVO;
+import nc.vo.ic.general.define.ICBillVO;
+import nc.vo.ic.m4d.entity.MaterialOutVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pubapp.pattern.exception.ExceptionUtils;
+import nc.vo.pubapp.pattern.pub.SqlBuilder;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Classname MaterialOutProjectRule
+ * @Description TODO
+ * @Version 1.0.0
+ * @Date 2025/6/13 14:59
+ * @Created by ame
+ */
+public class MaterialOutProjectRule extends ICRule {
+ private static BaseDAO dao=new BaseDAO();
+ @Override
+ public void process(MaterialOutVO[] vos) {
+ if(vos==null || vos.length<1){
+ return;
+ }
+ try {
+ //获取表头计划组织及表体行物料
+ for (ICBillVO vo : vos) {
+ String pk_org = (String) vo.getParentVO().getAttributeValue("pk_org");
+ ICBillBodyVO[] bodys = vo.getBodys();
+ Map material_construct = new HashMap<>();
+ Map material_stock = new HashMap<>();
+ queryFix2ByMaterial(bodys,material_construct,material_stock,pk_org);
+ for(ICBillBodyVO body:bodys){
+ String cmaterialvid = body.getCmaterialvid();
+ if(material_construct.containsKey(cmaterialvid)&& "Y".equals(material_construct.get(cmaterialvid))&& (!material_stock.containsKey(cmaterialvid)|| "N".equals(material_stock.get(cmaterialvid)))){
+ body.setCprojectid(null);
+ }
+ }
+ }
+ } catch (BusinessException var6) {
+ ExceptionUtils.wrappException(var6);
+ }
+ }
+ private void queryFix2ByMaterial(ICBillBodyVO[] childrenVOs, Map materialConstruct, Map materialStock, String pkOrg) throws BusinessException {
+ List materials=new ArrayList<>();
+
+ for (ICBillBodyVO childrenVO : childrenVOs){
+ String cmaterialvid = childrenVO.getCmaterialvid();
+ materials.add(cmaterialvid);
+ }
+ SqlBuilder sql =new SqlBuilder();
+ sql.append(" SELECT bdm.pk_material ,bdmf.fix2,bdms.fixasst2 ");
+ sql.append(" FROM bd_material bdm ");
+ sql.append(" LEFT JOIN bd_marasstframe bdmf ON bdm.pk_marasstframe =bdmf.pk_marasstframe ");
+ sql.append(" LEFT JOIN bd_materialstock bdms ON bdms.PK_MATERIAL =bdm.PK_MATERIAL AND bdms.PK_ORG ='"+pkOrg+"' ");
+ sql.append(" where ");
+ sql.append("bdm.pk_material",materials.toArray(new String[0]));
+ List