优化请购单转换采购订单批处理逻辑
- 调整代码结构,提高可读性和维护性- 优化分页查询,降低内存消耗 - 完善错误处理,确保数据一致性 -移除冗余日志,提升日志可读性
This commit is contained in:
parent
34728b28ff
commit
9f109aeaaf
|
@ -1,8 +1,6 @@
|
|||
package nc.bs.pu.m21.plugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
import nc.bs.framework.common.NCLocator;
|
||||
import nc.bs.logging.Log;
|
||||
|
@ -20,10 +18,10 @@ import nc.util.mmf.framework.db.MMSqlBuilder;
|
|||
import nc.vo.pu.m20.entity.PraybillHeaderVO;
|
||||
import nc.vo.pu.m20.entity.PraybillItemVO;
|
||||
import nc.vo.pu.m20.entity.PraybillVO;
|
||||
import nc.vo.pu.m21.entity.OrderHeaderVO;
|
||||
import nc.vo.pu.m21.entity.OrderItemVO;
|
||||
import nc.vo.pu.m21.entity.OrderVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pub.compiler.PfParameterVO;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
|
||||
import nc.vo.scmpub.res.billtype.POBillType;
|
||||
|
@ -44,13 +42,13 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
// 1. 查询满足条件的请购单聚合VO
|
||||
PraybillVO[] purchaseRequestVOs = getQualifiedPurchaseRequests(bgWorkingContext);
|
||||
logger.info("查询到满足条件的请购单数量: " + purchaseRequestVOs.length, this.getClass(), "executeTask");
|
||||
if (purchaseRequestVOs.length > 0) {
|
||||
if (purchaseRequestVOs.length <= 0) {
|
||||
logger.info("未找到满足条件的请购单,任务结束", this.getClass(), "executeTask");
|
||||
return null;
|
||||
}
|
||||
// 2. 批量转换处理
|
||||
processBatchTransfer(purchaseRequestVOs, bgWorkingContext);
|
||||
logger.info("批量转换请购单到采购订单完成", this.getClass(), "executeTask");
|
||||
} else {
|
||||
logger.info("未找到满足条件的请购单,任务结束", this.getClass(), "executeTask");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("执行批量转换请购单到采购订单任务失败", e, this.getClass(), "executeTask");
|
||||
ExceptionUtils.marsh(e);
|
||||
|
@ -72,9 +70,8 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
return new PraybillVO[0];
|
||||
}
|
||||
List<PraybillVO> resultList = new ArrayList<>();
|
||||
int pageSize = 2048;
|
||||
int pageSize = 100;
|
||||
IDDBPage page = new IDDBPage(sql, pageSize);
|
||||
logger.info("开始分页查询,页大小: " + pageSize, this.getClass(), "getQualifiedPurchaseRequests");
|
||||
int pageCount = 0;
|
||||
while (page.hasNext()) {
|
||||
pageCount++;
|
||||
|
@ -121,9 +118,6 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
* 根据ID获取请购单聚合VO
|
||||
*/
|
||||
private PraybillVO[] getBGWorkInfo(String[] ids) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("开始根据ID获取请购单聚合VO,ID数量: " + ids.length, this.getClass(), "getBGWorkInfo");
|
||||
}
|
||||
// 查询请购单表体
|
||||
VOQuery<PraybillItemVO> itemQuery = new VOQuery<>(PraybillItemVO.class);
|
||||
PraybillItemVO[] itemVOs = itemQuery.query(ids);
|
||||
|
@ -144,35 +138,25 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
VOQuery<PraybillHeaderVO> headerQuery = new VOQuery<>(PraybillHeaderVO.class);
|
||||
PraybillHeaderVO[] headerVOs = headerQuery.query(headerIds.toArray(new String[headerIds.size()]));
|
||||
logger.debug("查询到请购单表头数量: " + (headerVOs != null ? headerVOs.length : 0), this.getClass(), "getBGWorkInfo");
|
||||
return this.getAggvofromHeaderAndItem(headerVOs,
|
||||
itemVOs);
|
||||
return this.getAggvofromHeaderAndItem(headerVOs, itemVOs);
|
||||
}
|
||||
|
||||
/**
|
||||
* 组装采购订单聚合VO
|
||||
*/
|
||||
private PraybillVO[] getAggvofromHeaderAndItem(PraybillHeaderVO[] headerVOs, PraybillItemVO[] itemVOs) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("开始组装聚合VO,表头数量: " + (headerVOs != null ? headerVOs.length : 0) +
|
||||
", 表体数量: " + (itemVOs != null ? itemVOs.length : 0), this.getClass(), "getAggvofromHeaderAndItem");
|
||||
}
|
||||
|
||||
if (MMArrayUtil.isEmpty(headerVOs) || MMArrayUtil.isEmpty(itemVOs)) {
|
||||
logger.warn("表头或表体数据为空,无法组装聚合VO", this.getClass(), "getAggvofromHeaderAndItem");
|
||||
return new PraybillVO[0];
|
||||
}
|
||||
|
||||
List<PraybillVO> aggList = new ArrayList<>();
|
||||
|
||||
for (PraybillHeaderVO headerVO : headerVOs) {
|
||||
List<PraybillItemVO> itemList = new ArrayList<>();
|
||||
|
||||
for (PraybillItemVO itemVO : itemVOs) {
|
||||
if (headerVO.getPk_praybill().equals(itemVO.getPk_praybill())) {
|
||||
itemList.add(itemVO);
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemList.isEmpty()) {
|
||||
PraybillVO aggVO = new PraybillVO();
|
||||
aggVO.setParentVO(headerVO);
|
||||
|
@ -180,7 +164,6 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
aggList.add(aggVO);
|
||||
}
|
||||
}
|
||||
|
||||
logger.debug("聚合VO组装完成,数量: " + aggList.size(), this.getClass(), "getAggvofromHeaderAndItem");
|
||||
return aggList.toArray(new PraybillVO[aggList.size()]);
|
||||
}
|
||||
|
@ -193,39 +176,43 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin {
|
|||
|
||||
try {
|
||||
// 调用单据转换规则生成采购订单(20->21)
|
||||
logger.info("调用单据转换规则,从请购单(20)转换为采购订单(21)", this.getClass(), "processBatchTransfer");
|
||||
OrderVO[] orderVOs = PfServiceScmUtil.exeVOChangeByBillItfDef("20", "21", vos);
|
||||
|
||||
if (orderVOs != null && orderVOs.length > 0) {
|
||||
logger.info("单据转换成功,生成采购订单数量: " + orderVOs.length, this.getClass(), "processBatchTransfer");
|
||||
if (orderVOs == null || orderVOs.length == 0) {
|
||||
logger.warn("单据转换未生成任何采购订单", this.getClass(), "processBatchTransfer");
|
||||
return;
|
||||
}
|
||||
// 调用订单保存动作脚本
|
||||
logger.info("开始保存采购订单", this.getClass(), "processBatchTransfer");
|
||||
for (OrderVO orderVO : orderVOs) {
|
||||
// 对采购订单赋值行号
|
||||
OrderHeaderVO hvo = orderVO.getHVO();
|
||||
OrderItemVO[] bvo = orderVO.getBVO();
|
||||
for (int j = 0; j < bvo.length; j++) {
|
||||
int rowNum = (j + 1) * 10;
|
||||
// 设置pk_order
|
||||
bvo[j].setPk_order(hvo.getPk_order());
|
||||
bvo[j].setCrowno(String.valueOf(rowNum));
|
||||
}
|
||||
}
|
||||
IPfExchangeService service = NCLocator.getInstance().lookup(IPfExchangeService.class);
|
||||
OrderVO[] transVos = (OrderVO[]) service.runChangeDataAryNeedClassify("20", "21", orderVOs, null, 1);
|
||||
CloudPFlowContext cloudContext = this.getCloudPFlowContext(transVos);
|
||||
CloudPFlowContext cloudContext = this.getCloudPFlowContext(orderVOs);
|
||||
AppInfoContext.setBtnCode("Save");
|
||||
SCMScriptResultDTO scriptResult = ((IBatchRunScriptService) NCLocator.getInstance().lookup(IBatchRunScriptService.class)).runBacth(cloudContext, OrderVO.class);
|
||||
AbstractBill[] sucessVOs = scriptResult.getSucessVOs();
|
||||
if (transVos == null || transVos.length <= 0) {
|
||||
logger.info("转换时出现问题,传唤后VO对象数组为空", this.getClass(), "processBatchTransfer");
|
||||
Map<Integer, String> errorMessageMap = scriptResult.getErrorMessageMap();
|
||||
if (!errorMessageMap.isEmpty()) {
|
||||
errorMessageMap.keySet().forEach(key -> {
|
||||
String errMsg = errorMessageMap.get(key);
|
||||
if (errMsg.isEmpty()) return;
|
||||
OrderVO orderVO = orderVOs[key];
|
||||
// 给单据设置错误信息
|
||||
orderVO.getHVO().setVdef30(errMsg);
|
||||
orderVO.getHVO().setVdef31("N");
|
||||
logger.warn("单据转换生成采购订单时发生错误: " + scriptResult.getErrorMessage(), this.getClass(), "processBatchTransfer");
|
||||
});
|
||||
}
|
||||
logger.info("采购订单保存完成", this.getClass(), "processBatchTransfer");
|
||||
|
||||
} else {
|
||||
logger.warn("单据转换未生成任何采购订单", this.getClass(), "processBatchTransfer");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
logger.error("批量转换请购单到采购订单失败", e, this.getClass(), "processBatchTransfer");
|
||||
throw new BusinessException("批量转换请购单到采购订单失败: " + e.getMessage(), e);
|
||||
ExceptionUtils.marsh(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue