From 398eb6700bf29db15822c79b4301320064b1fa26 Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Tue, 23 Sep 2025 16:06:35 +0800 Subject: [PATCH] =?UTF-8?q?1=E5=87=BA=E5=BA=93=E5=8D=95=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96=EF=BC=9B?= =?UTF-8?q?2=E6=B7=BB=E5=8A=A0=E6=88=91=E7=9A=84=E6=8A=A5=E8=B4=A6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8A=A5=E8=B4=A6=E7=8A=B6=E6=80=81=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/MaterialInventoryUtilsExt.java | 18 ++++--- .../task/ReimbursementStatusTaskPlugin.java | 49 +++++++++++++++++++ 2 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/task/ReimbursementStatusTaskPlugin.java diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java index 5fc53b6..4a093e8 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java @@ -199,7 +199,7 @@ public class MaterialInventoryUtilsExt { coef = BigDecimal.valueOf(-1L); } - // 使用Map来按物料唯一标识分组并累加qty + // 使用Map来按物料唯一标识分组并累加qty(与更新库存保持一致的合并逻辑) Map materialQtyMap = new HashMap<>(); Map materialEntryMap = new HashMap<>(); Map materialInvMap = new HashMap<>(); @@ -212,16 +212,20 @@ public class MaterialInventoryUtilsExt { String lot = "".equals(entryInfo.getString("lot")) ? " " : entryInfo.getString("lot"); String unitId = entryInfo.getDynamicObject("measureunit") == null ? "" : entryInfo.getDynamicObject("measureunit").getString("id"); - // 创建物料的唯一键 - String materialKey = matId + "|" + modelnum + "|" + lot + "|" + unitId; + // 创建物料的唯一键(使用与更新库存一致的格式) + String materialKey = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); // 累加qty BigDecimal currentQty = entryInfo.getBigDecimal("qty").multiply(coef); materialQtyMap.merge(materialKey, currentQty, BigDecimal::add); - // 保存entryInfo和material信息供后续使用 - materialEntryMap.put(materialKey, entryInfo); - materialInvMap.put(materialKey, material); + // 保存entryInfo和material信息供后续使用(只保存第一个,因为我们只需要物料信息) + if (!materialEntryMap.containsKey(materialKey)) { + materialEntryMap.put(materialKey, entryInfo); + } + if (!materialInvMap.containsKey(materialKey)) { + materialInvMap.put(materialKey, material); + } } List matInvList = new ArrayList<>(); @@ -229,7 +233,7 @@ public class MaterialInventoryUtilsExt { // 第二次循环:处理累加后的qty for (Map.Entry entry : materialQtyMap.entrySet()) { String materialKey = entry.getKey(); - String[] keys = materialKey.split("\\|"); + String[] keys = materialKey.split("_"); if (keys.length < 4) { log.error("Invalid material key format: " + materialKey); diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/task/ReimbursementStatusTaskPlugin.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/task/ReimbursementStatusTaskPlugin.java new file mode 100644 index 0000000..c9e1d20 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/task/ReimbursementStatusTaskPlugin.java @@ -0,0 +1,49 @@ +package zcgj.zcdev.zcdev.pr.task; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.exception.KDException; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import zcgj.zcdev.zcdev.pr.utils.OrgCheckUtils; + +import java.util.Map; + +/** + * 我的报账修改报账状态定时任务 + * 说明:查询我的报账中的单据,存在对公报销单且为审核通过的单据且为冲预付的单据,则修改报账状态为报账完成 + */ +public class ReimbursementStatusTaskPlugin extends AbstractTask { + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + QFilter qFilters = new QFilter("bill.number", QCP.equals, "er_publicreimbursebill"); + qFilters.and(new QFilter("billstatusext", QCP.equals, "审核通过")); + DynamicObject[] dhc_myBillLists = BusinessDataServiceHelper.load("dhc_mybilllist", + "id,billno,reimbursestatus", new QFilter[]{qFilters});//我的报账 + + if (dhc_myBillLists != null && dhc_myBillLists.length > 0) { + for (DynamicObject dhc_myBillList : dhc_myBillLists) { + String billNo = dhc_myBillList.getString("billno");//对公报销单单据编号 + QFilter[] qFilter = new QFilter[]{new QFilter("billno", QCP.equals, billNo).and("payamount", QCP.equals, 0)}; + DynamicObject er_publicReimburseBill = BusinessDataServiceHelper.loadSingle("er_publicreimbursebill", + "id,costcompany", qFilter);//对公报销单 + + if (er_publicReimburseBill != null) { + DynamicObject costCompany = er_publicReimburseBill.getDynamicObject("costcompany");//对公报销单-费用承担公司 + Long costCompanyId = costCompany.getLong("id"); + if (OrgCheckUtils.isKS(costCompanyId)) { + //当前所在的组织是属于矿山下的 + dhc_myBillList.set("reimbursestatus", "2");//我的报账-报账状态 变为报账完成 + } + } + } + } + + if (dhc_myBillLists != null) { + SaveServiceHelper.save(dhc_myBillLists); + } + } +}