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