采购订单修订审批推送锐制

This commit is contained in:
李正@用友 2025-06-27 14:44:16 +08:00 committed by mzr
parent 4eff17cad5
commit fb0882c463
1 changed files with 985 additions and 0 deletions

View File

@ -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<OrderVO> tool = new BillTransferTool<OrderVO>(orderVos);
ExtBillHasGrandsonDataUtils<OrderVO> tool = new ExtBillHasGrandsonDataUtils<OrderVO>(orderVos);
DeepCloneTool clone = new DeepCloneTool();
// BillTransferTool<OrderVO> tool = new BillTransferTool<OrderVO>(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<OrderVO>().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<String, String> hmap = new HashMap<String, String>();
Map<String, String> bmap = new HashMap<String, String>();
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;
}
/**
* 方法功能描述可用量更新前处理后续会更新主键导致可用量数据不正确在此提前处理
* <p>
* <b>参数说明</b>
* <p>
*
* @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<String, String> hmap, Map<String, String> bmap) {
DataAccessUtils d = new DataAccessUtils();
List<List<Object>> datas = new ArrayList<List<Object>>();
List<List<Object>> srcdatas = new ArrayList<List<Object>>();
List<List<Object>> bdatas = new ArrayList<List<Object>>();
List<List<Object>> srcbdatas = new ArrayList<List<Object>>();
Map<String,String> newkeyhmap = new HashMap<String,String>();
Map<String,String> newkeybmap = new HashMap<String,String>();
// 费用项
List<List<Object>> feeBdatas = new ArrayList<List<Object>>();
List<List<Object>> feesrcBdatas = new ArrayList<List<Object>>();
// 费用明细
List<List<Object>> feeDetailBdatas = new ArrayList<List<Object>>();
List<List<Object>> feeDetailsrcBdatas = new ArrayList<List<Object>>();
//简单记录 原始订单 表头主键 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<List<Object>> datas2 = new ArrayList<List<Object>>();
List<List<Object>> bdatas2 = new ArrayList<List<Object>>();
List<List<Object>> feeDetailBdatas2 = new ArrayList<List<Object>>();
List<List<Object>> feeBdatas2 = new ArrayList<List<Object>>();
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<List<Object>> datas3 = new ArrayList<List<Object>>();
List<List<Object>> bdatas3 = new ArrayList<List<Object>>();
List<List<Object>> feeDetailBdatas3 = new ArrayList<List<Object>>();
List<List<Object>> feeBdatas3 = new ArrayList<List<Object>>();
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<OrderVO> processer = new CompareAroundProcesser<OrderVO>(
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);
// }
// }
// }
/**
* 方法功能描述保存前规则
* <p>
* <b>参数说明</b>
*
* @param processer
* <p>
* @since 6.0
* @author wuxla
* @time 2010-3-26 下午06:41:24
*/
private void addBeforeRule(CompareAroundProcesser<OrderVO> processer) {
// 冻结状态校验 add by CONGKE for NCCNATIVE 2019-11-21
processer.addBeforeRule(new VOSagaFrozenValidateRule<OrderVO>(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<OrderVO>(POBillType.Order));
// 支持审批中修改修订的单据后台向所有已经处理过审批任务的人发送消息
processer.addBeforeFinalRule(new ApprovingEditSendMsgRule<OrderVO>());
// 移动端修订数量合法性检查 add by hanxqm 2019年6月22日 16点06分
//processer.addBeforeFinalRule(new MobBeforeReviseForPoOrderImpl());
// 校验修订后金额是否超过累计付款金额
processer.addBeforeFinalRule(new CheckOverPay());
}
/**
* 方法功能描述保存后规则
* <p>
* <b>参数说明</b>
*
* @param processer
* <p>
* @since 6.0
* @author wuxla
* @time 2010-3-26 下午06:41:30
*/
private void addAfterRule(CompareAroundProcesser<OrderVO> 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<String, String> hmap, Map<String, String> 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<String, String> hmap, Map<String, String> 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<payplanItemcliVOs.length; k++) {
// payplanItemcliVOs[k].setPk_order_payplan(payplanItemOrgVos[k].getPk_order_payplan());
// payplanItemcliVOs[k].setStatus(VOStatus.UPDATED);
// }
}
OrderVO[] retVO = this.updateOrgVO(cliVOs, cloneVos);
/**
* 注意付款协议表体
*/
return retVO;
}
/**
* 根据新版本VO数组查询原始版本VO数组
*
* @param newVos
* @since dev1.0
* @author zhanghrh
* @time 2021-6-9 下午04:39:00
*/
private OrderVO[] queryOldVosByNewVos(OrderVO[] newVos) {
String[] ids = new String[newVos.length];
for (int i = 0; i < newVos.length; i++) {
ids[i] = newVos[i].getHVO().getPk_Srcorder();
}
OrderVO[] hisVos = new BillQuery<OrderVO>(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>(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<String,UFDouble[]> hmap = new HashMap<String,UFDouble[]>();
Map<String,UFDouble[]> bmap = new HashMap<String,UFDouble[]>();
Map<String,String[]> hmapString = new HashMap<String,String[]>();
Map<String,String[]> bmapString = new HashMap<String,String[]>();
Map<String,UFDate[]> bmapUFDate = new HashMap<String,UFDate[]>();
//遍历原始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<List<Object>> getForeignAddParam(List<List<Object>> datas,
String pk_ct_pu, String pk_origct) {
List<Object> list = new ArrayList<Object>();
list.add(pk_ct_pu);
list.add(pk_origct);
datas.add(list);
return datas;
}
}