NC6 转库单、采购入库单、库存委托入库单签字后自动生成调拨订单

tech2023-06-17  98

需求方案:

一、业务逻辑 1.业务背景 某集团计划将采购职能(转库单、采购、委外业务)集中到某个业务单元中,形成集团采购中心。所有具有对外销售职能的业务单元的供应需求,都由该采购中心供货。为加速业务流转、减少人工操作,该集团希望通过客开实现入库(转库单保存签字、采购入库单签字、委托加工入库单签字)自动驱动成品对销售业务单元的内部调拨。 2.业务逻辑 【转库单】保存签字而【采购入库单】、【委外入库单】签字时,如果单据表头仓库档案配置了“对方库存组织”、“对方仓库”,且上游【采购订单】、【委外订单】的交易类型参数“自动内部调拨”为“是”,则生成“入库库存组织”对“对方库存组织”的【调拨订单】。【调拨订单】交易类型由组织级参数“入库触发调拨单交易类型”设定。生成的【调拨订单】,根据组织级参数“入库触发调拨单状态”决定是否自动审核。

二、开发需求 1.仓库档案 在仓库档案通过自定义项6、自定义项7,设置自动形成内部调拨业务单据时的“对方库存组织”、“对方仓库”。其中:

对方库存组织:在具有“库存职能”的业务单元中任选其一,不包含已停用的;对方仓库:仓库档案中“所属库存组织”属于“对方库存组织”的所有未停用仓库任选其一;编辑仓库档案时,允许修改“对方库存组织”、“对方仓库”,也允许清空。如果修改了“对方库存组织”(含清空),则清空“对方仓库”;保存时,如果“对方库存组织”有值,但“对方仓库”为空,则提示“已配置“对方库存组织”,但未配置“对方仓库”,无法自动调拨”,允许保存;

2.交易类型参数 【库存其他入库单】、【采购入库】、【委托加工入库单】交易类型增加“自动内部调拨”参数,可勾选或反选。(动态建模平台->流程管理->交易类型管理) 注:该参数需要在代码中添加实现

3.组织级参数 系统按照下表增加两个组织级参数: 在【参数模板设置】中添加上面表格的参数,添加完后升级组织参数:

4.入库单签字改造 【采购入库单】、【委外入库单】签字时:

如果入库实收数量为负,则结束;如果上游【采购订单】、【委外订单】交易类型“自动内部调拨”参数为“否”,则结束;如果本组织的组织级系统参数“采购入库触发调拨单交易类型”、“委外入库触发调拨单交易类型”为空,则提示“参数IC205“采购入库触发调拨单交易类型”未配置,不能自动调拨”、“参数IC207“委外入库触发调拨单交易类型”未配置,不能自动调拨”,并结束;如果【采购入库单】、【委外入库单】表头仓库档案自定义项4“对方库存组织”为空,则结束;如果【采购入库单】、【委外入库单】表头仓库档案自定义项5“对方仓库”为空则提示“已配置“对方库存组织”,但未配置“对方仓库”,无法自动调拨”,并结束;生成【调拨订单】。【调拨订单】的“调出库存组织”、“调出仓库”与入库单的“库存组织”、“入库仓库”保持一致,“调入库存组织”、“调入仓库”与入库单入库仓库档案的“对方库存组织”(自定义项4)、“对方仓库”(自定义项5)保持一致。物料明细行与入库单的物料明细行保持一致(只保留实收数大于零的行),且单位、数量、主单位、主数量与入库单各行的单位、实收数量、主单位、实收主数量保持一致。每一明细行物料按照系统 “内部结算规则”,形成调拨订单价格(税率、无税单价、含税单价、无税金额、价税合计)。;本组织组织级参数“采购入库触发调拨单状态”、“委外入库触发调拨单状态”为“自由”,则结束;触发【调拨订单】“审核”;

5.入库单取消签字改造 【采购入库单】、【委外入库单】取消签字时,如果入库单存在下游【调拨订单】,则提示:“存在下游单据,不能取消签字”,签字失败。

开发 实现 【库存其他入库单】、【采购入库】、【委托加工入库单】交易类型增加“自动内部调拨”参数,可勾选或反选。

1、在“ic_transactiontype.bmf”元数据文件中新增“自动内部调拨”参数 autointrans 2、添加完后升级元数据。 3、在TransTypeExtendVO 类中添加字段

package nc.vo.ic.transtype; import nc.vo.ic.pub.define.ICPubMetaNameConst; import nc.vo.pub.IVOMeta; import nc.vo.pub.SuperVO; import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDateTime; import nc.vo.pubapp.pattern.model.meta.entity.vo.VOMetaFactory; public class TransTypeExtendVO extends SuperVO { // 影响成本 public static final String BAFFECTCOST = "baffectcost"; // 影响现存量 public static final String BAFFECTONHAND = "baffectonhand"; // 审批后自动推式生成其它出入库单 public static final String BAPPROVEPUSHBILL = "bapprovepushbill"; // 保存即审批 public static final String BAUTOAPPROVE = "bautoapprove"; // 保存即签字 public static final String BAUTOSIGN = "bautosign"; // 核销方式 public static final String CAVTYPE = "cavtype"; // 助促销品出库 public static final String BSALEPROMOTION = "bsalepromotion"; // 适用零售 public static final String BRETAIL = "bretail"; //自动内部调拨 add by 2020-09-03 public static final String AUTOINTRANS = "autointrans"; // 申请出库类型 public static final String DEST_BILLTYPECODE = "dest_billtypecode"; // 出入库标识 public static final String FINOUTFLAG = "finoutflag"; // 单据类型主键 // public static final String PK_BILLTYPEID = "pk_billtypeid"; // 集团 public static final String PK_GROUP = "pk_group"; // 库存交易类型主键 public static final String PK_TRANSTYPE = "pk_transtype"; // 库存交易类型编码 public static final String TRANSTYPECODE = "transtypecode"; // 时间戳 public static final String TS = "ts"; //寄存消耗结算方 public static final String FCONSSETTLEFLAG = "fconssettleflag"; private static final long serialVersionUID = 216342704177031780L; public UFBoolean getBaffectcost() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BAFFECTCOST); } public UFBoolean getBaffectonhand() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BAFFECTONHAND); } public UFBoolean getBapprovepushbill() { return (UFBoolean) this .getAttributeValue(TransTypeExtendVO.BAPPROVEPUSHBILL); } public UFBoolean getBautoapprove() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BAUTOAPPROVE); } public UFBoolean getBautosign() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BAUTOSIGN); } public Integer getCavtype() { return (Integer) this.getAttributeValue(TransTypeExtendVO.CAVTYPE); } public UFBoolean getBsalepromotion() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BSALEPROMOTION); } public UFBoolean getBretail() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.BRETAIL); } public UFBoolean getAutointrans() { return (UFBoolean) this.getAttributeValue(TransTypeExtendVO.AUTOINTRANS); } public String getDest_billtypecode() { return (String) this.getAttributeValue(TransTypeExtendVO.DEST_BILLTYPECODE); } public Integer getFinoutflag() { return (Integer) this.getAttributeValue(TransTypeExtendVO.FINOUTFLAG); } public Integer getFconssettleflag() { return (Integer) this.getAttributeValue(TransTypeExtendVO.FCONSSETTLEFLAG); } @Override public IVOMeta getMetaData() { IVOMeta meta = VOMetaFactory.getInstance().getVOMeta("ic.ic_transtype"); return meta; } // public String getPk_billtypeid() { // return (String) this.getAttributeValue(TransTypeExtendVO.PK_BILLTYPEID); // } public String getPk_group() { return (String) this.getAttributeValue(TransTypeExtendVO.PK_GROUP); } public String getPk_transtype() { return (String) this.getAttributeValue(TransTypeExtendVO.PK_TRANSTYPE); } public String getTranstypecode() { return (String) this.getAttributeValue(TransTypeExtendVO.TRANSTYPECODE); } public UFDateTime getTs() { return (UFDateTime) this.getAttributeValue(TransTypeExtendVO.TS); } public void setBaffectcost(UFBoolean baffectcost) { this.setAttributeValue(TransTypeExtendVO.BAFFECTCOST, baffectcost); } public void setBaffectonhand(UFBoolean baffectonhand) { this.setAttributeValue(TransTypeExtendVO.BAFFECTONHAND, baffectonhand); } public void setBapprovepushbill(UFBoolean bapprovepushbill) { this.setAttributeValue(TransTypeExtendVO.BAPPROVEPUSHBILL, bapprovepushbill); } public void setBautoapprove(UFBoolean bautoapprove) { this.setAttributeValue(TransTypeExtendVO.BAUTOAPPROVE, bautoapprove); } public void setBautosign(UFBoolean bautosign) { this.setAttributeValue(TransTypeExtendVO.BAUTOSIGN, bautosign); } public void setCavtype(Integer cavtype) { this.setAttributeValue(TransTypeExtendVO.CAVTYPE, cavtype); } public void setBsalepromotion(UFBoolean bsalepromotion) { this.setAttributeValue(TransTypeExtendVO.BSALEPROMOTION, bsalepromotion); } public void setBretail(UFBoolean bretail) { this.setAttributeValue(TransTypeExtendVO.BRETAIL, bretail); } public void setAutointrans(UFBoolean autointrans) { this.setAttributeValue(TransTypeExtendVO.AUTOINTRANS, autointrans); } public void setDest_billtypecode(String dest_billtypecode) { this.setAttributeValue(TransTypeExtendVO.DEST_BILLTYPECODE, dest_billtypecode); } public void setFinoutflag(Integer finoutflag) { this.setAttributeValue(TransTypeExtendVO.FINOUTFLAG, finoutflag); } // public void setPk_billtypeid(String pk_billtypeid) { // this.setAttributeValue(TransTypeExtendVO.PK_BILLTYPEID, pk_billtypeid); // } public void setPk_group(String pk_group) { this.setAttributeValue(TransTypeExtendVO.PK_GROUP, pk_group); } public void setPk_transtype(String pk_transtype) { this.setAttributeValue(TransTypeExtendVO.PK_TRANSTYPE, pk_transtype); } public void setTranstypecode(String transtypecode) { this.setAttributeValue(TransTypeExtendVO.TRANSTYPECODE, transtypecode); } public void setTs(UFDateTime ts) { this.setAttributeValue(TransTypeExtendVO.TS, ts); } public String getCtrantypeid() { return (String) this.getAttributeValue(ICPubMetaNameConst.CTRANTYPEID); } public void setCtrantypeid(String ctrantypeid) { this.setAttributeValue(ICPubMetaNameConst.CTRANTYPEID, ctrantypeid); } public void setFconssettleflag(Integer fconssettleflag) { this.setAttributeValue(TransTypeExtendVO.FCONSSETTLEFLAG, fconssettleflag); } }

交易类型扩展编辑器类 GeneralTransTypePanelFor45 :

package nc.ui.ic.transtype; import nc.ui.pub.bill.BillData; import nc.ui.pub.transtype.EditorContext; import nc.vo.ic.transtype.TransTypeExtendVO; import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFBoolean; /** * * <p> * <b>本类主要完成以下功能:</b> 采购入库单的交易类型扩展界面 注:45为采购入库单的单据类型 * <ul> * <li> * </ul> * * <p> * <p> * * @version 6.5 * @since 6.5 * @time 2020-09-03 下午16:24:14 */ public class GeneralTransTypePanelFor45 extends GeneralTransTypePanel { @Override public Object getTransTypeExtObj(EditorContext context) throws BusinessException { TransTypeExtendVO vo = (TransTypeExtendVO) super.getTransTypeExtObj(context); // 自动内部调拨 add by 2020-09-03 if (((Boolean) this.getValue(TransTypeExtendVO.AUTOINTRANS)).booleanValue()) { vo.setAutointrans(UFBoolean.TRUE); } else { vo.setAutointrans(UFBoolean.FALSE); } return vo; } @Override public void processItemView(BillData billData) { super.processItemView(billData); // 核销类型 super.setVisible(billData, TransTypeExtendVO.CAVTYPE, false); // super.setWidth(billData, TransTypeExtendVO.CAVTYPE); // 保存即签字 super.setVisible(billData, TransTypeExtendVO.BAUTOSIGN, true); // 自动内部调拨 add by 2020-09-03 super.setVisible(billData, TransTypeExtendVO.AUTOINTRANS, true); super.setWidth(billData, TransTypeExtendVO.AUTOINTRANS); } } package nc.ui.ic.transtype; import nc.ui.pub.bill.BillData; import nc.ui.pub.transtype.EditorContext; import nc.vo.ic.transtype.TransTypeExtendVO; import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFBoolean; /** * 其他出库单的交易类型扩展界面 * * @since 6.31 * @version 2013-9-3 上午10:11:28 * @author */ public class GeneralTransTypePanelFor4A extends GeneralTransTypePanel { @Override public Object getTransTypeExtObj(EditorContext context) throws BusinessException { TransTypeExtendVO vo = (TransTypeExtendVO) super.getTransTypeExtObj(context); // 适用零售 if (((Boolean) this.getValue(TransTypeExtendVO.BRETAIL)).booleanValue()) { vo.setBretail(UFBoolean.TRUE); } else { vo.setBretail(UFBoolean.FALSE); } // 自动内部调拨 add by 2020-09-03 if (((Boolean) this.getValue(TransTypeExtendVO.AUTOINTRANS)).booleanValue()) { vo.setAutointrans(UFBoolean.TRUE); } else { vo.setAutointrans(UFBoolean.FALSE); } return vo; } @Override public void processItemView(BillData billData) { super.processItemView(billData); // 适用零售 super.setVisible(billData, TransTypeExtendVO.BRETAIL, true); super.setWidth(billData, TransTypeExtendVO.BRETAIL); // 自动内部调拨 add by 2020-09-03 super.setVisible(billData, TransTypeExtendVO.AUTOINTRANS, true); super.setWidth(billData, TransTypeExtendVO.AUTOINTRANS); } } package nc.ui.ic.transtype; import nc.ui.pub.bill.BillData; import nc.ui.pub.transtype.EditorContext; import nc.vo.ic.transtype.TransTypeExtendVO; import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFBoolean; /** * * <p> * <b>本类主要完成以下功能:</b> 委外加工入库单的交易类型扩展界面 注:47为委外加工入库单的单据类型 * <ul> * <li> * </ul> * * <p> * <p> * * @version 6.0 * @since 6.0 * @author songhy * @time 2010-6-4 下午02:24:14 */ public class GeneralTransTypePanelFor47 extends GeneralTransTypePanel { @Override public Object getTransTypeExtObj(EditorContext context) throws BusinessException { TransTypeExtendVO vo = (TransTypeExtendVO) super.getTransTypeExtObj(context); // 自动内部调拨 add by 2020-09-03 if (((Boolean) this.getValue(TransTypeExtendVO.AUTOINTRANS)).booleanValue()) { vo.setAutointrans(UFBoolean.TRUE); } else { vo.setAutointrans(UFBoolean.FALSE); } return vo; } @Override public void processItemView(BillData billData) { super.processItemView(billData); // 保存即签字 super.setVisible(billData, TransTypeExtendVO.BAUTOSIGN, false); // 自动内部调拨 add by 2020-09-03 super.setVisible(billData, TransTypeExtendVO.AUTOINTRANS, true); super.setWidth(billData, TransTypeExtendVO.AUTOINTRANS); // 核销类型 super.setVisible(billData, TransTypeExtendVO.CAVTYPE, true); } }

在单据类型管理中新增此类(GeneralTransTypePanelFor45 ),如图 如果界面新增、修改保存报错,则只能后台直接修改数据库了或sql语句插入了。

编写自动调拨的业务逻辑

做后规则有两种套路: 一个是代码写 代码编写需要在入口类中注册

签字入口类

package nc.bs.ic.m47.sign; import nc.bs.ic.general.sign.ISignBP; import nc.bs.ic.general.sign.ISignRuleProvider; import nc.bs.ic.general.sign.SignBPTemplate; import nc.bs.ic.m47.base.BPPlugInPoint; import nc.bs.ic.m47.sign.rule.M47AfterSignAuto5XBillVO; import nc.bs.ic.m47.sign.rule.AfterSignAutoVerifyRule; import nc.bs.ic.m47.sign.rule.AfterSignForFI; import nc.bs.ic.m47.sign.rule.AfterSignRuleForFinanceProcess; import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; import nc.vo.ic.m47.entity.SubcontInVO; /** * <p> <b>本类主要完成以下功能:</b> <ul> <li>委托加工入库签字 </ul> <p> <p> * * @version 6.0 * @since 6.0 * @author wanghna * @time 2010-10-25 上午09:23:19 */ public class SignBP implements ISignBP<SubcontInVO>, ISignRuleProvider<SubcontInVO> { @Override public SubcontInVO[] sign(SubcontInVO[] vos) { SignBPTemplate<SubcontInVO> signBP = new SignBPTemplate<SubcontInVO>(BPPlugInPoint.SignAction, this); return signBP.sign(vos); } @Override public void addAfterRule(SubcontInVO[] vos, AroundProcesser<SubcontInVO> processor) { // 签字生成存货核算的委托加工入库 processor.addAfterRule(new AfterSignRuleForFinanceProcess()); // 签字自动核销 processor.addAfterRule(new AfterSignAutoVerifyRule()); // 委托加工入库单签字生成采购副本 processor.addAfterRule(new AfterSignForFI()); //签字后自动生成调拨订单 add by 2020-09-03 processor.addAfterRule(new M47AfterSignAuto5XBillVO()); } @Override public void addBeforeRule(SubcontInVO[] vos, AroundProcesser<SubcontInVO> processor) { // do nothing } }

自动生成调拨订单业务处理类

package nc.bs.ic.m47.sign.rule; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.framework.common.NCLocator; import nc.impl.pubapp.pattern.rule.IRule; import nc.itf.ic.transtype.ITransTypeExtendQueryService; import nc.itf.to.m5x.ITransOrderForGeneralIn; import nc.itf.to.m5x.ITransOrderMaintain; import nc.itf.uap.IUAPQueryBS; import nc.itf.uap.pf.IPfExchangeService; import nc.itf.uap.pf.IplatFormEntry; import nc.itf.uap.pf.busiflow.PfButtonClickContext; import nc.jdbc.framework.processor.ColumnProcessor; import nc.pub.occnc.syn.common.UFBoolean; import nc.pubitf.uapbd.IMaterialBaseClassPubService; import nc.pubitf.uapbd.IMaterialPubService_C; import nc.ui.pub.para.SysInitBO_Client; import nc.util.mmf.busi.consts.BillTypeConst; import nc.vo.bd.material.MaterialVO; import nc.vo.bd.material.marbasclass.MarBasClassVO; import nc.vo.bd.stordoc.StordocVO; import nc.vo.ic.m47.entity.SubcontInBodyVO; import nc.vo.ic.m47.entity.SubcontInHeadVO; import nc.vo.ic.m47.entity.SubcontInVO; import nc.vo.ic.transtype.TransTypeExtendVO; import nc.vo.pub.BusinessException; import nc.vo.pub.billtype.BilltypeVO; import nc.vo.pub.lang.UFDouble; import nc.vo.pub.para.SysInitVO; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.to.m5x.entity.BillHeaderVO; import nc.vo.to.m5x.entity.BillItemVO; import nc.vo.to.m5x.entity.BillVO; /** * * @description 委托加工入库单签字后生成调拨订单 * @scene 委托加工单签字 * @param * * * @since 6.5 * @version 2020-09-03 * @author */ public class M47AfterSignAuto5XBillVO implements IRule<SubcontInVO> { @Override public void process(SubcontInVO[] vos) { if ((vos == null) || (vos.length == 0)) { return; } // 2.如果入库实收数量为负,则结束; // 2.如果上游【委托加工入库单】交易类型“自动内部调拨”参数为“否”,则结束; // 4.如果 【委托加工入库单】表头仓库档案自定义项6“对方库存组织”为空,则结束;" ITransTypeExtendQueryService queryService = NCLocator.getInstance().lookup(ITransTypeExtendQueryService.class); for (SubcontInVO subcontInVO : vos) { SubcontInHeadVO headVO = subcontInVO.getHead(); SubcontInBodyVO[] bodyVOs = subcontInVO.getBodys(); String pk_org = headVO.getPk_org(); // 1、判断来源单据是否是委托订单-61 if (headVO == null || !"61".equals(bodyVOs[0].getCsourcetype())) { continue; } // 2判断实收数量为负 if (headVO.getNtotalnum() == null || headVO.getNtotalnum().compareTo(UFDouble.ZERO_DBL) < 0) { continue; } // 3如果【委托加工入库单】交易类型“自动内部调拨”参数为“否” TransTypeExtendVO[] transTypeExtendVO = null; try { transTypeExtendVO = queryService.queryByIds(new String[] { headVO.getCtrantypeid() }); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取委托加工入库单的交易类型出错" + e.getMessage()); } if (transTypeExtendVO == null || transTypeExtendVO[0].getAutointrans() == null || !transTypeExtendVO[0].getAutointrans().booleanValue()) {// 并上自动调拨参数为否 continue; } // 4如果本组织的组织级系统参数“入库触发调拨单交易类型”为空,则提示 SysInitVO initVO = null; try { initVO = SysInitBO_Client.queryByParaCode(pk_org, "IC207"); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取业务组织参数 IC207失败!" + e.getMessage()); } if (null == initVO || initVO.getValue() == null) { continue; } // 5如果【委托加工入库单】表头仓库档案自定义项6“对方库存组织”为空 StordocVO stordocVO = this.getStordocVOById(headVO.getCwarehouseid()); if (stordocVO == null || stordocVO.getDef6() == null) { continue; } // 6如果【委托加工入库单】表头仓库档案自定义项7“对方仓库”为空则提示 if (stordocVO.getDef7() == null) { continue; } // 调用单据转换规则 委托加工入库单-调拨订单 IPfExchangeService ipfes = NCLocator.getInstance().lookup(IPfExchangeService.class); BillVO[] billVO = null; try { billVO = (BillVO[]) ipfes.runChangeDataAryNeedClassify(BillTypeConst.SUBCONTIN, BillTypeConst.TRAN, new SubcontInVO[] { subcontInVO }, null, PfButtonClickContext.ClassifyByBusiflow); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("走单据转换规则【委托加工入库单-调拨订单】失败" + e.getMessage()); } if (billVO == null) { ExceptionUtils.wrappBusinessException("走单据转换规则没有生成调拨订单"); } BillVO tobillVO = billVO[0]; // 调入调出组织,仓库设置,物流明细行过滤 BillHeaderVO headerVO = tobillVO.getParentVO(); BillItemVO[] itemVO = tobillVO.getChildrenVO(); if (itemVO == null || itemVO.length <= 0) { ExceptionUtils.wrappBusinessException("走单据转换规则没有生成调拨订单"); } ArrayList<BillItemVO> itemVOList = new ArrayList<BillItemVO>(); for (BillItemVO bodyVO : itemVO) { // bodyVO.setVpricerule("1"); UFBoolean notZero = UFBoolean.TRUE; if (bodyVO.getNnum() == null && bodyVO.getNastnum() == null) { notZero = UFBoolean.FALSE; } if (bodyVO.getNnum().compareTo(UFDouble.ZERO_DBL) < 0 || bodyVO.getNastnum().compareTo(UFDouble.ZERO_DBL) < 0) { notZero = UFBoolean.FALSE; } if (notZero.booleanValue()) { itemVOList.add(bodyVO); } } tobillVO.setChildrenVO(itemVOList.toArray(new BillItemVO[itemVOList.size()])); headerVO.SetCtrantypeid(initVO.getValue()); headerVO.setCinstockorgid(stordocVO.getDef6()); String pk_org_v = getOrgVidById(stordocVO.getDef6()); headerVO.setCinstockorgvid(pk_org_v); headerVO.setCinfinanceorgid(stordocVO.getDef6()); headerVO.setCinfinanceorgvid(pk_org_v); headerVO.setPk_org(pk_org); headerVO.setPk_org_v(headVO.getPk_org_v()); headerVO.setCoutfinanceorgid(pk_org); headerVO.setCoutfinanceorgvid(headVO.getPk_org_v()); headerVO.setCtoutfinanceorgid(pk_org); headerVO.setCtoutfinanceorgvid(headVO.getPk_org_v()); BilltypeVO billtypevo = getBilltypeVOById(initVO.getValue()); String vtrantypecode = "5X-Cxx-03"; if (billtypevo != null) { vtrantypecode = billtypevo.getPk_billtypecode(); } headerVO.setVtrantypecode(vtrantypecode); String cbiztypeid = "1001E11000000000WHAO"; String busitype = getBusitypeVOById(vtrantypecode); if (busitype != null) { cbiztypeid = busitype; } headerVO.setCbiztypeid(cbiztypeid); tobillVO.setParentVO(headerVO); // 每busitypeVO行明细物料按系统 “内部结算规则“,形成调拨订单价格(税率、无税单价、含税单价、无税金额、价税合计)。 ITransOrderForGeneralIn iTransOrderForGeneralIn = NCLocator.getInstance() .lookup(ITransOrderForGeneralIn.class); BillVO[] returnvos = null; try { returnvos = iTransOrderForGeneralIn.setDefaultTransOrder(new BillVO[] { tobillVO }); } catch (BusinessException e2) { ExceptionUtils.wrappBusinessException("调拨订单设置默认值失败:" + e2.getMessage()); } tobillVO = returnvos[0]; // 保存调拨订单 IplatFormEntry iplatFormEntry = NCLocator.getInstance().lookup(IplatFormEntry.class); ITransOrderMaintain iTransOrderMaintain = NCLocator.getInstance().lookup(ITransOrderMaintain.class); subcontInVO.getHead().setStatus(2); BillVO[] billvo = null; try { billvo = iTransOrderMaintain.insertTransOrder(new BillVO[] { tobillVO }); } catch (BusinessException e1) { ExceptionUtils.wrappBusinessException("生成调拨订单保存失败:" + e1.getMessage()); } if (billvo != null) { tobillVO = billvo[0]; // 回写委托加工入库单vdef8, 是否已经自动调拨 try { new BaseDAO().executeUpdate( "update ic_subcontin_h set vdef8 ='Y' where vbillcode = '" + headVO.getVbillcode() + "'"); } catch (DAOException e1) { ExceptionUtils.wrappBusinessException("回写委托加工入库单失败!" + e1.getMessage()); } } // 根据组织参数,是否审批 SysInitVO init = null; try { init = SysInitBO_Client.queryByParaCode(pk_org, "IC208"); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取业务组织参数 IC208失败!" + e.getMessage()); } if (initVO != null && init != null && "已审核".equals(init.getValue())) { try { iplatFormEntry.processAction("APPROVE", vtrantypecode, null, tobillVO, null, null); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("生成调拨订单审批失败:" + e.getMessage()); } } } } /** * 根据pk找仓库 * * @param pk * @return */ private StordocVO getStordocVOById(String pk) { StordocVO stordocVO = null; try { stordocVO = (StordocVO) getIUAPQueryBS().retrieveByPK(StordocVO.class, pk); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk: " + pk + "找仓库失败:" + e.getMessage()); } return stordocVO; } /** * 根据pk找交易类型 * * @param pk * @return */ private BilltypeVO getBilltypeVOById(String pk) { BilltypeVO BilltypeVO = null; try { BilltypeVO = (BilltypeVO) getIUAPQueryBS().retrieveByPK(BilltypeVO.class, pk); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk: " + pk + "找交易类型失败:" + e.getMessage()); } return BilltypeVO; } /** * 根据交易类型code找业务流程 * * @param vtrantypecode * @return */ private String getBusitypeVOById(String vtrantypecode) { String busitype = null; String sql = "select pk_busitype from bd_busitype where primarybilltype= '" + vtrantypecode + "';"; try { busitype = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor()); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据交易类型code: " + vtrantypecode + "找业务流程失败:" + e.getMessage()); } return busitype; } /** * 根据pk_org找组织版本pk_org_v * * @param vtrantypecode * @return */ private String getOrgVidById(String pk_org) { String pk_org_v = null; String sql = "select pk_vid from org_orgs where dr = 0 and enablestate = 2 and pk_org = '" + pk_org + "'"; try { pk_org_v = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor()); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk_org: " + pk_org + "找组织版本pk_org_v:" + e.getMessage()); } return pk_org_v; } private IUAPQueryBS getIUAPQueryBS() { return NCLocator.getInstance().lookup(IUAPQueryBS.class); } /** * 查询物料对应的物料分类code Map<物料pk,物料分类code> panfengc * * @param pks * @return */ private Map<String, String> queryMaterialBaseClassCode(String[] pks) { Map<String, String> map = new HashMap<String, String>(); if (pks == null || pks.length == 0) return map; try { // 查询物料对应的物料分类主键 Map<String, MaterialVO> mapMaterial = this.getIMaterialPubService_C().queryMaterialBaseInfoByPks(pks, new String[] { MaterialVO.PK_MARBASCLASS }); Set<Entry<String, MaterialVO>> setMaterial = mapMaterial.entrySet(); List<String> pk_marbasclass_list = new ArrayList<String>(); for (Entry<String, MaterialVO> entry : setMaterial) { String Pk_marbasclass = entry.getValue().getPk_marbasclass(); pk_marbasclass_list.add(Pk_marbasclass); if (!map.containsKey(entry.getKey())) { map.put(entry.getKey(), Pk_marbasclass); } if (pk_marbasclass_list.size() == 0) { ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() .getStrByID("4001002_0", "04001002-0410")/* * @res "查询物料基本分类出错" */); } } // 根据物料分类pk查询物料分类VO MarBasClassVO[] basclass = this.queryMaterialBaseClassByPk(pk_marbasclass_list.toArray(new String[0]), false); // 建立 Map pk,code, 循环mapMaterial,组件新的数组 Map<String, String> marbasCodehash = new HashMap<String, String>(); for (MarBasClassVO marbasvo : basclass) { if (!marbasCodehash.containsKey(marbasvo.getPk_marbasclass())) { marbasCodehash.put(marbasvo.getPk_marbasclass(), marbasvo.getCode()); } } // 根据物料分类pk,找对应的物料分类code for (String pk : pks) { if (map.containsKey(pk)) { String Pk_marbasclass = map.get(pk); if (marbasCodehash.containsKey(Pk_marbasclass)) { String code = marbasCodehash.get(Pk_marbasclass); map.put(pk, code); } else map.put(pk, null); } } } catch (BusinessException e) { ExceptionUtils.wrappException(e); } return map; } private IMaterialPubService_C getIMaterialPubService_C() { return NCLocator.getInstance().lookup(IMaterialPubService_C.class); } private MarBasClassVO[] queryMaterialBaseClassByPk(String[] pk_marbasclass, boolean isContainParents) { MarBasClassVO[] aterialBaseClass = null; try { aterialBaseClass = NCLocator.getInstance().lookup(IMaterialBaseClassPubService.class) .queryMaterialBaseClassByPks(pk_marbasclass, isContainParents); } catch (BusinessException e) { // 日志异常 ExceptionUtils.wrappException(e); } return aterialBaseClass; } }

取消签字入口注册类

package nc.bs.ic.m47.cancelsign; import nc.bs.ic.general.cancelsign.CancelSignBPTemplate; import nc.bs.ic.general.cancelsign.ICancelSignBP; import nc.bs.ic.general.cancelsign.ICancelSignRuleProvider; import nc.bs.ic.m47.base.BPPlugInPoint; import nc.bs.ic.m47.cancelsign.rule.AfterCancelSignAutoVerifyRule; import nc.bs.ic.m47.cancelsign.rule.AfterCancelSignForFI; import nc.bs.ic.m47.cancelsign.rule.AfterUnsSgnRuleForFinanceProcess; import nc.bs.ic.m47.cancelsign.rule.BeforeUnSignRuleForVerty; import nc.bs.ic.m47.cancelsign.rule.M47CheckTo5XCancelSignRule; import nc.bs.ic.m47.cancelsign.rule.UnSignRuleFor25; import nc.bs.ic.pub.cancelsign.rule.CancelSignCheckPickedFlag; import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; import nc.vo.ic.m47.entity.SubcontInVO; /** * <p> <b>本类主要完成以下功能:</b> <ul> <li>委托加工入库取消签字 </ul> * * @version 6.0 * @since 6.0 * @author wanghna * @time 2010-10-25 上午09:22:11 */ public class CancelSignBP implements ICancelSignBP<SubcontInVO>, ICancelSignRuleProvider<SubcontInVO> { @Override public SubcontInVO[] cancelSign(SubcontInVO[] vos) { CancelSignBPTemplate<SubcontInVO> cancelSignBP = new CancelSignBPTemplate<SubcontInVO>(BPPlugInPoint.CancelSignAction, this); return cancelSignBP.cancelSign(vos); } @Override public void addAfterRule(SubcontInVO[] vos, AroundProcesser<SubcontInVO> processor) { // 取消签字 删除存货核算的加工入库 processor.addAfterRule(new AfterUnsSgnRuleForFinanceProcess()); // 取消自动核销 删除对应的单据 processor.addAfterRule(new AfterCancelSignAutoVerifyRule()); // 委托加工入库签字删除采购副本 processor.addAfterRule(new AfterCancelSignForFI()); } @Override public void addBeforeRule(SubcontInVO[] vos, AroundProcesser<SubcontInVO> processor) { // 已核销单据不能取消签字 //processor.addBeforeRule(new BeforeUnSignRuleForVerty()); // 已开票单据不能取消签字 processor.addBeforeRule(new UnSignRuleFor25()); // 已拣配不能取消签字 processor.addBeforeRule(new CancelSignCheckPickedFlag<SubcontInVO>()); //已自动生成调拨订单不能取消签字 add by 2020-09-03 processor.addBeforeFinalRule(new M47CheckTo5XCancelSignRule()); } }

取消签字校验类

package nc.bs.ic.m47.cancelsign.rule; import nc.bs.ic.pub.base.ICRule; import nc.vo.ic.m47.entity.SubcontInVO; import nc.vo.ic.m47.entity.SubcontInHeadVO; import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; /** * * @description 检查是否可取消签字,取消签字前检查: 下游是否生成 * 检查是否已经生成下游【调拨订单】,则提示:“存在下游单据,不能取消签字”,签字失败。 * @scene 委托加工入库单取消签字 * @param 无 * * @since v6.5 * @author * @version 2020-09-03 */ public class M47CheckTo5XCancelSignRule extends ICRule<SubcontInVO> { /** * 检查执行情况 */ public void checkExec(SubcontInVO[] vos) throws BusinessException { SubcontInHeadVO headvo = null; for (SubcontInVO vo : vos) { headvo = vo.getHead(); if ("Y".equals(headvo.getVdef8())) { ExceptionUtils.wrappBusinessException("已生成下游调拨订单,不能取消签字"); } } } /** * 父类方法重写 */ @Override public void process(SubcontInVO[] vos) { try { // 检查执行情况 this.checkExec(vos); } catch (Exception e) { ExceptionUtils.wrappException(e); } } }

另一个是从脚本注入后规则事件 执行以下脚本插入事件类

insert into PUB_PLUGINITEM (DR, INDUSTRYTYPE, IORDER, LOCALTYPE, PK_PLUGINITEM, TS, VCOMPONENTNAME, VDESCRIPTION, VEVENTTYPE, VEXTENDMODULE, VEXTENDPOINTNAME, VEXTENDTYPE, VMODULENAME, VRULECLASS, VTARGETCLASS) values (0, '~', null, '~', '1001ZZ100000000AOE0P', '2020-09-02 17:00:39', 'm45', '库存采购入库单取消签字校验是否是字段调拨', 'before', 'ic', 'nc.impl.ic.m45.action.CancelSignAction', 'addBefore', 'IC', 'nc.bs.ic.m45.cancelsign.rule.M45CheckTo5XCancelSignRule', null); insert into PUB_PLUGINITEM (DR, INDUSTRYTYPE, IORDER, LOCALTYPE, PK_PLUGINITEM, TS, VCOMPONENTNAME, VDESCRIPTION, VEVENTTYPE, VEXTENDMODULE, VEXTENDPOINTNAME, VEXTENDTYPE, VMODULENAME, VRULECLASS, VTARGETCLASS) values (0, '~', null, '~', '1001ZZ100000000AOA40', '2020-08-31 14:09:39', 'm45', '采购入库单签字后自动调拨', 'after', 'ic', 'nc.impl.ic.m45.action.SignAction', 'addAfter', 'IC', 'nc.bs.ic.m45.sign.rule.M45AfterSignAuto5XBillVO', null); select * from PUB_PLUGINITEM where VRULECLASS like '%nc.bs.ic.m45%' ORDER BY ts desc;

自动生成调拨订单业务处理类

package nc.bs.ic.m45.sign.rule; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.framework.common.NCLocator; import nc.impl.pubapp.pattern.rule.IRule; import nc.itf.ic.transtype.ITransTypeExtendQueryService; import nc.itf.to.m5x.ITransOrderForGeneralIn; import nc.itf.to.m5x.ITransOrderMaintain; import nc.itf.uap.IUAPQueryBS; import nc.itf.uap.pf.IPfExchangeService; import nc.itf.uap.pf.IplatFormEntry; import nc.itf.uap.pf.busiflow.PfButtonClickContext; import nc.jdbc.framework.processor.ColumnProcessor; import nc.pub.occnc.syn.common.UFBoolean; import nc.pubitf.uapbd.IMaterialBaseClassPubService; import nc.pubitf.uapbd.IMaterialPubService_C; import nc.ui.pub.para.SysInitBO_Client; import nc.util.mmf.busi.consts.BillTypeConst; import nc.vo.bd.material.MaterialVO; import nc.vo.bd.material.marbasclass.MarBasClassVO; import nc.vo.bd.stordoc.StordocVO; import nc.vo.ic.m45.entity.PurchaseInBodyVO; import nc.vo.ic.m45.entity.PurchaseInHeadVO; import nc.vo.ic.m45.entity.PurchaseInVO; import nc.vo.ic.transtype.TransTypeExtendVO; import nc.vo.pub.BusinessException; import nc.vo.pub.billtype.BilltypeVO; import nc.vo.pub.lang.UFDouble; import nc.vo.pub.para.SysInitVO; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.to.m5x.entity.BillHeaderVO; import nc.vo.to.m5x.entity.BillItemVO; import nc.vo.to.m5x.entity.BillVO; /** * * @description 采购入库单签字后生成调拨订单 * * * @since 6.5 * @version 2020-09-03 * @author */ public class M45AfterSignAuto5XBillVO implements IRule<PurchaseInVO> { @Override public void process(PurchaseInVO[] vos) { if ((vos == null) || (vos.length == 0)) { return; } // 2.如果入库实收数量为负,则结束; // 2.如果上游【采购入库单】交易类型“自动内部调拨”参数为“否”,则结束; // 4.如果 【采购入库单】表头仓库档案自定义项6“对方库存组织”为空,则结束;" ITransTypeExtendQueryService queryService = NCLocator.getInstance().lookup(ITransTypeExtendQueryService.class); for (PurchaseInVO purchaseInVO : vos) { PurchaseInHeadVO headVO = purchaseInVO.getHead(); PurchaseInBodyVO[] bodyVOs = purchaseInVO.getBodys(); String pk_org = headVO.getPk_org(); // 1、判断来源单据是否是采购订单-21 // if (headVO == null || !"21".equals(bodyVOs[0].getCsourcetype())) { // continue; // } // 2判断实收数量为负 if (headVO.getNtotalnum() == null || headVO.getNtotalnum().compareTo(UFDouble.ZERO_DBL) < 0) { continue; } // 3如果【采购入库单】交易类型“自动内部调拨”参数为“否” TransTypeExtendVO[] transTypeExtendVO = null; try { transTypeExtendVO = queryService.queryByIds(new String[] { headVO.getCtrantypeid() }); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取采购入库单的交易类型出错" + e.getMessage()); } if (transTypeExtendVO == null || transTypeExtendVO[0].getAutointrans() == null || !transTypeExtendVO[0].getAutointrans().booleanValue()) {// 并上自动调拨参数为否 continue; } // 4如果本组织的组织级系统参数“入库触发调拨单交易类型”为空,则提示 SysInitVO initVO = null; try { initVO = SysInitBO_Client.queryByParaCode(pk_org, "IC205"); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取业务组织参数 IC205失败!" + e.getMessage()); } if (null == initVO || initVO.getValue() == null) { continue; } // 5如果【采购入库单】表头仓库档案自定义项6“对方库存组织”为空 StordocVO stordocVO = this.getStordocVOById(headVO.getCwarehouseid()); if (stordocVO == null || stordocVO.getDef6() == null) { continue; } // 6如果【采购入库单】表头仓库档案自定义项7“对方仓库”为空则提示 if (stordocVO.getDef7() == null) { continue; } // 调用单据转换规则 采购入库单-调拨订单 IPfExchangeService ipfes = NCLocator.getInstance().lookup(IPfExchangeService.class); BillVO[] billVO = null; try { billVO = (BillVO[]) ipfes.runChangeDataAryNeedClassify(BillTypeConst.PURCHASEIN, BillTypeConst.TRAN, new PurchaseInVO[] { purchaseInVO }, null, PfButtonClickContext.ClassifyByBusiflow); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("走单据转换规则【采购入库单-调拨订单】失败" + e.getMessage()); } if (billVO == null) { ExceptionUtils.wrappBusinessException("走单据转换规则没有生成调拨订单"); } BillVO tobillVO = billVO[0]; // 调入调出组织,仓库设置,物流明细行过滤 BillHeaderVO headerVO = tobillVO.getParentVO(); BillItemVO[] itemVO = tobillVO.getChildrenVO(); if (itemVO == null || itemVO.length <= 0) { ExceptionUtils.wrappBusinessException("走单据转换规则没有生成调拨订单"); } ArrayList<BillItemVO> itemVOList = new ArrayList<BillItemVO>(); for (BillItemVO bodyVO : itemVO) { // bodyVO.setVpricerule("1"); UFBoolean notZero = UFBoolean.TRUE; if (bodyVO.getNnum() == null && bodyVO.getNastnum() == null) { notZero = UFBoolean.FALSE; } if (bodyVO.getNnum().compareTo(UFDouble.ZERO_DBL) < 0 || bodyVO.getNastnum().compareTo(UFDouble.ZERO_DBL) < 0) { notZero = UFBoolean.FALSE; } if (notZero.booleanValue()) { itemVOList.add(bodyVO); } } tobillVO.setChildrenVO(itemVOList.toArray(new BillItemVO[itemVOList.size()])); headerVO.SetCtrantypeid(initVO.getValue()); headerVO.setCinstockorgid(stordocVO.getDef6()); String pk_org_v = getOrgVidById(stordocVO.getDef6()); headerVO.setCinstockorgvid(pk_org_v); headerVO.setCinfinanceorgid(stordocVO.getDef6()); headerVO.setCinfinanceorgvid(pk_org_v); headerVO.setPk_org(pk_org); headerVO.setPk_org_v(headVO.getPk_org_v()); headerVO.setCoutfinanceorgid(pk_org); headerVO.setCoutfinanceorgvid(headVO.getPk_org_v()); headerVO.setCtoutfinanceorgid(pk_org); headerVO.setCtoutfinanceorgvid(headVO.getPk_org_v()); BilltypeVO billtypevo = getBilltypeVOById(initVO.getValue()); String vtrantypecode = "5X-Cxx-03"; if (billtypevo != null) { vtrantypecode = billtypevo.getPk_billtypecode(); } headerVO.setVtrantypecode(vtrantypecode); String cbiztypeid = "1001E11000000000WHAO"; String busitype = getBusitypeVOById(vtrantypecode); if (busitype != null) { cbiztypeid = busitype; } headerVO.setCbiztypeid(cbiztypeid); tobillVO.setParentVO(headerVO); // 每busitypeVO行明细物料按系统 “内部结算规则“,形成调拨订单价格(税率、无税单价、含税单价、无税金额、价税合计)。 ITransOrderForGeneralIn iTransOrderForGeneralIn = NCLocator.getInstance().lookup(ITransOrderForGeneralIn.class); BillVO[] returnvos = null; try { returnvos = iTransOrderForGeneralIn.setDefaultTransOrder(new BillVO[] { tobillVO }); } catch (BusinessException e2) { ExceptionUtils.wrappBusinessException("调拨订单设置默认值失败:" + e2.getMessage()); } tobillVO = returnvos[0]; // 保存调拨订单 IplatFormEntry iplatFormEntry = NCLocator.getInstance().lookup(IplatFormEntry.class); ITransOrderMaintain iTransOrderMaintain = NCLocator.getInstance().lookup(ITransOrderMaintain.class); purchaseInVO.getHead().setStatus(2); BillVO[] billvo = null; try { billvo = iTransOrderMaintain.insertTransOrder(new BillVO[] { tobillVO }); } catch (BusinessException e1) { ExceptionUtils.wrappBusinessException("生成调拨订单保存失败:" + e1.getMessage()); } if (billvo != null) { tobillVO = billvo[0]; // 回写采购入库单vdef8, 是否已经自动调拨 try { new BaseDAO().executeUpdate( "update ic_purchasein_h set vdef8 ='Y' where vbillcode = '" + headVO.getVbillcode() + "'"); } catch (DAOException e1) { ExceptionUtils.wrappBusinessException("回写采购入库单失败!" + e1.getMessage()); } } // 根据组织参数,是否审批 SysInitVO init = null; try { init = SysInitBO_Client.queryByParaCode(pk_org, "IC206"); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("获取业务组织参数 IC206失败!" + e.getMessage()); } if (initVO != null && init != null && "已审核".equals(init.getValue())) { try { iplatFormEntry.processAction("APPROVE", vtrantypecode, null, tobillVO, null, null); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("生成调拨订单审批失败:" + e.getMessage()); } } } } /** * 根据pk找仓库 * * @param pk * @return */ private StordocVO getStordocVOById(String pk) { StordocVO stordocVO = null; try { stordocVO = (StordocVO) getIUAPQueryBS().retrieveByPK(StordocVO.class, pk); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk: " + pk + "找仓库失败:" + e.getMessage()); } return stordocVO; } /** * 根据pk找交易类型 * * @param pk * @return */ private BilltypeVO getBilltypeVOById(String pk) { BilltypeVO BilltypeVO = null; try { BilltypeVO = (BilltypeVO) getIUAPQueryBS().retrieveByPK(BilltypeVO.class, pk); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk: " + pk + "找交易类型失败:" + e.getMessage()); } return BilltypeVO; } /** * 根据交易类型code找业务流程 * * @param vtrantypecode * @return */ private String getBusitypeVOById(String vtrantypecode) { String busitype = null; String sql = "select pk_busitype from bd_busitype where primarybilltype= '" + vtrantypecode + "';"; try { busitype = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor()); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据交易类型code: " + vtrantypecode + "找业务流程失败:" + e.getMessage()); } return busitype; } /** * 根据pk_org找组织版本pk_org_v * * @param vtrantypecode * @return */ private String getOrgVidById(String pk_org) { String pk_org_v = null; String sql = "select pk_vid from org_orgs where dr = 0 and enablestate = 2 and pk_org = '" + pk_org + "'"; try { pk_org_v = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor()); } catch (BusinessException e) { ExceptionUtils.wrappBusinessException("根据pk_org: " + pk_org + "找组织版本pk_org_v:" + e.getMessage()); } return pk_org_v; } private IUAPQueryBS getIUAPQueryBS() { return NCLocator.getInstance().lookup(IUAPQueryBS.class); } /** * 查询物料对应的物料分类code Map<物料pk,物料分类code> panfengc * * @param pks * @return */ private Map<String, String> queryMaterialBaseClassCode(String[] pks) { Map<String, String> map = new HashMap<String, String>(); if (pks == null || pks.length == 0) return map; try { // 查询物料对应的物料分类主键 Map<String, MaterialVO> mapMaterial = this.getIMaterialPubService_C().queryMaterialBaseInfoByPks(pks, new String[] { MaterialVO.PK_MARBASCLASS }); Set<Entry<String, MaterialVO>> setMaterial = mapMaterial.entrySet(); List<String> pk_marbasclass_list = new ArrayList<String>(); for (Entry<String, MaterialVO> entry : setMaterial) { String Pk_marbasclass = entry.getValue().getPk_marbasclass(); pk_marbasclass_list.add(Pk_marbasclass); if (!map.containsKey(entry.getKey())) { map.put(entry.getKey(), Pk_marbasclass); } if (pk_marbasclass_list.size() == 0) { ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() .getStrByID("4001002_0", "04001002-0410")/* * @res "查询物料基本分类出错" */); } } // 根据物料分类pk查询物料分类VO MarBasClassVO[] basclass = this.queryMaterialBaseClassByPk(pk_marbasclass_list.toArray(new String[0]), false); // 建立 Map pk,code, 循环mapMaterial,组件新的数组 Map<String, String> marbasCodehash = new HashMap<String, String>(); for (MarBasClassVO marbasvo : basclass) { if (!marbasCodehash.containsKey(marbasvo.getPk_marbasclass())) { marbasCodehash.put(marbasvo.getPk_marbasclass(), marbasvo.getCode()); } } // 根据物料分类pk,找对应的物料分类code for (String pk : pks) { if (map.containsKey(pk)) { String Pk_marbasclass = map.get(pk); if (marbasCodehash.containsKey(Pk_marbasclass)) { String code = marbasCodehash.get(Pk_marbasclass); map.put(pk, code); } else map.put(pk, null); } } } catch (BusinessException e) { ExceptionUtils.wrappException(e); } return map; } private IMaterialPubService_C getIMaterialPubService_C() { return NCLocator.getInstance().lookup(IMaterialPubService_C.class); } private MarBasClassVO[] queryMaterialBaseClassByPk(String[] pk_marbasclass, boolean isContainParents) { MarBasClassVO[] aterialBaseClass = null; try { aterialBaseClass = NCLocator.getInstance().lookup(IMaterialBaseClassPubService.class) .queryMaterialBaseClassByPks(pk_marbasclass, isContainParents); } catch (BusinessException e) { // 日志异常 ExceptionUtils.wrappException(e); } return aterialBaseClass; } }

取消签字校验类

package nc.bs.ic.m45.cancelsign.rule; import nc.bs.ic.pub.base.ICRule; import nc.vo.ic.m45.entity.PurchaseInVO; import nc.vo.ic.m45.entity.PurchaseInHeadVO; import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; /** * * @description * 检查是否可取消签字,取消签字前检查: * 下游是否生成 * 检查是否已经生成下游【调拨订单】,则提示:“存在下游单据,不能取消签字”,签字失败。 * @scene * 采购入库单取消签字 * @param * 无 * * @since v6.5 * @author * @version 2020-09-03 下午04:48:10 */ public class M45CheckTo5XCancelSignRule extends ICRule<PurchaseInVO> { /** * 检查执行情况 */ public void checkExec(PurchaseInVO[] vos) throws BusinessException { PurchaseInHeadVO headvo = null; for (PurchaseInVO vo : vos) { headvo = vo.getHead(); if ("Y".equals(headvo.getVdef8())) { ExceptionUtils.wrappBusinessException("已生成下游调拨订单,不能取消签字"); } } } /** * 父类方法重写 */ @Override public void process(PurchaseInVO[] vos) { try { // 检查执行情况 this.checkExec(vos); } catch (Exception e) { ExceptionUtils.wrappException(e); } } }

转库单的逻辑可以根据上面委托加工入库或者采购入库的方式编写

接下来就是单据转换规则的配置 如采购入库单-调拨订单的转换规则配置: 在单据转换规则界面中新增 【采购入库单】转【调拨订单】记录 其他单据依次添加配置。

以上就是大概的流程,如有不对的地方,欢迎留言指出,大家共同学习进步。

最新回复(0)