相同性别的用户执行同住逻辑,以其中最高报销级别获取住宿标准-龚宇杰

This commit is contained in:
ggxl 2025-04-17 14:32:38 +08:00
parent 7ad00cc967
commit 839381b31a
2 changed files with 214 additions and 4 deletions

View File

@ -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();
}
}

View File

@ -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<Long, Long> 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);
}
}
}
/**
* 比较AB两用户报销级别取最高值
*
* @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;
}
}
}