diff --git a/ic/src/public/nc/bs/ic/general/insert/InsertBPTemplate.java b/ic/src/public/nc/bs/ic/general/insert/InsertBPTemplate.java
new file mode 100644
index 00000000..76231fbf
--- /dev/null
+++ b/ic/src/public/nc/bs/ic/general/insert/InsertBPTemplate.java
@@ -0,0 +1,219 @@
+package nc.bs.ic.general.insert;
+
+import nc.bs.ic.billcode.rule.GeneralBillAdaptor;
+import nc.bs.ic.billcode.rule.ICGetBillCodeRule;
+import nc.bs.ic.billcode.rule.ICUniqueBillCode;
+import nc.bs.ic.general.insert.rule.after.AutoGeneralBillSign;
+import nc.bs.ic.general.insert.rule.after.DeleteLocationVOAfterBillInsert;
+import nc.bs.ic.general.insert.rule.after.FlowAccountUpdate;
+import nc.bs.ic.general.insert.rule.after.InsertAfterEventRule;
+import nc.bs.ic.general.insert.rule.after.LocationSaveAfterBillInsert;
+import nc.bs.ic.general.insert.rule.after.RewriteCorNum;
+import nc.bs.ic.general.insert.rule.after.SnCodeInsertAfterRule;
+import nc.bs.ic.general.insert.rule.before.BillDefaultValueSetter;
+import nc.bs.ic.general.insert.rule.before.CalTotalItems;
+import nc.bs.ic.general.insert.rule.before.DeasInfoHandle;
+import nc.bs.ic.general.insert.rule.before.DefaultBatchGenerate;
+import nc.bs.ic.general.insert.rule.before.ICBillDataCheck;
+import nc.bs.ic.general.insert.rule.before.ICStockOrgEnableCheckRule;
+import nc.bs.ic.general.insert.rule.before.InsertBeforeEventRule;
+import nc.bs.ic.general.insert.rule.before.IsFixedSpace;
+import nc.bs.ic.general.insert.rule.before.IsSeparateSpace;
+import nc.bs.ic.general.insert.rule.before.SnCodeInsertBeforeRule;
+import nc.bs.ic.general.rule.after.AtpAfterUpdate;
+import nc.bs.ic.general.rule.after.BarcodeOnhandCheck;
+import nc.bs.ic.general.rule.after.InOutTraceCheck;
+import nc.bs.ic.general.rule.after.MonthAfterUpdate;
+import nc.bs.ic.general.rule.after.OnhandAfterUpdate;
+import nc.bs.ic.general.rule.after.UpdateBatchByBill;
+import nc.bs.ic.general.rule.before.*;
+import nc.bs.ic.pub.base.ICAroundProcesser;
+import nc.bs.ic.pub.base.IInsertRuleProvider;
+import nc.bs.ic.pub.bp.BaseInsertBPTemplate;
+import nc.impl.pubapp.pattern.rule.plugin.IPluginPoint;
+import nc.vo.ic.general.define.ICBillVO;
+import nc.vo.ic.general.define.MetaNameConst;
+import nc.vo.ic.pub.define.ICPubMetaNameConst;
+import nc.vo.ic.pub.util.StringUtil;
+import nc.vo.scmpub.rule.AutoMaterialAssignRule;
+
+/**
+ * 
+ * 普通出入库单新增模板:
+ * 
+ * 
+ *
+ * @param  
+ * @version 6.0
+ * @since 6.0
+ * @author songhy
+ * @time 2010-8-31 上午11:30:28
+ */
+public class InsertBPTemplate extends
+        BaseInsertBPTemplate {
+
+    /**
+     * InsertBPTemplate 的构造子
+     *
+     * @param point
+     * @param rules
+     */
+    public InsertBPTemplate(IPluginPoint point, IInsertRuleProvider rules) {
+        super(point, rules);
+    }
+
+    /**
+     * 获得处理后规则集合
+     *
+     * @return
+     * @since 6.0
+     */
+    @Override
+    protected void addAfterRule(T[] vos, ICAroundProcesser processor) {
+
+        // 检验单据号是否重复
+        processor.addAfterRule(new ICUniqueBillCode(new GeneralBillAdaptor(
+                vos[0])));
+        // 在单据保存后保存单品数据
+        processor.addAfterRule(new LocationSaveAfterBillInsert());
+        // 必须放在LocationSaveAfterBillInsert规则后
+        processor.addAfterRule(new DeleteLocationVOAfterBillInsert());
+        // 回写累计出库
+        processor.addAfterRule(new RewriteCorNum());
+        // 出库跟踪入库检查
+        processor.addAfterRule(new InOutTraceCheck());
+        // 子类的规则 这个顺序禁止变动
+        this.getRuleProvider().addAfterRule(vos, processor);
+        // 现存量更新后规则
+        OnhandAfterUpdate hand = new OnhandAfterUpdate();
+        processor.addAfterRule(hand);
+        // 可用量更新后规则
+        processor.addAfterRule(new AtpAfterUpdate());
+        // 负结存检查(去掉 放入现存量更新后 更合适)
+        // processor.addAfterRule(new BillOnhandCheck());
+        // 安全库存检查(去掉 放入现存量更新 更合适)
+        // processor.addAfterRule(new SafetyStockCheck());
+        // 再订购点检查(去掉 放入现存量更新 更合适)
+        // processor.addAfterRule(new ReorderPointCheck());
+        // 记流水账
+        processor.addAfterRule(new FlowAccountUpdate());
+        // 月结补单后规则
+        processor.addAfterRule(new MonthAfterUpdate());
+        // 更新批次档案(必须放在后规则,且必须在单据号获得和记流水账规则后)
+        processor.addAfterRule(new UpdateBatchByBill());
+        processor.addAfterRule(new InsertAfterEventRule());
+        // 条码结存和条码重复校验
+        processor.addAfterRule(new BarcodeOnhandCheck());
+        // 检查是否保存即签字
+        processor.addAfterRule(new AutoGeneralBillSign());
+        // 新增业务日志
+//    processor.addAfterRule(new AddBusinessLogRule());
+        processor.addAfterRule(new SnCodeInsertAfterRule());
+    }
+
+    /**
+     * 获得处理前规则集合
+     *
+     * @return
+     * @since 6.0
+     */
+    @Override
+    protected void addBeforeRule(T[] vos, ICAroundProcesser processor) {
+        //库存扩展清空项目字段--规则限制单据--2025年7月17日09点54分
+        processor.addBeforeRule(new ICItemProjectValueRule());
+
+        // 发布交易类型设置交易类型主键
+        processor.addBeforeRule(new InOutBizTypeRule());
+        // 库存交易类型检查
+        processor.addBeforeRule(new ICTranstypeCheck());
+        // 单据默认值设置
+        processor.addBeforeRule(new BillDefaultValueSetter());
+        //组织停用检查
+        processor.addBeforeRule(new ICStockOrgEnableCheckRule());
+        // 精密-单据日期检查
+        // processor.addBeforeRule(new MaterialOutBillDateRule());
+        // 开关账检查
+        processor.addBeforeRule(new BaseAccountStatusCheck());
+        // 总数量,体积计算
+        processor.addBeforeRule(new CalTotalItems());
+        // 默认货位数据生成
+        processor.addBeforeRule(new DefaultSpaceGenerate());
+
+        // 保存时增加库存单据进行货位校验的时机参数校验
+        processor.addBeforeRule(new GoodsAllocationCheck());
+
+        // 处理拆解信息
+        processor.addBeforeRule(new DeasInfoHandle());
+        // 单据实体数据
+        processor.addBeforeRule(new ICBillDataCheck());
+
+        //物料自动分配
+        processor.addBeforeRule(new AutoMaterialAssignRule(ICPubMetaNameConst.CMATERIALVID,
+                new String[] { ICPubMetaNameConst.PK_ORG, ICPubMetaNameConst.COSTREGIONID, MetaNameConst.CCOSTDOMAINID,
+                        MetaNameConst.CPURORGOID, MetaNameConst.CFANACEORGOID },
+                new String[] { MetaNameConst.CLIABILITYOID, MetaNameConst.CIOLIABILITYOID }));
+
+        // 检查存货是否分配到库存组织(56保存后规则)
+        processor.addBeforeRule(new InvAllocCheck());
+        // 仓库检查:包括库存组织与仓库关系检查,包括代储,废品仓,资产仓
+        processor.addBeforeRule(new WarehouseAttributeCheck());
+        // 序列号生成
+        processor.addBeforeRule(new SnCodeInsertBeforeRule());
+        // 单品数据检查
+        processor.addBeforeRule(new LocactionEntityCheck());
+        // 设备类物料序列号检查
+        processor.addBeforeRule(new EquipSerialExistCheck());
+        // 是否固定货位 改为函数实现
+        processor.addBeforeRule(new IsFixedSpace());
+        // 是否单独货位
+        processor.addBeforeRule(new IsSeparateSpace());
+        // 物料相关属性检查 包括(物料辅助属性检查)
+        processor.addBeforeRule(new InvAttributeCheck());
+        // 自定义项检查
+        processor.addBeforeRule(new UserDefCheckRule());
+        // 自由辅助属性控制
+        processor.addBeforeRule(new MaterialAssistantCheck());
+        // 库存状态和交易类型检查,需要写Adapter
+        processor.addBeforeRule(new StateAndTranTypeMatch());
+
+        // 发运清单下产成品入库单信息填充
+        processor.addBeforeRule(new InOutFillForDeliverylistRule());
+        // 默认批次生成
+        processor.addBeforeRule(new DefaultBatchGenerate());
+        // 批次属性检查
+        processor.addBeforeRule(new BatchAttributeCheck());
+        // 换算率格式化规则
+        processor.addBeforeRule(new ChangeRateFormat());
+        // 获取单据号
+        processor.addBeforeRule(new ICGetBillCodeRule(new GeneralBillAdaptor(
+                vos[0])));
+        // 自动平衡主辅
+        processor.addBeforeRule(new NumBalanceRule());
+        // 可用量更新前规则
+        processor.addBeforeRule(new AtpBeforeUpdate());
+
+        // 现存量更新前规则
+        processor.addBeforeRule(new OnhandBeforeUpdate());
+
+        // 补单前规则
+        processor.addBeforeRule(new MonthBeforeUpdate());
+        this.getRuleProvider().addBeforeRule(vos, processor);
+        //增加业务事件监听规则
+        processor.addBeforeRule(new InsertBeforeEventRule());
+
+    }
+
+    @Override
+    protected T[] insertBill(T[] vos) {
+        for (T vo : vos) {
+            if (!StringUtil.isSEmptyOrNull(vo.getHead().getCgeneralhid())) {
+                continue;
+            }
+            vo.getHead().setCgeneralhid(vo.getTempBillPK());
+        }
+        return super.insertBill(vos);
+    }
+
+}
diff --git a/ic/src/public/nc/bs/ic/general/rule/before/ICItemProjectValueRule.java b/ic/src/public/nc/bs/ic/general/rule/before/ICItemProjectValueRule.java
new file mode 100644
index 00000000..2767afbf
--- /dev/null
+++ b/ic/src/public/nc/bs/ic/general/rule/before/ICItemProjectValueRule.java
@@ -0,0 +1,116 @@
+package nc.bs.ic.general.rule.before;
+
+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.m46.entity.FinProdInVO;
+import nc.vo.ic.m4a.entity.GeneralInVO;
+import nc.vo.ic.m4c.entity.SaleOutVO;
+import nc.vo.ic.m4i.entity.GeneralOutVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+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 ICItemProjectValueRule
+ * @Description 物料档案基本页签启用项目辅助属性+库存组织未启用项目,成品入库单、其它入库单保存时(包含接口导入)清除行项目,销售出库单、其它出库单保存时(包含接口导入)清除行项目;
+ * @Version 1.0.0
+ * @Date 2025/7/17 9:55
+ * @Created by ame
+ */
+public class ICItemProjectValueRule  extends ICRule {
+    private static BaseDAO dao = new BaseDAO();
+    @Override
+    public void process(E[] vos) {
+        if (vos == null || vos.length < 1) {
+            return;
+        }
+        //过滤单据
+        UFBoolean isExe= checkBilltype(vos[0]);
+        if(!isExe.booleanValue()){
+            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);
+                        body.setStatus(1);
+                    }
+                }
+            }
+        } catch (BusinessException var6) {
+            ExceptionUtils.wrappException(var6);
+        }
+    }
+
+    private UFBoolean checkBilltype(E vo) {
+        //2025年7月29日14点54分--取消其它出入库的启用项目逻辑
+//        if(vo instanceof FinProdInVO ||vo instanceof GeneralInVO || vo instanceof SaleOutVO || vo instanceof GeneralOutVO){
+        if(vo instanceof FinProdInVO|| vo instanceof SaleOutVO){
+            return UFBoolean.TRUE;
+        }else {
+            return UFBoolean.FALSE;
+        }
+    }
+
+    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 ");
+        //判断物料是否超500行
+        if (materials != null && materials.size() <= 500) {
+            sql.append("bdm.pk_material", materials.toArray(new String[0]));
+        }
+        if (materials != null && materials.size() > 500) {
+            //按照500条数据分批查询
+            List> result = new ArrayList<>();
+            int total = materials.size();
+            for (int i = 0; i < total; i += 500) {
+                int end = Math.min(total, i + 500);
+                result.add(new ArrayList<>(materials.subList(i, end)));
+            }
+            for (int i = 0; i < result.size(); i++) {
+                sql.append("bdm.pk_material", result.get(i).toArray(new String[0]));
+                if (i != result.size() - 1) {
+                    sql.append(" or ");
+                }
+            }
+        }
+        List