From 96b7ce570c39e7e96ccb644afcca787ea314125a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Fri, 13 Jun 2025 15:27:11 +0800 Subject: [PATCH 1/9] =?UTF-8?q?patch=5Fdev=5Fuapbd=5Fic=5F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A1=B9=E7=9B=AE=E5=8F=8A=E9=A1=B9=E7=9B=AE=E4=B8=93?= =?UTF-8?q?=E7=94=A8=E6=96=99=E5=80=BC=E9=80=BB=E8=BE=91=5FV1=5Fsdlizheng?= =?UTF-8?q?=5F20250613?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../private/nc/bs/ic/m45/insert/InsertBP.java | 128 ++++++ .../insert/rule/PurchaseInProjectRule.java | 77 ++++ .../private/nc/bs/ic/m45/update/UpdateBP.java | 153 +++++++ .../private/nc/bs/ic/m4d/insert/InsertBP.java | 121 ++++++ .../insert/rule/MaterialOutProjectRule.java | 77 ++++ .../private/nc/bs/ic/m4d/update/UpdateBP.java | 122 ++++++ .../nc/bs/bd/bom/bom0202/bp/BomInsertBP.java | 273 ++++++++++++ .../nc/bs/bd/bom/bom0202/bp/BomUpdateBP.java | 399 ++++++++++++++++++ .../rule/BOMBprojectmaterialEnableRule.java | 84 ++++ 9 files changed, 1434 insertions(+) create mode 100644 ic/src/private/nc/bs/ic/m45/insert/InsertBP.java create mode 100644 ic/src/private/nc/bs/ic/m45/insert/rule/PurchaseInProjectRule.java create mode 100644 ic/src/private/nc/bs/ic/m45/update/UpdateBP.java create mode 100644 ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java create mode 100644 ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutProjectRule.java create mode 100644 ic/src/private/nc/bs/ic/m4d/update/UpdateBP.java create mode 100644 uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomInsertBP.java create mode 100644 uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomUpdateBP.java create mode 100644 uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BOMBprojectmaterialEnableRule.java diff --git a/ic/src/private/nc/bs/ic/m45/insert/InsertBP.java b/ic/src/private/nc/bs/ic/m45/insert/InsertBP.java new file mode 100644 index 0000000..54a9edf --- /dev/null +++ b/ic/src/private/nc/bs/ic/m45/insert/InsertBP.java @@ -0,0 +1,128 @@ +package nc.bs.ic.m45.insert; + +import nc.bs.ic.general.insert.IInsertBP; +import nc.bs.ic.general.insert.InsertBPTemplate; +import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue; +import nc.bs.ic.general.rule.after.AtpAfterUpdate; +import nc.bs.ic.general.rule.before.CtplcustomeridCheck; +import nc.bs.ic.m45.base.BPPlugInPoint; +import nc.bs.ic.m45.base.rule.FillCostOrgRule; +import nc.bs.ic.m45.base.rule.PurchaseBillCheckRule; +import nc.bs.ic.m45.base.rule.PurchaseInAssetWarehouseCheck; +import nc.bs.ic.m45.base.rule.PurchaseInVOScaleCheckRule; +import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcess; +import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcessFor5805; +import nc.bs.ic.m45.base.rule.ReturnSnIsExistInEquipcardCheck; +import nc.bs.ic.m45.base.rule.VmiCheckRule; +import nc.bs.ic.m45.insert.rule.*; +import nc.bs.ic.pub.base.ICAroundProcesser; +import nc.bs.ic.pub.base.IInsertRuleProvider; +import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; +import nc.vo.bd.payment.IPaymentUtil; +import nc.vo.ic.general.define.MetaNameConst; +import nc.vo.ic.m45.entity.PurchaseInBodyVO; +import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.ic.pub.util.StringUtil; +import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobAfterPurchaseInSave; + +/** + * 采购入库单后台新增BP + * + * @author songhy + */ +public class InsertBP implements IInsertBP, + IInsertRuleProvider { + + @Override + public void addAfterRule(PurchaseInVO[] vos, + AroundProcesser processor) { + //红字采购入库单保存的时候,增加判断逻辑,如果表头仓库是直运仓,不检查物料的现存量 放在前面设置session + processor.addAfterRule(new IsRedBookThrough()); + + /** + * 放在现存量更新规则(OnhandAfterUpdate)之后,因为现存量更新时会调用预留接口,预留接口会回写采购订单, + * 如果入库数量=订单数量,订单会自动入库关闭,入库关闭会解除预留,导致后续操作错误 + */ + ((ICAroundProcesser) processor).addAfterRuleAt( + new InsertRewritePORule(), AtpAfterUpdate.class); + processor.addAfterRule(new InsReWritePIM()); + processor.addAfterRule(new InsertRewriteITRule()); + processor.addAfterRule(new MobAfterPurchaseInSave()); + processor.addAfterRule(new FeeDetailInsert()); + //红字采购入库单原单退回保存回写累计入库退回主数量,由于预留处理需要查询蓝字采购入库单,回写操作应放在现存量更新规则(OnhandAfterUpdate)之后 + ((ICAroundProcesser) processor).addAfterRuleAt(new InsertRedReturnInRewriteRule(), AtpAfterUpdate.class); + ((ICAroundProcesser) processor).addAfterRuleAt(new InsertRedReturnInRewriteSORule(), InsertRedReturnInRewriteRule.class); + // 回写付款计划 + processor.addAfterRule(new InsertRewritePayPlanConfirmDataRule()); + // 回写付款计划子孙开票数据 先票后入库 入库日期时点, + processor.addAfterRule(new InsertOrSignRewritePayPlanInvoiceRule(IPaymentUtil.STORE_RECEIPT_DATE)); + // 入库单保存回写采购合同付款计划 + processor.addAfterRule(new M45SaveAndRewriteCTPayPlan()); + + // processor.addAfterRule(new InsertRewritePORule()); + } + + @Override + public void addBeforeRule(PurchaseInVO[] vos, + AroundProcesser processor) { + // 检查是否可以生成入库单 + processor.addBeforeRule(new InsertCheckCanInRule()); + processor.addBeforeRule(new FillCostOrgRule()); +// processor.addBeforeRule(new SaveCheckFeeMnyRule()); + processor.addBeforeRule(new PurchaseBillCheckRule()); + processor.addBeforeRule(new PurchaseInAssetWarehouseCheck()); + // 当数量(主数量,数量,报价数量)与采购订单一致时,使采购入库单表体价格和单价与采购订单一致 + //下面的规则处理会使入库单的改价不生效 hujieh +// processor.addBeforeRule(new AdjustPriceAndMnyWhenSameNumRule()); + processor.addBeforeRule(new CtplcustomeridCheck()); + processor.addBeforeRule(new VmiCheckRule()); + processor.addBeforeRule(new ReturnSnIsExistInEquipcardCheck()); + // 红蓝字入库单倒挤,跟订单倒挤 + processor.addBeforeRule(new PurchaseinRetMarginProcess()); + processor.addBeforeRule(new PurchaseinRetMarginProcessFor5805()); + processor.addBeforeRule(new PurchaseInVOScaleCheckRule()); + processor.addBeforeRule(new InsertCheckMaterialUnit()); + // 利润中心校验规则 + processor.addBeforeRule(new CheckCliabilityValue(MetaNameConst.CLIABILITYOID,MetaNameConst.CIOLIABILITYOID)); + // 来源于进口模块--流向单,填充报价单位、报价换算率 + processor.addBeforeRule(new FillInVqtunitRule()); + + //2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目,采购入库单保存时(包含接口导入)清除行项目,材料出库单保存时(包含接口导入)清除行项目 + processor.addBeforeRule(new PurchaseInProjectRule()); + } + + @Override + public PurchaseInVO[] insert(PurchaseInVO[] bills) { + // 应该在“物理自由辅助属性检查”规则执行前补充供应商 + this.fillCvendorid(bills); + InsertBPTemplate insertBP = + new InsertBPTemplate(BPPlugInPoint.InsertBP, this); + return insertBP.insert(bills); + } + + /** + * 补表体的供应商,供应商已经挪到表头,表体的供应商要跟表头供应商一样 + * + * @param vos + */ + private void fillCvendorid(PurchaseInVO[] vos) { + String cvendor = null; + String cvendorvid = null; + for (PurchaseInVO vo : vos) { + + // 取表头供应商 + cvendor = vo.getHead().getCvendorid(); + cvendorvid = vo.getHead().getCvendorvid(); + if (StringUtil.isSEmptyOrNull(cvendor)) { + continue; + } + + // 为表体供应商赋值 + for (PurchaseInBodyVO body : vo.getBodys()) { + body.setCvendorid(cvendor); + body.setCvendorvid(cvendorvid); + } + } + } + +} diff --git a/ic/src/private/nc/bs/ic/m45/insert/rule/PurchaseInProjectRule.java b/ic/src/private/nc/bs/ic/m45/insert/rule/PurchaseInProjectRule.java new file mode 100644 index 0000000..6c1eae8 --- /dev/null +++ b/ic/src/private/nc/bs/ic/m45/insert/rule/PurchaseInProjectRule.java @@ -0,0 +1,77 @@ +package nc.bs.ic.m45.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.m45.entity.PurchaseInVO; +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 PurchaseInProjectRule + * @Description TODO + * @Version 1.0.0 + * @Date 2025/6/13 14:19 + * @Created by ame + */ +public class PurchaseInProjectRule extends ICRule { + private static BaseDAO dao=new BaseDAO(); + @Override + public void process(PurchaseInVO[] 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> remain = (List>) dao.executeQuery(sql.toString(), new MapListProcessor()); + if(remain==null || remain.isEmpty()){ + throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"】"); + } + for (Map 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); + } + } + +} diff --git a/ic/src/private/nc/bs/ic/m45/update/UpdateBP.java b/ic/src/private/nc/bs/ic/m45/update/UpdateBP.java new file mode 100644 index 0000000..b0fc71c --- /dev/null +++ b/ic/src/private/nc/bs/ic/m45/update/UpdateBP.java @@ -0,0 +1,153 @@ +package nc.bs.ic.m45.update; + +import nc.bs.ic.general.rule.after.AtpAfterUpdate; +import nc.bs.ic.general.rule.before.CtplcustomeridCheck; +import nc.bs.ic.general.update.IUpdateBP; +import nc.bs.ic.general.update.UpdateBPTemplate; +import nc.bs.ic.m45.base.BPPlugInPoint; +import nc.bs.ic.m45.base.rule.FillCostOrgRule; +import nc.bs.ic.m45.base.rule.PurchaseBillCheckRule; +import nc.bs.ic.m45.base.rule.PurchaseInAssetWarehouseCheck; +import nc.bs.ic.m45.base.rule.PurchaseInVOScaleCheckRule; +import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcess; +import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcessFor5805; +import nc.bs.ic.m45.base.rule.ReturnSnIsExistInEquipcardCheck; +import nc.bs.ic.m45.base.rule.VmiCheckRule; +import nc.bs.ic.m45.insert.rule.InsertCheckMaterialUnit; +import nc.bs.ic.m45.insert.rule.M45SaveAndRewriteCTPayPlan; +import nc.bs.ic.m45.insert.rule.PurchaseInProjectRule; +import nc.bs.ic.m45.update.rule.FeeDetailUpdate; +import nc.bs.ic.m45.update.rule.IsRedBookThroughUpdate; +import nc.bs.ic.m45.update.rule.UpdReWritePIM; +import nc.bs.ic.m45.update.rule.UpdateNumCheck; +import nc.bs.ic.m45.update.rule.UpdateRedReturnInRewriteRule; +import nc.bs.ic.m45.update.rule.UpdateRewriteITRule; +import nc.bs.ic.m45.update.rule.UpdateRewritePORule; +import nc.bs.ic.m45.update.rule.UpdateRewritePayPlanConfirmDataRule; +import nc.bs.ic.m45.update.rule.UpdateRewritePayPlanConfirmInvoicenumRule; +import nc.bs.ic.pub.base.ICCompareAroundProcesser; +import nc.bs.ic.pub.base.IUpdateRuleProvider; +import nc.bs.ic.pub.util.SagasUtils; +import nc.bs.scmpub.rule.VOSagaFrozenValidateRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.itf.ic.m45.compensate.IPurchaseInSagasCompensate; +import nc.vo.ic.general.define.SagasConst; +import nc.vo.ic.m45.entity.PurchaseInBodyVO; +import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.ic.pub.util.StringUtil; +import nc.vo.pub.VOStatus; +import nc.vo.scmpub.res.billtype.ICBillType; +import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobAfterPurchaseInUpdate; +import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobBeforePurchaseInUpdate; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * 采购入库单后台更新BP + * + * @author songhy + */ +public class UpdateBP implements IUpdateBP, IUpdateRuleProvider { + + @Override + public void addAfterRule(PurchaseInVO[] vos, PurchaseInVO[] originVOs, + CompareAroundProcesser processor) { + //红字采购入库修改单保存的时候,增加判断逻辑,如果表头仓库是直运仓,不检查物料的现存量 放在前面设置session + processor.addAfterRule(new IsRedBookThroughUpdate()); + + /** + * 放在现存量更新规则(OnhandAfterUpdate)之后,因为现存量更新时会调用预留接口,预留接口会回写采购订单, + * 如果入库数量=订单数量,订单会自动入库关闭,入库关闭会解除预留,导致后续操作错误 + */ + ((ICCompareAroundProcesser) processor).addAfterRuleAt(new UpdateRewritePORule(), + AtpAfterUpdate.class); + processor.addAfterRule(new UpdReWritePIM()); + processor.addAfterRule(new FeeDetailUpdate()); + // processor.addAfterRule(new UpdateRewritePORule()); + processor.addAfterRule(new UpdateRewriteITRule()); + // 2020年3月19日 补充微协同,增加采购入库单修改后消息 + processor.addAfterRule(new MobAfterPurchaseInUpdate()); + //红字采购入库单原单退回保存回写累计入库退回主数量,由于预留处理需要查询蓝字采购入库单,回写操作应放在现存量更新规则(OnhandAfterUpdate)之后 + ((ICCompareAroundProcesser) processor).addAfterRuleAt(new UpdateRedReturnInRewriteRule(), AtpAfterUpdate.class); + + // 入库单保存回写采购合同付款计划 + processor.addAfterRule(new M45SaveAndRewriteCTPayPlan()); + // 入库修改保存回写采购订单付款计划 add by yinliangc 20220219 + processor.addAfterRule(new UpdateRewritePayPlanConfirmDataRule()); + // 入库修改保存回写付款计划开票信息 + processor.addAfterRule(new UpdateRewritePayPlanConfirmInvoicenumRule()); + + } + + @Override + public void addBeforeRule(PurchaseInVO[] vos, PurchaseInVO[] originVOs, + CompareAroundProcesser processor) { + // sagas冻结校验 + processor.addBeforeRule(new VOSagaFrozenValidateRule(true)); + processor.addBeforeRule(new FillCostOrgRule()); + processor.addBeforeRule(new PurchaseBillCheckRule()); + processor.addBeforeRule(new PurchaseInAssetWarehouseCheck()); + processor.addBeforeRule(new CtplcustomeridCheck()); + processor.addBeforeRule(new VmiCheckRule()); + processor.addBeforeRule(new ReturnSnIsExistInEquipcardCheck()); + processor.addBeforeRule(new PurchaseinRetMarginProcess()); + processor.addBeforeRule(new PurchaseinRetMarginProcessFor5805()); + processor.addBeforeRule(new PurchaseInVOScaleCheckRule()); + // 利润中心校验规则 +// processor.addBeforeRule( +// new CheckCliabilityValue(MetaNameConst.CLIABILITYOID, MetaNameConst.CIOLIABILITYOID)); + processor.addBeforeRule(new InsertCheckMaterialUnit()); + processor.addBeforeRule(new MobBeforePurchaseInUpdate()); + //新加校验 出库跟踪入库场景 将采购入库单入库数量改小校验 + processor.addBeforeRule(new UpdateNumCheck()); + + //2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目,采购入库单保存时(包含接口导入)清除行项目,材料出库单保存时(包含接口导入)清除行项目 + processor.addBeforeRule(new PurchaseInProjectRule()); + + } + + /** + * 父类方法重写 + * + */ + @Override + public PurchaseInVO[] update(PurchaseInVO[] vos, PurchaseInVO[] originVOs) { + SagasUtils.frozenAndAddSaga(vos, ICBillType.PurchaseIn.getCode(), SagasConst.COMPENSABLE, null); + Map paramMap = new HashMap(); + paramMap.put(SagasConst.KEY_ACTIONNAME, SagasConst.UPDATE_45); + paramMap.put(SagasConst.KEY_VOS, SagasUtils.produceLightVO(vos, originVOs)); + SagasUtils.compensate(paramMap, IPurchaseInSagasCompensate.class); + this.fillCvendorid(vos); + UpdateBPTemplate updateBP = new UpdateBPTemplate(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> remain = (List>) dao.executeQuery(sql.toString(), new MapListProcessor()); + if(remain==null || remain.isEmpty()){ + throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"】"); + } + for (Map 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); + } + } + +} diff --git a/ic/src/private/nc/bs/ic/m4d/update/UpdateBP.java b/ic/src/private/nc/bs/ic/m4d/update/UpdateBP.java new file mode 100644 index 0000000..17af290 --- /dev/null +++ b/ic/src/private/nc/bs/ic/m4d/update/UpdateBP.java @@ -0,0 +1,122 @@ +package nc.bs.ic.m4d.update; + +import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue; +import nc.bs.ic.general.rule.after.AtpAfterUpdate; +import nc.bs.ic.general.rule.before.CtplcustomeridCheck; +import nc.bs.ic.general.update.IUpdateBP; +import nc.bs.ic.general.update.rule.after.RewriteQCUpdateRule; +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.MaterialOutProjectRule; +import nc.bs.ic.m4d.update.rule.ReWriteSOUpdateRule; +import nc.bs.ic.m4d.update.rule.UpdReWritePIM; +import nc.bs.ic.m4d.update.rule.UpdateRewriteMMDP; +import nc.bs.ic.pub.base.ICCompareAroundProcesser; +import nc.bs.ic.pub.base.IUpdateRuleProvider; +import nc.bs.scmpub.rule.CrossRuleValidateRule; +import nc.bs.scmpub.rule.VOSagaFrozenValidateRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +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:56:22 + */ +public class UpdateBP implements IUpdateBP, + IUpdateRuleProvider { + + @Override + public void addAfterRule(MaterialOutVO[] vos, MaterialOutVO[] originVOs, + CompareAroundProcesser processor) { + /* + * 放在现存量更新规则之后,因为回写销售订单,发货单时,如果出库数量等于订单数量, + * 订单自动行关闭,行关闭会执行预留解除,导致现存量更新时,处理预留业务产生错误 + */ + ((ICCompareAroundProcesser) processor).addAfterRuleAt( + new UpdRewriteWorkOrder(), AtpAfterUpdate.class); + // processor.addAfterRule(new UpdRewriteWorkOrder()); + + processor.addAfterRule(new UpdReWriteSapplyBillRule());// 回写出库申请单 + processor.addAfterRule(new UpdReWriteBuyingReqRule());// 回写物资需求申请 + + // 回写资产的领用单 + processor.addAfterRule(new UpdRewriteRM()); + // 回写紧急放行单 + processor.addAfterRule(new RewriteQCUpdateRule()); + + // 回写批次关联 + processor.addAfterRule(new UpdRewriteBacthJoin()); + + //回写发货单 + processor.addAfterRule(new ReWriteSOUpdateRule()); + + /* + * 放在现存量更新规则之后,因为回写销售订单,发货单时,如果出库数量等于订单数量, + * 订单自动行关闭,行关闭会执行预留解除,导致现存量更新时,处理预留业务产生错误 + */ + ((ICCompareAroundProcesser) processor).addAfterRuleAt( + new UpdRewriteMMPAC(), AtpAfterUpdate.class); + // 回写备料计划 + processor.addAfterRule(new UpdRewriteMMSFC()); + // 回写计划独立需求 + processor.addAfterRule(new UpdateRewriteMMDP()); + + // 回写项目管理备料表,放在回写出库申请之前,为了解决以下问题: + // 不能计算预占量的问题,根本原因是因为出库申请的行关闭状态导致。 + // 之前出库单先回写出库申请,再回写备料备料表,回写备料表时,项目管理要查询当前出库申请的行状态是否关闭,根据该状态计算预占量。 + // 这样就不能区分此状态是因为出库单保存回写的还是出库单保存前就是关闭的 + ((ICCompareAroundProcesser) processor).addAfterRuleAt( + new UpdReWritePIM(), UpdReWriteSapplyBillRule.class); + +// ((ICCompareAroundProcesser) processor).replaceAfterRuleAt( +// new UpdAfterEventRuleFor4D(), UpdateAfterEventRule.class); + + } + + @Override + public void addBeforeRule(MaterialOutVO[] vos, MaterialOutVO[] originVOs, + CompareAroundProcesser processor) { + + //saga状态校验,材料出库既要校验表头也要校验表体 + processor.addBeforeRule(new VOSagaFrozenValidateRule(true)); + processor.addBeforeRule(new CtplcustomeridCheck());//表体“货主客户”与“寄存供应商”不能同时存在 + processor.addBeforeRule(new MaterialOutValueProcRule()); + processor.addBeforeRule(new MaterialOutCheckRule()); + // 利润中心校验规则 + processor.addBeforeRule(new CheckCliabilityValue(MetaNameConst.CIOLIABILITYOID,MetaNameConst.CLIABILITYOID)); + processor.addBeforeRule(new MaterialOutWarehouseAttriCheck()); + + // 交叉校验规则 + processor.addBeforeRule(new CrossRuleValidateRule()); + // 材料出库参照采购入库业务日期校验 + processor.addBeforeRule(new PurchaseInDateCheck()); + +// ((ICCompareAroundProcesser) processor).replaceBeforeRuleAt( +// new UpdBeforeEventRuleFor4D(), UpdateBeforeEventRule.class); + + //2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目,采购入库单保存时(包含接口导入)清除行项目,材料出库单保存时(包含接口导入)清除行项目 + processor.addBeforeRule(new MaterialOutProjectRule()); + } + + @Override + public MaterialOutVO[] update(MaterialOutVO[] vos, MaterialOutVO[] originVOs) { + M4DUpdateBPTempate updateBP = + new M4DUpdateBPTempate(BPPlugInPoint.UpdateBP, this); + return updateBP.update(vos, originVOs); + } + +} diff --git a/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomInsertBP.java b/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomInsertBP.java new file mode 100644 index 0000000..fea1fab --- /dev/null +++ b/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomInsertBP.java @@ -0,0 +1,273 @@ +package nc.bs.bd.bom.bom0202.bp; + +import nc.bs.bd.bom.bom0202.plugin.bpplugin.BomPluginPoint; +import nc.bs.bd.bom.bom0202.rule.*; +import nc.bs.mmbd.pub.rule.MMAutoMaterialAssignRule; +import nc.bs.pubapp.pub.rule.FieldLengthCheckRule; +import nc.bs.pubapp.pub.rule.FillInsertDataRule; +import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule; +import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; +import nc.itf.org.IOrgConstBasic; +import nc.util.mmf.busi.rule.MMRowNoCheckRule; +import nc.util.mmf.framework.gc.GCInsertBPTemplate; +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.BomPosVO; +import nc.vo.bd.bom.bom0202.entity.BomReplVO; +import nc.vo.bd.bom.bom0202.entity.BomVO; +import nc.vo.bd.bom.bom0202.entity.BomWipVO; + +public class BomInsertBP { + /** + * 是否校验工程变更单是否启用 + */ + private boolean checkEcn = true; + + /** + * 是否支持审批流 + */ + private boolean isOnApprove; + + public boolean isOnApprove() { + return this.isOnApprove; + } + + public void setOnApprove(boolean isOnApprove) { + this.isOnApprove = isOnApprove; + } + + public AggBomVO[] insert(AggBomVO[] aggVO) { + return this.insert(aggVO, true); + } + + /** + * 跨组织复制时,原bom主键 + */ + private String[] origins = null; + + /** + * 带参数的BOM新增插入方法 + * + * @param aggVO + * @param newCheckEcn + * @return + */ + public AggBomVO[] insert(AggBomVO[] aggVO, boolean newCheckEcn) { + return this.insert(aggVO, newCheckEcn, null, false); + } + + /** + * 带参数的BOM新增插入方法 + * + * @param aggVO + * @param newCheckEcn + * @param orgins 跨组织复制原bom主键 + * @param param 无效参数,占位 + * @return + */ + public AggBomVO[] insert(AggBomVO[] aggVO, boolean newCheckEcn, String[] origins, boolean param) { + this.setCheckEcn(newCheckEcn); + if (origins != null) { + this.setOrigins(origins); + } + GCInsertBPTemplate bp = new GCInsertBPTemplate(BomPluginPoint.INSERT); + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser()); + AggBomVO[] returnvo = bp.insert(aggVO); + return returnvo; + } + + /** + * 带参的新增方法:是否支持ECN,是否支持审批流 + * + * @param aggVO + * @param isCheckEcn + * @param isOnApprove + * @return + */ + public AggBomVO[] insert(AggBomVO[] aggVO, boolean isCheckEcn, boolean isOnApprove) { + this.setCheckEcn(isCheckEcn); + this.setOnApprove(isOnApprove); + GCInsertBPTemplate bp = new GCInsertBPTemplate(BomPluginPoint.INSERT); + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser()); + AggBomVO[] returnvo = bp.insert(aggVO); + return returnvo; + } + + /** + * 新增前规则 + * + * @param processor + */ + @SuppressWarnings("unchecked") + private void addBeforeRule(AroundProcesser processer) { + // 补充默认值规则 + IRule rule = new FillInsertDataRule(); + processer.addBeforeRule(rule); + + // 组织停用校验 + rule = new OrgDisabledCheckRule(BomVO.PK_ORG, IOrgConstBasic.PRODUCEPLANTYPE); + processer.addBeforeRule(rule); + if (this.getCheckEcn()) { + // 是否启用工程变更校验 + rule = new ECNOrgEnableCheckRule(); + processer.addBeforeRule(rule); + } + + if (!this.getCheckEcn()) { + // 数据检查并设置默认值 + rule = new BomSaveDataCheckRule(); + processer.addBeforeRule(rule); + } else { + // 数据检查并设置默认值 + rule = new BomSaveDataCheckRule(this.getCheckEcn()); + processer.addBeforeRule(rule); + } + + // 行号检查 + rule = new MMRowNoCheckRule(); + processer.addBeforeRule(rule); + + // 物料信息检查 + rule = new BomMaterialCheckRule(); + processer.addBeforeRule(rule); + + // 长度检查 + rule = new FieldLengthCheckRule(); + processer.addBeforeRule(rule); + + // bom自定义项检查 + String[] prefixs = new String[] { "hvdef", "vdef", "vbdef", "vdef", "vdef", "vdef", "vdef" }; + Class[] voClasses = new Class[] { BomVO.class, BomItemVO.class, BomOutputsVO.class, BomActivityVO.class, + BomWipVO.class, BomPosVO.class, BomReplVO.class }; + rule = new nc.impl.pubapp.bd.userdef.UserDefSaveRule(prefixs, voClasses); + processer.addBeforeRule(rule); + + // 检查自由项 + rule = new MarAssistantSaveRule(); + processer.addBeforeRule(rule); + + // delete by qianzhx + // BOM在非审批通过态可以支持存在多个默认 20150425 + // BOM默认版本规则 + // rule = new BomDefaultVersionCheckRule(); + // processer.addBeforeRule(rule); + // edited by renshch 20150507 + // 定制BOM不支持审批流,最多一个默认,此规则已做调整,只对定制BOM处理 + //选配修改:这个规则仅处理定制BOM是否默认,定制BOM生成的时候已经处理过默认了,不需要再特殊校验,为了性能,先注释掉 + //rule = new BomDefaultVersionCheckRule(); + //processer.addBeforeRule(rule); + + // 默认卷积:在同一维度下只能有一个默认卷积(业务单元+物料+物料版本+bom类型) + ConvolutionRule ctRule = new ConvolutionRule(); + processer.addBeforeRule(ctRule); + + // 是否委外:在同一维度下只能有一个委外BOM(业务单元+物料+物料版本) + OutsourceRule osRule = new OutsourceRule(); + processer.addBeforeRule(osRule); + + // 子项物料启用序列号校验规则 + //此校验在BomSaveDataCheckRule里头已经校验,这里注释掉 + //rule = new SerialManageCheckRule(); + //processer.addBeforeRule(rule); + + // 定制/配置BOM材料页签的相关校验 + // 选配修改:去掉之前定制BOM关于特征码的校验,改到下面的rule里校验 + rule = new CfgBomAndCBomItemCheckRule(); + processer.addBeforeRule(rule); + + //选配修改:增加模型BOM/可选类BOM/定制BOM 设置状态和校验 + rule=new BomCheckForMatchRule(); + processer.addBeforeRule(rule); + + // 分配部分校验 + rule = new BomSaveAssignVersionCheckRule(); + processer.addBeforeRule(rule); + // 物料表头自动分配 + rule = new MMAutoMaterialAssignRule(new String[] { BomVO.HCMATERIALVID, BomVO.HCMATERIALID }, null, + null, new String[] { BomVO.PK_ORG }, null, null, BomVO.class, false); + processer.addBeforeFinalRule(rule); + // 表体材料物料自动分配 + rule = new MMAutoMaterialAssignRule(null, + new String[] { BomItemVO.CMATERIALVID, BomItemVO.CMATERIALID }, null, null, + new String[] { BomItemVO.PK_ORG }, null, BomItemVO.class, false); + processer.addBeforeFinalRule(rule); + // 表体联副产品物料自动分配 + rule = new MMAutoMaterialAssignRule(null, + new String[] { BomOutputsVO.CMATERIALVID, BomOutputsVO.CMATERIALID }, null, null, + new String[] { BomOutputsVO.PK_ORG }, null, BomOutputsVO.class, false); + processer.addBeforeFinalRule(rule); + // 孙表线上仓物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomWipVO.G_CMATERIALVID, null, +// new String[] { BomWipVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); +// // 孙表组装位置物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomPosVO.G_CMATERIALVID, null, +// new String[] { BomPosVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); +// // 孙表阶梯变动损耗物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomLossVO.CLMATERIALVID, null, +// new String[] { BomLossVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); + + // 孙表替代料物料表体自动分配 + rule = new MMAutoMaterialAssignRule(null, null, + new String[] { BomReplVO.CREPLMATERIALVID, BomReplVO.CREPLMATERIALOID }, null, null, + new String[] { BomReplVO.PK_ORG }, BomReplVO.class, false); + processer.addBeforeFinalRule(rule); + // 注册事件源 + rule = new BomAddBeforeEventRule(); + processer.addBeforeRule(rule); + + if (this.origins != null) { + // 替代方案-物料分配 + rule = new BomReplsMaterialAssignRule(this.origins); + processer.addBeforeRule(rule); + } + //2025年6月13日09点38分 -- BOM保存时校验各BOM子件本业务单元库存组织是否启用项目,如果启用,则项目专用料自动启用(包含接口导入) + rule =new BOMBprojectmaterialEnableRule(); + processer.addBeforeRule(rule); + } + + /** + * 新增后规则 + * + * @param processor + */ + private void addAfterRule(AroundProcesser processer) { + // BOM版本检查规则 + IRule rule = new BomVersionCheckRule(); + processer.addAfterRule(rule); + + // 注册事件源 + rule = new BomAddAfterEventRule(); + processer.addAfterRule(rule); + + } + + public void setCheckEcn(boolean checkEcn) { + this.checkEcn = checkEcn; + } + + public boolean getCheckEcn() { + return this.checkEcn; + } + + public String[] getOrigins() { + return origins; + } + + public void setOrigins(String[] origins) { + this.origins = origins; + } + +} diff --git a/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomUpdateBP.java b/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomUpdateBP.java new file mode 100644 index 0000000..1268ef0 --- /dev/null +++ b/uapbd/src/private/nc/bs/bd/bom/bom0202/bp/BomUpdateBP.java @@ -0,0 +1,399 @@ +package nc.bs.bd.bom.bom0202.bp; + +import nc.bs.bd.bom.bom0202.plugin.bpplugin.BomPluginPoint; +import nc.bs.bd.bom.bom0202.rule.*; +import nc.bs.mmbd.pub.rule.MMAutoMaterialAssignRule; +import nc.bs.pubapp.pub.rule.FieldLengthCheckRule; +import nc.bs.pubapp.pub.rule.FillUpdateDataRule; +import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule; +import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule; +import nc.impl.pubapp.pattern.rule.ICompareRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.itf.org.IOrgConstBasic; +import nc.mmbd.utils.factoryparam.MMBDFactoryParameter; +import nc.util.mmf.busi.rule.MMRowNoCheckRule; +import nc.util.mmf.framework.gc.GCUpdateBPTemplate; +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.BomPosVO; +import nc.vo.bd.bom.bom0202.entity.BomReplVO; +import nc.vo.bd.bom.bom0202.entity.BomVO; +import nc.vo.bd.bom.bom0202.entity.BomWipVO; +import nc.vo.pub.VOStatus; + +import java.util.Map; + +/** + * BOM更新BP + * + * @author baijl + */ +public class BomUpdateBP { + /** + * 是否校验工程变更单是否启用 + */ + private boolean checkEcn = true; + + public boolean getCheckEcn() { + return this.checkEcn; + } + + public void setCheckEcn(boolean checkEcn) { + this.checkEcn = checkEcn; + } + + /** + * 是否支持审批流 + */ + private boolean onApprove; + + public boolean getOnApprove() { + return this.onApprove; + } + + public void setOnApprove(boolean onApprove) { + this.onApprove = onApprove; + } + + /** + * 是否是bom或bom树修改保存,区分反向bom维护、bom子项批量修改等节点 + */ + private boolean isFromBomAndBomTree = false; + + private boolean isEcnOrgChanged = false; + + private boolean isAssign = false; + + private boolean isCancleAssign = false; + + /** + * 跨组织复制时,原bom主键 + */ + private String[] origins = null; + + private Map rownoMap = null; + + public Map getRownoMap() { + return rownoMap; + } + + public void setRownoMap(Map rownoMap) { + this.rownoMap = rownoMap; + } + public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills) { + return this.update(fullBills, originBills, true, false, false); + } + + public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn) { + return this.update(fullBills, originBills, newCheckEcn, false, false); + } + + public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean isFromBom, + boolean isEcnOrg) { + return this.update(fullBills, originBills, newCheckEcn, isFromBom, isEcnOrg, null, false); + } + + public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean isFromBom, + boolean isEcnOrg, String[] origins, Boolean param) { + this.setCheckEcn(newCheckEcn); + this.setFromBomAndBomTree(isFromBom); + this.setEcnOrgChanged(this.getIsOrgChanged(fullBills[0], isEcnOrg)); + if (origins != null) { + this.setOrigins(origins); + } + // 调用修改模板 + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(BomPluginPoint.UPDATE); + for (AggBomVO vo : fullBills) { + if (vo.getParent().getStatus() != VOStatus.UPDATED && !this.isAssign) { + vo.getParent().setStatus(VOStatus.UPDATED); + } + } + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser()); + return bp.update(fullBills, originBills); + } + + /** + * 带参的更新方法(是否支持ECN;是否支持审批流) + * + * @param fullBills + * @param originBills + * @param newCheckEcn + * @param onApprove + * @param isFromBom + * @param isEcnOrg + * @return + */ + public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean onapprove, + boolean isFromBom, boolean isEcnOrg) { + this.setCheckEcn(newCheckEcn); + this.setOnApprove(onapprove); + this.setFromBomAndBomTree(isFromBom); + this.setEcnOrgChanged(this.getIsOrgChanged(fullBills[0], isEcnOrg)); + // 调用修改模板 + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(BomPluginPoint.UPDATE); + for (AggBomVO vo : fullBills) { + if (vo.getParent().getStatus() != VOStatus.UPDATED && !this.isAssign) { + vo.getParent().setStatus(VOStatus.UPDATED); + } + } + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + // 执行后规则 + if (!this.isAssign && !this.isCancleAssign) { + this.addAfterRule(bp.getAroundProcesser()); + } + return bp.update(fullBills, originBills); + } + + /** + * 更新前规则 + * + * @param processer + */ + @SuppressWarnings("unchecked") + private void addBeforeRule(CompareAroundProcesser processer) { + IRule rule = null; + if (this.isAssign || this.isCancleAssign) { + // 分配校验 + if (this.isAssign) { + rule = new BomAssignCheckRule(); + processer.addBeforeRule(rule); + + // 分配组织vid + rule = new BomAssgnUseorgRule(); + processer.addBeforeRule(rule); + } + if (this.isCancleAssign) { + // 分配部分校验 + rule = new BomCancelAssignCheckRule(); + processer.addBeforeRule(rule); + } + } else { + + // 组织停用校验 + rule = new OrgDisabledCheckRule(BomVO.PK_ORG, IOrgConstBasic.PRODUCEPLANTYPE); + processer.addBeforeRule(rule); + + if (this.getIsFromBomAndBomTree()) { + // 判断组织启用工程变更的状态前后是否一致,不一致不能修改 + if (this.getIsEcnOrgChanged()) { + rule = new ECNOrgChangedRule(); + processer.addBeforeRule(rule); + } + } else { + if (this.getCheckEcn()) { + // 如果启用工程的话,不能修改保存bom(适用于批改、反向bom维护、bom子项批量替换场景) + rule = new ECNCheckForModifyBomRule(); + processer.addBeforeRule(rule); + } + } + + if (this.getCheckEcn()) { + // 数据检查 + BomSaveDataCheckRule saveDataCheckRule = new BomSaveDataCheckRule(); + saveDataCheckRule.setRownoMap(this.getRownoMap()); + processer.addBeforeRule(saveDataCheckRule); + } else { + // 数据检查 + BomSaveDataCheckRule saveDataCheckRule = new BomSaveDataCheckRule(!this.getCheckEcn()); + saveDataCheckRule.setRownoMap(this.getRownoMap()); + processer.addBeforeRule(saveDataCheckRule); + } + // 行号检查 + rule = new MMRowNoCheckRule(); + processer.addBeforeRule(rule); + + // 物料信息检查 + rule = new BomMaterialCheckRule(); + processer.addBeforeRule(rule); + + // 保存时分配信息校验 + rule = new BomSaveAssignVersionCheckRule(); + processer.addBeforeRule(rule); + + // 长度检查 + rule = new FieldLengthCheckRule(); + processer.addBeforeRule(rule); + + // if (this.getOnApprove()) { + // // 设置审计信息 + // rule = new FillUpdateDataRule(); + // processer.addBeforeRule(rule); + // } 注掉 因为定制BOM修改保存时最后修改人修改时间信息会写不进去 + // 设置审计信息 + rule = new FillUpdateDataRule(); + processer.addBeforeRule(rule); + + // 检查自由项 + rule = new MarAssistantSaveRule(); + processer.addBeforeRule(rule); + + // 检查自定义项 + String[] prefixs = new String[] { "hvdef", "vdef", "vbdef", "vdef", "vdef", "vdef", "vdef" }; + Class[] voClasses = new Class[] { BomVO.class, BomItemVO.class, BomOutputsVO.class, + BomActivityVO.class, BomWipVO.class, BomPosVO.class, BomReplVO.class }; + rule = new nc.impl.pubapp.bd.userdef.UserDefSaveRule(prefixs, voClasses); + processer.addBeforeRule(rule); + + // delete by qianzhx + // BOM在非审批通过态可以支持存在多个默认 20150425 + // BOM默认版本规则 + // rule = new BomDefaultVersionCheckRule(); + // processer.addBeforeRule(rule); + // edited by renshch 20150507 + // 定制BOM不支持审批流,最多一个默认,此规则已做调整,只对定制BOM处理 + rule = new BomDefaultVersionCheckRule(); + processer.addBeforeRule(rule); + + //选配修改:增加模型BOM/可选类BOM/定制BOM 校验 + rule=new BomCheckForMatchRule(); + processer.addBeforeRule(rule); + + // 默认卷积:在同一维度下只能有一个默认卷积(业务单元+物料+物料版本+bom类型) + ConvolutionRule ctRule = new ConvolutionRule(); + processer.addBeforeRule(ctRule); + + // 是否委外:在同一维度下只能有一个委外BOM(业务单元+物料+物料版本) + OutsourceRule osRule = new OutsourceRule(); + processer.addBeforeRule(osRule); + + // 子项物料启用序列号校验规则 + rule = new SerialManageCheckRule(); + processer.addBeforeRule(rule); + + // 配置BOM 材料页签的相关校验 + // 选配修改:去掉之前定制BOM关于特征码的校验,改到下面的rule里校验 + rule = new CfgBomAndCBomItemCheckRule(); + processer.addBeforeRule(rule); + + // 注册事件源 + rule = new BomUpdateBeforeEventRule(); + processer.addBeforeRule(rule); + + // 被替代方案引用的子项不能修改 + ICompareRule compareRule = new UpdateHasReplsCheckRule(); + processer.addBeforeRule(compareRule); + + } + // 物料表头自动分配 + rule = new MMAutoMaterialAssignRule(new String[] { BomVO.HCMATERIALVID, BomVO.HCMATERIALID }, null, + null, new String[] { BomVO.PK_ORG }, null, null, BomVO.class, this.isAssign); + processer.addBeforeFinalRule(rule); + // 表体材料物料自动分配 + rule = new MMAutoMaterialAssignRule(null, + new String[] { BomItemVO.CMATERIALVID, BomItemVO.CMATERIALID }, null, null, + new String[] { BomItemVO.PK_ORG }, null, BomItemVO.class, this.isAssign); + processer.addBeforeFinalRule(rule); + // 表体联副产品物料自动分配 + rule = new MMAutoMaterialAssignRule(null, + new String[] { BomOutputsVO.CMATERIALVID, BomOutputsVO.CMATERIALID }, null, null, + new String[] { BomOutputsVO.PK_ORG }, null, BomOutputsVO.class, this.isAssign); + processer.addBeforeFinalRule(rule); + // 孙表线上仓物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomWipVO.G_CMATERIALVID, null, +// new String[] { BomWipVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); +// // 孙表组装位置物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomPosVO.G_CMATERIALVID, null, +// new String[] { BomPosVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); +// // 孙表阶梯变动损耗物料表体自动分配 +// rule = new MMAutoMaterialAssignRule(null, BomLossVO.CLMATERIALVID, null, +// new String[] { BomLossVO.PK_ORG }); +// processer.addBeforeFinalRule(rule); + + // 孙表替代料物料表体自动分配 + rule = new MMAutoMaterialAssignRule(null, null, + new String[] { BomReplVO.CREPLMATERIALVID, BomReplVO.CREPLMATERIALOID }, null, null, + new String[] { BomReplVO.PK_ORG }, BomReplVO.class, this.isAssign); + processer.addBeforeFinalRule(rule); + + if (this.origins != null) { + // 替代方案-物料分配 + rule = new BomReplsMaterialAssignRule(this.origins); + processer.addBeforeRule(rule); + } + + //2025年6月13日09点38分 -- BOM保存时校验各BOM子件本业务单元库存组织是否启用项目,如果启用,则项目专用料自动启用(包含接口导入) + rule =new BOMBprojectmaterialEnableRule(); + processer.addBeforeRule(rule); + } + + /** + * 更新后规则 + * + * @param processer + */ + + private void addAfterRule(CompareAroundProcesser processer) { + // BOM版本检查规则 + IRule rule = new BomVersionCheckRule(); + processer.addAfterRule(rule); + + // 同步BOM匹配规则中的BOM版本 add by lijbe + ICompareRule updateBmrtRule = new BomUpdateBmrtVersionRule(); + processer.addBeforeRule(updateBmrtRule); + + // 注册事件源 + IRule eventRrule = new BomUpdateAfterEventRule(); + processer.addAfterRule(eventRrule); + + } + + public boolean getIsFromBomAndBomTree() { + return this.isFromBomAndBomTree; + } + + public void setFromBomAndBomTree(boolean isFromBomAndBomTree) { + this.isFromBomAndBomTree = isFromBomAndBomTree; + } + + public boolean getIsEcnOrgChanged() { + return false; + } + + public void setEcnOrgChanged(boolean isEcnOrgChanged) { + this.isEcnOrgChanged = isEcnOrgChanged; + } + + public boolean getIsOrgChanged(AggBomVO aggvo, boolean isEcn_old) { + BomVO bomvo = (BomVO) aggvo.getParentVO(); + boolean isEcn_new = MMBDFactoryParameter.isAlterCtrl(bomvo.getPk_org()); + if (isEcn_new != isEcn_old) { + // 前后不一致则赋值 + return true; + } + return false; + } + + public boolean isAssign() { + return this.isAssign; + } + + public void setAssign(boolean isAssign) { + this.isAssign = isAssign; + } + + public boolean isCancleAssign() { + return this.isCancleAssign; + } + + public void setCancleAssign(boolean isCancleAssign) { + this.isCancleAssign = isCancleAssign; + } + + public String[] getOrigins() { + return origins; + } + + public void setOrigins(String[] origins) { + this.origins = origins; + } + +} diff --git a/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BOMBprojectmaterialEnableRule.java b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BOMBprojectmaterialEnableRule.java new file mode 100644 index 0000000..2c7cf25 --- /dev/null +++ b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BOMBprojectmaterialEnableRule.java @@ -0,0 +1,84 @@ +package nc.bs.bd.bom.bom0202.rule; + +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.bom.bom0202.entity.AggBomVO; +import nc.vo.bd.bom.bom0202.entity.BomItemVO; +import nc.vo.org.OrgVO; +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 BOMBprojectmaterialEnableRule + * @Description TODO + * @Version 1.0.0 + * @Date 2025/6/13 9:43 + * @Created by ame + */ +public class BOMBprojectmaterialEnableRule implements IRule { + private static BaseDAO dao = new BaseDAO(); + + @Override + public void process(AggBomVO[] vos) { + if (!MMValueCheck.isEmpty(vos)) { + try { + //获取表头计划组织及表体行物料 + for (AggBomVO vo : vos) { + String pk_org = (String) vo.getParentVO().getAttributeValue("pk_org"); + BomItemVO[] childrenVOs = vo.getChildrenVO(); + Map material_construct = new HashMap<>(); + Map material_stock = new HashMap<>(); + queryFix2ByMaterial(childrenVOs,material_construct,material_stock,pk_org); + for(BomItemVO bomItemVO:childrenVOs){ + String cmaterialvid = bomItemVO.getCmaterialvid(); + if(material_construct.containsKey(cmaterialvid)&& "Y".equals(material_construct.get(cmaterialvid))&& material_stock.containsKey(cmaterialvid)&& "Y".equals(material_stock.get(cmaterialvid))){ + bomItemVO.setBprojectmaterial(UFBoolean.TRUE); + } + } + } + } catch (BusinessException var6) { + ExceptionUtils.wrappException(var6); + } + } + } + + + + private void queryFix2ByMaterial(BomItemVO[] childrenVOs, Map materialConstruct, Map materialStock, String pkOrg) throws BusinessException { + List materials=new ArrayList<>(); + + for (BomItemVO 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> remain = (List>) dao.executeQuery(sql.toString(), new MapListProcessor()); + if(remain==null || remain.isEmpty()){ + throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"】"); + } + for (Map 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); + } + } + +} From e785338212ff7468a12da093136c2986b6a97fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Mon, 16 Jun 2025 16:48:36 +0800 Subject: [PATCH 2/9] =?UTF-8?q?patch=5Fdev=5Fmmpsc=5F=E5=8D=8A=E6=88=90?= =?UTF-8?q?=E5=93=81=E6=94=B6=E8=B4=A7=E5=8D=95=E5=AE=A1=E6=89=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=8A=A0=E5=B7=A5=E8=B4=B9=5Fsdlizheng=5F20250616=5F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0mmpsc=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 5 + mmpsc/src/client/.gitkeep | 0 mmpsc/src/private/.gitkeep | 0 .../pscrecive/bp/PscreciveApproveBP.java | 75 +++++++++ .../pscrecive/bp/PscreciveAutoApproveBP.java | 144 ++++++++++++++++++ .../bs/mmpsc/pscrecive/rule/Push55E6Rule.java | 126 +++++++++++++++ mmpsc/src/public/.gitkeep | 0 mmpsc/src/test/.gitkeep | 0 8 files changed, 350 insertions(+) create mode 100644 mmpsc/src/client/.gitkeep create mode 100644 mmpsc/src/private/.gitkeep create mode 100644 mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveApproveBP.java create mode 100644 mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveAutoApproveBP.java create mode 100644 mmpsc/src/private/nc/bs/mmpsc/pscrecive/rule/Push55E6Rule.java create mode 100644 mmpsc/src/public/.gitkeep create mode 100644 mmpsc/src/test/.gitkeep diff --git a/.classpath b/.classpath index 2a23253..48135db 100644 --- a/.classpath +++ b/.classpath @@ -100,6 +100,11 @@ + + + + + diff --git a/mmpsc/src/client/.gitkeep b/mmpsc/src/client/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/mmpsc/src/private/.gitkeep b/mmpsc/src/private/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveApproveBP.java b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveApproveBP.java new file mode 100644 index 0000000..312ee09 --- /dev/null +++ b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveApproveBP.java @@ -0,0 +1,75 @@ +package nc.bs.mmpsc.pscrecive.bp; + +import nc.bs.mmpsc.pscrecive.plugin.bpplugin.PscrecivePluginPoint; +import nc.bs.mmpsc.pscrecive.rule.*; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.util.mmf.framework.gc.GCUpdateBPTemplate; +import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO; + +/** + * 单据审核的BP + * + * @since 6.0 + * @version 2014-01-27 15:02:41 + * @author computer + */ +public class PscreciveApproveBP { + /** + * 单据的持久化 + * + * @param clientBills 单据VO + * @param originBills 原始单据VO + * @return 保存后的单据VO + */ + public AggPscreciveVO[] approve(AggPscreciveVO[] clientBills, AggPscreciveVO[] originBills) { + // 调用修改模板 + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(PscrecivePluginPoint.APPROVE); + + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser(), originBills); + + return bp.update(clientBills, originBills); + } + + /** + * @param processer + * @param originBills + */ + private void addAfterRule(CompareAroundProcesser processer, AggPscreciveVO[] originBills) { + // 自动业务关闭工序委外订单 + IRule closerule = new CloseOrderRule(); + processer.addAfterRule(closerule); + //添加审批推送加工费结算单逻辑 + IRule pushrule = new Push55E6Rule(); + processer.addAfterFinalRule(pushrule); + } + + /** + * @param processer + */ + private void addBeforeRule(CompareAroundProcesser processer) { + // 校验冻结状态 added by zhanghr + IRule checkFrozenRule = new MMVOSagaFrozenValidateRule(true); + processer.addBeforeRule(checkFrozenRule); + // 检查状态 + IRule irule = new ApproveBillStatusRule(); + processer.addBeforeRule(irule); + // 工序委外订单状态检查规则 + IRule orderCheckRule = new CheckPscOrderStatusRule(); + processer.addBeforeRule(orderCheckRule); + // 补充核销状态 + IRule vrule = new ApproveVerifyStatusRule(); + processer.addBeforeRule(vrule); + // 修改审核信息 + IRule frule = new FillApprovePsnRule(); + processer.addBeforeRule(frule); + // 更新审核状态 + IRule updaterule = new ApproveStatusUpdateRule(); + processer.addBeforeRule(updaterule); + } +} diff --git a/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveAutoApproveBP.java b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveAutoApproveBP.java new file mode 100644 index 0000000..614dcd9 --- /dev/null +++ b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/bp/PscreciveAutoApproveBP.java @@ -0,0 +1,144 @@ +package nc.bs.mmpsc.pscrecive.bp; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import nc.bs.mmpsc.pscrecive.plugin.bpplugin.PscrecivePluginPoint; +import nc.bs.mmpsc.pscrecive.rule.*; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.util.mmf.framework.base.MMArrayUtil; +import nc.util.mmf.framework.base.MMVOUtil; +import nc.util.mmf.framework.gc.GCUpdateBPTemplate; +import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO; +import nc.vo.mmpsc.pscrecive.entity.PscReciveTransTypeVO; +import nc.vo.mmpsc.pscrecive.util.QueryUtil; +import nc.vo.mmpsc.pscrecive.util.VOChangUtil; + +/** + * 收货单自动审核的BP + * + * @since 6.0 + * @version 2014-01-27 15:02:41 + * @author computer + */ +public class PscreciveAutoApproveBP { + /** + * 单据的持久化 + * + * @param clientBills 单据VO + * @param originBills 原始单据VO + * @return 保存后的单据VO + */ + public AggPscreciveVO[] approve(AggPscreciveVO[] clientBills) { + AggPscreciveVO[] approveVOs = this.filterAutoApprove(clientBills); + if (MMArrayUtil.isEmpty(approveVOs)) { + return clientBills; + } + AggPscreciveVO[] originBills = VOChangUtil.clone(approveVOs); + // 调用修改模板 + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(PscrecivePluginPoint.APPROVE); + + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser(), originBills); + + AggPscreciveVO[] returnBills = bp.update(clientBills, originBills); + return new QueryUtil().queryAfterUpdate(returnBills); + } + + /** + * @param processer + * @param originBills + */ + private void addAfterRule(CompareAroundProcesser processer, AggPscreciveVO[] originBills) { + //暂时没有规则 + //添加审批推送加工费结算单逻辑 + IRule pushrule = new Push55E6Rule(); + processer.addAfterFinalRule(pushrule); + } + + /** + * @param processer + */ + private void addBeforeRule(CompareAroundProcesser processer) { + // 校验冻结状态 added by zhanghr + IRule checkFrozenRule = new MMVOSagaFrozenValidateRule(true); + processer.addBeforeRule(checkFrozenRule); + // 检查状态 + IRule irule = new ApproveBillStatusRule(); + processer.addBeforeRule(irule); + // 补充核销状态 + IRule vrule = new ApproveVerifyStatusRule(); + processer.addBeforeRule(vrule); + // 修改审核信息 + IRule frule = new FillApprovePsnRule(); + processer.addBeforeRule(frule); + // 更新审核状态 + IRule updaterule = new ApproveStatusUpdateRule(); + processer.addBeforeRule(updaterule); + // 自动业务关闭工序委外订单 + IRule closerule = new CloseOrderRule(); + processer.addBeforeRule(closerule); + } + + /** + * 过滤出需要自动审核 + * + * @param nowBills + * @return + */ + private AggPscreciveVO[] filterAutoApprove(AggPscreciveVO[] nowBills) { + if (nowBills == null || nowBills.length == 0) { + return null; + } + List typeid = new ArrayList(); + for (AggPscreciveVO bill : nowBills) { + typeid.add(bill.getHeadVO().getCtrantype()); + } + // 查询哪些交易类型需要自动审核 + Map autoMap = this.isAutoApprove(typeid.toArray(new String[0])); + // 过滤 + List reList = new ArrayList(); + for (AggPscreciveVO bill : nowBills) { + Boolean is = autoMap.get(bill.getHeadVO().getCtrantype()); + if (is != null && is.booleanValue()) { + reList.add(bill); + } + } + if (reList.size() > 0) { + return reList.toArray(new AggPscreciveVO[0]); + } + return null; + } + + /** + * 是否自动审核 + * + * @param ids + * @return + */ + private Map isAutoApprove(String[] ids) { + // 查询 + PscReciveTransTypeVO[] types = MMVOUtil.query(PscReciveTransTypeVO.class, PscReciveTransTypeVO.CTRANTYPEID, ids); + Map map = new HashMap(); + if (MMArrayUtil.isEmpty(types)) { + return map; + } + // 构造结果 + for (PscReciveTransTypeVO type : types) { + if (type.getBautoapprove() != null && type.getBautoapprove().booleanValue()) { + map.put(type.getCtrantypeid(), Boolean.TRUE); + } + else { + map.put(type.getCtrantypeid(), Boolean.FALSE); + } + } + return map; + } +} diff --git a/mmpsc/src/private/nc/bs/mmpsc/pscrecive/rule/Push55E6Rule.java b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/rule/Push55E6Rule.java new file mode 100644 index 0000000..bacab7a --- /dev/null +++ b/mmpsc/src/private/nc/bs/mmpsc/pscrecive/rule/Push55E6Rule.java @@ -0,0 +1,126 @@ +package nc.bs.mmpsc.pscrecive.rule; + +import nc.bs.framework.common.NCLocator; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.itf.mmpsc.pscsettle.ISettleMaintain; +import nc.itf.uap.pf.IPfExchangeService; +import nc.util.mmf.framework.base.MMArrayUtil; +import nc.util.mmf.framework.base.MMNumberUtil; +import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO; +import nc.vo.mmpsc.pscrecive.entity.PscreciveItemVO; +import nc.vo.mmpsc.pscrecive.entity.PscreciveQcVO; +import nc.vo.mmpsc.pscrecive.enumeration.PscReciveProcessMethodEnum; +import nc.vo.mmpsc.pscrecive.enumeration.PscReciveStatusEnum; +import nc.vo.mmpsc.pscsettle.entity.AggSettleVO; +import nc.vo.mmpsc.pscsettle.entity.SettleHeadVO; +import nc.vo.mmpsc.pscsettle.entity.SettleItemVO; +import nc.vo.pub.compiler.PfParameterVO; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Classname Push55E6Rule + * @Description TODO + * @Version 1.0.0 + * @Date 2025/6/16 14:40 + * @Created by ame + */ +public class Push55E6Rule implements IRule { + + @Override + public void process(AggPscreciveVO[] aggvos) { + if(aggvos==null || aggvos.length<1){ + return; + } + ISettleMaintain service = NCLocator.getInstance().lookup(ISettleMaintain.class); + try { + AggPscreciveVO[] newAggvos = this.fiterData(aggvos); + if(newAggvos!=null && newAggvos.length>0){ + IPfExchangeService ef = NCLocator.getInstance().lookup(IPfExchangeService.class); + AggSettleVO[] aggSettleVOs = (AggSettleVO[])ef.runChangeDataAryNeedClassify("55E5", "55E6", newAggvos, (PfParameterVO)null, 1); + if (aggSettleVOs != null && aggSettleVOs.length > 0) { + this.fillData(aggSettleVOs); + service.insertSettle(aggSettleVOs); + } + } + } catch (Exception e) { + ExceptionUtils.wrappBusinessException(e.getMessage()); + } + } + + private void fillData(AggSettleVO[] aggSettleVOs) { + for (AggSettleVO aggSettleVO : aggSettleVOs) { + SettleHeadVO headVO = aggSettleVO.getHeadVO(); + SettleItemVO[] itemVO = aggSettleVO.getItemVO(); + headVO.setStatus(2); + headVO.setFstatusflag(1); + //itemVO的vrowno根据序号设置值:i*10 + for (int i = 0; i < itemVO.length; i++) { + itemVO[i].setStatus(2); + itemVO[i].setVrowno(String.valueOf((i+1) * 10)); + } + } + } + + private AggPscreciveVO[] fiterData(AggPscreciveVO[] aggPscreciveVOs) { + AggPscreciveVO[] statusvos = this.fiterDataStatus(aggPscreciveVOs); + AggPscreciveVO[] qcvos = this.fiterDataQc(statusvos); + return qcvos; + } + + private AggPscreciveVO[] fiterDataStatus(AggPscreciveVO[] vos) { + List aggPscreciveVOs = new ArrayList(); + for (AggPscreciveVO aggPscreciveVO : vos) { + if (PscReciveStatusEnum.APPROVED.equalsValue(aggPscreciveVO.getHeadVO().getFstatusflag())) { + aggPscreciveVOs.add(aggPscreciveVO); + } + } + return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]); + } + + private AggPscreciveVO[] fiterDataQc(AggPscreciveVO[] vos) { + if (MMArrayUtil.isEmpty(vos)) { + return null; + } + List aggPscreciveVOs = new ArrayList(); + for (AggPscreciveVO aggPscreciveVO : vos) { + List pscreciveItemVOs = new ArrayList(); + for (PscreciveItemVO pscreciveItemVO : aggPscreciveVO.getItemVO()) { + PscreciveQcVO[] pscreciveQcVOs = pscreciveItemVO.getCpscrecive_qcid(); + if (MMArrayUtil.isNotEmpty(pscreciveQcVOs)) { + UFDouble sumNum = UFDouble.ZERO_DBL; + UFDouble sumAstNum = UFDouble.ZERO_DBL; + for (PscreciveQcVO pscreciveQcVO : pscreciveQcVOs) { + if (PscReciveProcessMethodEnum.PRODIN.equalsValue(pscreciveQcVO.getFqprocessmethod()) + || PscReciveProcessMethodEnum.MATERREJECT + .equalsValue(pscreciveQcVO.getFqprocessmethod()) + || PscReciveProcessMethodEnum.REWORK.equalsValue(pscreciveQcVO.getFqprocessmethod())) { + sumNum = MMNumberUtil.add(sumNum, pscreciveQcVO.getNqnum()); + sumAstNum = MMNumberUtil.add(sumAstNum, pscreciveQcVO.getNqastnum()); + } + } + if (MMNumberUtil.isGtZero(sumNum) && MMNumberUtil.isGtZero(sumAstNum)) { + pscreciveItemVO.setProcessastnum(sumAstNum); + pscreciveItemVO.setProcessnum(sumNum); + pscreciveItemVOs.add(pscreciveItemVO); + } + } else if (aggPscreciveVO.getHeadVO().getBreturn() != null + && aggPscreciveVO.getHeadVO().getBreturn().booleanValue()) { + pscreciveItemVO.setProcessastnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbastrecivenum())); + pscreciveItemVO.setProcessnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbrecivenum())); + pscreciveItemVOs.add(pscreciveItemVO); + } + } + if (pscreciveItemVOs.size() > 0) { + aggPscreciveVO.setChildrenVO(pscreciveItemVOs.toArray(new PscreciveItemVO[0])); + aggPscreciveVOs.add(aggPscreciveVO); + } + } + return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]); + } + + +} diff --git a/mmpsc/src/public/.gitkeep b/mmpsc/src/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/mmpsc/src/test/.gitkeep b/mmpsc/src/test/.gitkeep new file mode 100644 index 0000000..e69de29 From d6ba2ca7b554fac3efd27ac335b96632cd6a40e9 Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 16 Jun 2025 18:14:12 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=BC=80=E7=A5=A8=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=BC=A0=E7=A8=8E=E5=8A=A1=E4=BA=91=E5=A2=9E=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=9A=E6=95=B0=E7=94=B5=E5=8F=91=E7=A5=A8=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=98=BE=E7=A4=BA=E8=B4=AD=E9=94=80=E6=96=B9=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E7=94=B5=E8=AF=9D=E3=80=81=E6=95=B0=E7=94=B5=E5=8F=91?= =?UTF-8?q?=E7=A5=A8=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA=E8=B4=AD=E9=94=80?= =?UTF-8?q?=E6=96=B9=E9=93=B6=E8=A1=8C=E3=80=81=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ivsale/util/InvoiceTransferUtil.java | 511 +++++++++--------- 1 file changed, 264 insertions(+), 247 deletions(-) diff --git a/sscivm/src/public/nc/bs/sscivm/ivsale/util/InvoiceTransferUtil.java b/sscivm/src/public/nc/bs/sscivm/ivsale/util/InvoiceTransferUtil.java index 10b0c37..7cf39e3 100644 --- a/sscivm/src/public/nc/bs/sscivm/ivsale/util/InvoiceTransferUtil.java +++ b/sscivm/src/public/nc/bs/sscivm/ivsale/util/InvoiceTransferUtil.java @@ -12,11 +12,7 @@ import nc.bs.sscivm.ivsale.splitmerge.util.TransSpiltMergePksUtil; import nc.bs.sscivm.logger.SSCIVMLogger; import nc.dto.imag.boot.RequestInfo; import nc.dto.imag.boot.ResponseInfo; -import nc.dto.imag.invoice.PInvoice; -import nc.dto.imag.invoice.PInvoiceCepz; -import nc.dto.imag.invoice.PInvoiceDetail; -import nc.dto.imag.invoice.PInvoiceSDetail; -import nc.dto.imag.invoice.PInvoiceTspz; +import nc.dto.imag.invoice.*; import nc.dto.imag.invoice.tax.InvalidCommonRequest; import nc.dto.imag.invoice.tax.InvalidCommonResponse; import nc.dto.imag.invoice.tax.TaxCommonResponse; @@ -39,27 +35,9 @@ import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDate; import nc.vo.pub.lang.UFDateTime; import nc.vo.pub.lang.UFDouble; -import nc.vo.sscivm.invoice.IVMInvoiceAggVO; -import nc.vo.sscivm.invoice.IVMInvoiceConstant; -import nc.vo.sscivm.invoice.IVMInvoiceDetailVO; -import nc.vo.sscivm.invoice.IVMInvoiceHeadVO; -import nc.vo.sscivm.invoice.IVMInvoiceRelationVO; -import nc.vo.sscivm.invoice.IVMInvoiceTspzDetailVO; -import nc.vo.sscivm.ivmpub.ClassTypeEnum; -import nc.vo.sscivm.ivmpub.IVAplocationFPXZ; -import nc.vo.sscivm.ivmpub.IVAplocationKPFS; -import nc.vo.sscivm.ivmpub.IVAplocationLSLBS; -import nc.vo.sscivm.ivmpub.IVAplocationZSFS; -import nc.vo.sscivm.ivmpub.InvoiceStatus; -import nc.vo.sscivm.ivmpub.InvoiceTypeEnum; -import nc.vo.sscivm.ivmpub.IsHzfp; -import nc.vo.sscivm.ivmpub.KpztEnum; -import nc.vo.sscivm.ivsale.IVApplicationAggVO; -import nc.vo.sscivm.ivsale.IVApplicationBodyVO; -import nc.vo.sscivm.ivsale.IVApplicationHeadVO; -import nc.vo.sscivm.ivsale.IVApplicationRelationVO; -import nc.vo.sscivm.ivsale.IVApplogVO; -import nc.vo.sscivm.ivsale.IVTspzsBodyVO; +import nc.vo.sscivm.invoice.*; +import nc.vo.sscivm.ivmpub.*; +import nc.vo.sscivm.ivsale.*; import nc.vo.trade.pub.IBillStatus; import nccloud.commons.lang.StringUtils; import nccloud.itf.sscivm.ivsale.service.ApplicationLogService; @@ -68,17 +46,7 @@ import nccloud.putitf.riart.billtype.IBilltypeService; import java.math.BigDecimal; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class InvoiceTransferUtil { @@ -107,8 +75,8 @@ public class InvoiceTransferUtil { List invoices = new ArrayList(); for (IVApplicationAggVO vo : vos) { - applyRequest.addEmail(vo.getParentVO().getPk_ivapplication(), null, null, new String[] {vo.getParentVO().getEmail()}); - applyRequest.addSMS(vo.getParentVO().getPk_ivapplication(), null, null, new String[] {vo.getParentVO().getSms()}); + applyRequest.addEmail(vo.getParentVO().getPk_ivapplication(), null, null, new String[]{vo.getParentVO().getEmail()}); + applyRequest.addSMS(vo.getParentVO().getPk_ivapplication(), null, null, new String[]{vo.getParentVO().getSms()}); requet.setPk_org(vo.getParentVO().getPk_org()); PInvoice invoice = getPInvoiceByApplyHead(vo.getParentVO()); @@ -116,7 +84,7 @@ public class InvoiceTransferUtil { List details = new ArrayList(); for (IVApplicationBodyVO detailvo : vo.getBodyVOs()) { - if(detailvo.getCaninvoice_xmjshj().compareTo(UFDouble.ZERO_DBL)==0){ + if (detailvo.getCaninvoice_xmjshj().compareTo(UFDouble.ZERO_DBL) == 0) { continue; } PInvoiceDetail detail = getPInvoiceByApplyHead(vo.getParentVO(), detailvo); @@ -127,9 +95,9 @@ public class InvoiceTransferUtil { invoice.setItems(details.toArray(new PInvoiceDetail[0])); - //数电票特殊票种 + // 数电票特殊票种 IVTspzsBodyVO[] tspzVOs = vo.getIvTspzsBodyVO(); - if (tspzVOs != null && tspzVOs.length > 0){ + if (tspzVOs != null && tspzVOs.length > 0) { invoice = getPInvoiceByApplyTspz(tspzVOs, invoice); } invoices.add(invoice); @@ -165,8 +133,8 @@ public class InvoiceTransferUtil { + " = '" + logvo.getFphm() + "' ) " + " and (" + IVApplogVO.KPZT + " =" + KpztEnum.ZFING + " or " + IVApplogVO.KPZT + " =" + KpztEnum.ZFERR + " )" + " and " + IVApplogVO.ISSYNC + " ='Y' "; - if (logvo.getFpdm() == null){ - condition = " ( " + IVMInvoiceHeadVO.FPHM + if (logvo.getFpdm() == null) { + condition = " ( " + IVMInvoiceHeadVO.FPHM + " = '" + logvo.getFphm() + "' ) " + " and (" + IVApplogVO.KPZT + " =" + KpztEnum.ZFING + " or " + IVApplogVO.KPZT + " =" + KpztEnum.ZFERR + " )" + " and " + IVApplogVO.ISSYNC + " ='Y' "; @@ -212,7 +180,7 @@ public class InvoiceTransferUtil { String condition = " ( " + IVMInvoiceHeadVO.FPDM + " = '" + logvo.getFpdm() + "' and " + IVMInvoiceHeadVO.FPHM + " = '" + logvo.getFphm() + "' ) " + " and " + IVApplogVO.KPZT + " =" + KpztEnum.ZFING + " " + " and " + IVApplogVO.ISSYNC + " ='Y' "; - if ( logvo.getFpdm() == null){ + if (logvo.getFpdm() == null) { condition = " ( " + IVMInvoiceHeadVO.FPHM + " = '" + logvo.getFphm() + "' ) " + " and " + IVApplogVO.KPZT + " =" + KpztEnum.ZFING + " " + " and " + IVApplogVO.ISSYNC + " ='Y' "; @@ -260,14 +228,14 @@ public class InvoiceTransferUtil { List invoices = new ArrayList(); for (IVApplicationAggVO vo : vos) { requet.setPk_org(vo.getParentVO().getPk_org()); - redRequest.addEmail(vo.getParentVO().getPk_ivapplication(), new String[] {vo.getParentVO().getEmail()}); - redRequest.addSMS(vo.getParentVO().getPk_ivapplication(), new String[] {vo.getParentVO().getSms()}); + redRequest.addEmail(vo.getParentVO().getPk_ivapplication(), new String[]{vo.getParentVO().getEmail()}); + redRequest.addSMS(vo.getParentVO().getPk_ivapplication(), new String[]{vo.getParentVO().getSms()}); PInvoice invoice = getPInvoiceByApplyHead4Red(vo.getParentVO()); List details = new ArrayList(); for (IVApplicationBodyVO detailvo : vo.getBodyVOs()) { - if(detailvo.getCaninvoice_xmjshj().compareTo(UFDouble.ZERO_DBL)==0){ + if (detailvo.getCaninvoice_xmjshj().compareTo(UFDouble.ZERO_DBL) == 0) { continue; } PInvoiceDetail detail = getPInvoiceByApplybody4Red(detailvo); @@ -307,7 +275,7 @@ public class InvoiceTransferUtil { InvalidCommonRequest cr = new InvalidCommonRequest(); cr.setFpHm(invoice.getFphm()); cr.setFpDm(invoice.getFpdm()); - cr.setZfr(invoice.getKpr());//获取开票人原始逻辑,为空则为当前操作人 + cr.setZfr(invoice.getKpr());// 获取开票人原始逻辑,为空则为当前操作人 requet.setData(cr); return requet; @@ -331,12 +299,12 @@ public class InvoiceTransferUtil { IVApplogVO logvo = new IVApplogVO(); - String condition = " " + IVMInvoiceHeadVO.FPDM + " = '" + apply.getParentVO().getFpdm() + "' and " + String condition = " " + IVMInvoiceHeadVO.FPDM + " = '" + apply.getParentVO().getFpdm() + "' and " + IVMInvoiceHeadVO.FPHM + " = '" + apply.getParentVO().getFphm() + "' and dr=0 and " - + IVMInvoiceHeadVO.BILLTYPECODE + "='" + IVAWebConst.IVA_XXFP_JYLXBM +"' "; - if (apply.getParentVO().getFpdm() == null){ - condition = " " + IVMInvoiceHeadVO.FPHM + " = '" + apply.getParentVO().getFphm() + "' and dr=0 and " - + IVMInvoiceHeadVO.BILLTYPECODE + "='" + IVAWebConst.IVA_XXFP_JYLXBM +"' "; + + IVMInvoiceHeadVO.BILLTYPECODE + "='" + IVAWebConst.IVA_XXFP_JYLXBM + "' "; + if (apply.getParentVO().getFpdm() == null) { + condition = " " + IVMInvoiceHeadVO.FPHM + " = '" + apply.getParentVO().getFphm() + "' and dr=0 and " + + IVMInvoiceHeadVO.BILLTYPECODE + "='" + IVAWebConst.IVA_XXFP_JYLXBM + "' "; } IVMInvoiceAggVO[] ivMInvoiceAggVOS = NCLocator @@ -471,20 +439,20 @@ public class InvoiceTransferUtil { * @return * @throws BusinessException */ - public static List getResult4BlueInvoiceApply(IVApplicationAggVO[] ivApplicationVOs,ResponseInfo response) + public static List getResult4BlueInvoiceApply(IVApplicationAggVO[] ivApplicationVOs, ResponseInfo response) throws BusinessException { if (!IVMInvoiceConstant.SUCCESS_CODE.equals(response.getCode())) { throw new BusinessException(response.getMessage()); } - //是否NCC拆分合并 - boolean splitMerge =true; - if(ivApplicationVOs[0]!=null && ivApplicationVOs[0].getBodyVOs()[0].getPk_ivappdetail().length() == 20){ + // 是否NCC拆分合并 + boolean splitMerge = true; + if (ivApplicationVOs[0] != null && ivApplicationVOs[0].getBodyVOs()[0].getPk_ivappdetail().length() == 20) { splitMerge = false; } List logs = new ArrayList(); - //1、 平台处理后只有返回成功的数据,如果税务云返回失败会直接抛出异常 + // 1、 平台处理后只有返回成功的数据,如果税务云返回失败会直接抛出异常 PInvoice[] invoices = response.getData().getInvoices(); if (invoices != null) { @@ -494,95 +462,94 @@ public class InvoiceTransferUtil { } } - //2、记录发票与开票申请行关联关系,并再次更新 - if(ivApplicationVOs.length > 0 ){ - Set addApplicationRelationVO =new HashSet();//汇总需要更新的内容 - Set deleteApplicationRelationVO =new HashSet();//汇总需要删除的内容 - //判断返回的每条开票申请对应的数据,如果出现下游税务云返回票据多于上游记录关系,或者上游无关系。(说明下游税务云存在自动拆分,或纯手工开票场景。也使用NCC的拆分合并关联关系表管理) + // 2、记录发票与开票申请行关联关系,并再次更新 + if (ivApplicationVOs.length > 0) { + Set addApplicationRelationVO = new HashSet();// 汇总需要更新的内容 + Set deleteApplicationRelationVO = new HashSet();// 汇总需要删除的内容 + // 判断返回的每条开票申请对应的数据,如果出现下游税务云返回票据多于上游记录关系,或者上游无关系。(说明下游税务云存在自动拆分,或纯手工开票场景。也使用NCC的拆分合并关联关系表管理) for (IVApplicationAggVO aggVOOld : ivApplicationVOs) { - IVApplicationAggVO aggVO = aggVOOld.clone();//避免污染原始VO + IVApplicationAggVO aggVO = aggVOOld.clone();// 避免污染原始VO String pk_ivapplication = aggVO.getParentVO().getPk_ivapplication(); boolean zffp = aggVO.getParentVO().getZffp() == null ? false : aggVO.getParentVO().getZffp().booleanValue();// 是否作废开票申请单 boolean hzfp = aggVO.getParentVO().getHzfp() == null ? false : aggVO.getParentVO().getHzfp().booleanValue();// 是否红字开票申请单 - IVApplicationBodyVO[] iVApplicationBodyVOS= aggVO.getBodyVOs(); - Set childIVApplogVOS =new HashSet(); - //2.1当前开票申请与开票情况的关系合集 - if(logs.size()>0){ - for (IVApplogVO log:logs) { - if(Arrays.asList(TransSpiltMergePksUtil.transIvapplicationToLyid(new String[]{pk_ivapplication})).contains(log.getLyid())){ + IVApplicationBodyVO[] iVApplicationBodyVOS = aggVO.getBodyVOs(); + Set childIVApplogVOS = new HashSet(); + // 2.1当前开票申请与开票情况的关系合集 + if (logs.size() > 0) { + for (IVApplogVO log : logs) { + if (Arrays.asList(TransSpiltMergePksUtil.transIvapplicationToLyid(new String[]{pk_ivapplication})).contains(log.getLyid())) { childIVApplogVOS.add(log); } } } - //2.2蓝票或者重开场景重新设置值 + // 2.2蓝票或者重开场景重新设置值 // 非作废申请,红冲申请 - if(!zffp&&!hzfp&&childIVApplogVOS.size()>0){ - //匹配到生成的开票情况有内容 - for (IVApplogVO childIVApplogVO:childIVApplogVOS) { + if (!zffp && !hzfp && childIVApplogVOS.size() > 0) { + // 匹配到生成的开票情况有内容 + for (IVApplogVO childIVApplogVO : childIVApplogVOS) { PInvoiceDetail[] invoicedetails = childIVApplogVO.getItems(); - if(invoicedetails.length>0){ - for(PInvoiceDetail invoicedetail:invoicedetails){ - for(IVApplicationBodyVO iVApplicationBodyVO:iVApplicationBodyVOS){ - if(iVApplicationBodyVO.getHh().equals(invoicedetail.getHh())){ - UFDouble invoice_xmsl = new UFDouble(invoicedetail.getXmsl()==null?new BigDecimal(0):invoicedetail.getXmsl()); - UFDouble invoice_xmje = new UFDouble(invoicedetail.getXmje()==null?new BigDecimal(0):invoicedetail.getXmje()); - UFDouble invoice_xmjshj = new UFDouble(invoicedetail.getXmjshj()==null?new BigDecimal(0):invoicedetail.getXmjshj()); + if (invoicedetails.length > 0) { + for (PInvoiceDetail invoicedetail : invoicedetails) { + for (IVApplicationBodyVO iVApplicationBodyVO : iVApplicationBodyVOS) { + if (iVApplicationBodyVO.getHh().equals(invoicedetail.getHh())) { + UFDouble invoice_xmsl = new UFDouble(invoicedetail.getXmsl() == null ? new BigDecimal(0) : invoicedetail.getXmsl()); + UFDouble invoice_xmje = new UFDouble(invoicedetail.getXmje() == null ? new BigDecimal(0) : invoicedetail.getXmje()); + UFDouble invoice_xmjshj = new UFDouble(invoicedetail.getXmjshj() == null ? new BigDecimal(0) : invoicedetail.getXmjshj()); boolean zkh = invoice_xmjshj.compareTo(UFDouble.ZERO_DBL) < 0; - if(splitMerge){//判断NCC拆分合并场景 - JSONArray arr = JSONArray.parseArray(iVApplicationBodyVO.getPk_ivappdetail()); - //对arr进行排序 + if (splitMerge) {// 判断NCC拆分合并场景 + JSONArray arr = JSONArray.parseArray(iVApplicationBodyVO.getPk_ivappdetail()); + // 对arr进行排序 List arrList = JSONArray.parseArray(arr.toJSONString(), JSONObject.class); Collections.sort(arrList, new Comparator() { @Override public int compare(JSONObject o1, JSONObject o2) { - UFDouble jshj1 = new UFDouble(o1.getBigDecimal(IVApplicationBodyVO.XMJSHJ)); - UFDouble jshj2 = new UFDouble(o2.getBigDecimal(IVApplicationBodyVO.XMJSHJ)); + UFDouble jshj1 = new UFDouble(o1.getBigDecimal(IVApplicationBodyVO.XMJSHJ)); + UFDouble jshj2 = new UFDouble(o2.getBigDecimal(IVApplicationBodyVO.XMJSHJ)); return jshj1.compareTo(jshj2); } }); arr = JSONArray.parseArray(arrList.toString()); JSONArray update_arr = new JSONArray(); - //获取剩余的拆合列表,并还原到PK_IVAPPDETAIL中 - for(int i = 0;i < arr.size();i++) { - String pk_ivapplication_split = arr.getJSONObject(i).getString(IVApplicationBodyVO.PK_IVAPPLICATION); - String pk_ivappdetail = arr.getJSONObject(i).getString(IVApplicationBodyVO.PK_IVAPPDETAIL); - UFDouble split_xmsl = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMSL)); - UFDouble split_xmje = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMJE)); - UFDouble split_xmjshj = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMJSHJ)); - //按金额回写 - if(invoice_xmjshj.compareTo(UFDouble.ZERO_DBL)==0){ - //当前发票金额已用完 + // 获取剩余的拆合列表,并还原到PK_IVAPPDETAIL中 + for (int i = 0; i < arr.size(); i++) { + String pk_ivapplication_split = arr.getJSONObject(i).getString(IVApplicationBodyVO.PK_IVAPPLICATION); + String pk_ivappdetail = arr.getJSONObject(i).getString(IVApplicationBodyVO.PK_IVAPPDETAIL); + UFDouble split_xmsl = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMSL)); + UFDouble split_xmje = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMJE)); + UFDouble split_xmjshj = new UFDouble(arr.getJSONObject(i).getBigDecimal(IVApplicationBodyVO.XMJSHJ)); + // 按金额回写 + if (invoice_xmjshj.compareTo(UFDouble.ZERO_DBL) == 0) { + // 当前发票金额已用完 break; - } - else if((split_xmjshj.compareTo(invoice_xmjshj)<=0 && !zkh) || (split_xmjshj.compareTo(invoice_xmjshj)>=0 && zkh)){ - //当前拆分金额已用完 + } else if ((split_xmjshj.compareTo(invoice_xmjshj) <= 0 && !zkh) || (split_xmjshj.compareTo(invoice_xmjshj) >= 0 && zkh)) { + // 当前拆分金额已用完 invoice_xmjshj = invoice_xmjshj.sub(split_xmjshj); invoice_xmje = invoice_xmje.sub(split_xmje); invoice_xmsl = invoice_xmsl.sub(split_xmsl); - if(split_xmjshj.compareTo(UFDouble.ZERO_DBL)!=0) { - addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, pk_ivapplication_split, pk_ivappdetail, iVApplicationBodyVO.getHh(), split_xmsl, split_xmje, split_xmjshj, splitMerge));//需要重新赋值的部分 + if (split_xmjshj.compareTo(UFDouble.ZERO_DBL) != 0) { + addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, pk_ivapplication_split, pk_ivappdetail, iVApplicationBodyVO.getHh(), split_xmsl, split_xmje, split_xmjshj, splitMerge));// 需要重新赋值的部分 } - arr.getJSONObject(i).put(IVApplicationBodyVO.XMSL,UFDouble.ZERO_DBL.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.XMJE,UFDouble.ZERO_DBL.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.XMJSHJ,UFDouble.ZERO_DBL.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.SE,UFDouble.ZERO_DBL.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMSL, UFDouble.ZERO_DBL.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMJE, UFDouble.ZERO_DBL.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMJSHJ, UFDouble.ZERO_DBL.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.SE, UFDouble.ZERO_DBL.toBigDecimal()); split_xmjshj = UFDouble.ZERO_DBL; split_xmje = UFDouble.ZERO_DBL; split_xmsl = UFDouble.ZERO_DBL; update_arr.add(arr.getJSONObject(i)); - }else{ - //当前拆分金额部分用完 + } else { + // 当前拆分金额部分用完 split_xmjshj = split_xmjshj.sub(invoice_xmjshj); split_xmje = split_xmje.sub(invoice_xmje); split_xmsl = split_xmsl.sub(invoice_xmsl); - arr.getJSONObject(i).put(IVApplicationBodyVO.XMSL,split_xmsl.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.XMJE,split_xmje.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.XMJSHJ,split_xmjshj.toBigDecimal()); - arr.getJSONObject(i).put(IVApplicationBodyVO.SE,tranZeroAmount(split_xmjshj.sub(split_xmje)).toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMSL, split_xmsl.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMJE, split_xmje.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.XMJSHJ, split_xmjshj.toBigDecimal()); + arr.getJSONObject(i).put(IVApplicationBodyVO.SE, tranZeroAmount(split_xmjshj.sub(split_xmje)).toBigDecimal()); update_arr.add(arr.getJSONObject(i)); - if(invoice_xmjshj.compareTo(UFDouble.ZERO_DBL)!=0) { - addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, pk_ivapplication_split, pk_ivappdetail, iVApplicationBodyVO.getHh(), invoice_xmsl, invoice_xmje, invoice_xmjshj, splitMerge));//需要重新赋值的部分 + if (invoice_xmjshj.compareTo(UFDouble.ZERO_DBL) != 0) { + addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, pk_ivapplication_split, pk_ivappdetail, iVApplicationBodyVO.getHh(), invoice_xmsl, invoice_xmje, invoice_xmjshj, splitMerge));// 需要重新赋值的部分 } invoice_xmjshj = UFDouble.ZERO_DBL; invoice_xmje = UFDouble.ZERO_DBL; @@ -590,9 +557,9 @@ public class InvoiceTransferUtil { } } iVApplicationBodyVO.setPk_ivappdetail(arr.toJSONString()); - }else{//非NCC拆分合并场景 - if(invoice_xmjshj.compareTo(UFDouble.ZERO_DBL)!=0) { - addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, iVApplicationBodyVO.getPk_ivapplication(), iVApplicationBodyVO.getPk_ivappdetail(), iVApplicationBodyVO.getHh(), invoice_xmsl, invoice_xmje, invoice_xmjshj, splitMerge));//需要重新赋值的部分 + } else {// 非NCC拆分合并场景 + if (invoice_xmjshj.compareTo(UFDouble.ZERO_DBL) != 0) { + addApplicationRelationVO.add(getApplicationRelationVO(aggVO, childIVApplogVO, iVApplicationBodyVO.getPk_ivapplication(), iVApplicationBodyVO.getPk_ivappdetail(), iVApplicationBodyVO.getHh(), invoice_xmsl, invoice_xmje, invoice_xmjshj, splitMerge));// 需要重新赋值的部分 } } } @@ -603,47 +570,47 @@ public class InvoiceTransferUtil { } } - IVApplicationRelationVO[] oldApplicationRelationVO = NCLocator.getInstance().lookup(InvoiceSplitMergeService.class).saveSpiltAndMergeRelation(ivApplicationVOs,splitMerge,addApplicationRelationVO); - //2.3当前开票申请的票据与申请关联关系合集 - Set childApplicationRelationVOS =new HashSet(); - if(oldApplicationRelationVO!=null && oldApplicationRelationVO.length>0){ - for(IVApplicationRelationVO applicationRelationVO:oldApplicationRelationVO) { + IVApplicationRelationVO[] oldApplicationRelationVO = NCLocator.getInstance().lookup(InvoiceSplitMergeService.class).saveSpiltAndMergeRelation(ivApplicationVOs, splitMerge, addApplicationRelationVO); + // 2.3当前开票申请的票据与申请关联关系合集 + Set childApplicationRelationVOS = new HashSet(); + if (oldApplicationRelationVO != null && oldApplicationRelationVO.length > 0) { + for (IVApplicationRelationVO applicationRelationVO : oldApplicationRelationVO) { for (IVApplogVO childIVApplogVO : logs) { if (applicationRelationVO.getFpqqlsh().equals(childIVApplogVO.getLyid())) { - deleteApplicationRelationVO.add(applicationRelationVO);//需要清空删除的关联关系部分 + deleteApplicationRelationVO.add(applicationRelationVO);// 需要清空删除的关联关系部分 break; } } } } - //删除关联关系 - if(deleteApplicationRelationVO.size()>0){ + // 删除关联关系 + if (deleteApplicationRelationVO.size() > 0) { new IVApplicationRelationVODeleteBP().delete(deleteApplicationRelationVO.toArray(new IVApplicationRelationVO[deleteApplicationRelationVO.size()])); } - //更新关联关系 - if(addApplicationRelationVO.size()>0){ + // 更新关联关系 + if (addApplicationRelationVO.size() > 0) { new IVApplicationRelationVOInsertBP().insert(addApplicationRelationVO.toArray(new IVApplicationRelationVO[addApplicationRelationVO.size()])); } } return logs; } - public static IVApplicationRelationVO getApplicationRelationVO(IVApplicationAggVO aggVO, IVApplogVO childIVApplogVO,String pk_ivapplication, String pk_ivappdetail, String hh, UFDouble invoice_xmsl, UFDouble invoice_xmje, UFDouble invoice_xmjshj, boolean splitMerge) { + public static IVApplicationRelationVO getApplicationRelationVO(IVApplicationAggVO aggVO, IVApplogVO childIVApplogVO, String pk_ivapplication, String pk_ivappdetail, String hh, UFDouble invoice_xmsl, UFDouble invoice_xmje, UFDouble invoice_xmjshj, boolean splitMerge) { String kpfs = String.valueOf(aggVO.getParentVO().getKpfs());// 开票方式 1/直联开票、2/手工开票、3/发票拆分合并开票 IVApplicationRelationVO vo = new IVApplicationRelationVO(); vo.setPk_ivapplication(pk_ivapplication); vo.setPk_ivappdetail(pk_ivappdetail); - vo.setIsplitmerge(splitMerge?UFBoolean.TRUE:UFBoolean.FALSE); + vo.setIsplitmerge(splitMerge ? UFBoolean.TRUE : UFBoolean.FALSE); vo.setXmsl(invoice_xmsl); vo.setXmje(invoice_xmje); vo.setXmjshj(invoice_xmjshj); vo.setRowno(hh); - vo.setFpqqlsh(childIVApplogVO.getLyid());//税务云拆分的关联关系存储的是来源ID - vo.setPk_ivapplog(childIVApplogVO.getPk_ivapplog());//替换关联关系的生成,下游生成的部分会替换并按行赋值。便于找到回退的数据 - if(IVAWebConst.IVA_KP_SSCIVA01_1.equals(kpfs) || splitMerge) { - vo.setKpfs(IVAplocationKPFS.ZLKP.toIntValue());//直连开票 - }else{ - vo.setKpfs(IVAplocationKPFS.SGKP.toIntValue());//手工开票 + vo.setFpqqlsh(childIVApplogVO.getLyid());// 税务云拆分的关联关系存储的是来源ID + vo.setPk_ivapplog(childIVApplogVO.getPk_ivapplog());// 替换关联关系的生成,下游生成的部分会替换并按行赋值。便于找到回退的数据 + if (IVAWebConst.IVA_KP_SSCIVA01_1.equals(kpfs) || splitMerge) { + vo.setKpfs(IVAplocationKPFS.ZLKP.toIntValue());// 直连开票 + } else { + vo.setKpfs(IVAplocationKPFS.SGKP.toIntValue());// 手工开票 } return vo; } @@ -679,7 +646,7 @@ public class InvoiceTransferUtil { logvo.setInvoice_type(String.valueOf(applyvo.getParentVO().getFplx())); logvo.setGmfmc(applyvo.getParentVO().getGmf_mc()); logvo.setXsfmc(applyvo.getParentVO().getXsf_mc()); - if (applyvo.getHeadVO().getSgbz()!=null && applyvo.getHeadVO().getSgbz().booleanValue()) { + if (applyvo.getHeadVO().getSgbz() != null && applyvo.getHeadVO().getSgbz().booleanValue()) { logvo.setGmfmc(applyvo.getParentVO().getXsf_mc()); logvo.setXsfmc(applyvo.getParentVO().getGmf_mc()); } @@ -732,7 +699,7 @@ public class InvoiceTransferUtil { head.setViewurl(null); head.setBillstatus(IBillStatus.CHECKPASS); - //数电特殊票种 + // 数电特殊票种 head.setZsfs(pinvoice.getZsfs()); head.setTspz(IVApplicationTspzUtil.getTspzPk(pinvoice.getTspz())); head.setTspzdef99(head.getTspz()); @@ -783,11 +750,11 @@ public class InvoiceTransferUtil { head.setYlzfphm(ivApplicationHeadVO.getFphm()); } // 重新查询交易类型 - IUAPQueryBS iUAPQueryBS = (IUAPQueryBS)NCLocator.getInstance().lookup(IUAPQueryBS.class.getName()); - if (ivApplicationHeadVO.getSgbz()!=null && ivApplicationHeadVO.getSgbz().booleanValue()) { + IUAPQueryBS iUAPQueryBS = (IUAPQueryBS) NCLocator.getInstance().lookup(IUAPQueryBS.class.getName()); + if (ivApplicationHeadVO.getSgbz() != null && ivApplicationHeadVO.getSgbz().booleanValue()) { @SuppressWarnings("unchecked") List vos = - (List)iUAPQueryBS.retrieveByClause(BilltypeVO.class, BilltypeVO.PK_BILLTYPECODE + (List) iUAPQueryBS.retrieveByClause(BilltypeVO.class, BilltypeVO.PK_BILLTYPECODE + "='SSIV-Cxx-rec' " + " AND " + " pk_group ='" + ivApplicationHeadVO.getPk_group() + "' "); if (vos != null && vos.size() > 0) { String pk_billtypeid = vos.get(0).getPk_billtypeid(); @@ -797,16 +764,16 @@ public class InvoiceTransferUtil { head.setPk_billtype(IVAWebConst.IVA_JXFP_JYLXPK);// 交易类型主键 head.setBilltypecode(IVAWebConst.IVA_JXFP_JYLXBM); } - //收票日期 NC系统日期 + // 收票日期 NC系统日期 head.setSprq(new UFDate()); - //收票人取开票申请修改人 + // 收票人取开票申请修改人 head.setSpr(ivApplicationHeadVO.getModifier()); - //收购标志 + // 收购标志 head.setSgbz(UFBoolean.TRUE); - //默认为采购类发票 + // 默认为采购类发票 head.setClasstype(ClassTypeEnum.ClassType_CGL.toIntValue()); - //收购发票,购销信息对调 + // 收购发票,购销信息对调 head.setXsfmc(pinvoice.getGmfMc()); head.setXsfnsrsbh(pinvoice.getGmfNsrsbh()); head.setXsfdzdh(pinvoice.getGmfDzdh()); @@ -818,7 +785,7 @@ public class InvoiceTransferUtil { } else { @SuppressWarnings("unchecked") List vos = - (List)iUAPQueryBS.retrieveByClause(BilltypeVO.class, BilltypeVO.PK_BILLTYPECODE + (List) iUAPQueryBS.retrieveByClause(BilltypeVO.class, BilltypeVO.PK_BILLTYPECODE + "='SSIV-Cxx-sale' " + " AND " + " pk_group ='" + ivApplicationHeadVO.getPk_group() + "' "); if (vos != null && vos.size() > 0) { String pk_billtypeid = vos.get(0).getPk_billtypeid(); @@ -828,7 +795,7 @@ public class InvoiceTransferUtil { head.setPk_billtype(IVAWebConst.IVA_XXFP_JYLXPK);// 交易类型主键 head.setBilltypecode(IVAWebConst.IVA_XXFP_JYLXBM); } - //非收购发票,购销信息直传 + // 非收购发票,购销信息直传 head.setXsfmc(pinvoice.getXsfMc()); head.setXsfnsrsbh(pinvoice.getXsfNsrsbh()); head.setXsfdzdh(pinvoice.getXsfDzdh()); @@ -872,9 +839,9 @@ public class InvoiceTransferUtil { detail.setIsfee(UFBoolean.FALSE); detail.setFphxz(Integer.valueOf(item.getFphxz())); detail.setZkhhh(item.getZkhhh()); - //数电特殊票种 + // 数电特殊票种 PInvoiceSDetail motor = item.getDetailMotor(); - if(motor != null){ + if (motor != null) { detail.setJzfwfsd(motor.getJzfwfsd()); detail.setJzxmmc(motor.getJzxmmc()); detail.setCqzsbh(motor.getCqzsbh()); @@ -883,13 +850,13 @@ public class InvoiceTransferUtil { } } - //特殊票种 + // 特殊票种 List tspzDetails = new ArrayList(); - if (pinvoice.getTspzs() != null && pinvoice.getTspzs().length > 0){ - for (PInvoiceTspz ptspz : pinvoice.getTspzs()){ - IVMInvoiceTspzDetailVO tspz = new IVMInvoiceTspzDetailVO(); + if (pinvoice.getTspzs() != null && pinvoice.getTspzs().length > 0) { + for (PInvoiceTspz ptspz : pinvoice.getTspzs()) { + IVMInvoiceTspzDetailVO tspz = new IVMInvoiceTspzDetailVO(); - //货运 + // 货运 tspz.setYsmxxh(ptspz.getYsmxxh()); tspz.setYsgjzl(ptspz.getYsgjzl()); tspz.setYsgjph(ptspz.getYsgjph()); @@ -897,7 +864,7 @@ public class InvoiceTransferUtil { tspz.setDdd(ptspz.getDdd()); tspz.setYshwmc(ptspz.getYshwmc()); - //客运 + // 客运 tspz.setCxrxh(ptspz.getCxrxh()); tspz.setCxr(ptspz.getCxr()); tspz.setChuxrq(ptspz.getChuxrq() == null ? null : getUFDate(ptspz.getChuxrq())); @@ -912,8 +879,8 @@ public class InvoiceTransferUtil { } } - if (pinvoice.getCepzs() != null && pinvoice.getCepzs().length > 0){ - for (PInvoiceCepz pcepz : pinvoice.getCepzs()){ + if (pinvoice.getCepzs() != null && pinvoice.getCepzs().length > 0) { + for (PInvoiceCepz pcepz : pinvoice.getCepzs()) { IVMInvoiceTspzDetailVO cepz = new IVMInvoiceTspzDetailVO(); cepz.setXh(pcepz.getXh()); cepz.setPzlx(pcepz.getPzlx()); @@ -936,7 +903,7 @@ public class InvoiceTransferUtil { aggvo.setParentVO(head); aggvo.setChildrenVO(details.toArray(new IVMInvoiceDetailVO[0])); - if (tspzDetails.size() > 0){ + if (tspzDetails.size() > 0) { aggvo.setIvmInvoiceTspzDetailVO(tspzDetails.toArray(new IVMInvoiceTspzDetailVO[0])); } @@ -946,7 +913,7 @@ public class InvoiceTransferUtil { private static void initKhcje(IVMInvoiceAggVO aggvo) { IVMInvoiceHeadVO head = aggvo.getParentVO(); - if(head.getRed_flag() != null && head.getRed_flag().intValue() != IsHzfp.IsHzfp_0.toIntValue()){ + if (head.getRed_flag() != null && head.getRed_flag().intValue() != IsHzfp.IsHzfp_0.toIntValue()) { return; } // 1. 初始化表头可红冲金额等于价税合计金额 @@ -955,7 +922,7 @@ public class InvoiceTransferUtil { head.setYhcje(UFDouble.ZERO_DBL); // 2. 初始化表体可红冲金额 - IVMInvoiceDetailVO[] detailVOs = (IVMInvoiceDetailVO[])aggvo.getChildrenVO(); + IVMInvoiceDetailVO[] detailVOs = (IVMInvoiceDetailVO[]) aggvo.getChildrenVO(); Map rowNumAndJshjMap = new HashMap<>(); for (IVMInvoiceDetailVO detail : detailVOs) { rowNumAndJshjMap.put(detail.getRowno(), detail.getXmjshj()); @@ -990,33 +957,33 @@ public class InvoiceTransferUtil { if (lyids != null) { List bhcInvoiceRelations = new ArrayList(); Map billRelationMap = new HashMap(); - //红字发票,根据原蓝票回写金额需要提前 + // 红字发票,根据原蓝票回写金额需要提前 boolean hzfp = "1".equals(String.valueOf(pinvoice.getParentVO().getRed_flag())); - if(hzfp) { - //查询被红冲的发票的发票单据关联关系,丢失的关系直接从其中补 - StringBuilder queryReSql = new StringBuilder(""); + if (hzfp) { + // 查询被红冲的发票的发票单据关联关系,丢失的关系直接从其中补 + StringBuilder queryReSql = new StringBuilder(""); queryReSql.append(" select ion.* from sscivm_invoice_relation ion "); queryReSql.append(" left join sscivm_invoice ice on ion.pk_invoice = ice.pk_invoice "); - queryReSql.append(" where ion.fphm = '"+pinvoice.getParentVO().getYlzfphm()+"' "); - if (pinvoice.getParentVO().getYlzfpdm() != null){ - queryReSql.append(" and ion.fpdm = '"+pinvoice.getParentVO().getYlzfpdm()+"' "); + queryReSql.append(" where ion.fphm = '" + pinvoice.getParentVO().getYlzfphm() + "' "); + if (pinvoice.getParentVO().getYlzfpdm() != null) { + queryReSql.append(" and ion.fpdm = '" + pinvoice.getParentVO().getYlzfpdm() + "' "); } queryReSql.append(" and ice.dr = 0 "); queryReSql.append(" and (ice.billtypecode ='SSIV-Cxx-sale' or (ice.billtypecode ='SSIV-Cxx-rec' and ice.invoice_type in (109,309))) "); bhcInvoiceRelations = (List) new BaseDAO().executeQuery(queryReSql.toString(), new BeanListProcessor(IVMInvoiceRelationVO.class)); - if(bhcInvoiceRelations.size()>0) { + if (bhcInvoiceRelations.size() > 0) { for (IVMInvoiceRelationVO bhcInvoiceRelation : bhcInvoiceRelations) { billRelationMap.put(bhcInvoiceRelation.getBillid(), bhcInvoiceRelation); } - //业务单据红冲不记录关联关系 + // 业务单据红冲不记录关联关系 boolean ywdjhc = true; - for (IVApplicationAggVO ivApplicationHeadVO : ivApplicationHeadVOS){ - if (billRelationMap.containsKey(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())){ + for (IVApplicationAggVO ivApplicationHeadVO : ivApplicationHeadVOS) { + if (billRelationMap.containsKey(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())) { ywdjhc = false; } } - if (ywdjhc){ + if (ywdjhc) { billRelationMap = new HashMap(); bhcInvoiceRelations = new ArrayList(); } @@ -1031,8 +998,8 @@ public class InvoiceTransferUtil { if (ivApplicationHeadVO.getParentVO().getCkfp() != null && ivApplicationHeadVO.getParentVO().getCkfp().booleanValue()) { - //查找原发票的发票单据关联关系,从中补关系 - StringBuilder queryReSql = new StringBuilder(""); + // 查找原发票的发票单据关联关系,从中补关系 + StringBuilder queryReSql = new StringBuilder(""); queryReSql.append(" select rel.* from sscivm_invoice_relation rel "); queryReSql.append(" left join sscivm_invoice ice on rel.pk_invoice = ice.pk_invoice "); queryReSql.append(" left join sscivm_ivapplication iva on (iva.pk_ivapplication ='"); @@ -1047,11 +1014,11 @@ public class InvoiceTransferUtil { List yInvoiceRelations = (List) new BaseDAO() .executeQuery(queryReSql.toString(), new BeanListProcessor(IVMInvoiceRelationVO.class)); - //根据原发票的发票关联关系,生成 发票关联关系 - if(yInvoiceRelations.size()>0) { + // 根据原发票的发票关联关系,生成 发票关联关系 + if (yInvoiceRelations.size() > 0) { for (IVMInvoiceRelationVO bhcInvoiceRelation : yInvoiceRelations) { billRelationMap.put(bhcInvoiceRelation.getBillid(), bhcInvoiceRelation); - if(StringUtils.isBlank(bhcInvoiceRelation.getBillid()) || bhcInvoiceRelation.getBillid().equals(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())){ + if (StringUtils.isBlank(bhcInvoiceRelation.getBillid()) || bhcInvoiceRelation.getBillid().equals(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())) { continue; } IVMInvoiceRelationVO head = new IVMInvoiceRelationVO(); @@ -1085,7 +1052,7 @@ public class InvoiceTransferUtil { if (lyidstr != null && map.get(lyidstr).contains(ivApplicationHeadVO.getParentVO().getPk_ivapplication())) { IVMInvoiceRelationVO head = new IVMInvoiceRelationVO(); head.setStatus(VOStatus.NEW); - if(StringUtils.isBlank(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())){ + if (StringUtils.isBlank(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill())) { continue; } // 票面信息 @@ -1098,15 +1065,15 @@ public class InvoiceTransferUtil { head.setInvoiceamount(pinvoice.getParentVO().getJshj()); head.setPk_invoice(pinvoice.getParentVO().getPk_invoice()); IVMInvoiceRelationVO oldvo = billRelationMap.get(head.getBillid()); - if(oldvo != null){ - if(hzfp){ - if(oldvo.getAmount() != null){ + if (oldvo != null) { + if (hzfp) { + if (oldvo.getAmount() != null) { head.setAmount(oldvo.getAmount().multiply(-1)); } - if(oldvo.getJe() != null){ + if (oldvo.getJe() != null) { head.setJe(oldvo.getJe().multiply(-1)); } - if(oldvo.getSe() != null){ + if (oldvo.getSe() != null) { head.setSe(oldvo.getSe().multiply(-1)); } } else { @@ -1116,26 +1083,29 @@ public class InvoiceTransferUtil { } } heads.add(head); - if(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill()!=null && ivApplicationHeadVO.getParentVO().getSrc_pkbusibill().length()>0) { - pk_ivapplicationSet.add(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill());} + if (ivApplicationHeadVO.getParentVO().getSrc_pkbusibill() != null && ivApplicationHeadVO.getParentVO().getSrc_pkbusibill().length() > 0) { + pk_ivapplicationSet.add(ivApplicationHeadVO.getParentVO().getSrc_pkbusibill()); + } } } } - //合并场景联查对应的红字发票相关单据 - if(hzfp && pk_ivapplicationSet.size()>0) { - //根据被红冲发票关联关系,生成 发票关联关系 - if(bhcInvoiceRelations.size()>0) { + // 合并场景联查对应的红字发票相关单据 + if (hzfp && pk_ivapplicationSet.size() > 0) { + // 根据被红冲发票关联关系,生成 发票关联关系 + if (bhcInvoiceRelations.size() > 0) { for (IVMInvoiceRelationVO bhcInvoiceRelation : bhcInvoiceRelations) { IVMInvoiceRelationVO head = new IVMInvoiceRelationVO(); boolean continueAdd = true; - for(IVMInvoiceRelationVO headin:heads) { - if(headin.getBillid() != null && bhcInvoiceRelation.getBillid() != null && headin.getBillid().equals(bhcInvoiceRelation.getBillid())) { - continueAdd =false; + for (IVMInvoiceRelationVO headin : heads) { + if (headin.getBillid() != null && bhcInvoiceRelation.getBillid() != null && headin.getBillid().equals(bhcInvoiceRelation.getBillid())) { + continueAdd = false; } } - if(!continueAdd) { continue;} + if (!continueAdd) { + continue; + } head.setStatus(VOStatus.NEW); // 票面信息 head.setFphm(pinvoice.getParentVO().getFphm()); @@ -1189,12 +1159,13 @@ public class InvoiceTransferUtil { /** * 根据发票生成开票日志 + * * @param pinvoice * @param kpzt * @return * @throws BusinessException */ - public static IVApplogVO getIVApplogVOFromPInvoice(PInvoice pinvoice, int kpzt) throws BusinessException{ + public static IVApplogVO getIVApplogVOFromPInvoice(PInvoice pinvoice, int kpzt) throws BusinessException { SequenceGenerator generator = new SequenceGenerator(); IVApplogVO logvo = new IVApplogVO(); logvo.setCode(IVMInvoiceConstant.SUCCESS_CODE); @@ -1273,11 +1244,11 @@ public class InvoiceTransferUtil { pinvoice.setLyid(headvo.getPk_ivapplication()); pinvoice.setFplx(InvoiceTypeToTspzUtil.getRealInvoicetype(headvo.getFplx())); String tspz = InvoiceTypeToTspzUtil.getTspz(headvo.getFplx()); - if(StringUtils.isEmpty(tspz) && StringUtils.isNotEmpty(headvo.getTspz())){ + if (StringUtils.isEmpty(tspz) && StringUtils.isNotEmpty(headvo.getTspz())) { try { - Collection defdocVOS = ((IUAPQueryBS)NCLocator.getInstance().lookup(IUAPQueryBS.class.getName())).retrieveByClause(DefdocVO.class, " "+DefdocVO.PK_DEFDOC+"='"+headvo.getTspz()+"' "); - if(defdocVOS!=null && defdocVOS.size()>0){ - for(DefdocVO DefdocVO:defdocVOS){ + Collection defdocVOS = ((IUAPQueryBS) NCLocator.getInstance().lookup(IUAPQueryBS.class.getName())).retrieveByClause(DefdocVO.class, " " + DefdocVO.PK_DEFDOC + "='" + headvo.getTspz() + "' "); + if (defdocVOS != null && defdocVOS.size() > 0) { + for (DefdocVO DefdocVO : defdocVOS) { tspz = DefdocVO.getCode(); break; } @@ -1289,7 +1260,7 @@ public class InvoiceTransferUtil { pinvoice.setTspz(tspz); // 目前传值,后续应该不传,税务云都通过组织编码解析,销售方的其他信息不需要传值 - if (headvo.getSgbz()!=null && headvo.getSgbz().booleanValue()) {//收购销方转购方 + if (headvo.getSgbz() != null && headvo.getSgbz().booleanValue()) {// 收购销方转购方 pinvoice.setGmf_dz(headvo.getXsf_dz()); pinvoice.setGmf_dh(headvo.getXsf_dh()); pinvoice.setGmf_yh(headvo.getXsf_yh()); @@ -1300,7 +1271,7 @@ public class InvoiceTransferUtil { pinvoice.setGmfYhzh(headvo.getXsf_yhzh()); pinvoice.setXsfNsrsbh(headvo.getGmf_nsrsbh()); } else { - pinvoice.setXsfYhzh((headvo.getXsf_yhzh()==null?"":headvo.getXsf_yhzh())); + pinvoice.setXsfYhzh((headvo.getXsf_yhzh() == null ? "" : headvo.getXsf_yhzh())); pinvoice.setXsfNsrsbh(headvo.getXsf_nsrsbh()); pinvoice.setXsf_dz(headvo.getXsf_dz()); pinvoice.setXsf_dh(headvo.getXsf_dh()); @@ -1316,7 +1287,7 @@ public class InvoiceTransferUtil { pinvoice.setGmfYhzh(headvo.getGmf_yhzh()); } - //收购标志处理 + // 收购标志处理 if (headvo.getSgbz().booleanValue()) { pinvoice.setSgbz("2"); } @@ -1335,15 +1306,15 @@ public class InvoiceTransferUtil { pinvoice.setZdybz(headvo.getZdybz()); pinvoice.setOrgcode(headvo.getOrgcode()); - //税率说明 + // 税率说明 pinvoice.setSlsm(headvo.getSlsm()); pinvoice.setAllelcusername(headvo.getAllelcusername()); pinvoice.setAllelcpassword(headvo.getAllelcpassword()); - pinvoice.setZsfs(headvo.getZsfs()==null?"":headvo.getZsfs()); + pinvoice.setZsfs(headvo.getZsfs() == null ? "" : headvo.getZsfs()); - //数电特殊票种字段 + // 数电特殊票种字段 pinvoice.setBdcdz(headvo.getBdcdz()); pinvoice.setZlqq(getFormatDate(headvo.getZlqq())); pinvoice.setZlqz(getFormatDate(headvo.getZlqz())); @@ -1360,10 +1331,51 @@ public class InvoiceTransferUtil { pinvoice.setZnj(headvo.getZnj() == null ? null : getUFDoubleToBigDecimal(headvo.getZnj()).setScale(2, UFDouble.ROUND_HALF_UP)); pinvoice.setJehj(headvo.getJehj() == null ? null : getUFDoubleToBigDecimal(headvo.getJehj()).setScale(2, UFDouble.ROUND_HALF_UP)); pinvoice.setCjh(headvo.getCjh()); -// pinvoice.setKqysssxbgglbm(headvo.getKqysssxbgglbm()); + // pinvoice.setKqysssxbgglbm(headvo.getKqysssxbgglbm()); + + setOtherField(headvo, pinvoice); return pinvoice; } + private static void setOtherField(IVApplicationHeadVO headvo, PInvoice pinvoice) { + // 是否展示销售方开户银行及账号 Y-是/N-否 + String def3 = headvo.getDef3(); + // 是否展示销售方地址电话 + String def4 = headvo.getDef4(); + // 是否填写收款人及复核人 + String def16 = headvo.getDef16(); + // 是否展示购买方单位、地址电话 + String def17 = headvo.getDef17(); + // 是否展示购买方开户行、银行账号 + String def18 = headvo.getDef18(); + + // einvoiceShowGxfDzDh 表示是否显示购方和销方的地址电话 + // 根据需求:0: 不显示 1: 显示购方地址电话 2: 显示销方地址电话 3: 显示购方和销方地址电话 + int einvoiceShowGxfDzDh = 0; + + if ("Y".equals(def3)) { + einvoiceShowGxfDzDh += 1; // 购方地址电话显示 + } + if ("Y".equals(def17)) { + einvoiceShowGxfDzDh += 2; // 销方地址电话显示 + } + + // einvoiceShowGxfYhZh 表示是否显示购方和销方的小银行账户 + // 根据需求:0: 不显示 1: 显示购方银行账户 2: 显示销方银行账户 3: 显示购方和销方银行账户 + int einvoiceShowGxfYhZh = 0; + + if ("Y".equals(def4)) { + einvoiceShowGxfYhZh += 1; // 购方银行账户显示 + } + if ("Y".equals(def18)) { + einvoiceShowGxfYhZh += 2; // 销方银行账户显示 + } + // 数电发票是否显示购销方地址电话 0:不显示 1:仅显示销地址、电话 2:仅显示购买方地址、电话 3:购销方地址、电话都显示 + pinvoice.setEinvoiceShowGxfDzDh(String.valueOf(einvoiceShowGxfDzDh)); + // 数电发票是否显示购销方银行、账号: 0:不显示 1:仅显示销售方银行、账号 2:仅显示购买方银行、账号 3:购销方银行、账号都显示 + pinvoice.setEinvoiceShowGxfYhZh(String.valueOf(einvoiceShowGxfYhZh)); + } + /** * 根据红冲申请转换成发票平台VO * @@ -1380,7 +1392,7 @@ public class InvoiceTransferUtil { pinvoice.setFpDm(headvo.getFpdm()); pinvoice.setKpr(headvo.getKpr()); pinvoice.setJshj(getUFDoubleToBigDecimal(headvo.getCaninvoice_jshj()).setScale(2, UFDouble.ROUND_HALF_UP)); - pinvoice.setXsfYhzh((headvo.getXsf_yhzh()==null?"":headvo.getXsf_yhzh())); + pinvoice.setXsfYhzh((headvo.getXsf_yhzh() == null ? "" : headvo.getXsf_yhzh())); pinvoice.setHzxxbbh(headvo.getHzxxsqb()); // pinvoice.setHjje(getUFDoubleToBigDecimal(headvo.getHjje()).setScale(2, // UFDouble.ROUND_HALF_UP));//存在含税和不含税单价,统一交由税务云反算 @@ -1388,7 +1400,7 @@ public class InvoiceTransferUtil { // UFDouble.ROUND_HALF_UP));//存在含税和不含税单价,统一交由税务云反算 pinvoice.setOrgcode(headvo.getOrgcode()); - //税率说明红冲原因 + // 税率说明红冲原因 pinvoice.setSlsm(headvo.getSlsm()); pinvoice.setHcyy(headvo.getHcyy()); @@ -1410,8 +1422,8 @@ public class InvoiceTransferUtil { private static PInvoiceDetail getPInvoiceByApplyHead(IVApplicationHeadVO headvo, IVApplicationBodyVO body) { PInvoiceDetail detailvo = new PInvoiceDetail(); - //开票神申请规格型号自动截取40位长度 - detailvo.setGgxh((body.getGgxh()!=null&&body.getGgxh().length()>40)?body.getGgxh().substring(0, 40):body.getGgxh()); + // 开票神申请规格型号自动截取40位长度 + detailvo.setGgxh((body.getGgxh() != null && body.getGgxh().length() > 40) ? body.getGgxh().substring(0, 40) : body.getGgxh()); detailvo.setDw(body.getDw()); detailvo.setXmsl(getUFDoubleToBigDecimal(body.getCaninvoice_xmsl())); detailvo.setZkhhh(body.getZkhhh()); @@ -1422,14 +1434,14 @@ public class InvoiceTransferUtil { detailvo.setXmjshj(getUFDoubleToBigDecimal(body.getCaninvoice_xmjshj()).setScale(2, UFDouble.ROUND_HALF_UP)); detailvo.setSl(getUFDoubleToBigDecimal(body.getSl()).multiply(new BigDecimal(0.01))); // detailvo.setSe(detailvo.getXmjshj().subtract(detailvo.getXmje())); //税务云反算 - if(body.getSsflbm()!=null && body.getSsflbm().length()>0){ + if (body.getSsflbm() != null && body.getSsflbm().length() > 0) { // 传税收分类编码的开票 detailvo.setSpbm(body.getSsflbm()); detailvo.setXmmc(body.getXmmc()); - }else if ((body.getPk_materiel() == null || body.getPk_materiel().length() == 0)) { + } else if ((body.getPk_materiel() == null || body.getPk_materiel().length() == 0)) { // 重开的场景 String xmmc = body.getXmmc(); - if (xmmc != null && headvo.getCkfp() != null && headvo.getCkfp().booleanValue()) { + if (xmmc != null && headvo.getCkfp() != null && headvo.getCkfp().booleanValue()) { xmmc = xmmc.replace("*", "");// 按税务云清除第一个*号 xmmc = xmmc.replace("*", "");// 按税务云清除第二个*号 } @@ -1444,60 +1456,60 @@ public class InvoiceTransferUtil { if (headvo.getSgbz().booleanValue()) { detailvo.setLslbs(IVAplocationLSLBS.LSLBS_MS.toStringValue()); } - if(body.getYhzcbs()!=null){ + if (body.getYhzcbs() != null) { detailvo.setYhzcbs(body.getYhzcbs()); detailvo.setZzstsgl(body.getZzstsgl()); } detailvo.setKce(body.getKce() == null ? null : getUFDoubleToBigDecimal(body.getKce())); - //简易征收 + // 简易征收 if (body.getYhzcbs() != null) { detailvo.setYhzcbs(body.getYhzcbs()); } detailvo.setZzstsgl(body.getZzstsgl()); - //motor 明细数据处理 + // motor 明细数据处理 PInvoiceSDetail motor = new PInvoiceSDetail(); motor.setCqzsbh(body.getCqzsbh()); motor.setJzfwfsd(body.getJzfwfsd()); motor.setJzxmmc(body.getJzxmmc()); // **************************2024-07-10 新增 对应税务云,开票申请表体增加9个自定义项 - if(!StringUtils.isEmpty(body.getDef24())) {//CD 产地 + if (!StringUtils.isEmpty(body.getDef24())) {// CD 产地 motor.setCd(body.getDef24()); } - if(!StringUtils.isEmpty(body.getDef25())) {//CJHM 车架号码! + if (!StringUtils.isEmpty(body.getDef25())) {// CJHM 车架号码! motor.setCjhm(body.getDef25()); } - if(!StringUtils.isEmpty(body.getDef26())) {//车辆类型 CLLX + if (!StringUtils.isEmpty(body.getDef26())) {// 车辆类型 CLLX motor.setCllx(body.getDef26()); } - if(!StringUtils.isEmpty(body.getDef27())) {//CPXH 厂牌型号 + if (!StringUtils.isEmpty(body.getDef27())) {// CPXH 厂牌型号 motor.setCpxh(body.getDef27()); } - if(!StringUtils.isEmpty(body.getDef28())) {//SCQYMC 生产企业名称 + if (!StringUtils.isEmpty(body.getDef28())) {// SCQYMC 生产企业名称 motor.setScqymc(body.getDef28()); } - if(!StringUtils.isEmpty(body.getDef29())) {// XCRS 限乘人数 + if (!StringUtils.isEmpty(body.getDef29())) {// XCRS 限乘人数 motor.setXcrs(body.getDef29()); } - if(!StringUtils.isEmpty(body.getDef17())) {// HGZH 合格证号 + if (!StringUtils.isEmpty(body.getDef17())) {// HGZH 合格证号 motor.setHgzh(body.getDef17()); } - if(!StringUtils.isEmpty(body.getDef17())) {// HGZH 合格证号 + if (!StringUtils.isEmpty(body.getDef17())) {// HGZH 合格证号 motor.setHgzh(body.getDef17()); } - if(!StringUtils.isEmpty(body.getDef20())) {// FDJHM 发动机号码 + if (!StringUtils.isEmpty(body.getDef20())) {// FDJHM 发动机号码 motor.setFdjhm(body.getDef20()); } - if(!StringUtils.isEmpty(body.getDef30())) {// DUNWEI 吨位 + if (!StringUtils.isEmpty(body.getDef30())) {// DUNWEI 吨位 motor.setDunwei(body.getDef30()); } @@ -1509,6 +1521,7 @@ public class InvoiceTransferUtil { /** * 特殊票种发票信息转换 + * * @param tspzVOs * @param invoice * @return @@ -1516,9 +1529,9 @@ public class InvoiceTransferUtil { private static PInvoice getPInvoiceByApplyTspz(IVTspzsBodyVO[] tspzVOs, PInvoice invoice) { List tspzs = new ArrayList(); List cepzs = new ArrayList(); - for (IVTspzsBodyVO tspzVO : tspzVOs){ - //差额开票 - if (StringUtils.isNotEmpty(tspzVO.getPzlx()) && (IVAplocationZSFS.HCYY_CEZS.toStringValue().equals(invoice.getZsfs())|| IVAplocationZSFS.HCYY_QEZS.toStringValue().equals(invoice.getZsfs()))){ + for (IVTspzsBodyVO tspzVO : tspzVOs) { + // 差额开票 + if (StringUtils.isNotEmpty(tspzVO.getPzlx()) && (IVAplocationZSFS.HCYY_CEZS.toStringValue().equals(invoice.getZsfs()) || IVAplocationZSFS.HCYY_QEZS.toStringValue().equals(invoice.getZsfs()))) { PInvoiceCepz cepz = new PInvoiceCepz(); cepz.setXh(tspzVO.getXh()); cepz.setPzlx(tspzVO.getPzlx()); @@ -1536,8 +1549,8 @@ public class InvoiceTransferUtil { cepzs.add(cepz); } - //货物运输 - if (StringUtils.isNotEmpty(tspzVO.getYsgjzl()) && IVAWebConst.TSPZ_HWYS.equals(invoice.getTspz())){ + // 货物运输 + if (StringUtils.isNotEmpty(tspzVO.getYsgjzl()) && IVAWebConst.TSPZ_HWYS.equals(invoice.getTspz())) { PInvoiceTspz tspz = new PInvoiceTspz(); tspz.setYsmxxh(tspzVO.getYsmxxh()); tspz.setYsgjzl(tspzVO.getYsgjzl()); @@ -1548,8 +1561,8 @@ public class InvoiceTransferUtil { tspzs.add(tspz); } - //旅客运输 - if (StringUtils.isNotEmpty(tspzVO.getCxr()) && IVAWebConst.TSPZ_LKYS.equals(invoice.getTspz())){ + // 旅客运输 + if (StringUtils.isNotEmpty(tspzVO.getCxr()) && IVAWebConst.TSPZ_LKYS.equals(invoice.getTspz())) { PInvoiceTspz tspz = new PInvoiceTspz(); tspz.setCxrxh(tspzVO.getCxrxh()); tspz.setCxr(tspzVO.getCxr()); @@ -1564,10 +1577,10 @@ public class InvoiceTransferUtil { } } - if (tspzs.size() > 0){ + if (tspzs.size() > 0) { invoice.setTspzs(tspzs.toArray(new PInvoiceTspz[0])); } - if (cepzs.size() > 0){ + if (cepzs.size() > 0) { invoice.setCepzs(cepzs.toArray(new PInvoiceCepz[0])); } return invoice; @@ -1584,8 +1597,8 @@ public class InvoiceTransferUtil { PInvoiceDetail detailvo = new PInvoiceDetail(); detailvo.setXmmc(body.getXmmc()); - //开票神申请规格型号自动截取40位长度 - detailvo.setGgxh((body.getGgxh()!=null&&body.getGgxh().length()>40)?body.getGgxh().substring(0, 40):body.getGgxh()); + // 开票神申请规格型号自动截取40位长度 + detailvo.setGgxh((body.getGgxh() != null && body.getGgxh().length() > 40) ? body.getGgxh().substring(0, 40) : body.getGgxh()); detailvo.setDw(body.getDw()); detailvo.setXmsl(getUFDoubleToBigDecimal(body.getCaninvoice_xmsl())); detailvo.setZkhhh(body.getZkhhh()); @@ -1596,10 +1609,10 @@ public class InvoiceTransferUtil { detailvo.setXmjshj(getUFDoubleToBigDecimal(body.getCaninvoice_xmjshj()).setScale(2, UFDouble.ROUND_HALF_UP)); detailvo.setSl(getUFDoubleToBigDecimal(body.getSl()).multiply(new BigDecimal(0.01))); // detailvo.setSe(getUFDoubleToBigDecimal(body.getSe()));//存在含税和不含税单价,统一交由税务云反算 - if(body.getSsflbm()!=null && body.getSsflbm().length()>0){ + if (body.getSsflbm() != null && body.getSsflbm().length() > 0) { // 传税收分类编码的开票 detailvo.setSpbm(body.getSsflbm()); - }else { + } else { detailvo.setSpbm(body.getSpbm()); } return detailvo; @@ -1636,15 +1649,16 @@ public class InvoiceTransferUtil { /** * 获取开票日期 + * * @param kprq 税务云传递过来的开票日期 * @return UFDate 转换后的开票日期 */ - public static UFDate getUFDate(String kprq){ - //日期为空或长度不对,直接取当前日期 - if(kprq != null && kprq.length() == 10) { + public static UFDate getUFDate(String kprq) { + // 日期为空或长度不对,直接取当前日期 + if (kprq != null && kprq.length() == 10) { return new UFDate(kprq); } - if (kprq == null || kprq.length() != 14){ + if (kprq == null || kprq.length() != 14) { return new UFDate(); } else { StringBuffer date = new StringBuffer(); @@ -1665,9 +1679,11 @@ public class InvoiceTransferUtil { public static UFDouble tranZeroAmount(UFDouble amount) { - if(amount==null) {return UFDouble.ZERO_DBL;} - amount = (amount.compareTo(UFDouble.ZERO_DBL)<0)?UFDouble.ZERO_DBL:amount; - if (amount.abs().compareTo(new UFDouble(0.005)) < 0){ + if (amount == null) { + return UFDouble.ZERO_DBL; + } + amount = (amount.compareTo(UFDouble.ZERO_DBL) < 0) ? UFDouble.ZERO_DBL : amount; + if (amount.abs().compareTo(new UFDouble(0.005)) < 0) { amount = UFDouble.ZERO_DBL; } return amount; @@ -1675,11 +1691,12 @@ public class InvoiceTransferUtil { /** * 把UFDate转换成yyyy-MM-dd格式 + * * @param ufDate * @return */ - public static String getFormatDate(UFDate ufDate){ - if(ufDate==null){ + public static String getFormatDate(UFDate ufDate) { + if (ufDate == null) { return null; } Date date = ufDate.toDate(); From 5c9050f00223660e6072c548aeb4bb0ee58ffb7a Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 16 Jun 2025 18:16:07 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=BC=80=E7=A5=A8=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=BC=A0=E7=A8=8E=E5=8A=A1=E4=BA=91=E5=A2=9E=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=9A=E6=95=B0=E7=94=B5=E5=8F=91=E7=A5=A8=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=98=BE=E7=A4=BA=E8=B4=AD=E9=94=80=E6=96=B9=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E7=94=B5=E8=AF=9D=E3=80=81=E6=95=B0=E7=94=B5=E5=8F=91?= =?UTF-8?q?=E7=A5=A8=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA=E8=B4=AD=E9=94=80?= =?UTF-8?q?=E6=96=B9=E9=93=B6=E8=A1=8C=E3=80=81=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/nc/dto/imag/invoice/PInvoice.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/imag/src/public/nc/dto/imag/invoice/PInvoice.java b/imag/src/public/nc/dto/imag/invoice/PInvoice.java index c02241f..134f2d4 100644 --- a/imag/src/public/nc/dto/imag/invoice/PInvoice.java +++ b/imag/src/public/nc/dto/imag/invoice/PInvoice.java @@ -248,6 +248,11 @@ public class PInvoice extends SuperVO implements Serializable ,IEncode{ private PInvoiceCepz[] cepzs; private PInvoiceTspz[] tspzs; + // 数电发票是否显示购销方地址电话 + private String einvoiceShowGxfDzDh; + + // 数电发票是否显示购销方银行、账号 + private String einvoiceShowGxfYhZh; public String getApplyNumber() { @@ -945,6 +950,22 @@ public class PInvoice extends SuperVO implements Serializable ,IEncode{ this.kqysssxbgglbm = kqysssxbgglbm; } + public String getEinvoiceShowGxfDzDh() { + return einvoiceShowGxfDzDh; + } + + public void setEinvoiceShowGxfDzDh(String einvoiceShowGxfDzDh) { + this.einvoiceShowGxfDzDh = einvoiceShowGxfDzDh; + } + + public String getEinvoiceShowGxfYhZh() { + return einvoiceShowGxfYhZh; + } + + public void setEinvoiceShowGxfYhZh(String einvoiceShowGxfYhZh) { + this.einvoiceShowGxfYhZh = einvoiceShowGxfYhZh; + } + @Override public String toString() { From 4a824b44f352eb5a0c735ad38b9fd2fa085e7428 Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 16 Jun 2025 18:43:05 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=94=B6=E6=AC=BE?= =?UTF-8?q?=E5=8D=95=E5=AF=B9=E5=BA=94=E7=9A=84=E5=88=B0=E8=B4=A6=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=9A=84=E7=94=9F=E6=88=90=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../private/nc/bs/pub/action/N_F2_DELETE.java | 62 ++++++ .../private/nc/bs/pub/action/N_F2_SAVE.java | 186 ++++++++++++++++++ .../nc/bs/arap/util/GatheringBillAfter.java | 58 ++++++ 3 files changed, 306 insertions(+) create mode 100644 arap/src/private/nc/bs/pub/action/N_F2_DELETE.java create mode 100644 arap/src/private/nc/bs/pub/action/N_F2_SAVE.java create mode 100644 arap/src/public/nc/bs/arap/util/GatheringBillAfter.java diff --git a/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java b/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java new file mode 100644 index 0000000..a8e5b60 --- /dev/null +++ b/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java @@ -0,0 +1,62 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package nc.bs.pub.action; + +import nc.bs.arap.actions.N_BASE_ACTION; +import nc.bs.arap.util.GatheringBillAfter; +import nc.bs.framework.common.NCLocator; +import nc.vo.arap.gathering.AggGatheringBillVO; +import nc.vo.arap.pub.ArapConstant; +import nc.vo.fipub.exception.ExceptionHandler; +import nc.vo.pub.BusinessException; +import nc.vo.pub.compiler.PfParameterVO; +import nccloud.pubitf.arap.arappub.IArapBillPubUtilService; + +import java.util.Hashtable; + +public class N_F2_DELETE extends N_BASE_ACTION { + private Hashtable m_keyHas = null; + + public N_F2_DELETE() { + } + + public Object runComClass(PfParameterVO paraVo) throws BusinessException { + try { + if (paraVo.m_preValueVos == null) { + return null; + } else { + Object obj = null; + super.m_tmpVo = paraVo; + String actionCode = ArapConstant.DELETE; + ((IArapBillPubUtilService) NCLocator.getInstance().lookup(IArapBillPubUtilService.class)).interceptorVaildator(paraVo.m_preValueVos, actionCode); + this.setParameter("context", paraVo.m_preValueVos); + obj = this.runClass("nc.bs.arap.actions.GatheringbillDeleteBatchBSAction", "deleteVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); + this.afterCheck(); + // 收款单删除后将对应的到账通知cmp_informer的生成状态generateflag修改为已生成hasnogenerate + AggGatheringBillVO[] aggVos = (AggGatheringBillVO[]) paraVo.m_preValueVos; + GatheringBillAfter.updateInformerGenerateFlag(aggVos, "hasnogenerate"); + return obj; + } + } catch (Exception ex) { + throw ExceptionHandler.handleException(this.getClass(), ex); + } + } + + public String getCodeRemark() { + return " arap action script not allowed to modify ,all rights reserved!"; + } + + protected void setParameter(String key, Object val) { + if (this.m_keyHas == null) { + this.m_keyHas = new Hashtable(); + } + + if (val != null) { + this.m_keyHas.put(key, val); + } + + } +} diff --git a/arap/src/private/nc/bs/pub/action/N_F2_SAVE.java b/arap/src/private/nc/bs/pub/action/N_F2_SAVE.java new file mode 100644 index 0000000..232f6ff --- /dev/null +++ b/arap/src/private/nc/bs/pub/action/N_F2_SAVE.java @@ -0,0 +1,186 @@ +package nc.bs.pub.action; + +import nc.bs.arap.actions.N_BASE_ACTION; +import nc.bs.arap.gatheringbp.GatherBillBO; +import nc.bs.arap.util.GatheringBillAfter; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Logger; +import nc.impl.pubapp.env.BSContext; +import nc.pubitf.so.m30.sobalance.ISoBalance4VerifyQryBill; +import nc.vo.arap.gathering.AggGatheringBillVO; +import nc.vo.arap.pub.ArapConstant; +import nc.vo.arap.pub.BillEnumCollection; +import nc.vo.arap.receivable.ReceivableBillItemVO; +import nc.vo.arap.utils.StringUtil; +import nc.vo.fi.pub.SqlUtils; +import nc.vo.fipub.exception.ExceptionHandler; +import nc.vo.ml.NCLangRes4VoTransl; +import nc.vo.pub.AggregatedValueObject; +import nc.vo.pub.BusinessException; +import nc.vo.pub.compiler.PfParameterVO; +import nc.vo.pub.lang.UFBoolean; +import nc.vo.pub.lang.UFDouble; +import nccloud.bs.arap.util.commit.ArapCommitUtil; +import nccloud.impl.platform.common.util.StringUtils; +import nccloud.pubitf.arap.arappub.IArapBillPubUtilService; + +import java.util.*; + + +public class N_F2_SAVE extends N_BASE_ACTION { + private Hashtable m_keyHas = null; + + + public String getCodeRemark() { + return " arap action script not allowed to modify ,all rights reserved!"; + } + + + public Object runComClass(PfParameterVO paraVo) throws BusinessException { + try { + super.m_tmpVo = paraVo; + Object obj = null; + setParameter("context", paraVo.m_preValueVos); + + if (paraVo.isCloudEntry) { + + String actionCode = ArapConstant.SAVE; + ((IArapBillPubUtilService) NCLocator.getInstance().lookup(IArapBillPubUtilService.class)).interceptorVaildator(paraVo.m_preValueVos, actionCode); + } + + + String code = InvocationInfoProxy.getInstance().getProperty(ArapConstant.NCCFlOW_PARAMTER); + if (!StringUtils.isEmpty(code)) { + String[] codes = code.split(","); + for (int i = 0; i < codes.length; i++) { + BSContext.getInstance().setSession(codes[i], UFBoolean.FALSE); + } + } + + this.beforeCheck(); + + AggregatedValueObject bill = (paraVo.m_preValueVo == null) ? paraVo.m_preValueVos[0] : paraVo.m_preValueVo; + if (bill != null && bill.getChildrenVO() != null && bill.getChildrenVO().length > 0 && bill.getChildrenVO()[0] != null) { + String pk_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("pk_billtype"); + String top_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("top_billtype"); + String src_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("src_billtype"); + + if ("F2".equals(pk_billtype) && "30".equals(src_billtype) && "F0".equals(top_billtype)) { + + Map f2mnyMap = new HashMap<>(); + Map f0mnyMap = new HashMap<>(); + + List orderIds = new ArrayList<>(); + List f0pks = new ArrayList<>(); + for (int i = 0; i < bill.getChildrenVO().length; i++) { + String src_billid = (String) bill.getChildrenVO()[i].getAttributeValue("src_billid"); + UFDouble money_bal = (UFDouble) bill.getChildrenVO()[i].getAttributeValue("money_bal"); + if (!StringUtil.isEmpty(src_billid)) { + orderIds.add((String) bill.getChildrenVO()[i].getAttributeValue("src_billid")); + } + if (f2mnyMap.get(src_billid) == null) { + f2mnyMap.put(src_billid, money_bal); + } else { + f2mnyMap.put(src_billid, ((UFDouble) f2mnyMap.get(src_billid)).add(money_bal)); + } + f0pks.add((String) bill.getChildrenVO()[i].getAttributeValue("top_billid")); + } + + String f0sql = SqlUtils.getInStr("pk_recbill", (String[]) f0pks.toArray(new String[0]), true); + + Collection foItemvos = (new BaseDAO()).retrieveByClause(ReceivableBillItemVO.class, f0sql); + for (ReceivableBillItemVO vo : foItemvos) { + String src_billid = (String) vo.getAttributeValue("src_billid"); + UFDouble money_bal = (UFDouble) vo.getAttributeValue("money_bal"); + if (f0mnyMap.get(src_billid) == null) { + f0mnyMap.put(src_billid, money_bal); + continue; + } + f0mnyMap.put(src_billid, ((UFDouble) f0mnyMap.get(src_billid)).add(money_bal)); + } + + + Map> soOrderIdTOF2ItemMnyMap = ((ISoBalance4VerifyQryBill) NCLocator.getInstance().lookup(ISoBalance4VerifyQryBill.class)).querySobalanceAccVerifyMnyMap((String[]) orderIds.toArray(new String[0])); + if (soOrderIdTOF2ItemMnyMap != null && soOrderIdTOF2ItemMnyMap.size() > 0) { + for (String order : orderIds) { + Map mnys = (Map) soOrderIdTOF2ItemMnyMap.get(order); + UFDouble summny = UFDouble.ZERO_DBL; + if (mnys == null || mnys.size() == 0) { + continue; + } + for (String key : mnys.keySet()) { + UFDouble mny = (mnys.get(key) == null) ? UFDouble.ZERO_DBL : (UFDouble) mnys.get(key); + summny = summny.add(mny); + } + if (f2mnyMap.get(order) == null) { + f2mnyMap.put(order, summny); + continue; + } + f2mnyMap.put(order, ((UFDouble) f2mnyMap.get(order)).add(summny)); + } + + + for (String order : orderIds) { + if (f0mnyMap.get(order) != null && f2mnyMap.get(order) != null && ((UFDouble) f2mnyMap.get(order)).abs().compareTo(((UFDouble) f0mnyMap.get(order)).abs()) > 0) { + throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("2006pub_0", "02006pub-1678")); + } + } + } + } + } + + + String primaryKey = paraVo.m_preValueVos[0].getParentVO().getPrimaryKey(); + + if (hasBill(primaryKey)) { + obj = runClass("nc.bs.arap.actions.GatheringbillEditSaveBatchBSAction", "updateVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); + } else { + + paraVo = approveStatusChange(paraVo); + obj = runClass("nc.bs.arap.actions.GatheringbillSaveBatchBSAction", "insertVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); + } + // 生成收款单后将对应的到账通知cmp_informer的生成状态generateflag修改为已生成hasgenerate + AggGatheringBillVO[] aggVos = (AggGatheringBillVO[]) paraVo.m_preValueVos; + GatheringBillAfter.updateInformerGenerateFlag(aggVos, "hasgenerate"); + + return (new ArapCommitUtil()).autoCommit(obj); + + } catch (Exception exception) { + throw ExceptionHandler.handleException(getClass(), exception); + } + } + + private boolean hasBill(String primaryKey) throws BusinessException { + boolean hasBill = false; + if (primaryKey != null) { + AggGatheringBillVO[] bvos = null; + try { + GatherBillBO payableBO = new GatherBillBO(); + bvos = payableBO.findBillByPrimaryKey(new String[]{primaryKey}); + } catch (Exception e) { + Logger.error(e.getMessage(), e); + } + if (bvos != null && bvos.length != 0 && bvos[0] != null) { + hasBill = true; + } + } + return hasBill; + } + + protected void setParameter(String key, Object val) { + if (this.m_keyHas == null) { + this.m_keyHas = new Hashtable(); + } + if (val != null) + this.m_keyHas.put(key, val); + } + + private PfParameterVO approveStatusChange(PfParameterVO paraVo) { + for (AggregatedValueObject vo : paraVo.m_preValueVos) { + vo.getParentVO().setAttributeValue("approvestatus", BillEnumCollection.ApproveStatus.NOSTATE.VALUE); + } + return paraVo; + } +} \ No newline at end of file diff --git a/arap/src/public/nc/bs/arap/util/GatheringBillAfter.java b/arap/src/public/nc/bs/arap/util/GatheringBillAfter.java new file mode 100644 index 0000000..01d40f6 --- /dev/null +++ b/arap/src/public/nc/bs/arap/util/GatheringBillAfter.java @@ -0,0 +1,58 @@ +package nc.bs.arap.util; + +import nc.bs.dao.BaseDAO; +import nc.bs.logging.Logger; +import nc.jdbc.framework.SQLParameter; +import nc.vo.arap.gathering.AggGatheringBillVO; +import nc.vo.arap.gathering.GatheringBillItemVO; +import nccloud.commons.lang.StringUtils; + +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * 更新到账通知的收款生成状态 + * + * @author mzr + * @date 2025/6/13 + */ +public class GatheringBillAfter { + + /** + * 更新收款单对应的到账通知 cmp_informer 的 generateflag 生成状态 + * + * @param aggVos 收款单vo数组 + * @param generateFlag 目标状态(例如 "hasgenerate" 或 "hasnogenerate") + */ + public static void updateInformerGenerateFlag(AggGatheringBillVO[] aggVos, String generateFlag) { + if (aggVos == null || aggVos.length == 0) { + return; // 参数为空时直接返回 + } + try { + Set codeSet = new LinkedHashSet<>(); + for (AggGatheringBillVO aggVo : aggVos) { + GatheringBillItemVO[] bvos = aggVo.getBodyVOs(); + for (GatheringBillItemVO bvo : bvos) { + String bankrelatedCode = bvo.getBankrelated_code(); + if (StringUtils.isNotEmpty(bankrelatedCode) && !"~".equals(bankrelatedCode)) { + codeSet.add(bankrelatedCode); + } + } + } + String[] codes = codeSet.toArray(new String[0]); + Logger.error("updateInformerGenerateFlag-codes = " + Arrays.toString(codes)); + if (codes.length == 0) { + return; + } + BaseDAO baseDAO = new BaseDAO(); + String inStr = SqlUtils.getInStr("bankrelated_code", codes, true); + String sql = "UPDATE cmp_informer SET generateflag = ? WHERE " + inStr; + SQLParameter params = new SQLParameter(); + params.addParam(generateFlag); + baseDAO.executeUpdate(sql, params); + } catch (Exception e) { + Logger.error("updateInformerGenerateFlag-exp:", e); + } + } +} From ae65961106bde7a9e1dcec852b97a4cad7957062 Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 16 Jun 2025 19:44:20 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix(so):=20=E4=BF=AE=E5=A4=8D=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=BC=80=E5=B7=A5=E6=97=A5=E6=9C=9F=E5=92=8C=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=AE=8C=E5=B7=A5=E6=97=A5=E6=9C=9F=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nccloud/api/impl/so/m30/APISaleOrderMaitainImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/so/src/private/nccloud/api/impl/so/m30/APISaleOrderMaitainImpl.java b/so/src/private/nccloud/api/impl/so/m30/APISaleOrderMaitainImpl.java index ff19762..4961923 100644 --- a/so/src/private/nccloud/api/impl/so/m30/APISaleOrderMaitainImpl.java +++ b/so/src/private/nccloud/api/impl/so/m30/APISaleOrderMaitainImpl.java @@ -719,10 +719,14 @@ public class APISaleOrderMaitainImpl implements IAPISaleOrderMaitain { targetBVO.setVbdef18(sourceBVO.getVbdef18()); // 是否定制 - targetBVO.setVbdef19(sourceBVO.getVbdef19()); // 计划开工日期 - targetBVO.setVbdef20(sourceBVO.getVbdef20()); // 计划完工日期 targetBVO.setVbdef14(sourceBVO.getVbdef14()); // 合同销售订单变更明细id targetBVO.setCrowno(sourceBVO.getCrowno()); // 行号 + if (StringUtils.isNotEmpty(sourceBVO.getVbdef19())) { + targetBVO.setVbdef19(sourceBVO.getVbdef19()); // 计划开工日期 + } + if (StringUtils.isNotEmpty(sourceBVO.getVbdef20())) { + targetBVO.setVbdef20(sourceBVO.getVbdef20()); // 计划完工日期 + } } From 74256580abba0649e5a4ad4d62f13149b35cd8ea Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 17 Jun 2025 09:31:35 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A5=E5=8F=A3-?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/public/nccloud/api/uapbd/msg/MsgResource.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java b/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java index 21c1c93..45c780d 100644 --- a/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java +++ b/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java @@ -32,12 +32,13 @@ import java.util.Date; */ @Path("uapbd/msg") public class MsgResource extends AbstractNCCRestResource { + private static final String DEFAULT_SENDER = "NC_USER0000000000000"; public String getModule() { return "uapbd"; } - private HYSuperDMO superDMO = null; + private HYSuperDMO superDMO; public HYSuperDMO getSuperDMO() { @@ -65,7 +66,7 @@ public class MsgResource extends AbstractNCCRestResource { // 根据传递的角色查询要发送消息的用户信息 UserVO[] userVOS = getUserByRole(roleId); - if (userVOS == null) { + if (userVOS == null || userVOS.length == 0) { return ResultMessageUtil.toJSON(false, "未查询到用户"); } @@ -87,7 +88,7 @@ public class MsgResource extends AbstractNCCRestResource { CommonMessageVO commonMessageVO = new CommonMessageVO(); commonMessageVO.setReceiver(users); commonMessageVO.setTitle("BOM变更信息通知"); - commonMessageVO.setSender("NC_USER0000000000000"); + commonMessageVO.setSender(DEFAULT_SENDER); commonMessageVO.setSendDataTime(new UFDateTime()); commonMessageVO.setPriority(1); commonMessageVO.setMessageContent(content); @@ -95,8 +96,8 @@ public class MsgResource extends AbstractNCCRestResource { PfMessageUtil.sendNoticeMessage(commonMessageVO); return ResultMessageUtil.toJSON(true, "消息发送成功"); - } catch (BusinessException e) { - Logger.error("MsgResource-exp:" + e.getMessage()); + } catch (Exception e) { + Logger.error("MsgResource-exp:", e); return ResultMessageUtil.exceptionToJSON(new BusinessException(e.getMessage(), e)); } } From e336bcb5285f13919c2a100b82d81c640229fe88 Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 17 Jun 2025 09:32:44 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E5=88=86=E9=85=8D?= =?UTF-8?q?=E7=BB=84=E7=BB=87=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseinfo/action/CustomerSaveAction.java | 231 ------------------ .../action/CustomerSaveAddAction.java | 158 ------------ .../kejian/AssignCustomerListener.java | 66 +++++ .../nc/bs/uapbd/util}/BaseOpenApiReq.java | 5 +- .../nc/bs/uapbd/util}/HttpClientWapper.java | 2 +- .../customer/AssignCustomerExtResource.java | 132 ++++++++++ 6 files changed, 201 insertions(+), 393 deletions(-) delete mode 100644 uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAction.java delete mode 100644 uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAddAction.java create mode 100644 uapbd/src/private/nccloud/api/uapbd/customer/tms/listener/kejian/AssignCustomerListener.java rename uapbd/src/{client/nccloud/web/uapbd/customer/baseinfo/action => public/nc/bs/uapbd/util}/BaseOpenApiReq.java (97%) rename uapbd/src/{client/nccloud/web/uapbd/customer/baseinfo/action => public/nc/bs/uapbd/util}/HttpClientWapper.java (98%) create mode 100644 uapbd/src/public/nccloud/api/uapbd/customermanage/customer/AssignCustomerExtResource.java diff --git a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAction.java b/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAction.java deleted file mode 100644 index e54b31e..0000000 --- a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAction.java +++ /dev/null @@ -1,231 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package nccloud.web.uapbd.customer.baseinfo.action; - -import com.alibaba.fastjson.JSONObject; -import nc.bs.dao.BaseDAO; -import nc.bs.framework.common.InvocationInfoProxy; -import nc.bs.uif2.LockFailedException; -import nc.bs.uif2.VersionConflictException; -import nc.itf.bd.cust.assign.ICustAssignService; -import nc.itf.bd.cust.baseinfo.ICustBaseInfoQueryService; -import nc.itf.bd.cust.baseinfo.ICustBaseInfoService; -import nc.itf.uap.IUAPQueryBS; -import nc.jdbc.framework.processor.MapProcessor; -import nc.uap.utils.ResHelper; -import nc.vo.bd.cust.*; -import nc.vo.bd.supplier.SupplierVO; -import nc.vo.ml.NCLangRes4VoTransl; -import nc.vo.org.OrgVO; -import nc.vo.pub.BusinessException; -import nc.vo.pub.SuperVO; -import nc.vo.pub.lang.UFDateTime; -import nccloud.commons.lang.StringUtils; -import nccloud.framework.core.exception.ExceptionUtils; -import nccloud.framework.service.ServiceLocator; -import nccloud.framework.web.action.itf.ICommonAction; -import nccloud.framework.web.container.IRequest; -import nccloud.framework.web.json.JsonFactory; -import nccloud.framework.web.processor.template.ExtBillCardConvertProcessor; -import nccloud.framework.web.ui.model.row.Row; -import nccloud.framework.web.ui.pattern.billcard.ExtSpecilAggBill; -import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCard; -import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCardOperator; -import nccloud.framework.web.ui.pattern.grid.Grid; -import nccloud.web.uapbd.customer.baseinfo.utils.CustSupExceptionHandle; -import nccloud.web.uapbd.customer.baseinfo.utils.CustomerExtendAggBill; -import nccloud.web.uapbd.customer.baseinfo.utils.CustomerResultMessage; -import nccloud.web.uapbd.customer.baseinfo.utils.CustomerService; -import nccloud.web.uapbd.supplier.supplier.action.SupplierCommonUtil; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.UndeclaredThrowableException; -import java.util.*; - -public class CustomerSaveAction implements ICommonAction { - public CustomerSaveAction() { - } - - public Object doAction(IRequest request) { - CustomerExtendAggBill fromJson = (CustomerExtendAggBill) JsonFactory.create().fromJson(request.read(), CustomerExtendAggBill.class); - ExtBillCard extspecilAggBill = fromJson.getExtspecilAggBill(); - String step = fromJson.getStep(); - boolean checkflag = fromJson.isCheckflag(); - boolean createVersion = fromJson.isCreateversion(); - String pagecode = fromJson.getPagecode(); - List exceptAreas = new ArrayList(); - exceptAreas.add("custAddress"); - exceptAreas.add("custBankaccbas"); - exceptAreas.add("10140LM"); - exceptAreas.add("customerassign_list"); - exceptAreas.add("cust_sale_simple"); - exceptAreas.add("cust_creditctl_simple"); - exceptAreas.add("cust_finance_simple"); - exceptAreas.add("customer_list_checkbyorg"); - exceptAreas.add("versionList"); - ExtBillCardConvertProcessor ebcp = new ExtBillCardConvertProcessor(exceptAreas); - ExtBillCardOperator ec = new ExtBillCardOperator(pagecode); - new CustomerResultMessage(); - ExtBillCard ebc = null; - ExtSpecilAggBill bill = (ExtSpecilAggBill) ebcp.fromExtBillCard(extspecilAggBill); - CustomerVO customerVO = (CustomerVO) bill.getHead(); - CustlinkmanVO[] custlikCustlinkmanVOs = (CustlinkmanVO[]) bill.getBodys(CustlinkmanVO.class); - CustCountrytaxesVO[] custCountrytaxesVOs = (CustCountrytaxesVO[]) bill.getBodys(CustCountrytaxesVO.class); - customerVO.setCustcontacts(custlikCustlinkmanVOs); - customerVO.setCusttaxtypes(custCountrytaxesVOs); - if ("2".equals(customerVO.getCalibrationstate()) && customerVO.getLatestcaltime() == null) { - customerVO.setLatestcaltime(new UFDateTime()); - } - - if (!SupplierCommonUtil.checkRegisterfund(customerVO.getRegisterfund())) { - ExceptionUtils.wrapBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("nccriauapbd0", "0nccriauapbd00466")); - } - - CustomerService cs = new CustomerService(); - - try { - if (StringUtils.isNotBlank(step) && "one".equals(step)) { - if (createVersion) { - customerVO = ((ICustBaseInfoService) ServiceLocator.find(ICustBaseInfoService.class)).createCustomerVersion(customerVO); - } else if (StringUtils.isNotBlank(customerVO.getPk_customer())) { - CustomerVO[] temp = ((ICustBaseInfoQueryService) ServiceLocator.find(ICustBaseInfoQueryService.class)).queryDataByPkSet(new String[]{customerVO.getPk_customer()}); - if (temp == null || temp.length == 0) { - ExceptionUtils.wrapException(new BusinessException("没有找到对应的客户信息")); - } - - customerVO = cs.updateCustomer(customerVO, checkflag); - } else { - if (customerVO.getCustcontacts() != null && customerVO.getCustcontacts().length > 0) { - for (CustlinkmanVO custlinkmanvo : customerVO.getCustcontacts()) { - custlinkmanvo.setPk_customer((String) null); - } - } - - if (customerVO.getCusttaxtypes() != null && customerVO.getCusttaxtypes().length > 0) { - for (CustCountrytaxesVO custCountrytaxesVO : customerVO.getCusttaxtypes()) { - custCountrytaxesVO.setPk_customer((String) null); - } - } - - if (fromJson.getCopy_pk_customer() != null) { - customerVO = cs.insertCustomerVO(customerVO, checkflag); - ((ICustAssignService) ServiceLocator.find(ICustAssignService.class)).copyCustomerAssignData(customerVO, fromJson.getCopy_pk_customer()); - } else { - customerVO = cs.insertCustomerVO(customerVO, checkflag); - } - } - } - - if (StringUtils.isNotBlank(step) && "two_yes".equals(step)) { - SupplierVO supplierVO = fromJson.getSupplierVO(); - if (StringUtils.isNotBlank(customerVO.getPk_customer())) { - customerVO = cs.updateCustomerAndRelaToSup(customerVO, supplierVO); - } else { - Map resultMap = cs.insertCustAndRelaToSup(customerVO, supplierVO); - customerVO = (CustomerVO) resultMap.get("customer"); - } - } - - if (StringUtils.isNotBlank(step) && "two_no".equals(step)) { - if (StringUtils.isNotBlank(customerVO.getPk_customer())) { - customerVO = cs.updateCustomer(customerVO, checkflag); - } else { - customerVO = cs.insertCustomerVO(customerVO, checkflag); - } - } - - bill.putvo(CustlinkmanVO.class, customerVO.getCustcontacts()); - customerVO.setCustcontacts((CustlinkmanVO[]) null); - bill.putvo(CustbankVO.class, customerVO.getCustbanks()); - customerVO.setCustbanks((CustbankVO[]) null); - bill.putvo(CustCountrytaxesVO.class, customerVO.getCusttaxtypes()); - customerVO.setCusttaxtypes((CustCountrytaxesVO[]) null); - bill.setHead(customerVO); - ec.setTransFlag(true); - ebc = ec.toCard(bill, exceptAreas); - Grid grid = ebc.getBody("custtaxtypes"); - if (grid != null) { - List listRows = grid.getModel().getListRows(); - Map executeQuery = null; - if (listRows != null && listRows.size() > 0) { - for (Row row : listRows) { - if (row.getCell("pk_taxes").getValue() != null) { - String value = row.getCell("pk_taxes").getValue().toString(); - executeQuery = (Map) ((IUAPQueryBS) ServiceLocator.find(IUAPQueryBS.class)).executeQuery("select custtaxesname from bd_custaxes where pk_custaxes = '" + value + "'", new MapProcessor()); - row.getCell("pk_taxes").setDisplay(executeQuery != null ? (String) executeQuery.get("custtaxesname") : ""); - } - } - } - } - // 自动分配组织 - /*String[] customerPks = {customerVO.getPk_customer()}; - OrgVO[] virtulaOrg = getVirtulaOrg(); - String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new); - ErrLogReturnValue errLogReturnValue = cs.getAssignService().assignCustomerByPks(customerPks, assignOrgPks, null); - Logger.error("CustomerSaveAction-errLogReturnValue = " + errLogReturnValue.getErrLogResult());*/ - assignOrgApi(customerVO); - } catch (Exception e) { - if (e instanceof UndeclaredThrowableException) { - Throwable undeclaredThrowable = ((UndeclaredThrowableException) e).getUndeclaredThrowable(); - InvocationTargetException ie = (InvocationTargetException) undeclaredThrowable; - Throwable targetException = ie.getTargetException(); - if (targetException instanceof CustSupBusiException) { - CustSupBusiException cuBusiException = (CustSupBusiException) targetException; - CustomerResultMessage crm = CustSupExceptionHandle.handleCustSupException(cuBusiException); - return crm; - } - - if (targetException instanceof VersionConflictException) { - VersionConflictException versionConflictException = (VersionConflictException) targetException; - Object busiObject = versionConflictException.getBusiObject(); - ExceptionUtils.wrapBusinessException(ResHelper.getString("nccriauapbd0", "0nccriauapbd00030")); - } else if (targetException instanceof LockFailedException) { - ExceptionUtils.wrapBusinessException(ResHelper.getString("nccriauapbd0", "0nccriauapbd00030")); - } else { - ExceptionUtils.wrapException(targetException); - } - } else { - ExceptionUtils.wrapException(e); - } - } - - return ebc; - } - - public void assignOrgApi(CustomerVO customerVO) throws BusinessException { - String[] customerPks = {customerVO.getCode()}; - OrgVO[] virtulaOrg = getVirtulaOrg(); - String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getCode).toArray(String[]::new); - JSONObject param = new JSONObject(); - JSONObject ufinterfaceJson = new JSONObject(); - JSONObject dataJson = new JSONObject(); - dataJson.put("customer", customerPks); - dataJson.put("org", assignOrgPks); - - ufinterfaceJson.put("sender", "default"); - ufinterfaceJson.put("data", dataJson); - param.put("ufinterface", ufinterfaceJson); - BaseOpenApiReq req = new BaseOpenApiReq(); - req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assign", param); - } - - /** - * 查询组织信息 - * - * @author mzr - * @date 2025/05/29 - */ - public OrgVO[] getVirtulaOrg() throws BusinessException { - String groupID = InvocationInfoProxy.getInstance().getGroupId(); - // NCCForUAPLogger.debug("groupID = " + groupID); - // enablestate 启用状态 isbusinessunit 是否业务单元数据 - String condition = "pk_group = '" + groupID + "' and ENABLESTATE = '2' and isbusinessunit='Y'"; - Collection collection = (new BaseDAO()).retrieveByClause(OrgVO.class, condition, "code"); - return collection.toArray(new OrgVO[0]); - } - - -} diff --git a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAddAction.java b/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAddAction.java deleted file mode 100644 index 8e5b1b2..0000000 --- a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/CustomerSaveAddAction.java +++ /dev/null @@ -1,158 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package nccloud.web.uapbd.customer.baseinfo.action; - -import com.alibaba.fastjson.JSONObject; -import nc.bs.dao.BaseDAO; -import nc.bs.framework.common.InvocationInfoProxy; -import nc.bs.logging.Logger; -import nc.itf.bd.cust.baseinfo.ICustBaseInfoService; -import nc.pub.billcode.itf.IBillcodeManage; -import nc.pub.billcode.vo.BillCodeContext; -import nc.vo.bd.cust.CustCountrytaxesVO; -import nc.vo.bd.cust.CustlinkmanVO; -import nc.vo.bd.cust.CustomerVO; -import nc.vo.bd.errorlog.ErrLogReturnValue; -import nc.vo.org.OrgVO; -import nc.vo.pub.BusinessException; -import nc.vo.pub.lang.UFBoolean; -import nc.vo.pub.lang.UFDateTime; -import nccloud.framework.core.exception.ExceptionUtils; -import nccloud.framework.web.action.itf.ICommonAction; -import nccloud.framework.web.container.IRequest; -import nccloud.framework.web.container.SessionContext; -import nccloud.framework.web.ui.pattern.billcard.ExtSpecilAggBill; -import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCard; -import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCardOperator; -import nccloud.web.uapbd.customer.baseinfo.utils.CustomerService; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public class CustomerSaveAddAction implements ICommonAction { - public CustomerSaveAddAction() { - } - - public Object doAction(IRequest request) { - ExtBillCardOperator ec = new ExtBillCardOperator(); - List exceptAreas = new ArrayList(); - exceptAreas.add("custAddress"); - exceptAreas.add("custBankaccbas"); - exceptAreas.add("10140LM"); - exceptAreas.add("customerassign_list"); - exceptAreas.add("cust_sale_simple"); - exceptAreas.add("cust_creditctl_simple"); - exceptAreas.add("cust_finance_simple"); - exceptAreas.add("customer_list_checkbyorg"); - ExtSpecilAggBill bill = (ExtSpecilAggBill) ec.toBill(request); - ExtBillCard ebc = null; - CustomerVO customerVO = (CustomerVO) bill.getHead(); - CustlinkmanVO[] custlikCustlinkmanVOs = (CustlinkmanVO[]) bill.getBodys(CustlinkmanVO.class); - CustCountrytaxesVO[] custCountrytaxesVOs = (CustCountrytaxesVO[]) bill.getBodys(CustCountrytaxesVO.class); - if (custlikCustlinkmanVOs != null && custlikCustlinkmanVOs.length > 0) { - for (CustlinkmanVO custlinkmanvo : custlikCustlinkmanVOs) { - custlinkmanvo.setPk_customer((String) null); - } - } - - if (custCountrytaxesVOs != null && custCountrytaxesVOs.length > 0) { - for (CustCountrytaxesVO custCountrytaxesVO : custCountrytaxesVOs) { - custCountrytaxesVO.setPk_customer((String) null); - } - } - - customerVO.setCustcontacts(custlikCustlinkmanVOs); - customerVO.setCusttaxtypes(custCountrytaxesVOs); - if ("2".equals(customerVO.getCalibrationstate()) && customerVO.getLatestcaltime() == null) { - customerVO.setLatestcaltime(new UFDateTime()); - } - - CustomerService cs = new CustomerService(); - ICustBaseInfoService getiCustBaseInfoService = cs.getiCustBaseInfoService(); - IBillcodeManage billcodeManage = cs.getBillcodeManage(); - String pk_group = SessionContext.getInstance().getClientInfo().getPk_group(); - String billcode = ""; - - try { - customerVO.setIssupplier(UFBoolean.FALSE); - customerVO.setCuststate(1); - customerVO.setFrozenflag(UFBoolean.FALSE); - customerVO.setIsfreecust(UFBoolean.FALSE); - customerVO.setPk_group(pk_group); - customerVO.setPk_org(pk_group); - customerVO = getiCustBaseInfoService.insertCustomerVO(customerVO, false); - CustomerVO saveAddRe = new CustomerVO(); - BillCodeContext billCodeContext = billcodeManage.getBillCodeContext("customer", pk_group, pk_group); - if (billCodeContext != null && billCodeContext.isPrecode()) { - billcode = billcodeManage.getPreBillCode_RequiresNew("customer", pk_group, pk_group); - } - - saveAddRe.setCode(billcode); - saveAddRe.setIssupplier(UFBoolean.FALSE); - saveAddRe.setCuststate(1); - saveAddRe.setFrozenflag(UFBoolean.FALSE); - saveAddRe.setPk_country("0001Z010000000079UJJ"); - saveAddRe.setPk_format("FMT0Z000000000000000"); - saveAddRe.setPk_timezone("0001Z010000000079U2P"); - saveAddRe.setIsfreecust(UFBoolean.FALSE); - saveAddRe.setPk_org(customerVO.getPk_org()); - saveAddRe.setPk_group(customerVO.getPk_group()); - bill.putvo(CustlinkmanVO.class, new CustlinkmanVO[0]); - bill.putvo(CustCountrytaxesVO.class, new CustCountrytaxesVO[0]); - bill.setHead(saveAddRe); - ebc = ec.toCard(bill, exceptAreas); - ec.setTransFlag(true); - ebc.setUserjson(billCodeContext == null ? "" : "" + billCodeContext.isEditable()); - - // 自动分配组织 - /*String[] customerPks = {customerVO.getPk_customer()}; - OrgVO[] virtulaOrg = getVirtulaOrg(); - String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new); - ErrLogReturnValue errLogReturnValue = cs.getAssignService().assignCustomerByPks(customerPks, assignOrgPks, null); - Logger.error("CustomerSaveAddAction-errLogReturnValue = " + errLogReturnValue.getErrLogResult());*/ - assignOrgApi(customerVO); - } catch (BusinessException e) { - ExceptionUtils.wrapException(e); - } - - return ebc; - } - - public void assignOrgApi(CustomerVO customerVO) throws BusinessException { - String[] customerPks = {customerVO.getCode()}; - OrgVO[] virtulaOrg = getVirtulaOrg(); - String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getCode).toArray(String[]::new); - JSONObject param = new JSONObject(); - JSONObject ufinterfaceJson = new JSONObject(); - JSONObject dataJson = new JSONObject(); - dataJson.put("customer", customerPks); - dataJson.put("org", assignOrgPks); - - ufinterfaceJson.put("sender", "default"); - ufinterfaceJson.put("data", dataJson); - param.put("ufinterface", ufinterfaceJson); - BaseOpenApiReq req = new BaseOpenApiReq(); - req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assign", param); - } - - /** - * 查询组织信息 - * - * @author mzr - * @date 2025/05/29 - */ - public OrgVO[] getVirtulaOrg() throws BusinessException { - String groupID = InvocationInfoProxy.getInstance().getGroupId(); - // NCCForUAPLogger.debug("groupID = " + groupID); - // enablestate 启用状态 isbusinessunit 是否业务单元数据 - String condition = "pk_group = '" + groupID + "' and ENABLESTATE = '2' and isbusinessunit='Y'"; - Collection collection = (new BaseDAO()).retrieveByClause(OrgVO.class, condition, "code"); - return collection.toArray(new OrgVO[0]); - } - -} diff --git a/uapbd/src/private/nccloud/api/uapbd/customer/tms/listener/kejian/AssignCustomerListener.java b/uapbd/src/private/nccloud/api/uapbd/customer/tms/listener/kejian/AssignCustomerListener.java new file mode 100644 index 0000000..e2fdd69 --- /dev/null +++ b/uapbd/src/private/nccloud/api/uapbd/customer/tms/listener/kejian/AssignCustomerListener.java @@ -0,0 +1,66 @@ +package nccloud.api.uapbd.customer.tms.listener.kejian; + +import com.alibaba.fastjson.JSONObject; +import nc.bs.bd.baseservice.ArrayClassConvertUtil; +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.businessevent.bd.BDCommonEvent; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.uapbd.util.BaseOpenApiReq; +import nc.vo.bd.cust.CustomerVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; + +import java.util.Arrays; +import java.util.Collection; + +/** + * 创建客户后,自动分配组织 + * + * @author mzr + * @date 2025/06/16 + */ +public class AssignCustomerListener implements IBusinessListener { + @Override + public void doAction(IBusinessEvent event) throws BusinessException { + BDCommonEvent e = (BDCommonEvent) event; + Object[] objs = e.getObjs(); + CustomerVO[] useVOs = ArrayClassConvertUtil.convert(objs, CustomerVO.class); + for (CustomerVO customerVO : useVOs) { + assignOrgApi(customerVO); + } + } + + public void assignOrgApi(CustomerVO customerVO) throws BusinessException { + String[] customerPks = {customerVO.getPk_customer()}; + OrgVO[] virtulaOrg = getVirtulaOrg(); + String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new); + JSONObject param = new JSONObject(); + JSONObject ufinterfaceJson = new JSONObject(); + JSONObject dataJson = new JSONObject(); + dataJson.put("customer", customerPks); + dataJson.put("org", assignOrgPks); + + ufinterfaceJson.put("sender", "default"); + ufinterfaceJson.put("data", dataJson); + param.put("ufinterface", ufinterfaceJson); + BaseOpenApiReq req = new BaseOpenApiReq(); + req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assignByPk", param); + } + + /** + * 查询组织信息 + * + * @author mzr + * @date 2025/05/29 + */ + public OrgVO[] getVirtulaOrg() throws BusinessException { + String groupID = InvocationInfoProxy.getInstance().getGroupId(); + // NCCForUAPLogger.debug("groupID = " + groupID); + // enablestate 启用状态 isbusinessunit 是否业务单元数据 + String condition = "pk_group = '" + groupID + "' and ENABLESTATE = '2' and isbusinessunit='Y'"; + Collection collection = (new BaseDAO()).retrieveByClause(OrgVO.class, condition, "code"); + return collection.toArray(new OrgVO[0]); + } +} diff --git a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/BaseOpenApiReq.java b/uapbd/src/public/nc/bs/uapbd/util/BaseOpenApiReq.java similarity index 97% rename from uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/BaseOpenApiReq.java rename to uapbd/src/public/nc/bs/uapbd/util/BaseOpenApiReq.java index ca91f5b..8e86ffb 100644 --- a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/BaseOpenApiReq.java +++ b/uapbd/src/public/nc/bs/uapbd/util/BaseOpenApiReq.java @@ -1,4 +1,4 @@ -package nccloud.web.uapbd.customer.baseinfo.action; +package nc.bs.uapbd.util; import com.alibaba.fastjson.JSONObject; @@ -7,7 +7,6 @@ import com.sm.misc.BASE64Encoder; import nc.bs.dao.DAOException; import nc.bs.logging.Logger; import nc.bs.trade.business.HYSuperDMO; -import nc.itf.arap.goldentax.SysParaInitQuery; import nc.vo.opm.thirdapp.ThirdappVO; import nc.ws.opm.pub.utils.security.SecurityUtil; import org.apache.commons.httpclient.Header; @@ -61,7 +60,7 @@ public class BaseOpenApiReq { if (apiInfo == null) { return; } - BASE_URL_DEV = SysParaInitQuery.getParaString("GLOBLE00000000000000", "GJBURL"); + // BASE_URL_DEV = SysParaInitQuery.getParaString("GLOBLE00000000000000", "GJBURL"); CLIENT_ID = apiInfo.getApp_id(); CLIENT_SECRET = apiInfo.getApp_secret(); PUBLIC_KEY = apiInfo.getPublic_key(); diff --git a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/HttpClientWapper.java b/uapbd/src/public/nc/bs/uapbd/util/HttpClientWapper.java similarity index 98% rename from uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/HttpClientWapper.java rename to uapbd/src/public/nc/bs/uapbd/util/HttpClientWapper.java index df61ca7..fb1111a 100644 --- a/uapbd/src/client/nccloud/web/uapbd/customer/baseinfo/action/HttpClientWapper.java +++ b/uapbd/src/public/nc/bs/uapbd/util/HttpClientWapper.java @@ -1,4 +1,4 @@ -package nccloud.web.uapbd.customer.baseinfo.action; +package nc.bs.uapbd.util; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; diff --git a/uapbd/src/public/nccloud/api/uapbd/customermanage/customer/AssignCustomerExtResource.java b/uapbd/src/public/nccloud/api/uapbd/customermanage/customer/AssignCustomerExtResource.java new file mode 100644 index 0000000..65f6e69 --- /dev/null +++ b/uapbd/src/public/nccloud/api/uapbd/customermanage/customer/AssignCustomerExtResource.java @@ -0,0 +1,132 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package nccloud.api.uapbd.customermanage.customer; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.framework.common.NCLocator; +import nc.itf.bd.cust.assign.ICustAssignService; +import nc.jdbc.framework.processor.ColumnListProcessor; +import nc.vo.pub.BusinessException; +import nccloud.api.rest.utils.ResultMessageUtil; +import nccloud.api.uapbd.common.utils.OpenApiPagenationUtils; +import nccloud.vo.sql.util.InSqlUtil; +import nccloud.ws.rest.resource.AbstractNCCRestResource; +import org.json.JSONString; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import java.util.List; + +@Path("uapbd/customermanageext/customer") +public class AssignCustomerExtResource extends AbstractNCCRestResource { + public AssignCustomerExtResource() { + } + + @POST + @Path("assign") + @Consumes({"application/json"}) + @Produces({"application/json"}) + public JSONString assign(JSONString json) { + JSONObject jObject = JSON.parseObject(json.toJSONString()); + if (jObject == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("JSONString:null")); + } else { + JSONObject object = jObject.getJSONObject("ufinterface"); + if (object == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("ufinterface:null")); + } else { + JSONObject data = object.getJSONObject("data"); + if (data == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("data:null")); + } else { + JSONArray customer = data.getJSONArray("customer"); + JSONArray org = data.getJSONArray("org"); + List customerList = OpenApiPagenationUtils.jSONArrayToList(customer); + List orgList = OpenApiPagenationUtils.jSONArrayToList(org); + if (customerList.size() == 0) { + return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数中客户编码为空,请确认传入参数!")); + } else if (orgList.size() == 0) { + return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数待分配组织编码为空,请确认传入参数!")); + } else { + String pk_group = InvocationInfoProxy.getInstance().getGroupId(); + String userid = InvocationInfoProxy.getInstance().getUserId(); + + try { + String[] customerPks = this.translateCustomers(customerList, pk_group); + String[] assignOrgPks = this.translateOrgPk(orgList, pk_group); + ((ICustAssignService) NCLocator.getInstance().lookup(ICustAssignService.class)).assignCustomerByPks(customerPks, assignOrgPks, (String[]) null); + return ResultMessageUtil.toJSON("客户分配成功!"); + } catch (BusinessException e) { + return ResultMessageUtil.exceptionToJSON(e); + } + } + } + } + } + } + + @POST + @Path("assignByPk") + @Consumes({"application/json"}) + @Produces({"application/json"}) + public JSONString assignByPk(JSONString json) { + JSONObject jObject = JSON.parseObject(json.toJSONString()); + if (jObject == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("JSONString:null")); + } else { + JSONObject object = jObject.getJSONObject("ufinterface"); + if (object == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("ufinterface:null")); + } else { + JSONObject data = object.getJSONObject("data"); + if (data == null) { + return ResultMessageUtil.exceptionToJSON(new NullPointerException("data:null")); + } else { + JSONArray customer = data.getJSONArray("customer"); + JSONArray org = data.getJSONArray("org"); + List customerList = OpenApiPagenationUtils.jSONArrayToList(customer); + List orgList = OpenApiPagenationUtils.jSONArrayToList(org); + if (customerList.size() == 0) { + return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数中客户编码为空,请确认传入参数!")); + } else if (orgList.size() == 0) { + return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数待分配组织编码为空,请确认传入参数!")); + } else { + try { + String[] customerPks = customerList.toArray(new String[0]); + String[] assignOrgPks = orgList.toArray(new String[0]); + ((ICustAssignService) NCLocator.getInstance().lookup(ICustAssignService.class)).assignCustomerByPks(customerPks, assignOrgPks, null); + return ResultMessageUtil.toJSON("客户分配成功!"); + } catch (BusinessException e) { + return ResultMessageUtil.exceptionToJSON(e); + } + } + } + } + } + } + + private String[] translateCustomers(List codes, String pk_group) throws BusinessException { + String sql = "select pk_customer from bd_customer where pk_group = '" + pk_group + "' and " + InSqlUtil.buildInSql("code", "or", "in", (String[]) codes.toArray(new String[0])); + List pks = (List) (new BaseDAO()).executeQuery(sql, new ColumnListProcessor()); + return pks != null && pks.size() > 0 ? (String[]) pks.toArray(new String[0]) : null; + } + + private String[] translateOrgPk(List codes, String pk_group) throws BusinessException { + String sql = "select pk_org from org_orgs where isbusinessunit = 'Y' and pk_group = '" + pk_group + "' and " + InSqlUtil.buildInSql("code", "or", "in", (String[]) codes.toArray(new String[0])); + List pks = (List) (new BaseDAO()).executeQuery(sql, new ColumnListProcessor()); + return pks != null && pks.size() > 0 ? (String[]) pks.toArray(new String[0]) : null; + } + + public String getModule() { + return "uapbd"; + } +} From d08a4b955fc574b0bd6017522cadd4885f127d05 Mon Sep 17 00:00:00 2001 From: maolei Date: Tue, 17 Jun 2025 09:59:44 +0800 Subject: [PATCH 9/9] =?UTF-8?q?mmpac=E6=B5=81=E7=A8=8B=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=AE=A2=E5=8D=95:=20=E5=A2=9E=E5=8A=A0=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=90=8C=E6=AD=A5=E5=88=B0MES=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 鏂板 shouldSyncToMes 鏂规硶鍒ゆ柇鏄惁闇瑕佸悓姝ュ埌MES绯荤粺 - 鏍规嵁婧愬ご鍗曟嵁绫诲瀷鍒ゆ柇鏄惁涓洪攢鍞鍗 - 濡傛灉鏄攢鍞鍗曪紝鑱旀煡閿鍞鍗曞瓙瀹炰綋 - 鍒ゆ柇閿鍞鍗曟槸鍚︽湁瀹氬埗鏍囪瘑 - 濡傛灉鏈夊畾鍒舵爣璇嗭紝妫鏌ュ伐鑹洪厤缃畬鎴愭椂闂存槸鍚︽湁鍊 - 濡傛灉鏃犲畾鍒舵爣璇嗭紝鍏佽鍚屾鍒癕ES - 濡傛灉鏈夊畾鍒舵爣璇嗕笖宸ヨ壓閰嶇疆瀹屾垚鏃堕棿鏈夊硷紝鍏佽鍚屾鍒癕ES- 濡傛灉鏈夊畾鍒舵爣璇嗕笖宸ヨ壓閰嶇疆瀹屾垚鏃堕棿涓虹┖锛屼笉鍏佽鍚屾鍒癕ES --- .../bp/rule/AfterApproveRuleSyncMes.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java index 84aa02e..a465c8f 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java @@ -7,6 +7,7 @@ import nc.bs.dao.BaseDAO; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.impl.pubapp.pattern.rule.IRule; +import nc.jdbc.framework.SQLParameter; import nc.jdbc.framework.processor.ColumnProcessor; import nc.vo.bc.pmpub.project.ProjectHeadVO; import nc.vo.bd.bom.bom0202.entity.BomVO; @@ -21,6 +22,7 @@ import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.scmpub.util.ArrayUtil; +import nc.vo.so.m30.entity.SaleOrderBVO; import nc.vo.vorg.DeptVersionVO; import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; @@ -202,6 +204,12 @@ public class AfterApproveRuleSyncMes implements IRule { String vbillcode = head.getVbillcode(); // 单据号 String itemRow = item.getVrowno(); // 行号 obmlog.info("开始为生产订单 " + vbillcode + " 行 " + itemRow + " 构建同步MES数据。"); + // 检查是否需要同步到MES系统 + if (!shouldSyncToMes(item)) { + obmlog.info("生产订单 " + vbillcode + " 行 " + itemRow + " 不满足同步条件,跳过同步到MES系统。"); + return; + } + // orderNo String 是 生产订单号+行号 vbillcode+itemRow String orderNoWithRow = vbillcode + itemRow; if (orderNoWithRow.length() > 18) { @@ -425,4 +433,80 @@ public class AfterApproveRuleSyncMes implements IRule { return field; } + /** + * 判断是否需要同步到MES系统 + * 业务逻辑: + * 1. 通过源头单据类型判断是否为销售订单(源头单据类型为30) + * 2. 如果是销售订单,需要联查销售订单子实体 + * 3. 判断销售订单是否有定制标识(vbdef18) + * 4. 如果有定制标识,需要检查工艺配置完成时间(vbdef17)是否有值 + * - 有值:传递给MES + * - 无值:不传递给MES + * 5. 如果无定制标识:传递给MES + * + * @param item 生产订单明细 + * @return true-需要同步,false-不需要同步 + * @throws BusinessException + */ + private boolean shouldSyncToMes(PMOItemVO item) throws BusinessException { + // 检查源头单据类型是否为销售订单(30) + if (!"30".equals(item.getVfirsttype())) { + // 非销售订单来源,直接同步 + obmlog.debug("生产订单明细行来源不是销售订单(源头单据类型:" + item.getVfirsttype() + "),允许同步。"); + return true; + } + + // 是销售订单来源,需要进一步检查 + String vfirstbid = item.getVfirstbid(); // 源头单据子表ID + if (StringUtils.isEmpty(vfirstbid)) { + obmlog.warn("生产订单明细行来源为销售订单,但源头单据子表ID为空,默认允许同步。"); + return true; + } + + try { + // 查询销售订单子实体的定制标识和工艺配置完成时间 + SqlBuilder sqlBuilder = new SqlBuilder(); + sqlBuilder.append(" SELECT vbdef18, vbdef17 "); + sqlBuilder.append(" FROM so_saleorder_b "); sqlBuilder.append(" WHERE csaleorderbid = ? "); + sqlBuilder.append(" AND dr = 0 "); + SQLParameter sqlParam = new SQLParameter(); + sqlParam.addParam(vfirstbid); + SaleOrderBVO saleOrderBVO = (SaleOrderBVO) dao.retrieveByPK(SaleOrderBVO.class, vfirstbid); + if (Objects.isNull(saleOrderBVO)) { + obmlog.warn("未查询到销售订单子实体信息(ID:" + vfirstbid + "),默认允许同步。"); + return true; + } + + String vbdef18 = saleOrderBVO.getVbdef18(); + String vbdef17 = saleOrderBVO.getVbdef17(); + + obmlog.debug("销售订单定制标识:" + vbdef18 + ",工艺配置完成时间:" + vbdef17); + + // 如果无定制标识,允许同步 + if (StringUtils.isEmpty(vbdef18)) { + obmlog.debug("销售订单无定制标识,允许同步。"); + return true; + } + + if ("N".equals(vbdef18)) { + obmlog.debug("销售订单定制标识为N,允许同步。"); + return true; + } + + // 有定制标识,检查工艺配置完成时间 + if (StringUtils.isEmpty(vbdef17)) { + obmlog.info("销售订单有定制标识但工艺配置完成时间为空,不允许同步。"); + return false; + } else { + obmlog.debug("销售订单有定制标识且工艺配置完成时间有值,允许同步。"); + return true; + } + + } catch (Exception e) { + obmlog.error("查询销售订单信息失败:" + e.getMessage(), e); + // 查询失败时,为了避免影响正常业务,默认允许同步 + throw new BusinessException("查询销售订单信息失败:" + e.getMessage()); + } + } + }