From 839381b31a07ec9a49ef25d73bd9748b365a01d0 Mon Sep 17 00:00:00 2001 From: ggxl <194689125@qq.com> Date: Thu, 17 Apr 2025 14:32:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=B8=E5=90=8C=E6=80=A7=E5=88=AB=E7=9A=84?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=89=A7=E8=A1=8C=E5=90=8C=E4=BD=8F=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E4=BB=A5=E5=85=B6=E4=B8=AD=E6=9C=80=E9=AB=98?= =?UTF-8?q?=E6=8A=A5=E9=94=80=E7=BA=A7=E5=88=AB=E8=8E=B7=E5=8F=96=E4=BD=8F?= =?UTF-8?q?=E5=AE=BF=E6=A0=87=E5=87=86-=E9=BE=9A=E5=AE=87=E6=9D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/form/GetExpenseStandardPlugin.java | 12 +- .../plugin/form/TripPersonCohabitPlugin.java | 206 ++++++++++++++++++ 2 files changed, 214 insertions(+), 4 deletions(-) create mode 100644 src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java diff --git a/src/main/java/zf47/jdgz1/fi/em/plugin/form/GetExpenseStandardPlugin.java b/src/main/java/zf47/jdgz1/fi/em/plugin/form/GetExpenseStandardPlugin.java index 080667a..86bf7ca 100644 --- a/src/main/java/zf47/jdgz1/fi/em/plugin/form/GetExpenseStandardPlugin.java +++ b/src/main/java/zf47/jdgz1/fi/em/plugin/form/GetExpenseStandardPlugin.java @@ -71,7 +71,7 @@ public class GetExpenseStandardPlugin extends AbstractBillPlugIn implements Plug } String changeName = e.getProperty().getName(); - log.info("GetExpenseStandardPlugin:值更新字段标识(" + changeName + ")"); +// log.info("GetExpenseStandardPlugin:值更新字段标识(" + changeName + ")"); if (headFields.contains(changeName)) {//值更新字段在单据头 for (int i = 0; i < expenseEntries.size(); i++) { DynamicObject expenseEntry = expenseEntries.get(i); @@ -103,9 +103,9 @@ public class GetExpenseStandardPlugin extends AbstractBillPlugIn implements Plug model.setValue("zf47_standard_unit", "", rowIndex); } } - } else { + }/* else { log.warn("GetExpenseStandardPlugin:值更新字段(" + changeName + ")不在HeadFields(" + headFields + ")、EntryFields(" + entryFields + ")"); - } + }*/ } /** @@ -136,6 +136,10 @@ public class GetExpenseStandardPlugin extends AbstractBillPlugIn implements Plug } } + if (result.isEmpty()) { + log.info("GetExpenseStandardPlugin:费用标准配置集合中没有与该分录数据与之对应的!"); + } + return result; } @@ -159,6 +163,6 @@ public class GetExpenseStandardPlugin extends AbstractBillPlugIn implements Plug if (object1 != null && object1.equals(object2)) num++; } - return num == entryFields.size() - 1; + return num == entryFields.size(); } } \ No newline at end of file diff --git a/src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java b/src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java new file mode 100644 index 0000000..6276c65 --- /dev/null +++ b/src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java @@ -0,0 +1,206 @@ +package zf47.jdgz1.fi.em.plugin.form; + +import com.kingdee.util.StringUtils; +import kd.bos.bill.AbstractBillPlugIn; +import kd.bos.cache.ThreadCache; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.datamodel.IDataModel; +import kd.bos.entity.datamodel.events.PropertyChangedArgs; +import kd.bos.form.events.BeforeDoOperationEventArgs; +import kd.bos.form.operate.FormOperate; +import kd.fi.er.business.tripstd.context.StdPreCalContext; +import kd.fi.er.business.tripstd.model.TripStandardDetail; +import kd.fi.er.business.tripstd.service.imp.ErTripStdServiceImp; +import kd.sdk.plugin.Plugin; +import kd.fi.er.formplugin.web.tripstandard.util.TripStandardUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +/** + * 单据界面插件 + */ +public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugin { + + /* + * 差旅报销单-相同性别的用户执行同住逻辑,以其中最高报销级别获取住宿标准 + * */ + + @Override + public void propertyChanged(PropertyChangedArgs e) { + String propName = e.getProperty().getName(); + int rowIndex = e.getChangeSet()[0].getRowIndex(); + int parentIndex = e.getChangeSet()[0].getParentRowIndex(); + switch (propName) { + case "company": + updateAllAccStd(); + break; + case "expenseitem": + case "triparea": + case "trip2travelers": + updateTripAccStd(parentIndex, rowIndex); + break; + } + } + + @Override + public void afterBindData(EventObject e) { + updateAllAccStd(); + } + + @Override + public void beforeDoOperation(BeforeDoOperationEventArgs args) { + FormOperate operate = (FormOperate) args.getSource(); + String operateKey = operate.getOperateKey(); + if ("submit".equals(operateKey)) { + updateAllAccStd(); + } + } + + /** + * 修改所有行程中的住宿费标准 + */ + private void updateAllAccStd() { + IDataModel model = this.getModel(); + DynamicObjectCollection tripEntries = model.getEntryEntity("tripentry"); + if (tripEntries != null) { + for (int i = 0; i < tripEntries.size(); i++) { + DynamicObject tripEntry = tripEntries.get(i); + DynamicObjectCollection entries = tripEntry.getDynamicObjectCollection("entryentity"); + if (entries != null) { + for (int j = 0; j < entries.size(); j++) { + DynamicObject entry = entries.get(j); + DynamicObject tripExpenseItem = entry.getDynamicObject("expenseitem"); + if (tripExpenseItem != null && "005".equals(tripExpenseItem.getString("number"))) { + updateTripAccStd(i, j); + } + } + } + } + } + } + + /** + * 修改指定的行程信息下的子单据体差旅明细中的住宿费标准 + * + * @param parentEntryIndex 父单据体行程信息的分录下标 + * @param curEntryIndex 子单据体差旅明细的分录下标 + */ + private void updateTripAccStd(int parentEntryIndex, int curEntryIndex) { + IDataModel model = this.getModel(); + DynamicObject company = (DynamicObject) model.getValue("company"); + DynamicObject tripEntry = model.getEntryRowEntity("tripentry", parentEntryIndex);// 行程信息分录 + DynamicObjectCollection travelers = tripEntry.getDynamicObjectCollection("travelers");// 出差人 + + DynamicObjectCollection entries = tripEntry.getDynamicObjectCollection("entryentity");//行程信息的子单据体差旅明细 + if (entries != null) { + DynamicObject entry = entries.get(curEntryIndex); + DynamicObject tripExpenseItem = entry.getDynamicObject("expenseitem");//差旅项目 + if (tripExpenseItem != null && "005".equals(tripExpenseItem.getString("number"))) {//差旅项目为住宿费 + DynamicObject tripArea = entry.getDynamicObject("triparea");// 出差地域 + DynamicObject entryCurrency = entry.getDynamicObject("entrycurrency");// 币种 + if (tripArea == null) return; + + HashMap cohabitPersons = new HashMap<>(); + BigDecimal tripStdSum = new BigDecimal(0); + BigDecimal highTripStdSum = new BigDecimal(0); + StringBuilder stdDetail = new StringBuilder(); + for (int i = 0; i < travelers.size(); i++) { + DynamicObject travelerI = travelers.get(i).getDynamicObject("fbasedataid"); + if (cohabitPersons.containsKey(travelerI.getLong("id"))) continue; + + for (int j = i + 1; j < travelers.size(); j++) { + DynamicObject travelerJ = travelers.get(j).getDynamicObject("fbasedataid"); + String genderI = travelerI.getString("gender"); + String genderJ = travelerJ.getString("gender"); + if (!genderI.equals("0") && StringUtils.equals(genderI, genderJ)) { + cohabitPersons.put(travelerI.getLong("id"), travelerJ.getLong("id")); + cohabitPersons.put(travelerJ.getLong("id"), travelerI.getLong("id")); + + if (stdDetail.length() == 0) { + stdDetail.append(travelerI.getString("name")).append("和").append(travelerJ.getString("name")).append(":"); + } else { + stdDetail.append(" | ").append(travelerI.getString("name")).append("和").append(travelerJ.getString("name")).append(":"); + } + + ErTripStdServiceImp tripStdServiceImp = new ErTripStdServiceImp(); + StdPreCalContext stdPreCalContext = (StdPreCalContext) ThreadCache.get("stdPreCalContext"); + DynamicObject reimburseLevelI = tripStdServiceImp.getReimburseLevelByUserId(travelerI.getLong("id"), company.getLong("id"), stdPreCalContext); + DynamicObject reimburseLevelJ = tripStdServiceImp.getReimburseLevelByUserId(travelerJ.getLong("id"), company.getLong("id"), stdPreCalContext); + if (reimburseLevelI == null || reimburseLevelJ == null) continue; + + DynamicObject traveler; + int num = whichIsTopReimburseLevel(reimburseLevelI, reimburseLevelJ); + if (1 == num) { + traveler = travelerI; + } else { + traveler = travelerJ; + } + + TripStandardDetail tripStdDetail = TripStandardUtils.getAccmodationStdFromPageCache(traveler.getLong("id"), this, entryCurrency.getPkValue(), tripArea.getPkValue(), tripExpenseItem.getPkValue(), null); + BigDecimal tripSTDAmount = tripStdDetail == null ? BigDecimal.ZERO : tripStdDetail.getStandardamount(); + BigDecimal highSeasonTripSTDAmount = tripStdDetail == null ? BigDecimal.ZERO : tripStdDetail.getHighSeasonStandardamount(); + + BigDecimal std = tripSTDAmount.setScale(2, RoundingMode.HALF_DOWN); + if (std.equals(new BigDecimal(0).setScale(2, RoundingMode.HALF_DOWN))) { + stdDetail.append("未设置").append(std).append(","); + } else { + stdDetail.append("¥").append(std).append("/天,"); + } + tripStdSum = tripStdSum.add(tripSTDAmount); + + BigDecimal highStd = highSeasonTripSTDAmount.setScale(2, RoundingMode.HALF_DOWN); + if (highStd.equals(new BigDecimal(0).setScale(2, RoundingMode.HALF_DOWN))) { + stdDetail.append("旺季未设置").append(highStd); + } else { + stdDetail.append("旺季¥").append(highStd).append("/天"); + } + highTripStdSum = highTripStdSum.add(highSeasonTripSTDAmount); + break; + } + } + } + + model.setValue("tripstandardamount", tripStdSum, curEntryIndex, parentEntryIndex); + model.setValue("hightripstandardamount", highTripStdSum, curEntryIndex, parentEntryIndex); + model.setValue("stddetail", stdDetail.toString(), curEntryIndex, parentEntryIndex); + + BigDecimal entryAmount = (BigDecimal) model.getValue("orientryamount", curEntryIndex, parentEntryIndex); + model.setValue("orientryamount", entryAmount.subtract(new BigDecimal(1)), curEntryIndex, parentEntryIndex); + model.setValue("orientryamount", entryAmount, curEntryIndex, parentEntryIndex); + } + } + } + + /** + * 比较A、B两用户报销级别,取最高值 + * + * @param reimburseLevelI A用户报销级别 + * @param reimburseLevelJ B用户报销级别 + */ + private int whichIsTopReimburseLevel(DynamicObject reimburseLevelI, DynamicObject reimburseLevelJ) { + int i = 0; + int j = 0; + + String numberI = reimburseLevelI.getString("number"); + String numberJ = reimburseLevelJ.getString("number"); + + String[] reimburseLevels = new String[]{"002", "003", "General-01"}; + + for (int num = 0; num < reimburseLevels.length; num++) { + String reimburseLevel = reimburseLevels[num]; + if (i == 0 && numberI.equals(reimburseLevel)) i = num; + if (j == 0 && numberJ.equals(reimburseLevel)) j = num; + + if (i != 0 && j != 0) break; + } + + if (i > j) { + return 1; + } else { + return 2; + } + } +}