库存保存BP-代码同步-用友李正
This commit is contained in:
		
							parent
							
								
									215c55e889
								
							
						
					
					
						commit
						79177e6f96
					
				|  | @ -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; | ||||
| 
 | ||||
| /** | ||||
|  * <p> | ||||
|  * <b>普通出入库单新增模板:</b> | ||||
|  * <ul> | ||||
|  * <li> | ||||
|  * </ul> | ||||
|  * <p> | ||||
|  * | ||||
|  * @param <T> <p> | ||||
|  * @version 6.0 | ||||
|  * @since 6.0 | ||||
|  * @author songhy | ||||
|  * @time 2010-8-31 上午11:30:28 | ||||
|  */ | ||||
| public class InsertBPTemplate<T extends ICBillVO> extends | ||||
|         BaseInsertBPTemplate<T> { | ||||
| 
 | ||||
|     /** | ||||
|      * InsertBPTemplate 的构造子 | ||||
|      * | ||||
|      * @param point | ||||
|      * @param rules | ||||
|      */ | ||||
|     public InsertBPTemplate(IPluginPoint point, IInsertRuleProvider<T> rules) { | ||||
|         super(point, rules); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获得处理后规则集合 | ||||
|      * | ||||
|      * @return | ||||
|      * @since 6.0 | ||||
|      */ | ||||
|     @Override | ||||
|     protected void addAfterRule(T[] vos, ICAroundProcesser<T> processor) { | ||||
| 
 | ||||
|         // 检验单据号是否重复 | ||||
|         processor.addAfterRule(new ICUniqueBillCode<T>(new GeneralBillAdaptor( | ||||
|                 vos[0]))); | ||||
|         // 在单据保存后保存单品数据 | ||||
|         processor.addAfterRule(new LocationSaveAfterBillInsert<T>()); | ||||
|         // 必须放在LocationSaveAfterBillInsert规则后 | ||||
|         processor.addAfterRule(new DeleteLocationVOAfterBillInsert<T>()); | ||||
|         // 回写累计出库 | ||||
|         processor.addAfterRule(new RewriteCorNum<T>()); | ||||
|         // 出库跟踪入库检查 | ||||
|         processor.addAfterRule(new InOutTraceCheck<T>()); | ||||
|         // 子类的规则 这个顺序禁止变动 | ||||
|         this.getRuleProvider().addAfterRule(vos, processor); | ||||
|         // 现存量更新后规则 | ||||
|         OnhandAfterUpdate<T> hand = new OnhandAfterUpdate<T>(); | ||||
|         processor.addAfterRule(hand); | ||||
|         // 可用量更新后规则 | ||||
|         processor.addAfterRule(new AtpAfterUpdate<T>()); | ||||
|         // 负结存检查(去掉 放入现存量更新后 更合适) | ||||
|         // processor.addAfterRule(new BillOnhandCheck<T>()); | ||||
|         // 安全库存检查(去掉 放入现存量更新 更合适) | ||||
|         // processor.addAfterRule(new SafetyStockCheck<T>()); | ||||
|         // 再订购点检查(去掉 放入现存量更新 更合适) | ||||
|         // processor.addAfterRule(new ReorderPointCheck<T>()); | ||||
|         // 记流水账 | ||||
|         processor.addAfterRule(new FlowAccountUpdate<T>()); | ||||
|         // 月结补单后规则 | ||||
|         processor.addAfterRule(new MonthAfterUpdate<T>()); | ||||
|         // 更新批次档案(必须放在后规则,且必须在单据号获得和记流水账规则后) | ||||
|         processor.addAfterRule(new UpdateBatchByBill<T>()); | ||||
|         processor.addAfterRule(new InsertAfterEventRule<T>()); | ||||
|         // 条码结存和条码重复校验 | ||||
|         processor.addAfterRule(new BarcodeOnhandCheck<T>()); | ||||
|         // 检查是否保存即签字 | ||||
|         processor.addAfterRule(new AutoGeneralBillSign<T>()); | ||||
|         // 新增业务日志 | ||||
| //    processor.addAfterRule(new AddBusinessLogRule<T>()); | ||||
|         processor.addAfterRule(new SnCodeInsertAfterRule<T>()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获得处理前规则集合 | ||||
|      * | ||||
|      * @return | ||||
|      * @since 6.0 | ||||
|      */ | ||||
|     @Override | ||||
|     protected void addBeforeRule(T[] vos, ICAroundProcesser<T> processor) { | ||||
|         //库存扩展清空项目字段--规则限制单据--2025年7月17日09点54分 | ||||
|         processor.addBeforeRule(new ICItemProjectValueRule()); | ||||
| 
 | ||||
|         // 发布交易类型设置交易类型主键 | ||||
|         processor.addBeforeRule(new InOutBizTypeRule<T>()); | ||||
|         // 库存交易类型检查 | ||||
|         processor.addBeforeRule(new ICTranstypeCheck<T>()); | ||||
|         // 单据默认值设置 | ||||
|         processor.addBeforeRule(new BillDefaultValueSetter<T>()); | ||||
|         //组织停用检查 | ||||
|         processor.addBeforeRule(new ICStockOrgEnableCheckRule<T>()); | ||||
|         // 精密-单据日期检查 | ||||
|         // processor.addBeforeRule(new MaterialOutBillDateRule<T>()); | ||||
|         // 开关账检查 | ||||
|         processor.addBeforeRule(new BaseAccountStatusCheck<T>()); | ||||
|         // 总数量,体积计算 | ||||
|         processor.addBeforeRule(new CalTotalItems<T>()); | ||||
|         // 默认货位数据生成 | ||||
|         processor.addBeforeRule(new DefaultSpaceGenerate<T>()); | ||||
| 
 | ||||
|         // 保存时增加库存单据进行货位校验的时机参数校验 | ||||
|         processor.addBeforeRule(new GoodsAllocationCheck<T>()); | ||||
| 
 | ||||
|         // 处理拆解信息 | ||||
|         processor.addBeforeRule(new DeasInfoHandle<T>()); | ||||
|         // 单据实体数据 | ||||
|         processor.addBeforeRule(new ICBillDataCheck<T>()); | ||||
| 
 | ||||
|         //物料自动分配 | ||||
|         processor.addBeforeRule(new AutoMaterialAssignRule<T>(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<T>()); | ||||
|         // 仓库检查:包括库存组织与仓库关系检查,包括代储,废品仓,资产仓 | ||||
|         processor.addBeforeRule(new WarehouseAttributeCheck<T>()); | ||||
|         // 序列号生成 | ||||
|         processor.addBeforeRule(new SnCodeInsertBeforeRule<T>()); | ||||
|         // 单品数据检查 | ||||
|         processor.addBeforeRule(new LocactionEntityCheck<T>()); | ||||
|         // 设备类物料序列号检查 | ||||
|         processor.addBeforeRule(new EquipSerialExistCheck<T>()); | ||||
|         // 是否固定货位 改为函数实现 | ||||
|         processor.addBeforeRule(new IsFixedSpace<T>()); | ||||
|         // 是否单独货位 | ||||
|         processor.addBeforeRule(new IsSeparateSpace<T>()); | ||||
|         // 物料相关属性检查 包括(物料辅助属性检查) | ||||
|         processor.addBeforeRule(new InvAttributeCheck<T>()); | ||||
|         // 自定义项检查 | ||||
|         processor.addBeforeRule(new UserDefCheckRule<T>()); | ||||
|         // 自由辅助属性控制 | ||||
|         processor.addBeforeRule(new MaterialAssistantCheck<T>()); | ||||
|         // 库存状态和交易类型检查,需要写Adapter | ||||
|         processor.addBeforeRule(new StateAndTranTypeMatch<T>()); | ||||
| 
 | ||||
|         // 发运清单下产成品入库单信息填充 | ||||
|         processor.addBeforeRule(new InOutFillForDeliverylistRule<T>()); | ||||
|         // 默认批次生成 | ||||
|         processor.addBeforeRule(new DefaultBatchGenerate<T>()); | ||||
|         // 批次属性检查 | ||||
|         processor.addBeforeRule(new BatchAttributeCheck<T>()); | ||||
|         // 换算率格式化规则 | ||||
|         processor.addBeforeRule(new ChangeRateFormat<T>()); | ||||
|         // 获取单据号 | ||||
|         processor.addBeforeRule(new ICGetBillCodeRule<T>(new GeneralBillAdaptor( | ||||
|                 vos[0]))); | ||||
|         // 自动平衡主辅 | ||||
|         processor.addBeforeRule(new NumBalanceRule<T>()); | ||||
|         // 可用量更新前规则 | ||||
|         processor.addBeforeRule(new AtpBeforeUpdate<T>()); | ||||
| 
 | ||||
|         // 现存量更新前规则 | ||||
|         processor.addBeforeRule(new OnhandBeforeUpdate<T>()); | ||||
| 
 | ||||
|         // 补单前规则 | ||||
|         processor.addBeforeRule(new MonthBeforeUpdate<T>()); | ||||
|         this.getRuleProvider().addBeforeRule(vos, processor); | ||||
|         //增加业务事件监听规则 | ||||
|         processor.addBeforeRule(new InsertBeforeEventRule<T>()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -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 <E extends ICBillVO> extends ICRule<E> { | ||||
|     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<String, String> material_construct = new HashMap<>(); | ||||
|                 Map<String, String> 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<String, String> materialConstruct, Map<String, String> materialStock, String pkOrg) throws BusinessException { | ||||
|         List<String> 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<List<String>> 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<Map<String, Object>> remain = (List<Map<String, Object>>) dao.executeQuery(sql.toString(), new MapListProcessor()); | ||||
|         if (remain == null || remain.isEmpty()) { | ||||
|             throw new BusinessException("物料查询辅助属性结构失败,sql【" + sql + "】"); | ||||
|         } | ||||
|         for (Map<String, Object> map : remain) { | ||||
|             String fix2 = map.get("fix2") == null ? "N" : map.get("fix2").toString(); | ||||
|             String fixasst2 = map.get("fixasst2") == null ? "N" : map.get("fixasst2").toString(); | ||||
|             materialConstruct.put(map.get("pk_material").toString(), fix2); | ||||
|             materialStock.put(map.get("pk_material").toString(), fixasst2); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue