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 index 94d9dc4..f247e75 100644 --- a/src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java +++ b/src/main/java/zf47/jdgz1/fi/em/plugin/form/TripPersonCohabitPlugin.java @@ -92,7 +92,6 @@ public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugi */ 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");// 出差人 @@ -113,15 +112,15 @@ public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugi DynamicObject travelerI = travelers.get(i).getDynamicObject("fbasedataid"); if (cohabitPersons.containsKey(travelerI.getLong("id"))) continue; - boolean isCohabit = false; + boolean isCohabit = false;//是否同住 for (int j = i + 1; j < travelers.size(); j++) { DynamicObject travelerJ = travelers.get(j).getDynamicObject("fbasedataid"); travelerI = BusinessDataServiceHelper.loadSingle(travelerI.getPkValue(), "bos_user"); travelerJ = BusinessDataServiceHelper.loadSingle(travelerJ.getPkValue(), "bos_user"); - String genderI = travelerI.getString("gender"); + String genderI = travelerI.getString("gender");//性别 String genderJ = travelerJ.getString("gender"); - if (!genderI.equals("0") && genderI.equals(genderJ)) { + if (!genderI.equals("0") && genderI.equals(genderJ)) {//性别不为保密且相等 isCohabit = true; cohabitPersons.put(travelerI.getLong("id"), travelerJ.getLong("id")); cohabitPersons.put(travelerJ.getLong("id"), travelerI.getLong("id")); @@ -132,23 +131,29 @@ public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugi 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; + BigDecimal tripSTDAmount;//标准金额 + BigDecimal highSeasonTripSTDAmount;//旺季标准金额 - DynamicObject traveler; - int num = whichIsTopReimburseLevel(reimburseLevelI, reimburseLevelJ); - if (1 == num) { - traveler = travelerI; + //根据人员ID、币种ID、出差地域ID、差旅项目ID获取标准 + TripStandardDetail tripStdDetailI = TripStandardUtils.getAccmodationStdFromPageCache(travelerI.getLong("id"), this, entryCurrency.getPkValue(), tripArea.getPkValue(), tripExpenseItem.getPkValue(), null); + BigDecimal tripSTDAmountI = tripStdDetailI == null ? BigDecimal.ZERO : tripStdDetailI.getStandardamount(); + BigDecimal highSeasonTripSTDAmountI = tripStdDetailI == null ? BigDecimal.ZERO : tripStdDetailI.getHighSeasonStandardamount(); + + TripStandardDetail tripStdDetailJ = TripStandardUtils.getAccmodationStdFromPageCache(travelerJ.getLong("id"), this, entryCurrency.getPkValue(), tripArea.getPkValue(), tripExpenseItem.getPkValue(), null); + BigDecimal tripSTDAmountJ = tripStdDetailJ == null ? BigDecimal.ZERO : tripStdDetailJ.getStandardamount(); + BigDecimal highSeasonTripSTDAmountJ = tripStdDetailJ == null ? BigDecimal.ZERO : tripStdDetailJ.getHighSeasonStandardamount(); + + if (tripSTDAmountI.compareTo(tripSTDAmountJ) > 0) { + tripSTDAmount = tripSTDAmountI; } else { - traveler = travelerJ; + tripSTDAmount = tripSTDAmountJ; } - 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(); + if (highSeasonTripSTDAmountI.compareTo(highSeasonTripSTDAmountJ) > 0) { + highSeasonTripSTDAmount = highSeasonTripSTDAmountI; + } else { + highSeasonTripSTDAmount = highSeasonTripSTDAmountJ; + } getStdDetail(stdDetail, tripSTDAmount, highSeasonTripSTDAmount); @@ -179,6 +184,7 @@ public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugi 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); @@ -187,34 +193,12 @@ public class TripPersonCohabitPlugin extends AbstractBillPlugIn implements Plugi } /** - * 比较A、B两用户报销级别,取最高值 + * 构建标准明细 * - * @param reimburseLevelI A用户报销级别 - * @param reimburseLevelJ B用户报销级别 + * @param stdDetail 标准明细 + * @param tripSTDAmount 标准金额 + * @param highSeasonTripSTDAmount 旺季标准金额 */ - private int whichIsTopReimburseLevel(DynamicObject reimburseLevelI, DynamicObject reimburseLevelJ) { - String numberI = reimburseLevelI.getString("number"); - String numberJ = reimburseLevelJ.getString("number"); - - String[] reimburseLevels = new String[]{"002", "003", "General-01"}; - int length = reimburseLevels.length; - int i = length; - int j = length; - - for (int num = 0; num < reimburseLevels.length; num++) { - String reimburseLevel = reimburseLevels[num]; - if (i == length && numberI.equals(reimburseLevel)) i = num; - if (j == length && numberJ.equals(reimburseLevel)) j = num; - - if (i != length && j != length) break; - } - - if (i < j) { - return 1; - } else { - return 2; - } - } private void getStdDetail(StringBuilder stdDetail, BigDecimal tripSTDAmount, BigDecimal highSeasonTripSTDAmount) { BigDecimal std = tripSTDAmount.setScale(2, RoundingMode.HALF_DOWN);