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 3ca6cca..2d73cd9 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 @@ -1,11 +1,154 @@ package zf47.jdgz1.fi.em.plugin.form; import kd.bos.bill.AbstractBillPlugIn; +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.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.sdk.plugin.Plugin; +import java.util.*; +import java.util.stream.Collectors; + /** * 单据界面插件 */ public class GetExpenseStandardPlugin extends AbstractBillPlugIn implements Plugin { + /* + * 费用报销单-根据报账类型、费用项目以及一些特殊字段,去费用标准配置表中获取费用标准、标准单位 + * */ + + private static final Log log = LogFactory.getLog(GetExpenseStandardPlugin.class); + + @Override + public void propertyChanged(PropertyChangedArgs e) { + IDataModel model = this.getModel(); + DynamicObject bill = model.getDataEntity(); + + String reimburseType = bill.getString("reimburseType"); + if (reimburseType == null || reimburseType.isEmpty()) return; + + DynamicObjectCollection expenseEntries = bill.getDynamicObjectCollection("expenseentryentity");// 费用明细分录 + if (expenseEntries == null || expenseEntries.isEmpty()) return; + + //获取 监听值变更单据头字段集合 + QFilter headParamQF = new QFilter("number", QCP.equals, "ExpenseListeningHeadFields"); + DynamicObject headParam = BusinessDataServiceHelper.loadSingle("zf47_system_params", "zf47_val", headParamQF.toArray()); + if (headParam == null) { + log.warn("GetExpenseStandardPlugin:ExpenseListeningHeadFields参数未配置"); + return; + } + String headVal = headParam.getString("zf47_val"); + ArrayList headFields; + if (headVal.contains(",")) { + String[] splits = headVal.split(","); + headFields = new ArrayList<>(Arrays.asList(splits)); + } else { + headFields = new ArrayList<>(Collections.singletonList(headVal)); + } + + //获取 监听值变更分录字段集合 + QFilter entryParamQF = new QFilter("number", QCP.equals, "ExpenseListeningEntryFields"); + DynamicObject entryParam = BusinessDataServiceHelper.loadSingle("zf47_system_params", "zf47_val", entryParamQF.toArray()); + if (entryParam == null) { + log.warn("GetExpenseStandardPlugin:ExpenseListeningEntryFields参数未配置"); + return; + } + String entryVal = entryParam.getString("zf47_val"); + ArrayList entryFields; + if (entryVal.contains(",")) { + String[] splits = entryVal.split(","); + entryFields = new ArrayList<>(Arrays.asList(splits)); + } else { + entryFields = new ArrayList<>(Collections.singletonList(entryVal)); + } + + String changeName = e.getProperty().getName(); + if (headFields.contains(changeName)) {//值更新字段在单据头 + for (int i = 0; i < expenseEntries.size(); i++) { + DynamicObject expenseEntry = expenseEntries.get(i); + DynamicObject expenseItem = expenseEntry.getDynamicObject("expenseitem"); + if (expenseItem != null) { + HashMap result = getExpenseStandard(entryFields, reimburseType, expenseItem.getString("number"), expenseEntry); + if (result != null) { + for (String field : result.keySet()) { + model.setValue(field, result.get(field), i); + } + } + } + } + } else if (entryFields.contains(changeName)) {//值更新字段在费用明细分录 + int rowIndex = e.getChangeSet()[0].getRowIndex(); + DynamicObject expenseEntry = expenseEntries.get(rowIndex); + DynamicObject expenseItem = expenseEntry.getDynamicObject("expenseitem"); + if (expenseItem != null) { + HashMap result = getExpenseStandard(entryFields, reimburseType, expenseItem.getString("number"), expenseEntry); + if (result != null) { + for (String field : result.keySet()) { + model.setValue(field, result.get(field), rowIndex); + } + } + } + } + } + + /** + * 根据报账类型、费用项目编码组成的过滤条件从费用标准配置表中取值,并一一与分录对象进行比较,最终获取到对应的费用标准和标准单位,组成HashMap集合并返回 + * @param entryFields 费用明细分录字段标识集合 + * @param reimburseType 报账类型 + * @param expenseItem 费用项目编码 + * @param expenseEntry 费用明细分录对象 + */ + private HashMap getExpenseStandard(ArrayList entryFields, String reimburseType, String expenseItem, DynamicObject expenseEntry) { + HashMap result = new HashMap<>(); + QFilter filter = new QFilter("zf47_reimburse_type", QCP.equals, reimburseType) + .and(new QFilter("zf47_expense_item.number", QCP.equals, expenseItem)); + + DynamicObject[] standardConfigIds = BusinessDataServiceHelper.load("zf47_exp_standard_conf","id", filter.toArray()); + if (standardConfigIds == null || standardConfigIds.length == 0) { + log.info("GetExpenseStandardPlugin:根据reimburseType:"+reimburseType+"、expenseItem:"+expenseItem+",没有获取到费用标准"); + return null; + } + + List ids = Arrays.stream(standardConfigIds).map(x -> x.getLong("id")).collect(Collectors.toList()); + for (Long id : ids) { + DynamicObject standardConfig = BusinessDataServiceHelper.loadSingle(id, "zf47_exp_standard_conf"); + if (isAccordWithExpenseStandards(entryFields, expenseEntry, standardConfig)) { + result.put("zf47_expense_standards", standardConfig.getBigDecimal("zf47_expense_standards")); + result.put("zf47_standard_unit", standardConfig.getString("zf47_standard_unit")); + } + } + + return result; + } + + /** + * 遍历费用明细分录字段标识集合,从两个对象中取值判断是否相等,都相等则符合该标准返回true + * @param entryFields 费用明细分录字段标识集合 + * @param expenseEntry 费用明细分录对象 + * @param standardConfig 费用标准配置对象 + */ + private boolean isAccordWithExpenseStandards(ArrayList entryFields, DynamicObject expenseEntry, DynamicObject standardConfig) { + int num = 0; + for (String entryField : entryFields) { + if ("zf47_expense_item".equals(entryField)) continue; + + Object object1 = expenseEntry.get(entryField); + Object object2 = standardConfig.get(entryField); + if (object1 == null && object2 == null) { + num++; + continue; + } + + if (object1 != null && object1.equals(object2)) num++; + } + + return num == entryFields.size() - 1; + } } \ No newline at end of file