相同性别的用户执行同住逻辑,以其中最高报销级别获取住宿标准-龚宇杰
This commit is contained in:
parent
7ad00cc967
commit
839381b31a
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue