diff --git a/pu/src/private/nc/impl/pu/m21/action/OrderReviseApproveAction.java b/pu/src/private/nc/impl/pu/m21/action/OrderReviseApproveAction.java new file mode 100644 index 0000000..6b6b21a --- /dev/null +++ b/pu/src/private/nc/impl/pu/m21/action/OrderReviseApproveAction.java @@ -0,0 +1,985 @@ +package nc.impl.pu.m21.action; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import nc.bs.pu.m21.action.rule.approve.AfterApprovingSynchronizeRuleRZ; +import nc.bs.pu.m21.maintain.OrderReviseUpdateBP; +import nc.bs.pu.m21.maintain.rule.save.SaveTransferMsgRule; +import nc.bs.pu.m21.plugin.OrderPluginPoint; +import nc.bs.scmpub.rule.VOSagaFrozenValidateRule; +import nc.impl.pu.m21.action.rule.approve.ApproveM21AndRewriteCTPayPlan; +import nc.impl.pu.m21.action.rule.approve.FilterOrderByStatusRule; +import nc.impl.pu.m21.action.rule.approve.OrderPriceMaintainRule; +import nc.impl.pu.m21.action.rule.revise.ArrivalOpenCheckRule; +import nc.impl.pu.m21.action.rule.revise.BrefwhenreturnCheckRule; +import nc.impl.pu.m21.action.rule.revise.CheckBfinalcloseRule; +import nc.impl.pu.m21.action.rule.revise.CheckOverPay; +import nc.impl.pu.m21.action.rule.revise.InvoiceOpenCkeckRule; +import nc.impl.pu.m21.action.rule.revise.ItemChangeCheckRule; +import nc.impl.pu.m21.action.rule.revise.ItemRule; +import nc.impl.pu.m21.action.rule.revise.ModifyStatusOnWayRule; +import nc.impl.pu.m21.action.rule.revise.ModifySupplyRule; +import nc.impl.pu.m21.action.rule.revise.NnumCheckRule; +import nc.impl.pu.m21.action.rule.revise.OneContractCheckRule; +import nc.impl.pu.m21.action.rule.revise.OpenCheckRule; +import nc.impl.pu.m21.action.rule.revise.OrderPayPlanVOReviseRule; +import nc.impl.pu.m21.action.rule.revise.ReviseBudgetCtrlRule; +import nc.impl.pu.m21.action.rule.revise.ReviseNumCheckRule; +import nc.impl.pubapp.pattern.data.bill.tool.BillConcurrentTool; +import nc.impl.pubapp.pattern.database.DataAccessUtils; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.itf.pu.reference.ic.ATPServices; +import nc.vo.pu.m21.context.OrderContext; +import nc.vo.pu.m21.entity.OrderFeeVO; +import nc.vo.pu.m21.entity.OrderHeaderVO; +import nc.vo.pu.m21.entity.OrderItemVO; +import nc.vo.pu.m21.entity.OrderMatFeeVO; +import nc.vo.pu.m21.entity.OrderVO; +import nc.vo.pu.m21.enumeration.EnumActive; +import nc.vo.pu.m21.enumeration.EnumRevise; +import nc.vo.pu.m21.utils.ExtBillHasGrandsonDataUtils; +import nc.vo.pu.pub.constant.PUEntity; +import nc.vo.pu.pub.enumeration.POEnumBillStatus; +import nc.vo.pu.pub.rule.ApprovingEditCheckRule; +import nc.vo.pu.pub.rule.ApprovingEditSendMsgRule; +import nc.vo.pu.pub.util.BillQuery; +import nc.vo.pu.pub.util.BillUpdate; +import nc.vo.pub.BusinessException; +import nc.vo.pub.JavaType; +import nc.vo.pub.VOStatus; +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.pubapp.AppContext; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.tool.performance.DeepCloneTool; +import nc.vo.scmpub.res.billtype.POBillType; +import nc.vo.scmpub.util.ArrayUtil; +import nc.vo.scmpub.util.TimeUtils; +import nccloud.commons.lang.ArrayUtils; +import nccloud.pubimpl.pu.mobile.service.order.MobAfterReviseForPoOrderImpl; + +public class OrderReviseApproveAction { + /** + * 采购订单修订,审批通过后的交换主键执行更新的操作 + */ + public OrderVO[] approve(OrderVO[] orderVos, OrderContext ctx) { + if (ArrayUtils.isEmpty(orderVos)) { + return null; + } + // 取到client端vo +// OrderVO[] cliVOs = orderVos; +// BillTransferTool tool = new BillTransferTool(orderVos); + ExtBillHasGrandsonDataUtils tool = new ExtBillHasGrandsonDataUtils(orderVos); + DeepCloneTool clone = new DeepCloneTool(); + // BillTransferTool tool = new BillTransferTool(orderVos); + OrderVO[] cliVOs = (OrderVO[])clone.deepClone(orderVos);; + String approver = cliVOs[0].getHVO().getApprover(); + UFDate taudittime =cliVOs[0].getHVO().getTaudittime(); + Integer forderstatus = cliVOs[0].getHVO().getForderstatus(); + OrderVO[] voOrginal = tool.getOriginBills(); + // 通过pk_src查询出原始vo + OrderVO[] oldOrgVos = this.queryOldVosByNewVos(cliVOs); + if (ArrayUtils.isEmpty(oldOrgVos)) { + return null; + } + String creator = oldOrgVos[0].getHVO().getCreator(); // 创建人 + UFDateTime creationtime =oldOrgVos[0].getHVO().getCreationtime(); // 创建时间 + // 可用量更新前处理 + this.atpBeforeUpdate(oldOrgVos); + // 先查询原始版本vos,对vos加锁,再查询一遍,这时能保证完全锁住vos,获得的数据库vos是正确的 + BillConcurrentTool utilBill = new BillConcurrentTool(); + utilBill.lockBill(oldOrgVos); + oldOrgVos = this.queryOldVosByNewVos(cliVOs); + //获取原始版本的付款协议直接给最新版本使用 +// OrderPaymentVO[] paymentItem = oldOrgVos[0].getPaymentVO(); + cliVOs = this.setWriteBackNums(cliVOs, oldOrgVos); +// cliVOs = new BillUpdate().update(cliVOs, voOrginal); + // 提交时补充孙表 +// new FeeDetailVOUtils().setOrderMatFeeVO(cliVOs); +// new FeeDetailVOUtils().setOrderMatFeeVO(oldOrgVos); +// new FeeDetailVOUtils().setOrderMatFeeVO(voOrginal); + try{ + cliVOs = (OrderVO[])new BillUpdate().update(cliVOs,voOrginal,OrderHeaderVO.PK_ORDER); + }catch (BusinessException e){ + ExceptionUtils.wrappException(e); + } + Map hmap = new HashMap(); + Map bmap = new HashMap(); + OrderVO[] CliVOClone = new OrderVO[cliVOs.length]; + for (int i = 0; i < CliVOClone.length; i++) { + CliVOClone[i] = (OrderVO) cliVOs[i].clone(); + } + OrderVO[] OrgVoClone = new OrderVO[oldOrgVos.length]; + for (int i = 0; i < OrgVoClone.length; i++) { + OrgVoClone[i] = (OrderVO) oldOrgVos[i].clone(); + } + this.changePK(cliVOs,oldOrgVos, hmap,bmap); + OrderVO[] hisVOs =this.queryNewVosByOldVos(cliVOs); + OrderVO[] lastestVOs =this.queryNewVosByOldVos(oldOrgVos); +// // 提交时补充孙表 +// new FeeDetailVOUtils().setOrderMatFeeVO(lastestVOs); +// // 提交时补充孙表 +// new FeeDetailVOUtils().setOrderMatFeeVO(hisVOs); + OrgVoClone[0].getHVO().setForderstatus(lastestVOs[0].getHVO().getForderstatus()); + + // 交换cliVOs主键 + OrderVO[] newCliVO = this.changeClientVoWithPK(oldOrgVos, lastestVOs, hmap, + bmap,forderstatus,approver,taudittime,creator,creationtime); + // 交换oldOrgVos主键 此方法返回变量无用,先注掉 + OrderVO[] newOrgVos = this.changeoldOrgVosWithPK(hisVOs, cliVOs, hmap, + bmap); + // 更新OrgVO +// this.updateOrgVO(newOrgVos, CliVOClone); + // 更新clientVO + OrderVO[] retVOs = this.updateClientVO(newCliVO, OrgVoClone, ctx); + return retVOs; + } + + /** + * 方法功能描述:可用量更新前处理。后续会更新主键导致可用量数据不正确,在此提前处理 + *

+ * 参数说明 + *

+ * + * @since 6.0 + * @author wuxla + * @time 2010-7-2 下午01:24:05 + */ + private void atpBeforeUpdate(OrderVO[] vos) { + ATPServices.modifyATPBefore(POBillType.Order.getCode(), vos); + } + + private void changePK(OrderVO[] cliVOs,OrderVO[] oldOrgVos, Map hmap, Map bmap) { + DataAccessUtils d = new DataAccessUtils(); + List> datas = new ArrayList>(); + List> srcdatas = new ArrayList>(); + List> bdatas = new ArrayList>(); + List> srcbdatas = new ArrayList>(); + Map newkeyhmap = new HashMap(); + Map newkeybmap = new HashMap(); + // 费用项 + List> feeBdatas = new ArrayList>(); + List> feesrcBdatas = new ArrayList>(); + // 费用明细 + List> feeDetailBdatas = new ArrayList>(); + List> feeDetailsrcBdatas = new ArrayList>(); + + //简单记录 原始订单 表头主键 A-~ ,修订订单 表头主键B-A + //过程如下 三步 + //A-~, B-A + //A-~, C-A + //B-A, C-A + //B-A, A-A + //第一步 B-A,C-A + for (int i = 0; i < cliVOs.length; i++) { + // 头 + OrderHeaderVO voHead = cliVOs[i].getHVO(); + String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk + String newhpk ="1ZH" + pk_srcorder.substring(3); + hmap.put(pk_srcorder, voHead.getPk_order()); + newkeyhmap.put(pk_srcorder, newhpk); + datas = this.getForeignAddParam(datas, newhpk, voHead.getPk_order()); + + // 体 + OrderItemVO[] voBody = cliVOs[i].getBVO(); + for (OrderItemVO body : voBody) { + if (body.getPk_srcorder_b() != null) { + bmap.put(body.getPk_srcorder_b(), body.getPk_order_b()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String newbpk = "1ZH" + body.getPk_srcorder_b().substring(3); + newkeybmap.put(body.getPk_srcorder_b(), newbpk); + bdatas = this.getForeignAddParam(bdatas, newbpk, body.getPk_order_b()); + } + // 物料行对应费用明细 + OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVOs)){ + for (OrderMatFeeVO matFee : matFeeVOs) { + if (matFee.getPk_srcorder_bf() != null) { + bmap.put(matFee.getPk_srcorder_bf(), matFee.getPk_order_bf()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String newbpk = "1ZH" + matFee.getPk_order_bf().substring(3); + newkeybmap.put(matFee.getPk_srcorder_bf(), newbpk); + feeDetailBdatas = this.getForeignAddParam(feeDetailBdatas, newbpk, matFee.getPk_order_bf()); + } + } + } + } + // 费用项 + OrderFeeVO[] feeVos = cliVOs[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVos)){ + for (OrderFeeVO fee : feeVos) { + if (fee.getPk_srcorder_f() != null) { + bmap.put(fee.getPk_srcorder_f(), fee.getPk_order_f()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String newbpk = "1ZH" + fee.getPk_srcorder_f().substring(3); + newkeybmap.put(fee.getPk_srcorder_f(), newbpk); + feeBdatas = this.getForeignAddParam(feeBdatas, newbpk, fee.getPk_order_f()); + } + } + } + } + d.update(this.getSql(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas); + d.update(this.getSql(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas); + d.update(this.getSql(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas); +// if(feeBdatas.size() != 0){ + // 费用项 + d.update(this.getSql(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F), + new JavaType[] { + JavaType.String, JavaType.String + }, feeBdatas); + d.update(this.getSql(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas); +// } +// if(feeBdatas.size() != 0){ + // 费用明细 + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF), + new JavaType[] { + JavaType.String, JavaType.String + }, feeDetailBdatas); + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas); + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas); +// } + //第二步(1)A-~,A-A (2)A-A,B-A bmap key:A value:B newkeybmap:key:A value :C + List> datas2 = new ArrayList>(); + List> bdatas2 = new ArrayList>(); + List> feeDetailBdatas2 = new ArrayList>(); + List> feeBdatas2 = new ArrayList>(); + for (int i = 0; i < oldOrgVos.length; i++) { + // 头 + OrderHeaderVO voHead = oldOrgVos[i].getHVO(); + String pk_order = voHead.getPk_order(); + if (hmap.containsKey(pk_order)) { + srcdatas = this.getForeignAddParam(srcdatas, pk_order, pk_order); + + } + // 体 + OrderItemVO[] voBody = oldOrgVos[i].getBVO(); + for (OrderItemVO body : voBody) { + if (body.getPk_order_b() != null) { + if (bmap.containsKey(body.getPk_order_b())) { + srcbdatas= this.getForeignAddParam(srcbdatas, body.getPk_order_b(), body.getPk_order_b()); + } + } + // 费用明细 + OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVOs)){ + for(OrderMatFeeVO matFeeVO : matFeeVOs){ + if (matFeeVO.getPk_order_bf() != null) { + if (bmap.containsKey(matFeeVO.getPk_order_bf())) { + feeDetailsrcBdatas= this.getForeignAddParam(feeDetailsrcBdatas, matFeeVO.getPk_order_bf(), matFeeVO.getPk_order_bf()); + } + } + } + } + } + // 费用项 + OrderFeeVO[] feeVOS = oldOrgVos[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVOS)){ + for(OrderFeeVO feeVO : feeVOS){ + if (feeVO.getPk_order_f() != null) { + if (bmap.containsKey(feeVO.getPk_order_f())) { + feesrcBdatas= this.getForeignAddParam(feesrcBdatas, feeVO.getPk_order_f(), feeVO.getPk_order_f()); + } + } + } + } + } + d.update(this.getSqlForHisVO(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_SRCORDER,OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, srcdatas); + d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderItemVO.PK_SRCORDER_B,OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, srcbdatas); +// if(feesrcBdatas.size() != 0){ + // 费用项 + d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderFeeVO.PK_SRCORDER_F,OrderFeeVO.PK_ORDER_F), + new JavaType[] { + JavaType.String, JavaType.String + }, feesrcBdatas); +// } +// if(feeDetailsrcBdatas.size() != 0){ + // 费用明细 + d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_SRCORDER_BF,OrderMatFeeVO.PK_ORDER_BF), + new JavaType[] { + JavaType.String, JavaType.String + }, feeDetailsrcBdatas); +// } + // A-A ,B-A + for (int i = 0; i < oldOrgVos.length; i++) { + // 头 + OrderHeaderVO voHead = oldOrgVos[i].getHVO(); + String pk_order = voHead.getPk_order(); + String pk_src_order = null; + if (hmap.containsKey(pk_order)) { + pk_src_order = hmap.get(pk_order); + datas2 = this.getForeignAddParam(datas2, pk_src_order, pk_order); + } + // 体 + OrderItemVO[] voBody = oldOrgVos[i].getBVO(); + for (OrderItemVO body : voBody) { + if (body.getPk_order_b() != null) { + if (bmap.containsKey(body.getPk_order_b())) { + String pk_src_order_b = bmap.get(body.getPk_order_b()); + bdatas2 = this.getForeignAddParam(bdatas2, pk_src_order_b, body.getPk_order_b()); + } + } + // 费用明细 + OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVOs)) { + for(OrderMatFeeVO matFeeVO : matFeeVOs){ + if (matFeeVO.getPk_order_bf() != null) { + if (bmap.containsKey(matFeeVO.getPk_order_bf())) { + String pk_src_order_bf = bmap.get(matFeeVO.getPk_order_bf()); + feeDetailBdatas2 = this.getForeignAddParam(feeDetailBdatas2, pk_src_order_bf, matFeeVO.getPk_order_bf()); + } + } + } + } + } + // 费用项 + OrderFeeVO[] feeVOS = oldOrgVos[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVOS)) { + for(OrderFeeVO fee : feeVOS){ + if (fee.getPk_order_f() != null) { + if (bmap.containsKey(fee.getPk_order_f())) { + String pk_src_order_bf = bmap.get(fee.getPk_order_f()); + feeBdatas2 = this.getForeignAddParam(feeBdatas2, pk_src_order_bf, fee.getPk_order_f()); + } + } + } + } + } + d.update(this.getSqlForHisVO(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas2); + d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B,OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas2); + d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas2); + +// if(feeBdatas2.size() != 0){ + // 费用项 + d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F,OrderFeeVO.PK_ORDER_F), + new JavaType[] { + JavaType.String, JavaType.String + }, feeBdatas2); + d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas2); +// } +// if(feeDetailBdatas2.size() != 0){ + // 费用明细 + d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF,OrderMatFeeVO.PK_ORDER_BF), + new JavaType[] { + JavaType.String, JavaType.String + }, feeDetailBdatas2); + d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas2); + d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B,OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas2); +// } + //第三步C-A,A-A + List> datas3 = new ArrayList>(); + List> bdatas3 = new ArrayList>(); + List> feeDetailBdatas3 = new ArrayList>(); + List> feeBdatas3 = new ArrayList>(); + for (int i = 0; i < cliVOs.length; i++) { + // 头 + OrderHeaderVO voHead = cliVOs[i].getHVO(); + String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk + String needchangedhkey = newkeyhmap.get(pk_srcorder); + datas3 = this.getForeignAddParam(datas3, pk_srcorder, needchangedhkey); + // 体 + OrderItemVO[] voBody = cliVOs[i].getBVO(); + for (OrderItemVO body : voBody) { + if (body.getPk_srcorder_b() != null) { + bmap.put(body.getPk_srcorder_b(), body.getPk_order_b()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String needchangedbkey = newkeybmap.get(body.getPk_srcorder_b()); + bdatas3 = this.getForeignAddParam(bdatas3, body.getPk_srcorder_b(), needchangedbkey); + + } + // 费用明细 + OrderMatFeeVO[] matFeeVOS = body.getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVOS)){ + for(OrderMatFeeVO matFee : matFeeVOS){ + if (matFee.getPk_srcorder_bf() != null) { + bmap.put(matFee.getPk_srcorder_bf(), matFee.getPk_order_bf()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String needchangedbfeekey = newkeybmap.get(matFee.getPk_srcorder_bf()); + feeDetailBdatas3 = this.getForeignAddParam(feeDetailBdatas3, matFee.getPk_srcorder_bf(), needchangedbfeekey); + } + } + } + } + // 费用项 + OrderFeeVO[] feeVOS = cliVOs[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVOS)){ + for(OrderFeeVO fee : feeVOS){ + if (fee.getPk_srcorder_f() != null) { + bmap.put(fee.getPk_srcorder_f(), fee.getPk_order_f()); +// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键,这里需要注意,可能存在修订增行的场景,导致pk_srcorder_b为空,所以这里需要判断一下 + String needchangedbfeedetailkey = newkeybmap.get(fee.getPk_srcorder_f()); + feeBdatas3 = this.getForeignAddParam(feeBdatas3, fee.getPk_srcorder_f(), needchangedbfeedetailkey); + } + } + } + } + d.update(this.getSql(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas3); + d.update(this.getSql(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas3); + d.update(this.getSql(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas3); +// if(feeBdatas3.size() != 0){ + // 费用项 + d.update(this.getSql(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F), + new JavaType[] { + JavaType.String, JavaType.String + }, feeBdatas3); + d.update(this.getSql(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas3); +// } +// if(feeDetailBdatas3.size() != 0){ + // 费用明细 + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF), + new JavaType[] { + JavaType.String, JavaType.String + }, feeDetailBdatas3); + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER), + new JavaType[] { + JavaType.String, JavaType.String + }, datas3); + d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B), + new JavaType[] { + JavaType.String, JavaType.String + }, bdatas3); +// } +// return cliVOs; + } + + /** + * 更新OrgVO + * @param newOrgVos + * @param cliVOs + */ + private OrderVO[] updateOrgVO(OrderVO[] newOrgVos, OrderVO[] cliVOs) { + OrderVO[] retVOs = null; + try{ + retVOs = (OrderVO[])new BillUpdate().update(newOrgVos,cliVOs,OrderHeaderVO.PK_ORDER); + }catch (BusinessException e){ + ExceptionUtils.wrappException(e); + } + return retVOs; + } + + /** + * 更新clientVO + * @param newCliVO + * @param oldOrgVos + * @param ctx + */ + private OrderVO[] updateClientVO(OrderVO[] newCliVO, OrderVO[] oldOrgVos, + OrderContext ctx) { + if (ArrayUtils.isEmpty(newCliVO)) { + return null; + } + // 特殊处理 + // 前台差异处理时,因为界面没有付款计划,所以将其设置为删除 + // 设置成不变 +// this.setPayPlanStatus(newCliVO); + // 规则 + CompareAroundProcesser processer = new CompareAroundProcesser( + OrderPluginPoint.REVISE); + this.addBeforeRule(processer); + this.addAfterRule(processer, ctx); + + // 执行最新版的采购订单保存 + processer.before(newCliVO, oldOrgVos); + OrderVO[] retVOs = new OrderReviseUpdateBP(ctx).update(newCliVO, oldOrgVos); + + processer.after(retVOs, oldOrgVos); + return retVOs; + + } + +// private void setPayPlanStatus(OrderVO[] voSaved) { +// +// for (OrderVO vo : voSaved) { +// ISuperVO[] vos = vo.getChildren(PayPlanVO.class); +// if (ArrayUtils.isEmpty(vos)) { +// continue; +// } +// PayPlanVO[] payplanVOs = ArrayUtil.convertArrayType(vos); +// for (PayPlanVO payplanVO : payplanVOs) { +// payplanVO.setStatus(VOStatus.UNCHANGED); +// } +// } +// } + + /** + * 方法功能描述:保存前规则 + *

+ * 参数说明 + * + * @param processer + *

+ * @since 6.0 + * @author wuxla + * @time 2010-3-26 下午06:41:24 + */ + private void addBeforeRule(CompareAroundProcesser processer) { + // 冻结状态校验 add by CONGKE for NCCNATIVE 2019-11-21 + processer.addBeforeRule(new VOSagaFrozenValidateRule(true)); + //新增加一个前规则,用来判断订单是否最终关闭,如果已经最终关闭,不允许修订add by zhanghrh 2021.9.22 + processer.addBeforeRule(new CheckBfinalcloseRule()); + // 参数合法性检查 + processer.addBeforeRule(new ItemRule()); + processer.addBeforeRule(new NnumCheckRule()); + + // 表头退货(库)基于原订单补货检查,有后续单据不允许修改退货/库基于原订单补货字段 + processer.addBeforeRule(new BrefwhenreturnCheckRule()); + + // 表体不能改变项检查有后续单据,表体批次号、需求部门、项目、收货仓库、收货地址、赠品不能修改 + processer.addBeforeRule(new ItemChangeCheckRule()); + + // 合同检查,修订前单据来自同一个合同,则不能将订单改为来自多个合同的订单 + processer.addBeforeRule(new OneContractCheckRule()); + + // 支持审批中修改(修订)的单据,检查是否应该由当前审批人修改(修订) + processer.addBeforeFinalRule( + new ApprovingEditCheckRule(POBillType.Order)); + + // 支持审批中修改(修订)的单据,后台向所有已经处理过审批任务的人发送消息 + processer.addBeforeFinalRule(new ApprovingEditSendMsgRule()); + + // 移动端修订数量合法性检查 add by hanxqm 2019年6月22日 16点06分 + //processer.addBeforeFinalRule(new MobBeforeReviseForPoOrderImpl()); + + // 校验修订后金额是否超过累计付款金额 + processer.addBeforeFinalRule(new CheckOverPay()); + + } + + /** + * 方法功能描述:保存后规则 + *

+ * 参数说明 + * + * @param processer + *

+ * @since 6.0 + * @author wuxla + * @time 2010-3-26 下午06:41:30 + */ + private void addAfterRule(CompareAroundProcesser processer, + OrderContext ctx) { + // 修订数量合法性检查,修订后的数量与原数量同正负,且不能小于后续数量 + processer.addAfterRule( + new ReviseNumCheckRule(ctx.getReviseToleranceConfirm().booleanValue())); + // 只处理审批后的数据(因审批中修订会有未审批通过的数据过来) + processer.addAfterRule( + new FilterOrderByStatusRule(POEnumBillStatus.APPROVE.toInt())); + processer.addAfterRule(new ModifySupplyRule()); + processer.addAfterRule(new ReviseBudgetCtrlRule()); + // 修改在途状态表中数据 + processer.addAfterRule(new ModifyStatusOnWayRule()); + // 更新价格表 + processer.addAfterRule(new OrderPriceMaintainRule()); + + // ncm add by zhangllb 20170519 采购订单修订时更新订单付款计划 + // processer.addAfterRule(new OrderPayPlanReviseRule()); + // 采购订单修订更新采购订单付款计划 add by yinliangc 20220312 + processer.addAfterRule(new OrderPayPlanVOReviseRule()); + // 移动端向供应商发送通知消息 zhaofengt 2019/7/30 + processer.addAfterRule(new MobAfterReviseForPoOrderImpl()); + // 判断是否自动到货打开 + processer.addAfterRule(new ArrivalOpenCheckRule()); + // 判断是否自动入库打开 + processer.addAfterRule(new OpenCheckRule()); + // 判断是否自动开票打开 + processer.addAfterRule(new InvoiceOpenCkeckRule()); + // 采购订单修订审批回写采购合同付款计划 + processer.addAfterFinalRule(new ApproveM21AndRewriteCTPayPlan()); + // 调用内部交易信息 + processer.addAfterRule(new SaveTransferMsgRule()); + + // 采购订单审批后同步到锐制系统 + processer.addAfterFinalRule(new AfterApprovingSynchronizeRuleRZ()); + + } + + /** + * 得到交换主键最新oldOrgVos + * + * @param oldOrgVos + * @return + */ + private OrderVO[] changeoldOrgVosWithPK(OrderVO[] oldOrgVos, OrderVO[] cliVOs, + Map hmap, Map bmap) { + UFDate correctdate = TimeUtils.getsrvBaseDate(); + OrderVO[] cloneVos = new OrderVO[oldOrgVos.length]; + // 交换oldOrgVos的pk + for (int i = 0; i < oldOrgVos.length; i++) { + cloneVos[i] = (OrderVO) oldOrgVos[i].clone(); + // 头 + OrderHeaderVO voHead = oldOrgVos[i].getHVO(); + voHead.setStatus(VOStatus.UPDATED); + voHead.setBislatest(UFBoolean.FALSE); + voHead.setBisReviseLatest(UFBoolean.FALSE); + voHead.setRevisionStatus(Integer.valueOf(EnumRevise.REVISE.toIntValue())); + // 体 + OrderItemVO[] voItems = oldOrgVos[i].getBVO(); + for (int j = 0; j < voItems.length; ++j) { + //设置修订人员和日期 + voItems[j].setDcorrectdate(correctdate); + voItems[j].setChandler(cliVOs[i].getHVO().getCrevisepsn()); + //设置历史数据 + voItems[j].setFisactive((Integer) EnumActive.REVISEHISTORY.value()); + voItems[j].setStatus(VOStatus.UPDATED); + // 费用明细 + OrderMatFeeVO[] matFeeVO = voItems[j].getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVO)){ + for(OrderMatFeeVO matFee : matFeeVO){ + matFee.setStatus(VOStatus.UPDATED); + } + } + } + // 费用项 + OrderFeeVO[] feeVO = oldOrgVos[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVO)){ + for(OrderFeeVO fee : feeVO){ + fee.setStatus(VOStatus.UPDATED); + } + } + /* + * add by wandl 清空付款协议,付款计划主键,修订含有付款协议的订单会报违反唯一约束! + */ +// OrderPaymentVO[] paymentItem = newOrgVos[i].getPaymentVO(); +// for (OrderPaymentVO payment : paymentItem) { +//// payment.setPk_payment(null); +// payment.setStatus(VOStatus.DELETED); +// } + +// PayPlanVO[] payplanItem = (PayPlanVO[])newOrgVos[i].getChildren(PayPlanVO.class); +// for (PayPlanVO payplan : payplanItem) { +//// payplan.setPk_order_payplan(null); +// payplan.setStatus(VOStatus.DELETED); +// } + } + OrderVO[] retVO =this.updateOrgVO(oldOrgVos, cloneVos); + /** + * 注意付款协议表体 + */ + return retVO; + + } + + /** + * 得到交换主键最新cliVOs + * + * @param cliVOs + * @param forderstatus + * @param taudittime + * @param approver + */ + private OrderVO[] changeClientVoWithPK(OrderVO[] oldOrgVos, OrderVO[] cliVOs, + Map hmap, Map bmap, Integer forderstatus, + String approver, UFDate taudittime, String creator,UFDateTime creationtime) { + OrderVO[] cloneVos =new OrderVO[cliVOs.length]; + // 交换newCliVO的pk + for (int i = 0; i < cliVOs.length; i++) { + cloneVos[i] = (OrderVO) cliVOs[i].clone(); + // 头 + OrderHeaderVO voHead = cliVOs[i].getHVO(); + voHead.setStatus(VOStatus.UPDATED); + voHead.setForderstatus(forderstatus); + voHead.setApprover(approver); + voHead.setTaudittime(taudittime); + voHead.setCreator(creator); + voHead.setCreationtime(creationtime); + voHead.setModifier(AppContext.getInstance().getPkUser()); + voHead.setModifiedtime(AppContext.getInstance().getServerTime()); +// String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk +// hmap.put(pk_srcorder, voHead.getPk_order()); +// voHead.setPk_order(pk_srcorder);// 将原始版本pk赋值给表头主键 + voHead.setBislatest(UFBoolean.TRUE);// 设置为最新版本 + voHead.setBisReviseLatest(UFBoolean.TRUE);//设置修订可见最新版本 + voHead.setRevisionStatus(Integer.valueOf(EnumRevise.SIMPLE.toIntValue()));// 将修订状态置为普通,避免在采购订单维护节点收回的单据,还会走采购订单修订的审批流 + // 体 + OrderItemVO[] voBody = cliVOs[i].getBVO(); + for (OrderItemVO body : voBody) { +// body.setPk_order(pk_srcorder);// 将表体存放的表头主键也替换为原始版本pk + body.setStatus(VOStatus.UPDATED); + // 费用明细 + OrderMatFeeVO[] matFeeVO = body.getGrandSonVOS(); + if(!ArrayUtil.isEmpty(matFeeVO)){ + for(OrderMatFeeVO matFee : matFeeVO){ + matFee.setStatus(VOStatus.UPDATED); + } + } + } + // 费用项 + OrderFeeVO[] feeVO = cliVOs[i].getOrderFeeVO(); + if(!ArrayUtil.isEmpty(feeVO)){ + for(OrderFeeVO fee : feeVO){ + fee.setStatus(VOStatus.UPDATED); + } + } + /* + * clintVO在修订保存的时候清空了付款协议,和付款计划。在这补回来 + */ + //付款协议 +// OrderPaymentVO[] paymentItemcliVOs = newCliVO[i].getPaymentVO(); +// OrderPaymentVO[] paymentItemOrgVos = oldOrgVos[i].getPaymentVO(); +// for (int j = 0; j < paymentItemcliVOs.length; j++) { +// paymentItemcliVOs[j] +// .setPk_payment(paymentItemOrgVos[j].getPk_payment()); +// paymentItemcliVOs[j].setStatus(VOStatus.UPDATED); +// } + //付款计划 +// PayPlanVO[] payplanItemcliVOs = (PayPlanVO[]) newCliVO[i].getChildren(PayPlanVO.class); +// PayPlanVO[] payplanItemOrgVos = (PayPlanVO[]) oldOrgVos[i].getChildren(PayPlanVO.class); +// for(int k =0 ; k(OrderVO.class).query(ids); + return hisVos; + } + + /** + * 根据新版本VO数组查询原始版本VO数组 + * + * @param newVos + * @since dev1.0 + * @author zhanghrh + * @time 2021-6-9 下午04:39:00 + */ + private OrderVO[] queryNewVosByOldVos(OrderVO[] newVos) { + String[] ids = new String[newVos.length]; + for (int i = 0; i < newVos.length; i++) { + ids[i] = newVos[i].getHVO().getPk_order(); + } + OrderVO[] hisVos = new BillQuery(OrderVO.class).query(ids); + return hisVos; + } + + + /** + * 记录初始VO上所有下游回写订单的字段 + * + * @param newVos + * @since dev1.0 + * @author zhanghrh + * @time 2021-6-9 下午04:39:00 + */ + private OrderVO[] setWriteBackNums(OrderVO[] newVos,OrderVO[] oldVos) { + Map hmap = new HashMap(); + Map bmap = new HashMap(); + Map hmapString = new HashMap(); + Map bmapString = new HashMap(); + Map bmapUFDate = new HashMap(); + + //遍历原始VO记录累计回写字段 + for(OrderVO oldVo: oldVos) { + UFDouble[] hfiles = new UFDouble[3]; + String[] hfilesString =new String[1]; + OrderHeaderVO hvo =oldVo.getHVO(); + //UFDouble类型 + hfiles[0]=hvo.getNaccpayreqmny();//累计付款申请金额 + hfiles[1]=hvo.getNaccpaymny();//累计付款金额 + hfiles[2]=hvo.getNinvoicemny();//累计开票金额 + hmap.put(hvo.getPk_order(), hfiles); + //String类型 + hfilesString[0] = hvo.getVcoopordercode();//对方订单号 + hmapString.put(hvo.getPk_order(), hfilesString); + OrderItemVO bvos[] = oldVo.getBVO(); + for(OrderItemVO bvo: bvos) { + UFDouble[] bfiles = new UFDouble[17]; + String[] bfilesString =new String[2]; + UFDate[] bfilesUFDate =new UFDate[2]; + //UFDouble类型 + bfiles[0] = bvo.getNacccancelinvmny();//累计已核销开票金额 + bfiles[1] = bvo.getNaccumarrvnum();//累计到货主数量 + bfiles[2] = bvo.getNaccumdevnum();//累计运输主数量 + bfiles[3] = bvo.getNaccuminvoicemny();//累计本币开票金额 + bfiles[4] = bvo.getNaccuminvoicenum();//累计开票主数量 + bfiles[5] = bvo.getNaccumpickupnum();//累计拣货主数量 + bfiles[6] = bvo.getNaccumrpnum();//累计到货计划主数量 + bfiles[7] = bvo.getNaccumstorenum();//累计入库主数量 + bfiles[8] = bvo.getNaccumwastnum();//累计途耗主数量 + bfiles[9] = bvo.getNbackarrvnum();//累计退货主数量 + bfiles[10] = bvo.getNbackstorenum();//累计退库主数量 + bfiles[11] = bvo.getNfeemny();//费用累计开票金额 + bfiles[12] = bvo.getNconfirmnum();//确认数量 + bfiles[13] = bvo.getNsuprsnum();//被预留数量 + bfiles[14] = bvo.getNsendplannum();//送货计划数量 + bfiles[15] = bvo.getNaccpaymny();//累计付款金额 + bfiles[16] = bvo.getNaccpayreqmny();//累计付款申请金额 + + bmap.put(bvo.getPk_order_b(), bfiles); + //String类型 + bfilesString[0] = bvo.getVvendorordercode();//对方订单号 + bfilesString[1] = bvo.getVvendororderrow();//对方订单行号 +// bfilesString[2] = bvo.getPk_schedule();//排程计划 +// bfilesString[3] = bvo.getPk_schedule_b();//排程计划明细 + bmapString.put(bvo.getPk_order_b(), bfilesString); + //UFDate类型 + bfilesUFDate[0] = bvo.getDconfirmdate();//确认日期 + bfilesUFDate[1] = bvo.getDcorrectdate();//修正日期 + bmapUFDate.put(bvo.getPk_order_b(), bfilesUFDate); + } + } + //遍历前端传来的VO,把累计回写字段按pk_src=pk 设置到前端VO中 + for(OrderVO newVo :newVos) { + OrderHeaderVO newHVO =newVo.getHVO(); + String pk_src_order = newHVO.getPk_Srcorder(); + if(hmap.containsKey(pk_src_order)) { + newHVO.setStatus(VOStatus.UPDATED); + //UFDouble类型 + newHVO.setNaccpayreqmny(hmap.get(pk_src_order)[0]);//累计付款申请金额 + newHVO.setNaccpaymny(hmap.get(pk_src_order)[1]);//累计付款金额 + newHVO.setNinvoicemny(hmap.get(pk_src_order)[2]);//累计开票金额 + //String类型 + newHVO.setVcoopordercode(hmapString.get(pk_src_order)[0]);//对方订单号 + } + OrderItemVO newBVOs[] = newVo.getBVO(); + for(OrderItemVO newBVO : newBVOs) { + String pk_src_order_b = newBVO.getPk_srcorder_b(); + if(bmap.containsKey(pk_src_order_b)) { + newBVO.setStatus(VOStatus.UPDATED); + //UFDouble类型 + newBVO.setNacccancelinvmny(bmap.get(pk_src_order_b)[0]);//累计已核销开票金额 + newBVO.setNaccumarrvnum(bmap.get(pk_src_order_b)[1]);//累计到货主数量 + newBVO.setNaccumdevnum(bmap.get(pk_src_order_b)[2]);//累计运输主数量 + newBVO.setNaccuminvoicemny(bmap.get(pk_src_order_b)[3]);//累计本币开票金额 + newBVO.setNaccuminvoicenum(bmap.get(pk_src_order_b)[4]);//累计开票主数量 + newBVO.setNaccumpickupnum(bmap.get(pk_src_order_b)[5]);//累计拣货主数量 + newBVO.setNaccumrpnum(bmap.get(pk_src_order_b)[6]);//累计到货计划主数量 + newBVO.setNaccumstorenum(bmap.get(pk_src_order_b)[7]);//累计入库主数量 + newBVO.setNaccumwastnum(bmap.get(pk_src_order_b)[8]);//累计途耗主数量 + newBVO.setNbackarrvnum(bmap.get(pk_src_order_b)[9]);//累计退货主数量 + newBVO.setNbackstorenum(bmap.get(pk_src_order_b)[10]);//累计退库主数量 + newBVO.setNfeemny(bmap.get(pk_src_order_b)[11]);//费用累计开票金额 + newBVO.setNconfirmnum(bmap.get(pk_src_order_b)[12]);//确认数量 + newBVO.setNsuprsnum(bmap.get(pk_src_order_b)[13]);//被预留数量 + newBVO.setNsendplannum(bmap.get(pk_src_order_b)[14]);//送货计划数量 + + newBVO.setNaccpaymny(bmap.get(pk_src_order_b)[15]);//累计付款金额 + newBVO.setNaccpayreqmny(bmap.get(pk_src_order_b)[16]);//累计付款申请金额 + + //String类型 + newBVO.setVvendorordercode(bmapString.get(pk_src_order_b)[0]);//对方订单号 + newBVO.setVvendororderrow(bmapString.get(pk_src_order_b)[1]);//对方订单行号 + //UFDate类型 + newBVO.setDconfirmdate(bmapUFDate.get(pk_src_order_b)[0]);//确认日期 + newBVO.setDcorrectdate(bmapUFDate.get(pk_src_order_b)[1]);//修正日期 + } + } + } + return newVos; + } + + private String getSql(String tableName, String fieldName) { + StringBuilder builder = new StringBuilder(); + builder.append("update "); + builder.append(tableName); + builder.append(" set "); + builder.append(fieldName); + builder.append(" = ? where "); + builder.append(fieldName); + builder.append(" = ? "); + return builder.toString(); + } + + private String getSqlForHisVO(String tableName, String fieldName, String fieldName2) { + StringBuilder builder = new StringBuilder(); + builder.append("update "); + builder.append(tableName); + builder.append(" set "); + builder.append(fieldName); + builder.append(" = ? where "); + builder.append(fieldName2); + builder.append(" = ? "); +// builder.append(" and "); +// builder.append(fieldName2+"=" + ""); + return builder.toString(); + } + + private List> getForeignAddParam(List> datas, + String pk_ct_pu, String pk_origct) { + List list = new ArrayList(); + list.add(pk_ct_pu); + list.add(pk_origct); + datas.add(list); + return datas; + } + +}