Explorar o código

Merge remote-tracking branch 'origin/master'

xuhao hai 5 meses
pai
achega
025c64334d

+ 12 - 9
src/main/java/fi/ar/formplugin/AcctageForm.java

@@ -115,17 +115,17 @@ public class AcctageForm extends AbstractReportFormPlugin implements HyperLinkCl
         final List<ComboItem> comboItems = new ArrayList<ComboItem>(64);
         List<ComboItem> combo = new ArrayList<ComboItem>(64);
         if ("ALL".equals(sourceEntity) || "finpaidbill".equals(sourceEntity)) {
-            final ComboItem comboItem = new ComboItem(new LocaleString(ResManager.loadKDString("\u6309\u5355\u636e\u65e5\u671f", "AcctageForm_6", "fi-arapcommon", new Object[0])), "bizdate");
+            final ComboItem comboItem = new ComboItem(new LocaleString(ResManager.loadKDString("按单据日期", "AcctageForm_6", "fi-arapcommon", new Object[0])), "bizdate");
             comboItems.add(comboItem);
             this.setStandard(comboItems);
             return;
         }
         if ("paidbill".equals(sourceEntity)) {
-            final ComboItem bizDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("\u6309\u4e1a\u52a1\u65e5\u671f", "AcctageForm_7", "fi-arapcommon", new Object[0])), "bizdate");
+            final ComboItem bizDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("按业务日期", "AcctageForm_7", "fi-arapcommon", new Object[0])), "bizdate");
             comboItems.add(bizDateItem);
-            final String recDate = ResManager.loadKDString("\u6536\u6b3e\u65e5\u671f", "AcctageForm_8", "fi-arapcommon", new Object[0]);
-            final String payDate = ResManager.loadKDString("\u4ed8\u6b3e\u65e5\u671f", "AcctageForm_9", "fi-arapcommon", new Object[0]);
-            final ComboItem payDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("\u6309%s", "AcctageForm_10", "fi-arapcommon", new Object[] { this.isAr() ? recDate : payDate })), this.isAr() ? "payeedate" : "paydate");
+            final String recDate = ResManager.loadKDString("收款日期", "AcctageForm_8", "fi-arapcommon", new Object[0]);
+            final String payDate = ResManager.loadKDString("付款日期", "AcctageForm_9", "fi-arapcommon", new Object[0]);
+            final ComboItem payDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("%s", "AcctageForm_10", "fi-arapcommon", new Object[] { this.isAr() ? recDate : payDate })), this.isAr() ? "payeedate" : "paydate");
             comboItems.add(payDateItem);
             this.setStandard(comboItems);
             return;
@@ -166,19 +166,22 @@ public class AcctageForm extends AbstractReportFormPlugin implements HyperLinkCl
                     if (parent instanceof EntryType) {
                         continue;
                     }
-                    final ComboItem comboItem2 = new ComboItem(new LocaleString(ResManager.loadKDString("\u6309%s", "AcctageForm_10", "fi-arapcommon", new Object[] { displayName })), value);
+                    final ComboItem comboItem2 = new ComboItem(new LocaleString(ResManager.loadKDString("%s", "AcctageForm_10", "fi-arapcommon", new Object[] { displayName })), value);
                     comboItems.add(comboItem2);
                 }
             }
 
         }
         if ("ap_finapbill".equals(sourceEntity) || "ar_finarbill".equals(sourceEntity)) {
-            final ComboItem comboItem3 = new ComboItem(new LocaleString(ResManager.loadKDString("\u6309\u8ba1\u5212\u884c\u5230\u671f\u65e5", "AcctageForm_0", "fi-arapcommon", new Object[0])), "planduedate");
+            final ComboItem comboItem3 = new ComboItem(new LocaleString(ResManager.loadKDString("按计划行到期日", "AcctageForm_0", "fi-arapcommon", new Object[0])), "planduedate");
             comboItems.add(comboItem3);
             this.setStandard(comboItems);
         }
-        combo=comboItems.subList(0,2);
-        this.setStandard(combo);
+//        combo=comboItems.subList(0,2);
+//        this.setStandard(combo);
+        comboItems.remove(5);
+        comboItems.remove(3);
+        this.setStandard(comboItems);
     }
 
     private Set<String> buildSourceEntityKeys(final String sourceEntity) {

+ 295 - 0
src/main/java/fi/ar/formplugin/AcctageFormAp.java

@@ -0,0 +1,295 @@
+package fi.ar.formplugin;
+
+
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.report.plugin.*;
+import kd.bos.context.*;
+import kd.bos.dataentity.resource.*;
+import kd.bos.entity.*;
+import kd.bos.form.field.*;
+import java.util.List;
+import java.util.stream.*;
+import kd.bplat.scmc.report.conf.*;
+import kd.bos.dataentity.entity.*;
+import kd.bos.orm.query.*;
+import kd.fi.arapcommon.helper.*;
+import kd.fi.arapcommon.util.*;
+import kd.bos.bill.*;
+import kd.bos.report.*;
+import kd.bos.entity.report.*;
+import java.util.*;
+import kd.bos.dataentity.metadata.*;
+import kd.bos.entity.property.*;
+import kd.bos.form.*;
+import kd.bos.list.*;
+import kd.bos.form.events.*;
+
+/**
+ * @author cjz
+ * @date 2024/10/30 17:34
+ * @description:标准报表改造
+ */
+public class AcctageFormAp extends AbstractReportFormPlugin implements HyperLinkClickListener
+{
+    private List<Long> orgIds;
+    private ReportConf confCache;
+
+    public AcctageFormAp() {
+        this.orgIds = null;
+    }
+
+    public void registerListener(final EventObject e) {
+        super.registerListener(e);
+        final ReportList list = (ReportList)this.getControl("reportlistap");
+        list.addHyperClickListener((HyperLinkClickListener)this);
+        final BasedataEdit orgCtrl = (BasedataEdit)this.getControl("orgs");
+        orgCtrl.addBeforeF7SelectListener(beforeF7SelectEvent -> {
+            final ListShowParameter showParameter = (ListShowParameter)beforeF7SelectEvent.getFormShowParameter();
+            showParameter.getListFilterParameter().setFilter(new QFilter("id", "in", (Object)this.getOrgIds()));
+        });
+        final BasedataEdit billTypeEdit = (BasedataEdit)this.getControl("billtypes");
+        billTypeEdit.addBeforeF7SelectListener(listener -> {
+            final ListShowParameter formShowParameter = (ListShowParameter)listener.getFormShowParameter();
+            final String billScope = (String)this.getModel().getValue("sourceentity");
+            final List<String> billScopes = new LinkedList<String>();
+            if ("ALL".equals(billScope)) {
+                if (this.isAr()) {
+                    billScopes.add("ar_finarbill");
+                    billScopes.add("ar_busbill");
+                }
+                else {
+                    billScopes.add("ap_finapbill");
+                    billScopes.add("ap_busbill");
+                }
+            }
+            if (billScope.contains("fin")) {
+                if (this.isAr()) {
+                    billScopes.add("ar_finarbill");
+                }
+                else {
+                    billScopes.add("ap_finapbill");
+                }
+            }
+            if (billScope.contains("bus")) {
+                if (this.isAr()) {
+                    billScopes.add("ar_busbill");
+                }
+                else {
+                    billScopes.add("ap_busbill");
+                }
+            }
+            formShowParameter.getListFilterParameter().setFilter(new QFilter("billformid", "in", (Object)billScopes));
+        });
+    }
+
+    public void initDefaultQueryParam(final ReportQueryParam queryParam) {
+        if (EmptyUtils.isEmpty(this.getModel().getValue("orgs"))) {
+            this.orgIds = this.getOrgIds();
+            if (this.orgIds != null && this.orgIds.size() > 0) {
+                long orgId = RequestContext.get().getOrgId();
+                if (!this.orgIds.contains(orgId)) {
+                    orgId = this.orgIds.get(0);
+                }
+                this.getModel().setValue("orgs", (Object)new Object[] { orgId });
+            }
+        }
+        this.setCompareDateComboItems();
+    }
+
+    private List<Long> getOrgIds() {
+        if (this.orgIds == null) {
+            final List<DynamicObject> orgs = OrgHelper.getAuthorizedInitializedOrgs(this.getView().getEntityId(), "47150e89000000ac", this.isAr());
+            this.orgIds = (List)orgs.stream().map((org) -> {
+                return org.getLong("id");
+            }).distinct().collect(Collectors.toList());
+        }
+        return this.orgIds;
+    }
+
+    private boolean isAr() {
+        return StringUtils.contains(this.getView().getEntityId(), "ar_");
+    }
+
+    private void setCompareDateComboItems() {
+        final String sourceEntity = (String)this.getModel().getValue("sourceentity");
+        final List<ComboItem> comboItems = new ArrayList<ComboItem>(64);
+        List<ComboItem> combo = new ArrayList<ComboItem>(64);
+        if ("ALL".equals(sourceEntity) || "finpaidbill".equals(sourceEntity)) {
+            final ComboItem comboItem = new ComboItem(new LocaleString(ResManager.loadKDString("按单据日期", "AcctageForm_6", "fi-arapcommon", new Object[0])), "bizdate");
+            comboItems.add(comboItem);
+            this.setStandard(comboItems);
+            return;
+        }
+        if ("paidbill".equals(sourceEntity)) {
+            final ComboItem bizDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("按业务日期", "AcctageForm_7", "fi-arapcommon", new Object[0])), "bizdate");
+            comboItems.add(bizDateItem);
+            final String recDate = ResManager.loadKDString("收款日期", "AcctageForm_8", "fi-arapcommon", new Object[0]);
+            final String payDate = ResManager.loadKDString("付款日期", "AcctageForm_9", "fi-arapcommon", new Object[0]);
+            final ComboItem payDateItem = new ComboItem(new LocaleString(ResManager.loadKDString("按%s", "AcctageForm_10", "fi-arapcommon", new Object[] { this.isAr() ? recDate : payDate })), this.isAr() ? "payeedate" : "paydate");
+            comboItems.add(payDateItem);
+            this.setStandard(comboItems);
+            return;
+        }
+        final Set<String> allSourceEntityKeys = this.buildSourceEntityKeys(sourceEntity);
+        List<DateTimeProp> datePropIntersection = null;
+        for (final String entityKey : allSourceEntityKeys) {
+            final List<DateTimeProp> dateProps = EntityMetadataUtils.getDateProps(entityKey);
+            if (datePropIntersection == null) {
+                datePropIntersection = dateProps;
+            }
+            else {
+                final Iterator<DateTimeProp> iterator = datePropIntersection.iterator();
+                while (iterator.hasNext()) {
+                    final DateTimeProp next = iterator.next();
+                    boolean contains = false;
+                    for (final DateTimeProp p : dateProps) {
+                        if (p.getName().equals(next.getName())) {
+                            contains = true;
+                            break;
+                        }
+                    }
+                    if (!contains) {
+                        iterator.remove();
+                    }
+                }
+            }
+        }
+        if (datePropIntersection != null) {
+            for (final DateTimeProp prop : datePropIntersection) {
+                final String value = prop.getName();
+                if (!StringUtils.contains(value, "createtime") && !StringUtils.contains(value, "modifytime") && !StringUtils.contains(value, "updatetime") && !"auditdate".equals(value) && !"exratedate".equals(value)) {
+                    if ("premduedate".equals(prop.getName())) {
+                        continue;
+                    }
+                    final IDataEntityType parent = prop.getParent();
+                    final String displayName = prop.getDisplayName().getLocaleValue();
+                    if (parent instanceof EntryType) {
+                        continue;
+                    }
+                    final ComboItem comboItem2 = new ComboItem(new LocaleString(ResManager.loadKDString("按%s", "AcctageForm_10", "fi-arapcommon", new Object[] { displayName })), value);
+                    comboItems.add(comboItem2);
+                }
+            }
+
+        }
+        if ("ap_finapbill".equals(sourceEntity) || "ar_finarbill".equals(sourceEntity)) {
+            final ComboItem comboItem3 = new ComboItem(new LocaleString(ResManager.loadKDString("按计划行到期日", "AcctageForm_0", "fi-arapcommon", new Object[0])), "planduedate");
+            comboItems.add(comboItem3);
+            this.setStandard(comboItems);
+        }
+//        combo=comboItems.subList(0,2);
+//        this.setStandard(combo);
+        comboItems.remove(4);
+        comboItems.remove(2);
+        this.setStandard(comboItems);
+    }
+
+    private Set<String> buildSourceEntityKeys(final String sourceEntity) {
+        final Set<String> allSourceEntityKeys = new HashSet<String>(4);
+        if (sourceEntity.contains("fin")) {
+            if (this.isAr()) {
+                allSourceEntityKeys.add("ar_finarbill");
+            }
+            else {
+                allSourceEntityKeys.add("ap_finapbill");
+            }
+        }
+        if (sourceEntity.contains("bus")) {
+            if (this.isAr()) {
+                allSourceEntityKeys.add("ar_busbill");
+            }
+            else {
+                allSourceEntityKeys.add("ap_busbill");
+            }
+        }
+        if ("finpaidbill".equals(sourceEntity) || "paidbill".equals(sourceEntity)) {
+            if (this.isAr()) {
+                allSourceEntityKeys.add("cas_recbill");
+                allSourceEntityKeys.add("ar_receivedbill");
+            }
+            else {
+                allSourceEntityKeys.add("cas_paybill");
+                allSourceEntityKeys.add("ap_paidbill");
+            }
+        }
+        if ("ALL".equals(sourceEntity)) {
+            if (this.isAr()) {
+                allSourceEntityKeys.add("cas_recbill");
+                allSourceEntityKeys.add("ar_receivedbill");
+                allSourceEntityKeys.add("ar_busbill");
+                allSourceEntityKeys.add("ar_finarbill");
+            }
+            else {
+                allSourceEntityKeys.add("cas_paybill");
+                allSourceEntityKeys.add("ap_paidbill");
+                allSourceEntityKeys.add("ap_busbill");
+                allSourceEntityKeys.add("ap_finapbill");
+            }
+        }
+        return allSourceEntityKeys;
+    }
+
+    private void setStandard(final List<ComboItem> comboItems) {
+        final ComboEdit comboEdit = (ComboEdit)this.getControl("standard");
+        comboEdit.setComboItems((List)comboItems);
+        this.getModel().setValue("standard", (Object)"duedate");
+    }
+
+    public void hyperLinkClick(final HyperLinkClickEvent evt) {
+        final String fieldName = evt.getFieldName();
+        if ("billno".equals(fieldName)) {
+            final ReportList list = (ReportList)this.getControl("reportlistap");
+            final DynamicObject rowData = list.getReportModel().getRowData(evt.getRowIndex());
+            final BillShowParameter parameter = new BillShowParameter();
+            parameter.setFormId(rowData.getString("entitykey"));
+            parameter.setPkId((Object)rowData.getLong("id"));
+            parameter.setStatus(OperationStatus.VIEW);
+            parameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+            parameter.setHasRight(true);
+            this.getView().showForm((FormShowParameter)parameter);
+        }
+        else {
+            final ReportShowParameter parameter2 = new ReportShowParameter();
+            final FormShowParameter reportParameter = this.getView().getFormShowParameter();
+            parameter2.setFormId(reportParameter.getFormId());
+            parameter2.getOpenStyle().setTargetKey(reportParameter.getOpenStyle().getTargetKey());
+            parameter2.getOpenStyle().setShowType(reportParameter.getFormConfig().getShowType());
+            final ReportList reportList = (ReportList)evt.getSource();
+            final IReportListModel reportModel = reportList.getReportModel();
+            final DynamicObject rowData2 = reportModel.getRowData(evt.getRowIndex());
+            final Map<String, Object> customParams = this.getCustomParams(rowData2);
+            customParams.put("hyperLinkClickLineName", fieldName);
+            parameter2.setCustomParams((Map)customParams);
+            this.getView().showForm((FormShowParameter)parameter2);
+        }
+    }
+
+    private Map<String, Object> getCustomParams(final DynamicObject rowData) {
+        final Map<String, Object> customParams = new HashMap<String, Object>(2);
+        final Map<String, Object> dimensionData = new HashMap<String, Object>(4);
+        customParams.put("isopenbyhyperlink", Boolean.TRUE);
+        dimensionData.put("org", rowData.get("org"));
+        dimensionData.put("orgs", rowData.get("org"));
+        dimensionData.put("asstacttype", rowData.get("asstacttype"));
+        dimensionData.put("asstact", rowData.get("asstact"));
+        dimensionData.put("currency", rowData.get("currency"));
+        final List<String> sysDimensions = new ArrayList<String>(Arrays.asList("org", "asstacttype", "asstact", "currency"));
+        final String showKeyCols = (String)this.getModel().getValue("showkeycols");
+        final List<String> showKeyColList = Stream.of(showKeyCols.split(",")).filter(EmptyUtils::isNotEmpty).collect(Collectors.toList());
+        for (String s : showKeyColList) {
+            if (sysDimensions.contains(s)) {
+                continue;
+            }
+            Object value = rowData.get(s);
+            if (value instanceof DynamicObject) {
+                s += ".number";
+                value = ((DynamicObject)value).getString("number");
+            }
+            dimensionData.put(s, value);
+        }
+        customParams.put("rowData", dimensionData);
+        return customParams;
+    }
+
+
+}

+ 62 - 0
src/main/java/fi/em/formPlugin/BxdF7ListtenerMobileFromPlugin.java

@@ -0,0 +1,62 @@
+package fi.em.formPlugin;
+
+import kd.bos.bill.AbstractMobBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.list.MobileListShowParameter;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.EventObject;
+import java.util.HashSet;
+import java.util.Map;
+
+/**
+ * 移动表单插件
+ * 2024-09-11 wangj
+ * 主要功能:过滤支付组织
+ */
+public class BxdF7ListtenerMobileFromPlugin extends AbstractMobBillPlugIn implements Plugin, BeforeF7SelectListener {
+    private final static String paycompany="paycompany";//预付借款单 共享中心
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        // 侦听基础资料字段的事件
+        BasedataEdit fieldEdit1 = this.getView().getControl(paycompany);
+        fieldEdit1.addBeforeF7SelectListener(this);
+    }
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String fieldKey = beforeF7SelectEvent.getProperty().getName();
+        int row = beforeF7SelectEvent.getRow();
+        if (StringUtils.equals(fieldKey, paycompany)){
+            this.getQFilter(beforeF7SelectEvent,paycompany);
+        }
+    }
+    private void getQFilter(BeforeF7SelectEvent arg0, String type) {
+        DynamicObject data = (DynamicObject)this.getModel().getValue("costcompany") ;
+        if(data ==null){
+            throw new KDBizException("核算组织为空!");
+        }
+        String number = data.getString("number");
+        QFilter filter;
+        //给基础资料添加过滤
+        filter = new QFilter("fromorg.number", QCP.equals, number);
+        filter.and("typerelation.number", QCP.equals,"accounting2capital");
+        Map<Object, DynamicObject> objectDynamicObjectMap = BusinessDataServiceHelper.loadFromCache("bos_org_orgrelation", new QFilter[]{filter});
+        for(Object idkey:objectDynamicObjectMap.keySet()){
+            DynamicObject dynamicObject = objectDynamicObjectMap.get(idkey);
+            DynamicObject toorg = dynamicObject.getDynamicObject("toorg");
+            String numbers = toorg.getString("number");
+            QFilter number1 = new QFilter("number", QCP.equals, numbers);
+            MobileListShowParameter showParameter = (MobileListShowParameter)arg0.getFormShowParameter();
+            showParameter.getListFilterParameter().setFilter(number1);
+        }
+    }
+}

+ 79 - 0
src/main/java/fi/em/formPlugin/SalaryDeferPlugin.java

@@ -0,0 +1,79 @@
+package fi.em.formPlugin;
+
+
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicProperty;
+import kd.bos.form.ClientProperties;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.plugin.AbstractFormPlugin;
+
+import java.util.Calendar;
+import java.util.EventObject;
+import java.util.Map;
+
+/**
+ * @author cjz
+ * @date 2024/11/25 11:29
+ * @description:薪酬发放,递延分录
+ */
+public class SalaryDeferPlugin extends AbstractFormPlugin {
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        //递延分录
+        EntryGrid entryGrid = this.getControl("nckd_defer");
+        Map<String, Integer> dataIndex = entryGrid.getDataIndex();
+
+        //当前年份
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+
+
+        //递延当前年份
+        entryGrid.setColumnProperty("nckd_currentyear", ClientProperties.Header,new LocaleString(String.valueOf(year)));
+        entryGrid.setColumnProperty("nckd_year1", ClientProperties.Header,new LocaleString(String.valueOf(year+1)));
+        entryGrid.setColumnProperty("nckd_year2", ClientProperties.Header,new LocaleString(String.valueOf(year+2)));
+        entryGrid.setColumnProperty("nckd_year3", ClientProperties.Header,new LocaleString(String.valueOf(year+3)));
+        entryGrid.setColumnProperty("nckd_year4", ClientProperties.Header,new LocaleString(String.valueOf(year+4)));
+        entryGrid.setColumnProperty("nckd_year5", ClientProperties.Header,new LocaleString(String.valueOf(year+5)));
+        entryGrid.setColumnProperty("nckd_f_year1", ClientProperties.Header,new LocaleString(String.valueOf(year-3)));
+        entryGrid.setColumnProperty("nckd_f_year2", ClientProperties.Header,new LocaleString(String.valueOf(year-2)));
+        entryGrid.setColumnProperty("nckd_f_year3", ClientProperties.Header,new LocaleString(String.valueOf(year-1)));
+        entryGrid.setColumnProperty("nckd_f_currentyear", ClientProperties.Header,new LocaleString(String.valueOf(year)));
+        entryGrid.setColumnProperty("nckd_f_year4", ClientProperties.Header,new LocaleString(String.valueOf(year+1)));
+        entryGrid.setColumnProperty("nckd_f_year5", ClientProperties.Header,new LocaleString(String.valueOf(year+2)));
+
+        DynamicObjectCollection coll = this.getModel().getDataEntity(true).getDynamicObjectCollection("nckd_defer");
+        DynamicObjectType item = coll.getDynamicObjectType();
+        DynamicProperty property = item.getProperty("nckd_currentyear");
+        property.getDisplayName().setLocaleValue(String.valueOf(year));
+        property=item.getProperty("nckd_year1");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+1));
+        property=item.getProperty("nckd_year2");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+2));
+        property=item.getProperty("nckd_year3");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+3));
+        property=item.getProperty("nckd_year4");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+4));
+        property=item.getProperty("nckd_year5");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+5));
+        property=item.getProperty("nckd_f_year1");
+        property.getDisplayName().setLocaleValue(String.valueOf(year-3));
+        property=item.getProperty("nckd_f_year2");
+        property.getDisplayName().setLocaleValue(String.valueOf(year-2));
+        property=item.getProperty("nckd_f_year3");
+        property.getDisplayName().setLocaleValue(String.valueOf(year-1));
+        property=item.getProperty("nckd_f_currentyear");
+        property.getDisplayName().setLocaleValue(String.valueOf(year));
+        property=item.getProperty("nckd_f_year4");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+1));
+        property=item.getProperty("nckd_f_year5");
+        property.getDisplayName().setLocaleValue(String.valueOf(year+2));
+
+
+
+
+    }
+}

+ 21 - 7
src/main/java/fi/em/formPlugin/SalaryDownloadFilePlugin.java

@@ -21,7 +21,7 @@ import java.util.Map;
 /**
  * @author cjz
  * @date 2024/11/7 20:35
- * @description:点击按钮下载对应薪酬计提分录模板文件
+ * @description:点击按钮下载对应薪酬发放分录模板文件
  */
 public class SalaryDownloadFilePlugin extends AbstractFormPlugin {
 
@@ -34,18 +34,18 @@ public class SalaryDownloadFilePlugin extends AbstractFormPlugin {
         String operateKey = arg.getOperateKey();
         //获取下拉列表字段
         ComboProp comboProp = (ComboProp) getModel().getProperty("nckd_entrytype");
-        //审核操作代码
+        //下载操作代码
         String downloadBut="download";
         DynamicObject dynamicObject=this.getModel().getDataEntity(true);
         String nckd_entrytype= dynamicObject.getString("nckd_entrytype");
         //通过下拉值获取下拉标题
         String displayName = comboProp.getItemByName(nckd_entrytype);
+        QFilter qFilter=new QFilter("number", QCP.equals,"salaryfile");
+        //下载模板表单
+        DynamicObject nckd_file= BusinessDataServiceHelper.loadSingle("nckd_file",new QFilter[]{qFilter});
+        List<Map<String, Object>> list = AttachmentServiceHelper
+                .getAttachments("nckd_file", nckd_file.getPkValue(), "nckd_attachmentpanelap");
         if (downloadBut.equals(operateKey)) {
-            QFilter qFilter=new QFilter("number", QCP.equals,"salaryfile");
-            //下载模板表单
-            DynamicObject nckd_file= BusinessDataServiceHelper.loadSingle("nckd_file",new QFilter[]{qFilter});
-            List<Map<String, Object>> list = AttachmentServiceHelper
-                    .getAttachments("nckd_file", nckd_file.getPkValue(), "nckd_attachmentpanelap");
             //获取下载链接并打开
             for(int i = 0; i < list.size(); i++) {
                 String filename=list.get(i).get("name").toString();
@@ -56,6 +56,20 @@ public class SalaryDownloadFilePlugin extends AbstractFormPlugin {
                 }
             }
         }
+
+        //递延工资发放模板下载
+        String dldefer="dldefer";
+        if (dldefer.equals(operateKey)) {
+            //获取下载链接并打开
+            for(int i = 0; i < list.size(); i++) {
+                String filename=list.get(i).get("name").toString();
+                if (filename.equals("递延工资引入模板.xlsx")) {
+                    String downLoadUrl = list.get(i).get("url").toString();
+                    //调用该url
+                    getView().openUrl(downLoadUrl);
+                }
+            }
+        }
     }
 
 

+ 62 - 0
src/main/java/fi/em/formPlugin/SalaryDownloadFilePluginCp.java

@@ -0,0 +1,62 @@
+package fi.em.formPlugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.property.ComboProp;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.imc.bdm.common.constant.BotpCallBackLogConstant;
+import org.apache.commons.io.FileUtils;
+import sys.sc.opplugin.utils.InterFaceImgUtils;
+import sys.sc.opplugin.utils.SftpClient;
+
+import javax.swing.filechooser.FileSystemView;
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author cjz
+ * @date 2024/11/7 20:35
+ * @description:点击按钮下载对应薪酬计提分录模板文件
+ */
+public class SalaryDownloadFilePluginCp extends AbstractFormPlugin {
+
+
+
+    //点击按钮下载文件
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs arg){
+        super.afterDoOperation(arg);
+        String operateKey = arg.getOperateKey();
+        //获取下拉列表字段
+        ComboProp comboProp = (ComboProp) getModel().getProperty("nckd_entrytype");
+        //审核操作代码
+        String downloadBut="download";
+        DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+        String nckd_entrytype= dynamicObject.getString("nckd_entrytype");
+        //通过下拉值获取下拉标题
+        String displayName = comboProp.getItemByName(nckd_entrytype);
+        if (downloadBut.equals(operateKey)) {
+            QFilter qFilter=new QFilter("number", QCP.equals,"salarycpfile");
+            //下载模板表单
+            DynamicObject nckd_file= BusinessDataServiceHelper.loadSingle("nckd_file",new QFilter[]{qFilter});
+            List<Map<String, Object>> list = AttachmentServiceHelper
+                    .getAttachments("nckd_file", nckd_file.getPkValue(), "nckd_attachmentpanelap");
+            //获取下载链接并打开
+            for(int i = 0; i < list.size(); i++) {
+                String filename=list.get(i).get("name").toString();
+                if (filename.equals(displayName+".xls")) {
+                    String downLoadUrl = list.get(i).get("url").toString();
+                    //调用该url
+                    getView().openUrl(downLoadUrl);
+                }
+            }
+        }
+    }
+
+
+}

+ 11 - 11
src/main/java/fi/em/formPlugin/SalaryFileUploadEditPlugin.java

@@ -21,7 +21,7 @@ import java.util.*;
 /**
  * @author cjz
  * @date 2024/8/20 16:18
- * @description:薪酬计提单上传附件,并将附件中的数据写入分录
+ * @description:薪酬发放单上传附件,并将附件中的数据写入分录
  */
 public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements UploadListener {
     private static String bos_org = "bos_org"; //业务单元组织标识
@@ -59,10 +59,10 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
         //根据分录类型获取对应分录标识
         if ("A".equals(nckd_entrytype)) {
             billtype="nckd_staffentry";
-            readExcelByRowOrCell(4,44,inputStream,billtype);
+            readExcelByRowOrCell(4,45,inputStream,billtype);
         }else if ("B".equals(nckd_entrytype)) {
             billtype="nckd_earlyretiredentry";
-            readExcelByRowOrCell(4,34,inputStream,billtype);
+            readExcelByRowOrCell(4,30,inputStream,billtype);
         } else if ("C".equals(nckd_entrytype)) {
             billtype="nckd_retireentry";
             readExcelByRowOrCell(4,15,inputStream,billtype);
@@ -137,19 +137,19 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
         List<String> nckd_generalemployees =Arrays.asList("nckd_se_institution","nckd_se_empname","nckd_se_empnumber"
                 ,"nckd_se_idnumber","nckd_se_banknumber","nckd_se_unit","nckd_se_org","nckd_se_department","nckd_se_allbasicsry"
                 ,"nckd_se_basicsry","nckd_se_acmsry","nckd_se_reacmsry","nckd_se_bsnrwd","nckd_se_otreward","nckd_se_cmcsbd"
-                ,"nckd_se_otherpysry","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
-                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_salarypayable","nckd_se_per_endins"
+                ,"nckd_se_otherpysry","nckd_se_latesry","nckd_se_latesrygrant","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
+                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_risksry","nckd_se_salarypayable","nckd_se_per_endins"
                 ,"nckd_se_per_hopins","nckd_se_per_bhopins","nckd_se_per_ljins","nckd_se_per_hosins","nckd_se_per_cmymey"
                 ,"nckd_se_unionmey","nckd_se_tax","nckd_se_otherreduce","nckd_se_desalary","nckd_se_netsalary","nckd_se_cpy_endins"
-                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_birthins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
+                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
                 ,"nckd_se_cpy_cmymey");
         //薪酬明细(内退)分录字段标识
         List<String> nckd_earlyretired=Arrays.asList("nckd_ee_institution","nckd_ee_empname","nckd_ee_empnumber","nckd_ee_idnumber","nckd_ee_banknumber"
-                ,"nckd_ee_unit","nckd_ee_org","nckd_ee_department","nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_otherallowance","nckd_ee_per_endins"
+                ,"nckd_ee_unit","nckd_ee_org","nckd_ee_department","nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_orallowance","nckd_ee_per_endins"
+                ,"nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins","nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins"
+                ,"nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt","nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys"
                 ,"nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins","nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey"
-                ,"nckd_ee_tax","nckd_ee_desalary","nckd_ee_netsalary","nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins"
-                ,"nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins","nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt"
-                ,"nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys");
+                );
         //薪酬明细(退休)分录字段标识
         List<String> nckd_retired=Arrays.asList("nckd_re_institution","nckd_re_empname","nckd_re_empnumber","nckd_re_idnumber","nckd_re_banknumber"
                 ,"nckd_re_unit","nckd_re_org","nckd_re_department","nckd_re_livallowance","nckd_re_otherallowance","nckd_re_reward"
@@ -550,7 +550,7 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
         //薪酬明细(内退)
         if (billtype.equals("nckd_earlyretiredentry")) {
             flag=headList.get(0).getCell(9).getStringCellValue();
-            if (!flag.equals("内退生活费")) {
+            if (!flag.equals("内退员工基本工资")) {
                 throw new KDBizException("上传的文件格式有误,请检查!");
             }
             for (int i=0;i<rowList.size();i++) {

+ 664 - 0
src/main/java/fi/em/formPlugin/SalaryFileUploadEditPluginCp.java

@@ -0,0 +1,664 @@
+package fi.em.formPlugin;
+
+
+
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.control.AttachmentPanel;
+import kd.bos.form.control.Toolbar;
+import kd.bos.form.control.events.UploadEvent;
+import kd.bos.form.control.events.UploadListener;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.poi.ss.usermodel.*;
+import java.io.*;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author cjz
+ * @date 2024/8/20 16:18
+ * @description:薪酬计提单上传附件,并将附件中的数据写入分录
+ */
+public class SalaryFileUploadEditPluginCp extends AbstractBillPlugIn implements UploadListener {
+    private static String bos_org = "bos_org"; //业务单元组织标识
+    private static String bos_adminorg="bos_adminorg";//行政组织标识
+
+    //给附件面板添加监听
+    @Override
+    public void registerListener(EventObject e) {
+
+        super.registerListener(e);
+        //按钮面板
+        Toolbar toolbar = this.getControl("tbmain");
+        toolbar.addUploadListener(this);
+        //附件面板
+        AttachmentPanel attachmentPanel = getControl("attachmentpanel");
+        attachmentPanel.addUploadListener(this);
+    }
+
+
+    @Override
+    public void afterUpload(UploadEvent evt) {
+        //获取当前操作单据
+        DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+        String nckd_entrytype=dynamicObject.getString("nckd_entrytype");
+        //解析附件面板
+        AttachmentPanel attachmentPanel=this.getControl("attachmentpanel");
+        List<Map<String,Object>> attachmentData=attachmentPanel.getAttachmentData();
+        //获取最新上传的文件路径
+        String fileurl = (String) attachmentData.get(attachmentData.size()-1).get("url");
+        //获取文件缓存
+        TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+        //从缓存中拿到输入流
+        InputStream inputStream = cache.getInputStream(fileurl);
+        String billtype="";
+        //根据分录类型获取对应分录标识
+        if ("A".equals(nckd_entrytype)) {
+            billtype="nckd_staffentry";
+            readExcelByRowOrCell(4,44,inputStream,billtype);
+        }else if ("B".equals(nckd_entrytype)) {
+            billtype="nckd_earlyretiredentry";
+            readExcelByRowOrCell(4,34,inputStream,billtype);
+        } else if ("C".equals(nckd_entrytype)) {
+            billtype="nckd_retireentry";
+            readExcelByRowOrCell(4,15,inputStream,billtype);
+        } else if ("D".equals(nckd_entrytype)) {
+            billtype="nckd_salaryentry";
+            readExcelByRowOrCell(4,78,inputStream,billtype);
+        } else if ("E".equals(nckd_entrytype)) {
+            billtype="nckd_salaryentryre";
+            readExcelByRowOrCell(4,41,inputStream,billtype);
+        } else if (null==nckd_entrytype) {
+            throw new KDBizException("请选择分录类型");
+        }
+    }
+
+
+    /**
+     * @line execel头行数
+     * @column excel列数
+     * @inputStream 文件流
+     * @nckd_entrytype 分录类型
+     * @description:读取上传的excel,并将数据写入对应分录中
+     */
+    public void readExcelByRowOrCell(int line,int column,InputStream inputStream,String billtype)
+    {
+        try {
+            Workbook wb = WorkbookFactory.create(inputStream);
+            Sheet filesheet=wb.getSheetAt(0);//默认取第一个工作表
+            //表中存的数据
+            List<Row> rowList=new ArrayList<>();
+            //表头字段
+            List<Row> headList=new ArrayList<>();
+            //人力薪酬和薪酬明细等excel分开处理
+            if (billtype.equals("nckd_salaryentry")) {
+                headList.add(filesheet.getRow(line-3));
+            }else {
+                headList.add(filesheet.getRow(line-2));
+            }
+            //读取每行的数据存入list中
+            for (int i=line;i<=filesheet.getLastRowNum();i++) {
+                //获取每一行
+                Row row = filesheet.getRow(i);
+                if (null==row.getCell(1)) {
+                    break;
+                }
+                //根据字段行循环,没有值的单元格则赋值,防止空指针
+                for(int j=1;j<column;j++){
+                    Cell cell=row.getCell(j);
+                    if (null==cell) {
+                        row.createCell(j);
+                    }
+                }
+                rowList.add(row);
+            }
+            //excel数据校验
+            dataVerify(headList,rowList,billtype);
+            //分录赋值
+            createNewRow(rowList,billtype);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+
+    /**
+     * @rowList 读取的excel数据
+     * @nckd_entrytype 分录标识
+     * @description:根据分录类型不同,赋值分录
+     */
+    public void createNewRow(List<Row> rowList,String nckd_entry){
+        //薪酬明细(一般员工)分录字段标识
+        List<String> nckd_generalemployees =Arrays.asList("nckd_se_institution","nckd_se_empname","nckd_se_empnumber"
+                ,"nckd_se_idnumber","nckd_se_banknumber","nckd_se_unit","nckd_se_org","nckd_se_department","nckd_se_allbasicsry"
+                ,"nckd_se_basicsry","nckd_se_acmsry","nckd_se_reacmsry","nckd_se_bsnrwd","nckd_se_otreward","nckd_se_cmcsbd"
+                ,"nckd_se_otherpysry","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
+                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_salarypayable","nckd_se_per_endins"
+                ,"nckd_se_per_hopins","nckd_se_per_bhopins","nckd_se_per_ljins","nckd_se_per_hosins","nckd_se_per_cmymey"
+                ,"nckd_se_unionmey","nckd_se_tax","nckd_se_otherreduce","nckd_se_desalary","nckd_se_netsalary","nckd_se_cpy_endins"
+                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_birthins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
+                ,"nckd_se_cpy_cmymey");
+        //薪酬明细(内退)分录字段标识
+        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_institution","nckd_ee_empname","nckd_ee_empnumber","nckd_ee_idnumber","nckd_ee_banknumber"
+                ,"nckd_ee_unit","nckd_ee_org","nckd_ee_department","nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_orallowance","nckd_ee_per_endins"
+                ,"nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins","nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins"
+                ,"nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt","nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys"
+                ,"nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins","nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey"
+                );
+        //薪酬明细(退休)分录字段标识
+        List<String> nckd_retired=Arrays.asList("nckd_re_institution","nckd_re_empname","nckd_re_empnumber","nckd_re_idnumber","nckd_re_banknumber"
+                ,"nckd_re_unit","nckd_re_org","nckd_re_department","nckd_re_livallowance","nckd_re_otherallowance","nckd_re_reward"
+                ,"nckd_re_salarypayable","nckd_re_desalary","nckd_re_netsalary");
+        //人力薪酬分录标识
+        List<String> nckd_pay=Arrays.asList("nckd_sae_institution","nckd_sae_empname","nckd_sae_jobid","nckd_sae_idnumber","nckd_sae_banknumber","nckd_sae_company"
+                ,"nckd_sae_institutions","nckd_sae_department","nckd_sae_levelsry","nckd_sae_dutiessry","nckd_sae_updutiessry","nckd_sae_workyearsry"
+                ,"nckd_sae_depyear","nckd_sae_eduasry","nckd_sae_transry","nckd_sae_jobsry","nckd_sae_basicsry","nckd_sae_allbasicsry","nckd_sae_acmsry"
+                ,"nckd_sae_mountsry","nckd_sae_reacmsry","nckd_sae_balyearsry","nckd_sae_blastyearsry","nckd_sae_allsry","nckd_sae_bsnrwd","nckd_sae_cpmrwd"
+                ,"nckd_sae_psrwd","nckd_sae_comrwd","nckd_sae_cardrwd","nckd_sae_intwrd","nckd_sae_clearrwd","nckd_sae_allrwd","nckd_sae_retainsry"
+                ,"nckd_sae_reward","nckd_sae_otreward","nckd_sae_cmcsbd","nckd_sae_trfsbd","nckd_sae_housesbd","nckd_sae_warmsbd","nckd_sae_edusbd"
+                ,"nckd_sae_trafficsbd","nckd_sae_othersbd","nckd_sae_reduce","nckd_sae_othersry","nckd_sae_sickreduce","nckd_sae_sickhopreduce"
+                ,"nckd_sae_eventreduce","nckd_sae_afwreduce","nckd_sae_latereduce","nckd_sae_cwasry","nckd_sae_cwareduce","nckd_sae_dgreduce"
+                ,"nckd_sae_dcpreduce","nckd_sae_badreduce","nckd_sae_otherreduce","nckd_sae_allreduce","nckd_sae_lastsry","nckd_sae_allpay"
+                ,"nckd_sae_per_endins","nckd_sae_per_ljins","nckd_sae_per_hopins","nckd_sae_per_bhopins","nckd_sae_per_hosins","nckd_sae_per_cmymey"
+                ,"nckd_sae_per_ins","nckd_sae_unionmey","nckd_sae_tax","nckd_sae_allamount","nckd_sae_cash","nckd_sae_wages","nckd_sae_cpy_endins"
+                ,"nckd_sae_cpy_hopins","nckd_sae_cpy_bhopins","nckd_sae_cpy_birthins","nckd_sae_cpy_ljins","nckd_sae_cpy_dmgins","nckd_sae_cpy_hosins"
+                ,"nckd_sae_cpy_cmymey");
+
+        //人力薪酬内退分录标识
+        List<String> nckd_payretird=Arrays.asList("nckd_see_institution","nckd_see_empname","nckd_see_jobid","nckd_see_idnumber"
+                ,"nckd_see_banknumber","nckd_see_company","nckd_see_institutions","nckd_see_department","nckd_see_allbasicsry"
+                ,"nckd_see_allowance","nckd_see_otherallowanc","nckd_see_per_endins","nckd_see_per_ljins","nckd_see_per_hopins"
+                ,"nckd_see_per_bhopins","nckd_see_per_hosins","nckd_see_per_cmymey","nckd_see_unionmey","nckd_see_tax"
+                ,"nckd_see_desalary","nckd_see_netsalary","nckd_see_otherreduce","nckd_see_cpy_endins","nckd_see_cpy_bhopins"
+                ,"nckd_see_cpy_ljins","nckd_see_cpy_birthins","nckd_see_cpy_dmgins","nckd_see_cpy_cmymey","nckd_see_cpy_hosins"
+                ,"nckd_see_taxt","nckd_see_alltaxt","nckd_see_charge","nckd_see_finallsys","nckd_see_cpy_oldins","nckd_see_cpy_hop"
+                ,"nckd_see_cpy_bhop","nckd_see_cpy_bir","nckd_see_cpy_ljob","nckd_see_cpy_dwork","nckd_see_cpy_hos","nckd_see_cpy_cmy");
+
+
+        //将excel数据存入薪酬明细(一般员工)分录
+        if(nckd_entry.equals("nckd_staffentry")) {
+            //先清空分录
+            this.getModel().deleteEntryData("nckd_staffentry");
+            for (int i=0;i< rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_generalemployees.get(0),entrycostdept,rowIndex);
+                }
+                //员工名称
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_generalemployees.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //员工工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_generalemployees.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_generalemployees.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_generalemployees.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    //获取所在单位
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_generalemployees.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    //获取部门
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_generalemployees.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    //获取部门
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_generalemployees.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_generalemployees.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_generalemployees.get(j),bigDecimal,rowIndex);
+                    }
+                }
+                //刷新分录
+                this.getView().updateView("nckd_staffentry");
+            }
+        }
+        //薪酬明细(内退)分录
+        if (nckd_entry.equals("nckd_earlyretiredentry")) {
+            this.getModel().deleteEntryData("nckd_earlyretiredentry");
+            for (int i=0;i<rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_earlyretired.get(0),entrycostdept,rowIndex);
+                }
+                //员工姓名
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_earlyretired.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //员工工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_earlyretired.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_earlyretired.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_earlyretired.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_earlyretired.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_earlyretired.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_earlyretired.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_earlyretired.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_earlyretired.get(j),bigDecimal,rowIndex);
+                    }
+                }
+            }
+        }
+        //薪酬明细(退休)分录
+        if(nckd_entry.equals("nckd_retireentry")) {
+            this.getModel().deleteEntryData("nckd_retireentry");
+            for (int i=0;i<rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_retired.get(0),entrycostdept,rowIndex);
+                }
+                //员工姓名
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_retired.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //员工工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_retired.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_retired.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_retired.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_retired.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_retired.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_retired.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_retired.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_retired.get(j),bigDecimal,rowIndex);
+                    }
+                }
+            }
+        }
+        //人力薪酬分录
+        if(nckd_entry.equals("nckd_salaryentry")) {
+            this.getModel().deleteEntryData("nckd_salaryentry");
+            for (int i=0;i<rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_pay.get(0),entrycostdept,rowIndex);
+                }
+                //姓名
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_pay.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_pay.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_pay.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_pay.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_pay.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_pay.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_pay.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_pay.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_pay.get(j),bigDecimal,rowIndex);
+                    }
+                }
+            }
+
+        }
+        //人力薪酬内退分录
+        if (nckd_entry.equals("nckd_salaryentryre")){
+            this.getModel().deleteEntryData("nckd_salaryentryre");
+            for (int i=0;i<rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(0),entrycostdept,rowIndex);
+                }
+                //员工姓名
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //员工工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_payretird.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_payretird.get(j),bigDecimal,rowIndex);
+                    }
+                }
+            }
+        }
+    }
+
+
+
+
+    /**
+     * @headList 读取的excel表头数据
+     * @rowList 读取excel的表数据
+     * @billtype 分录标识
+     * @description:校验excel数据是否合法,传入的excel是否为正确的格式
+     */
+    public void dataVerify(List<Row> headList,List<Row> rowList,String billtype) {
+        //获取对应单据的字段名
+        String flag;
+        //薪酬明细(一般员工)
+        if (billtype.equals("nckd_staffentry")) {
+            //获取单据的字段名
+             flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("基本工资")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+        //薪酬明细(内退)
+        if (billtype.equals("nckd_earlyretiredentry")) {
+            flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("内退员工基本工资")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+        //薪酬明细(退休)
+        if (billtype.equals("nckd_retireentry")) {
+            flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("退休员工生活补贴")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+        //人力薪酬
+        if (billtype.equals("nckd_salaryentry")) {
+            flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("级别工资")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+(j+1)+"列的数据:"+headList.get(i).getCell(j+1).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+        //人力薪酬(内退)
+        if (billtype.equals("nckd_salaryentryre"))
+        {
+            flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("内退生活费")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 对Excel的各个单元格的格式进行判断并转换
+     */
+    public  String getCellValue(Cell cell) {
+        String cellValue = "";
+        if (cell == null) {
+            return cellValue;
+        }
+        // 判断数据的类型
+        switch (cell.getCellType()) {
+            case NUMERIC:
+                //读取数字将不必要的小数点去掉
+                BigDecimal bigDecimal=new BigDecimal(Double.toString(cell.getNumericCellValue()));
+                cellValue=bigDecimal.stripTrailingZeros().toPlainString();
+                break;
+            case STRING: // 字符串
+                cellValue = String.valueOf(cell.getStringCellValue()).trim();
+                break;
+            case BLANK: // 空值
+                cellValue = "";
+                break;
+            case ERROR: // 故障
+                cellValue = "未知类型";
+                break;
+            default:
+                cellValue = "未知类型";
+                break;
+        }
+        return cellValue;
+    }
+}

+ 434 - 0
src/main/java/fi/em/formPlugin/SubAndAudFormCpPlugin.java

@@ -0,0 +1,434 @@
+package fi.em.formPlugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.sdk.plugin.Plugin;
+import kd.tmc.fpm.business.domain.model.report.DynamicObjectData;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author cjz
+ * @date 2024/9/12 11:12
+ * @description:薪酬计提提交后自动审核,保存前计算汇总分录
+ */
+public class SubAndAudFormCpPlugin extends AbstractListPlugin implements Plugin {
+
+    private static String nckd_staffentry="nckd_staffentry";//通用薪酬一般员工
+    private static String nckd_a_staffentry="nckd_a_staffentry";//通用薪酬一般员工汇总分录标识
+    private static String nckd_earlyretiredentry="nckd_earlyretiredentry";//通用薪酬内退
+    private static String nckd_a_earlyretiredentry="nckd_a_earlyretiredentry";//通用薪酬内退分录标识
+    private static String nckd_retireentry="nckd_retireentry";//通用薪酬退休
+    private static String nckd_a_retireentry="nckd_a_retireentry";//通用薪酬退休分录标识
+    private static String nckd_salaryentry="nckd_salaryentry";//人力薪酬
+    private static String nckd_a_salaryentry="nckd_a_salaryentry";//人力薪酬分录标识
+    private static String nckd_salaryentryre="nckd_salaryentryre";//人力薪酬内退
+    private static String nckd_a_salaryentryre="nckd_a_salaryentryre";//人力薪酬内退标识
+
+
+
+    //控件标识
+    private static String nckd_a_generalemployees="nckd_a_generalemployees";//通用一般汇总
+    private static String nckd_a_earlyretired="nckd_a_earlyretired";//通用内退汇总
+    private static String nckd_a_retired="nckd_a_retired";//通用退休汇总
+    private static String nckd_a_pay="nckd_a_pay";//人力一般汇总
+    private static String nckd_a_payretird="nckd_a_payretird";//人力内退汇总
+
+    public void afterDoOperation(AfterDoOperationEventArgs arg){
+        //提交并审核
+        if ("submit".equals(arg.getOperateKey())) {
+            //调用审核
+            this.getView().invokeOperation("audit");
+        }
+    }
+
+
+    //根据输入的list名,返回对应list
+    public List<String> entryList(String nckdentry)
+      {
+        //薪酬明细(一般员工)分录字段标识,金额字段
+        List<String> nckd_generalemployees = Arrays.asList("nckd_se_allbasicsry"
+                ,"nckd_se_basicsry","nckd_se_acmsry","nckd_se_reacmsry","nckd_se_bsnrwd","nckd_se_otreward","nckd_se_cmcsbd"
+                ,"nckd_se_otherpysry","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
+                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_salarypayable","nckd_se_per_endins"
+                ,"nckd_se_per_hopins","nckd_se_per_bhopins","nckd_se_per_ljins","nckd_se_per_hosins","nckd_se_per_cmymey"
+                ,"nckd_se_unionmey","nckd_se_tax","nckd_se_otherreduce","nckd_se_desalary","nckd_se_netsalary","nckd_se_cpy_endins"
+                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_birthins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
+                ,"nckd_se_cpy_cmymey");
+
+        //薪酬明细(一般员工)汇总分录
+        List<String> nckd_a_employees=Arrays.asList("nckd_ase_allbasicsry","nckd_ase_basicsry","nckd_ase_acmsry"
+                ,"nckd_ase_reacmsry","nckd_ase_bsnrwd","nckd_ase_otreward","nckd_ase_cmcsbd","nckd_ase_otherpysry","nckd_ase_clearrwd"
+                ,"nckd_ase_awareward","nckd_ase_otherdevreward","nckd_ase_coldsbad","nckd_ase_warmsbad","nckd_ase_nursabd","nckd_ase_oalwance"
+                ,"nckd_ase_salarypayable","nckd_ase_per_endins","nckd_ase_per_hopins","nckd_ase_per_bhopins","nckd_ase_per_ljins","nckd_ase_per_hosins"
+                ,"nckd_ase_per_cmymey","nckd_ase_unionmey","nckd_ase_tax","nckd_ase_otherreduce","nckd_ase_desalary","nckd_ase_netsalary"
+                ,"nckd_ase_cpy_endins","nckd_ase_cpy_hopins","nckd_ase_cpy_bhopins","nckd_ase_cpy_ljins","nckd_ase_cpy_birthins","nckd_ase_cpy_dmgins"
+                ,"nckd_ase_cpy_hosins","nckd_ase_cpy_cmymey");
+
+
+        //薪酬明细(内退)分录字段标识,金额字段
+        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_orallowance","nckd_ee_per_endins"
+                ,"nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins","nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins"
+                ,"nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt","nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys"
+                ,"nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins","nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey"
+        );
+
+          //薪酬明细(内退)汇总分录
+          List<String> nckd_a_earlyretired=Arrays.asList("nckd_aee_allbasicsry","nckd_aee_otherallowance","nckd_aee_orallowance","nckd_aee_per_endins"
+                  ,"nckd_aee_otherreduce","nckd_aee_cpy_endins","nckd_aee_cpy_bhopins","nckd_aee_cpy_ljins","nckd_aee_cpy_birthins","nckd_aee_cpy_dmgins"
+                  ,"nckd_aee_cpy_cmymey","nckd_aee_cpy_hosins","nckd_aee_taxt","nckd_aee_alltaxt","nckd_aee_charge","nckd_aee_finallsys","nckd_aee_per_ljins"
+                  ,"nckd_aee_per_hopins","nckd_aee_per_bhopins","nckd_aee_per_hosins","nckd_aee_per_cmymey","nckd_aee_unionmey");
+
+
+
+        //薪酬明细(退休)分录字段标识,金额字段
+        List<String> nckd_retired=Arrays.asList("nckd_re_livallowance","nckd_re_otherallowance","nckd_re_reward"
+                ,"nckd_re_salarypayable","nckd_re_desalary","nckd_re_netsalary");
+
+        //薪酬明细(退休)汇总分录
+        List<String> nckd_a_retired=Arrays.asList("nckd_are_livallowance","nckd_are_ollowance","nckd_are_reward","nckd_are_salarypayable"
+                ,"nckd_are_desalary","nckd_are_netsalary");
+
+
+        //人力薪酬分录标识金额字段,金额字段
+        List<String> nckd_pay=Arrays.asList("nckd_sae_levelsry","nckd_sae_dutiessry","nckd_sae_updutiessry","nckd_sae_workyearsry"
+                ,"nckd_sae_depyear","nckd_sae_eduasry","nckd_sae_transry","nckd_sae_jobsry","nckd_sae_basicsry","nckd_sae_allbasicsry","nckd_sae_acmsry"
+                ,"nckd_sae_mountsry","nckd_sae_reacmsry","nckd_sae_balyearsry","nckd_sae_blastyearsry","nckd_sae_allsry","nckd_sae_bsnrwd","nckd_sae_cpmrwd"
+                ,"nckd_sae_psrwd","nckd_sae_comrwd","nckd_sae_cardrwd","nckd_sae_intwrd","nckd_sae_clearrwd","nckd_sae_allrwd","nckd_sae_retainsry"
+                ,"nckd_sae_reward","nckd_sae_otreward","nckd_sae_cmcsbd","nckd_sae_trfsbd","nckd_sae_housesbd","nckd_sae_warmsbd","nckd_sae_edusbd"
+                ,"nckd_sae_trafficsbd","nckd_sae_othersbd","nckd_sae_reduce","nckd_sae_othersry","nckd_sae_sickreduce","nckd_sae_sickhopreduce"
+                ,"nckd_sae_eventreduce","nckd_sae_afwreduce","nckd_sae_latereduce","nckd_sae_cwasry","nckd_sae_cwareduce","nckd_sae_dgreduce"
+                ,"nckd_sae_dcpreduce","nckd_sae_badreduce","nckd_sae_otherreduce","nckd_sae_allreduce","nckd_sae_lastsry","nckd_sae_allpay"
+                ,"nckd_sae_per_endins","nckd_sae_per_ljins","nckd_sae_per_hopins","nckd_sae_per_bhopins","nckd_sae_per_hosins","nckd_sae_per_cmymey"
+                ,"nckd_sae_per_ins","nckd_sae_unionmey","nckd_sae_tax","nckd_sae_allamount","nckd_sae_cash","nckd_sae_wages","nckd_sae_cpy_endins"
+                ,"nckd_sae_cpy_hopins","nckd_sae_cpy_bhopins","nckd_sae_cpy_birthins","nckd_sae_cpy_ljins","nckd_sae_cpy_dmgins","nckd_sae_cpy_hosins"
+                ,"nckd_sae_cpy_cmymey");
+
+        //人力薪酬汇总分录
+        List<String>nckd_a_allpay=Arrays.asList("nckd_asae_levelsry","nckd_asae_dutiessry","nckd_asae_updutiessry","nckd_asae_workyearsry"
+                ,"nckd_asae_depyear","nckd_asae_eduasry","nckd_asae_transry","nckd_asae_jobsry","nckd_asae_basicsry","nckd_asae_allbasicsry"
+                ,"nckd_asae_acmsry","nckd_asae_mountsry","nckd_asae_reacmsry","nckd_asae_balyearsry","nckd_asae_blastyearsry","nckd_asae_allsry"
+                ,"nckd_asae_bsnrwd","nckd_asae_cpmrwd","nckd_asae_psrwd","nckd_asae_comrwd","nckd_asae_cardrwd","nckd_asae_intwrd","nckd_asae_clearrwd"
+                ,"nckd_asae_allrwd","nckd_asae_retainsry","nckd_asae_reward","nckd_asae_otreward","nckd_asae_cmcsbd","nckd_asae_trfsbd","nckd_asae_housesbd"
+                ,"nckd_asae_warmsbd","nckd_asae_edusbd","nckd_asae_trafficsbd","nckd_asae_othersbd","nckd_asae_reduce","nckd_asae_othersry","nckd_asae_sickreduce"
+                ,"nckd_asae_shopreduce","nckd_asae_eventreduce","nckd_asae_afwreduce","nckd_asae_latereduce","nckd_asae_cwasry","nckd_asae_cwareduce"
+                ,"nckd_asae_dgreduce","nckd_asae_dcpreduce","nckd_asae_badreduce","nckd_asae_otherreduce","nckd_asae_allreduce","nckd_asae_lastsry"
+                ,"nckd_asae_allpay","nckd_asae_per_endins","nckd_asae_per_ljins","nckd_asae_per_hopins","nckd_asae_per_bhopins","nckd_asae_per_hosins"
+                ,"nckd_asae_per_cmymey","nckd_asae_per_ins","nckd_asae_unionmey","nckd_asae_tax","nckd_asae_allamount","nckd_asae_cash","nckd_asae_wages"
+                ,"nckd_asae_cpy_endins","nckd_asae_cpy_hopins","nckd_asae_cpy_bhopins","nckd_asae_cpy_birthins","nckd_asae_cpy_ljins","nckd_asae_cpy_dmgins"
+                ,"nckd_asae_cpy_hosins","nckd_asae_cpy_cmymey");
+
+        //人力薪酬内退分录标识,金额字段
+        List<String> nckd_payretird=Arrays.asList("nckd_see_allbasicsry"
+                ,"nckd_see_allowance","nckd_see_otherallowanc","nckd_see_per_endins","nckd_see_per_ljins","nckd_see_per_hopins"
+                ,"nckd_see_per_bhopins","nckd_see_per_hosins","nckd_see_per_cmymey","nckd_see_unionmey","nckd_see_tax"
+                ,"nckd_see_desalary","nckd_see_netsalary","nckd_see_otherreduce","nckd_see_cpy_endins","nckd_see_cpy_bhopins"
+                ,"nckd_see_cpy_ljins","nckd_see_cpy_birthins","nckd_see_cpy_dmgins","nckd_see_cpy_cmymey","nckd_see_cpy_hosins"
+                ,"nckd_see_taxt","nckd_see_alltaxt","nckd_see_charge","nckd_see_finallsys","nckd_see_cpy_oldins","nckd_see_cpy_hop"
+                ,"nckd_see_cpy_bhop","nckd_see_cpy_bir","nckd_see_cpy_ljob","nckd_see_cpy_dwork","nckd_see_cpy_hos","nckd_see_cpy_cmy");
+
+
+        //人力薪酬内退分录
+        List<String> nckd_a_payretird=Arrays.asList("nckd_asee_allbasicsry","nckd_asee_allowance","nckd_asee_ollowanc","nckd_asee_per_endins"
+                ,"nckd_asee_per_ljins","nckd_asee_per_hopins","nckd_asee_per_bhopins","nckd_asee_per_hosins","nckd_asee_per_cmymey","nckd_asee_unionmey"
+                ,"nckd_asee_tax","nckd_asee_desalary","nckd_asee_netsalary","nckd_asee_otherreduce","nckd_asee_cpy_endins","nckd_asee_cpy_bhopins"
+                ,"nckd_asee_cpy_ljins","nckd_asee_cpy_birthins","nckd_asee_cpy_dmgins","nckd_asee_cpy_cmymey","nckd_asee_cpy_hosins","nckd_asee_taxt"
+                ,"nckd_asee_alltaxt","nckd_asee_charge","nckd_asee_finallsys","nckd_asee_cpy_oldins","nckd_asee_cpy_hop","nckd_asee_cpy_bhop","nckd_asee_cpy_bir"
+                ,"nckd_asee_cpy_ljob","nckd_asee_cpy_dwork","nckd_asee_cpy_hos","nckd_asee_cpy_cmy");
+
+        Map<String,List<String>> mapList=new HashMap<>();
+        mapList.put("nckd_generalemployees",nckd_generalemployees);
+        mapList.put("nckd_a_employees",nckd_a_employees);
+        mapList.put("nckd_earlyretired",nckd_earlyretired);
+        mapList.put("nckd_retired",nckd_retired);
+        mapList.put("nckd_a_earlyretired",nckd_a_earlyretired);
+        mapList.put("nckd_pay",nckd_pay);
+        mapList.put("nckd_payretird",nckd_payretird);
+        mapList.put("nckd_a_retired",nckd_a_retired);
+        mapList.put("nckd_a_allpay",nckd_a_allpay);
+        mapList.put("nckd_a_payretird",nckd_a_payretird);
+
+
+        //list名
+        List<String> list=new ArrayList<>();
+        list.add("nckd_a_payretird");
+        list.add("nckd_a_allpay");
+        list.add("nckd_a_retired");
+        list.add("nckd_generalemployees");
+        list.add("nckd_allemployees");
+        list.add("nckd_a_employees");
+        list.add("nckd_earlyretired");
+        list.add("nckd_retired");
+        list.add("nckd_a_earlyretired");
+        list.add("nckd_pay");
+        list.add("nckd_payretird");
+        list.add("nckd_allearlytired");
+        list.add("nckd_allretired");
+        list.add("nckd_allpay");
+        list.add("nckd_allpayretird");
+        for (String item:list) {
+            if (nckdentry.equals(item)) {
+                return mapList.get(nckdentry);
+            }
+        }
+        return null;
+    }
+
+    //保存前计算汇总分录
+    public void beforeDoOperation(BeforeDoOperationEventArgs arg) {
+        super.beforeDoOperation(arg);
+        FormOperate source = (FormOperate) arg.getSource();
+        //获取当前操作单据
+        DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+        //当前单据分录类型
+        String nckd_entrytype=dynamicObject.getString("nckd_entrytype");
+
+        //保存,提交前,计算汇总分录
+        if ("save".equals(source.getOperateKey())||"submit".equals(source.getOperateKey())){
+            //分录类型为通用薪酬一般员工
+            if ("A".equals(nckd_entrytype)) {
+                //先清空汇总分录分录
+                this.getModel().deleteEntryData("nckd_a_staffentry");
+                //字段标识
+                String entrylist="nckd_generalemployees";
+                //对应分录标识
+                String propername="nckd_staffentry";
+                //对应部门标识
+                String dep="nckd_se_department";
+                //对应汇总分录字段标识
+                String allentrtlist="nckd_a_employees";
+                this.getView().setVisible(true,nckd_a_generalemployees);
+                this.getView().setVisible(false,nckd_a_earlyretired);
+                this.getView().setVisible(false,nckd_a_retired);
+                this.getView().setVisible(false,nckd_a_pay);
+                this.getView().setVisible(false,nckd_a_payretird);
+                allDataEntry(dynamicObject,entrylist,propername,dep,allentrtlist,"nckd_ase_department",nckd_a_staffentry);
+
+                DynamicObjectCollection nckd_ase=dynamicObject.getDynamicObjectCollection("nckd_a_staffentry");
+                //循环汇总分录
+                for (int i=0;i<nckd_ase.size();i++){
+                    //部门
+                    DynamicObject depament=nckd_ase.get(i).getDynamicObject("nckd_ase_department");
+                    DynamicObjectCollection nckd_staffentry=dynamicObject.getDynamicObjectCollection("nckd_staffentry");
+                    for (DynamicObject it:nckd_staffentry) {
+                        //所在单位相等则获取发薪机构
+                        if (depament.equals(it.getDynamicObject("nckd_se_department"))) {
+                            this.getModel().setValue("nckd_ase_institution",it.getDynamicObject("nckd_se_institution"),i);
+                            break;
+                        }
+                    }
+                }
+
+            }
+            //分录类型为通用薪酬内退
+            if ("B".equals(nckd_entrytype)) {
+                //先清空汇总分录分录
+                this.getModel().deleteEntryData("nckd_a_earlyretiredentry");
+                //字段标识
+                String entrylist="nckd_earlyretired";
+                //对应分录标识
+                String propername="nckd_earlyretiredentry";
+                //对应部门标识
+                String dep="nckd_ee_department";
+                //对应汇总分录字段标识
+                String allentrtlist="nckd_a_earlyretired";
+                allDataEntry(dynamicObject,entrylist,propername,dep,allentrtlist,"nckd_aee_department",nckd_a_earlyretiredentry);
+                this.getView().setVisible(false,nckd_a_generalemployees);
+                this.getView().setVisible(true,nckd_a_earlyretired);
+                this.getView().setVisible(false,nckd_a_retired);
+                this.getView().setVisible(false,nckd_a_pay);
+                this.getView().setVisible(false,nckd_a_payretird);
+
+                //发薪机构赋值
+                DynamicObjectCollection nckd_ase=dynamicObject.getDynamicObjectCollection("nckd_a_earlyretiredentry");
+                //循环汇总分录
+                for (int i=0;i<nckd_ase.size();i++){
+                    //部门
+                    DynamicObject depament=nckd_ase.get(i).getDynamicObject("nckd_aee_department");
+                    DynamicObjectCollection nckd_staffentry=dynamicObject.getDynamicObjectCollection("nckd_earlyretiredentry");
+                    for (DynamicObject it:nckd_staffentry) {
+                        //所在单位相等则获取发薪机构
+                        if (depament.equals(it.getDynamicObject("nckd_ee_department"))) {
+                            this.getModel().setValue("nckd_aee_institution",it.getDynamicObject("nckd_ee_institution"),i);
+                            break;
+                        }
+                    }
+                }
+            }
+            //分录类型为通用薪酬退休
+            if ("C".equals(nckd_entrytype)) {
+                //先清空汇总分录分录
+                this.getModel().deleteEntryData("nckd_a_retireentry");
+                //字段标识
+                String entrylist="nckd_retired";
+                //对应分录标识
+                String propername="nckd_retireentry";
+                //对应部门标识
+                String dep="nckd_re_department";
+                //对应汇总分录字段标识
+                String allentrtlist="nckd_a_retired";
+                allDataEntry(dynamicObject,entrylist,propername,dep,allentrtlist,"nckd_are_department",nckd_a_retireentry);
+                this.getView().setVisible(false,nckd_a_generalemployees);
+                this.getView().setVisible(false,nckd_a_earlyretired);
+                this.getView().setVisible(true,nckd_a_retired);
+                this.getView().setVisible(false,nckd_a_pay);
+                this.getView().setVisible(false,nckd_a_payretird);
+                //发薪机构赋值
+                DynamicObjectCollection nckd_ase=dynamicObject.getDynamicObjectCollection("nckd_a_retireentry");
+                //循环汇总分录
+                for (int i=0;i<nckd_ase.size();i++){
+                    //部门
+                    DynamicObject depament=nckd_ase.get(i).getDynamicObject("nckd_are_department");
+                    DynamicObjectCollection nckd_staffentry=dynamicObject.getDynamicObjectCollection("nckd_retireentry");
+                    for (DynamicObject it:nckd_staffentry) {
+                        //所在单位相等则获取发薪机构
+                        if (depament.equals(it.getDynamicObject("nckd_re_department"))) {
+                            this.getModel().setValue("nckd_are_institution",it.getDynamicObject("nckd_re_institution"),i);
+                            break;
+                        }
+                    }
+                }
+            }
+            //分录类型为人力薪酬(一般员工)
+            if ("D".equals(nckd_entrytype)) {
+                //先清空汇总分录分录
+                this.getModel().deleteEntryData("nckd_a_salaryentry");
+                //字段标识
+                String entrylist="nckd_pay";
+                //对应分录标识
+                String propername="nckd_salaryentry";
+                //对应部门标识
+                String dep="nckd_sae_department";
+                //对应汇总分录字段标识
+                String allentrtlist="nckd_a_allpay";
+                allDataEntry(dynamicObject,entrylist,propername,dep,allentrtlist,"nckd_asae_department",nckd_a_salaryentry);
+                this.getView().setVisible(false,nckd_a_generalemployees);
+                this.getView().setVisible(false,nckd_a_earlyretired);
+                this.getView().setVisible(false,nckd_a_retired);
+                this.getView().setVisible(true,nckd_a_pay);
+                this.getView().setVisible(false,nckd_a_payretird);
+                //发薪机构赋值
+                DynamicObjectCollection nckd_ase=dynamicObject.getDynamicObjectCollection("nckd_a_salaryentry");
+                //循环汇总分录
+                for (int i=0;i<nckd_ase.size();i++){
+                    //部门
+                    DynamicObject depament=nckd_ase.get(i).getDynamicObject("nckd_asae_department");
+                    DynamicObjectCollection nckd_staffentry=dynamicObject.getDynamicObjectCollection("nckd_salaryentry");
+                    for (DynamicObject it:nckd_staffentry) {
+                        //所在单位相等则获取发薪机构
+                        if (depament.equals(it.getDynamicObject("nckd_sae_department"))) {
+                            this.getModel().setValue("nckd_asae_institution",it.getDynamicObject("nckd_sae_institution"),i);
+                            break;
+                        }
+                    }
+                }
+            }
+            //分录类型为人力薪酬(内退)
+            if ("E".equals(nckd_entrytype)) {
+                //先清空汇总分录分录
+                this.getModel().deleteEntryData("nckd_a_salaryentryre");
+                //字段标识
+                String entrylist="nckd_payretird";
+                //对应分录标识
+                String propername="nckd_salaryentryre";
+                //对应部门标识
+                String dep="nckd_see_department";
+                //对应汇总分录字段标识
+                String allentrtlist="nckd_a_payretird";
+                allDataEntry(dynamicObject,entrylist,propername,dep,allentrtlist,"nckd_asee_department",nckd_a_salaryentryre);
+                this.getView().setVisible(false,nckd_a_generalemployees);
+                this.getView().setVisible(false,nckd_a_earlyretired);
+                this.getView().setVisible(false,nckd_a_retired);
+                this.getView().setVisible(false,nckd_a_pay);
+                this.getView().setVisible(true,nckd_a_payretird);
+                //发薪机构赋值
+                DynamicObjectCollection nckd_ase=dynamicObject.getDynamicObjectCollection("nckd_a_salaryentryre");
+                //循环汇总分录
+                for (int i=0;i<nckd_ase.size();i++){
+                    //部门
+                    DynamicObject depament=nckd_ase.get(i).getDynamicObject("nckd_asee_department");
+                    DynamicObjectCollection nckd_staffentry=dynamicObject.getDynamicObjectCollection("nckd_salaryentryre");
+                    for (DynamicObject it:nckd_staffentry) {
+                        //所在单位相等则获取发薪机构
+                        if (depament.equals(it.getDynamicObject("nckd_see_department"))) {
+                            this.getModel().setValue("nckd_asee_institution",it.getDynamicObject("nckd_see_institution"),i);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * @dynamicObject 当前单据信息
+     * @entrylist 字段标识列表
+     * @propername 分录标识
+     * @dep 对应分录部门标识
+     * @allentrtlist 写入的汇总分录字段
+     * @nckd_dep 汇总分录部门标识
+     * @description:根据分录类型不同计算汇总分录
+     */
+    public void allDataEntry(DynamicObject dynamicObject
+            ,String entrylist,String propername,String dep,String allentrtlist,String nckd_dep,String nckd_allentry)
+    {
+        //字段标识
+        List<String> nckd_generalemployees = entryList(entrylist);
+        //获取一般员工分录
+        DynamicObjectCollection staffentry=dynamicObject.getDynamicObjectCollection(propername);
+        //分录部门list
+        List<DynamicObject> depList=new ArrayList<>();
+        //初始化值为第一行部门
+        depList.add(staffentry.get(0).getDynamicObject(dep));
+        for (DynamicObject item:staffentry) {
+            //将不同的值加入到部门的list中
+            if (!depList.contains(item.getDynamicObject(dep))) {
+                depList.add(item.getDynamicObject(dep));
+            }
+        }
+
+        //几个不同部门则循环几次
+        for (DynamicObject bumen : depList) {
+            //某部门总数据
+            List<BigDecimal> sumNum = new ArrayList<>();
+            //汇总表部门list初始化
+            for (int b = 0; b < nckd_generalemployees.size(); b++) {
+                sumNum.add(new BigDecimal("0.0"));
+            }
+            //计算一个部门汇总
+            for (DynamicObject object : staffentry) {
+                //获取所在部门
+                DynamicObject department = object.getDynamicObject(dep);
+                //相同部门则累加金额数据
+                if (department.equals(bumen)) {
+                    for (int a = 0; a < nckd_generalemployees.size(); a++) {
+                        BigDecimal cell = sumNum.get(a);
+                        //字段标识
+                        String entry = nckd_generalemployees.get(a);
+                        //i行的a列数据
+                        BigDecimal num = object.getBigDecimal(entry);
+                        cell = cell.add(num);
+                        sumNum.set(a, cell);
+                    }
+                }
+            }
+            //创建新的分录行
+            int rowIndex = this.getModel().createNewEntryRow(nckd_allentry);
+            //设置部门
+            this.getModel().setValue(nckd_dep, bumen, rowIndex);
+            for (int c = 0; c < sumNum.size(); c++) {
+                this.getModel().setValue(entryList(allentrtlist).get(c), sumNum.get(c), rowIndex);
+            }
+        }
+
+    }
+
+
+
+}

+ 16 - 17
src/main/java/fi/em/formPlugin/SubAndAudFormPlugin.java

@@ -15,7 +15,7 @@ import java.util.*;
 /**
  * @author cjz
  * @date 2024/9/12 11:12
- * @description:薪酬计提提交后自动审核,保存前计算汇总分录
+ * @description:薪酬发放提交后自动审核,保存前计算汇总分录
  */
 public class SubAndAudFormPlugin extends AbstractListPlugin implements Plugin {
 
@@ -50,40 +50,39 @@ public class SubAndAudFormPlugin extends AbstractListPlugin implements Plugin {
 
     //根据输入的list名,返回对应list
     public List<String> entryList(String nckdentry)
-    {
+      {
         //薪酬明细(一般员工)分录字段标识,金额字段
         List<String> nckd_generalemployees = Arrays.asList("nckd_se_allbasicsry"
                 ,"nckd_se_basicsry","nckd_se_acmsry","nckd_se_reacmsry","nckd_se_bsnrwd","nckd_se_otreward","nckd_se_cmcsbd"
-                ,"nckd_se_otherpysry","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
-                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_salarypayable","nckd_se_per_endins"
+                ,"nckd_se_otherpysry","nckd_se_latesry","nckd_se_latesrygrant","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
+                ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_risksry","nckd_se_salarypayable","nckd_se_per_endins"
                 ,"nckd_se_per_hopins","nckd_se_per_bhopins","nckd_se_per_ljins","nckd_se_per_hosins","nckd_se_per_cmymey"
                 ,"nckd_se_unionmey","nckd_se_tax","nckd_se_otherreduce","nckd_se_desalary","nckd_se_netsalary","nckd_se_cpy_endins"
-                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_birthins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
+                ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
                 ,"nckd_se_cpy_cmymey");
 
         //薪酬明细(一般员工)汇总分录
         List<String> nckd_a_employees=Arrays.asList("nckd_ase_allbasicsry","nckd_ase_basicsry","nckd_ase_acmsry"
-                ,"nckd_ase_reacmsry","nckd_ase_bsnrwd","nckd_ase_otreward","nckd_ase_cmcsbd","nckd_ase_otherpysry","nckd_ase_clearrwd"
-                ,"nckd_ase_awareward","nckd_ase_otherdevreward","nckd_ase_coldsbad","nckd_ase_warmsbad","nckd_ase_nursabd","nckd_ase_oalwance"
+                ,"nckd_ase_reacmsry","nckd_ase_bsnrwd","nckd_ase_otreward","nckd_ase_cmcsbd","nckd_ase_otherpysry","nckd_ase_latesry","nckd_ase_latesrygrant","nckd_ase_clearrwd"
+                ,"nckd_ase_awareward","nckd_ase_otherdevreward","nckd_ase_coldsbad","nckd_ase_warmsbad","nckd_ase_nursabd","nckd_ase_oalwance","nckd_ase_risksry"
                 ,"nckd_ase_salarypayable","nckd_ase_per_endins","nckd_ase_per_hopins","nckd_ase_per_bhopins","nckd_ase_per_ljins","nckd_ase_per_hosins"
                 ,"nckd_ase_per_cmymey","nckd_ase_unionmey","nckd_ase_tax","nckd_ase_otherreduce","nckd_ase_desalary","nckd_ase_netsalary"
-                ,"nckd_ase_cpy_endins","nckd_ase_cpy_hopins","nckd_ase_cpy_bhopins","nckd_ase_cpy_ljins","nckd_ase_cpy_birthins","nckd_ase_cpy_dmgins"
+                ,"nckd_ase_cpy_endins","nckd_ase_cpy_hopins","nckd_ase_cpy_bhopins","nckd_ase_cpy_ljins","nckd_ase_cpy_dmgins"
                 ,"nckd_ase_cpy_hosins","nckd_ase_cpy_cmymey");
 
 
         //薪酬明细(内退)分录字段标识,金额字段
-        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_otherallowance","nckd_ee_per_endins"
+        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_orallowance","nckd_ee_per_endins"
+                ,"nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins","nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins"
+                ,"nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt","nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys"
                 ,"nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins","nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey"
-                ,"nckd_ee_tax","nckd_ee_desalary","nckd_ee_netsalary","nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins"
-                ,"nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins","nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt"
-                ,"nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys");
+        );
 
         //薪酬明细(内退)汇总分录
-        List<String> nckd_a_earlyretired=Arrays.asList("nckd_aee_allbasicsry","nckd_aee_allowance","nckd_aee_ollowance","nckd_aee_per_endins"
-                ,"nckd_aee_per_ljins","nckd_aee_per_hopins","nckd_aee_per_bhopins","nckd_aee_per_hosins","nckd_aee_per_cmymey","nckd_aee_unionmey"
-                ,"nckd_aee_tax","nckd_aee_desalary","nckd_aee_netsalary","nckd_aee_otherreduce","nckd_aee_cpy_endins","nckd_aee_cpy_bhopins","nckd_aee_cpy_ljins"
-                ,"nckd_aee_cpy_birthins","nckd_aee_cpy_dmgins","nckd_aee_cpy_cmymey","nckd_aee_cpy_hosins","nckd_aee_taxt","nckd_aee_alltaxt","nckd_aee_charge"
-                ,"nckd_aee_finallsys");
+        List<String> nckd_a_earlyretired=Arrays.asList("nckd_aee_allbasicsry","nckd_aee_otherallowance","nckd_aee_orallowance","nckd_aee_per_endins"
+                ,"nckd_aee_otherreduce","nckd_aee_cpy_endins","nckd_aee_cpy_bhopins","nckd_aee_cpy_ljins","nckd_aee_cpy_birthins","nckd_aee_cpy_dmgins"
+                ,"nckd_aee_cpy_cmymey","nckd_aee_cpy_hosins","nckd_aee_taxt","nckd_aee_alltaxt","nckd_aee_charge","nckd_aee_finallsys","nckd_aee_per_ljins"
+                ,"nckd_aee_per_hopins","nckd_aee_per_bhopins","nckd_aee_per_hosins","nckd_aee_per_cmymey","nckd_aee_unionmey");
 
 
         //薪酬明细(退休)分录字段标识,金额字段

+ 6 - 4
src/main/java/fi/fa/opplugin/BusProcessBillOpPlugin.java

@@ -24,8 +24,9 @@ public class BusProcessBillOpPlugin extends AbstractOperationServicePlugIn {
                 if ("D".equals(info.getString("nckd_detailtype"))) {
                     //资产报废
                     for (DynamicObject nckd_entryentity6 : info.getDynamicObjectCollection("nckd_entryentity6")) {
-                        String number = nckd_entryentity6.getDynamicObject("nckd_basedatafield").getString("number");
-                        if (!StringUtils.isEmpty(number)) {
+                        DynamicObject nckd_basedatafield = nckd_entryentity6.getDynamicObject("nckd_basedatafield");
+                        if (nckd_basedatafield != null) {
+                            String number = nckd_basedatafield.getString("number");
                             //查询e管家实物卡片清单
                             QFilter filter = new QFilter("nckd_card_real_code", QCP.equals,number);
                             DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
@@ -100,8 +101,9 @@ public class BusProcessBillOpPlugin extends AbstractOperationServicePlugIn {
                 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
                 if ("D".equals(info.getString("nckd_detailtype"))) {
                     for (DynamicObject nckd_entryentity6 : info.getDynamicObjectCollection("nckd_entryentity6")) {
-                        String  number = nckd_entryentity6.getDynamicObject("nckd_basedatafield").getString("number");
-                        if (!StringUtils.isEmpty(number)) {
+                        DynamicObject  nckd_basedatafield = nckd_entryentity6.getDynamicObject("nckd_basedatafield");
+                        if (nckd_basedatafield != null) {
+                            String number = nckd_basedatafield.getString("number");
                             //查询e管家实物卡片清单
                             QFilter filter = new QFilter("nckd_card_real_code", QCP.equals,number);
                             DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});

+ 33 - 0
src/main/java/fi/fa/opplugin/FaLeaseContractOpPlugin.java

@@ -0,0 +1,33 @@
+package fi.fa.opplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+public class FaLeaseContractOpPlugin extends AbstractOperationServicePlugIn {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            if (StringUtils.equals(e.getOperationKey(),"audit")) {
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                DynamicObject assetcat = info.getDynamicObject("assetcat");
+                Long id = null;
+                if (assetcat != null) {
+                    id = assetcat.getLong("id");
+                }
+                Boolean isexempt = info.getBoolean("isexempt");
+                DynamicObjectCollection payplanentryentitys = info.getDynamicObjectCollection("payplanentryentity");
+                for (DynamicObject payplanentryentity : payplanentryentitys) {
+                    payplanentryentity.set("nckd_basedatafield", id);
+                    payplanentryentity.set("nckd_checkboxfield", isexempt);
+                }
+                SaveServiceHelper.save(new DynamicObject[]{info});
+            }
+        }
+    }
+}

+ 1082 - 0
src/main/java/kd/fi/er/formplugin/mobile/TripReimburseConsumcordPluginEx.java

@@ -0,0 +1,1082 @@
+package kd.fi.er.formplugin.mobile;
+
+import com.google.common.collect.Lists;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import kd.bos.bill.AbstractMobBillPlugIn;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.entity.MulBasedataDynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.cache.RedisModelCache;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.IRefrencedataProvider;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
+import kd.bos.entity.datamodel.events.AfterDeleteRowEventArgs;
+import kd.bos.entity.datamodel.events.BizDataEventArgs;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.property.MulBasedataProp;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IFormView;
+import kd.bos.form.IMobileView;
+import kd.bos.form.IPageCache;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.ShowType;
+import kd.bos.form.cardentry.CardEntry;
+import kd.bos.form.control.AbstractGrid;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.Label;
+import kd.bos.form.control.events.BeforeClickEvent;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.form.control.events.RowClickEvent;
+import kd.bos.form.control.events.RowClickEventListener;
+import kd.bos.form.events.BeforeClosedEvent;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.DateEdit;
+import kd.bos.form.field.MulBasedataEdit;
+import kd.bos.form.plugin.IFormPlugin;
+import kd.bos.list.ListFilterParameter;
+import kd.bos.list.MobileListShowParameter;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
+import kd.bos.util.CollectionUtils;
+import kd.fi.er.business.reimamountctl.utils.QuotaCtrlUtil;
+import kd.fi.er.business.servicehelper.CommonServiceHelper;
+import kd.fi.er.business.servicehelper.CoreBaseBillServiceHelper;
+import kd.fi.er.business.servicehelper.DailyBillServiceHelper;
+import kd.fi.er.business.servicehelper.TripReimburseServiceHelper;
+import kd.fi.er.business.utils.ActionLocalCache;
+import kd.fi.er.business.utils.AmountChangeUtil;
+import kd.fi.er.business.utils.ErCommonUtils;
+import kd.fi.er.business.utils.ErCostCenterUtil;
+import kd.fi.er.business.utils.ErStdConfig;
+import kd.fi.er.business.utils.SystemParamterUtil;
+import kd.fi.er.business.utils.TripBillTravelerUtils;
+import kd.fi.er.common.ErBillStatusEnum;
+import kd.fi.er.common.ShowPageUtils;
+import kd.fi.er.formplugin.budget.BudgetCommonUtil;
+import kd.fi.er.formplugin.daily.web.workflow.ErMobWorkFlowOtherViewEditUtils;
+import kd.fi.er.formplugin.invoicecloud.usecase.ShowInvoiceCloudPageUtil;
+import kd.fi.er.formplugin.util.EntryCopyUtil;
+import kd.fi.er.formplugin.web.TripEntryEdit;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+
+public class TripReimburseConsumcordPluginEx extends AbstractMobBillPlugIn implements ClickListener, RowClickEventListener {
+    private static Log logger = LogFactory.getLog(TripEntryEdit.class);
+    private static final String[] requiredProps = new String[]{"from", "to", "startdate", "enddate", "vehicles", "travelers"};
+    private static final String[] requiredSTDProps = new String[]{"overdesc"};
+    protected static final String[] STDCTRL_ATTRIBUTE = new String[]{"5", "1", "2", "4", "7"};
+    protected static final String[] ACCD_ALLOWANCE_ATTRIBUTE = new String[]{"5", "1"};
+    protected static final String[] VEHIC_ATTRIBUTE = new String[]{"2", "4", "7"};
+    private static final String KEY_SUBMIT = "submit";
+    private static final String OPPARAM_AFTERCONFIRM = "afterconfirm";
+    private static final String INVOICE_HEAD_ENTRY = "invoiceentry";
+    private static final String INVOICE_ITEM_ENTRY = "invoiceitementry";
+    private static final String TRIPEXPENSEACTIONID = "showEspenseItem";
+
+    public TripReimburseConsumcordPluginEx() {
+    }
+
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        this.addClickListeners(new String[]{"btn_addexpenseitem", "btn_save", "imageap_delete", "labelap_edit", "labelap_done", "image_invoice"});
+        AbstractGrid grid = (AbstractGrid)this.getView().getControl("entryentity");
+        grid.addRowClickListener(this);
+        MulBasedataEdit travelersF7 = (MulBasedataEdit)this.getControl("travelers");
+        DynamicObject company = (DynamicObject)this.getView().getParentView().getModel().getValue("company");
+        DynamicObject org = (DynamicObject)this.getView().getParentView().getModel().getValue("org");
+        TripBillTravelerUtils.getF7FilterInfo(company, org, travelersF7);
+    }
+
+    public void createNewData(BizDataEventArgs e) {
+        super.createNewData(e);
+        FormShowParameter showParameter = this.getView().getFormShowParameter();
+        Map<String, Object> mapCustomParam = showParameter.getCustomParams();
+        int status = (Integer)mapCustomParam.get("status");
+        IDataModel pModel = this.getView().getParentView().getModel();
+        if (status == 1 && pModel.getDataEntity().getDataEntityType().getName().equals(this.getView().getEntityId())) {
+            e.setDataEntity(pModel.getDataEntity());
+        }
+
+    }
+
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        IDataModel model = this.getModel();
+        CoreBaseBillServiceHelper.setFromStatus(this);
+        IFormView parentView = this.getView().getParentView();
+        IDataModel parentModel = parentView.getModel();
+        model.setValue("billstatus", parentModel.getValue("billstatus"));
+        model.setValue("editentry", "0");
+        this.getView().setVisible(false, new String[]{"labelap_done"});
+        Map<String, Object> mapCustomParam = this.getView().getFormShowParameter().getCustomParams();
+        Integer status = null;
+        Object tocity;
+        if (mapCustomParam != null) {
+            Object index = mapCustomParam.get("index");
+            if (index != null) {
+                this.getPageCache().put("parentViewTripIndex", index.toString());
+            }
+
+            status = (Integer)mapCustomParam.get("status");
+            Object currency = mapCustomParam.get("currency");
+            if (currency != null) {
+                model.setValue("currency", Long.valueOf(currency.toString()));
+            }
+
+            tocity = mapCustomParam.get("applier");
+            if (tocity != null) {
+                model.setValue("applier", Long.valueOf(tocity.toString()));
+            }
+        }
+
+        Long companyId = ErCommonUtils.getPk(parentModel.getValue("company"));
+        model.setValue("company", companyId);
+        model.setValue("costcompany", ErCommonUtils.getPk(parentModel.getValue("costcompany")));
+        boolean iscurrencyshowintripentry = !DailyBillServiceHelper.isNewTripReim(this.getModel()) && SystemParamterUtil.getIsCurrencyShowinTripentry(ErCommonUtils.getPk(this.getModel().getValue("company")));
+        model.setValue("iscurrencyshowintripentry", iscurrencyshowintripentry);
+        model.setValue("ismulwayto", parentModel.getValue("ismulwayto"));
+        CommonServiceHelper.setMulWayToVisible(parentModel, this.getView());
+        model.setValue("istravelers", parentModel.getValue("istravelers"));
+        model.setValue("travelerssamestd", parentModel.getValue("travelerssamestd"));
+        this.getModel().setValue("bizdate", parentView.getModel().getValue("bizdate"));
+        if (status != null && status == 0) {
+            this.initNewTripentryInfo(model, parentModel, mapCustomParam);
+        } else if (status != null && status == 1) {
+            this.updateTripentryInfo(model, parentModel, mapCustomParam, companyId);
+        }
+
+        if (mapCustomParam != null) {
+            tocity = mapCustomParam.get("to");
+            if (null != tocity) {
+                Long cityId = Long.parseLong(tocity.toString());
+                model.setValue("from", cityId, 0);
+            }
+        }
+
+        AmountChangeUtil.updateExpenseDetailAmountLabelForMob(this.getView(), model);
+        this.setExpenseEntryLableCount();
+        this.copyInvoiceFromParentToChildPage(this.getView().getParentView().getModel(), model);
+    }
+
+    private void updateTripentryInfo(IDataModel model, IDataModel parentModel, Map<String, Object> mapCustomParam, Long companyId) {
+        DynamicObjectCollection ptrip = (DynamicObjectCollection)parentModel.getDataEntity(true).get("tripentry");
+        Object indexObj = mapCustomParam.get("index");
+        if (indexObj != null) {
+            int index = Integer.parseInt(indexObj.toString());
+            DynamicObject viewTrip = (DynamicObject)ptrip.get(index);
+            DynamicObject tripCurrency = (DynamicObject)viewTrip.get("tripcurrency");
+            if (null == tripCurrency) {
+                tripCurrency = (DynamicObject)parentModel.getValue("currency");
+                viewTrip.set("tripcurrency", parentModel.getValue("currency"));
+                viewTrip.set("tripexchangerate", BigDecimal.ONE);
+                AmountChangeUtil.updateExpenseDetailAmountLabelForMob(this.getView(), model);
+            }
+
+            DynamicObjectCollection trip = (DynamicObjectCollection)this.getModel().getDataEntity(true).get("tripentry");
+            trip.clear();
+            EntryCopyUtil.copyEntry2TargetColl(trip, viewTrip);
+            if (CollectionUtils.isNotEmpty(trip)) {
+                ((DynamicObject)trip.get(0)).set("seq", 1);
+            }
+
+            DynamicObject tripEntryCol = (DynamicObject)trip.get(0);
+            int tripday = tripEntryCol.getInt("tripday");
+            int entryCountIndex = model.getEntryRowCount("entryentity");
+
+            for(int i = 0; i < entryCountIndex; ++i) {
+                model.setValue("daycount", tripday, i, 0);
+                model.setValue("entrycurrency", model.getValue("entrycurrency", i, 0), i, 0);
+            }
+
+        }
+    }
+
+    private void initNewTripentryInfo(IDataModel model, IDataModel parentModel, Map<String, Object> mapCustomParam) {
+        boolean iscurrency = (Boolean)parentModel.getValue("iscurrency");
+        model.setValue("iscurrency", iscurrency);
+        int tripRowIndex = model.createNewEntryRow("tripentry");
+        Object tocity = mapCustomParam.get("to");
+        if (null == tocity) {
+            Long cityId = ((IMobileView)this.getView()).getCurrentCityId();
+            model.setValue("from", cityId, tripRowIndex);
+        }
+
+        DynamicObject costDept = (DynamicObject)parentModel.getValue("costdept");
+        DynamicObject costCompany = (DynamicObject)parentModel.getValue("costcompany");
+        model.setValue("entrycostdept", ErCommonUtils.getPk(costDept), tripRowIndex);
+        model.setValue("entrycostcompany", ErCommonUtils.getPk(costCompany), tripRowIndex);
+        Long[] applierIds = new Long[]{ErCommonUtils.getPk(parentModel.getValue("applier"))};
+        model.setValue("travelers", applierIds, tripRowIndex);
+        model.setValue("tripcurrency", ErCommonUtils.getPk(parentModel.getValue("currency")), tripRowIndex);
+        String vehicles = (String)model.getValue("vehicles", tripRowIndex);
+        Object company = model.getValue("company");
+        if (company == null) {
+            model.setValue("company", ErCommonUtils.getPk(parentModel.getValue("company")));
+        }
+
+        CoreBaseBillServiceHelper.mulTripVehicle(model, vehicles, tripRowIndex);
+        CoreBaseBillServiceHelper.addDefaultTripExpenseEntry(model, tripRowIndex);
+        DynamicObject dataEntity = model.getDataEntity(true);
+        long companyId = dataEntity.getLong("company_id");
+        String tripStandardControlMethod = SystemParamterUtil.getTripStandardControlLevel(companyId).getValue();
+        String vehicleConType = SystemParamterUtil.getVehicleStdControlLevel(companyId).getValue();
+        DynamicObjectCollection tripEntryColl = dataEntity.getDynamicObjectCollection("tripentry");
+        DynamicObjectCollection detailColl = ((DynamicObject)tripEntryColl.get(tripRowIndex)).getDynamicObjectCollection("entryentity");
+
+        for(int i = 0; i < detailColl.size(); ++i) {
+            model.setValue("ispassentry", Boolean.FALSE, i, tripRowIndex);
+            DynamicObject tripExpItem = ((DynamicObject)detailColl.get(i)).getDynamicObject("expenseitem");
+            if (tripExpItem != null) {
+                String attribute = tripExpItem.getString("attribute");
+                if (Arrays.asList(ACCD_ALLOWANCE_ATTRIBUTE).contains(attribute)) {
+                    model.setValue("controlmethod", tripStandardControlMethod, i, tripRowIndex);
+                } else if (Arrays.asList(VEHIC_ATTRIBUTE).contains(attribute)) {
+                    model.setValue("controlmethod", vehicleConType, i, tripRowIndex);
+                }
+            }
+
+            model.setValue("trip2travelers", ((DynamicObject)tripEntryColl.get(tripRowIndex)).getDynamicObjectCollection("travelers"), i, tripRowIndex);
+        }
+
+        ErCostCenterUtil.initEntryCostCenter(this.getModel(), "tripentry", tripRowIndex, -1);
+    }
+
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        FormShowParameter showParameter = this.getView().getFormShowParameter();
+        Map<String, Object> mapCustomParam = showParameter.getCustomParams();
+        boolean isQueryBudget = (Boolean)mapCustomParam.get("isquerybudget");
+        BudgetCommonUtil.setIsQueryBudgetFlag(this.getPageCache(), isQueryBudget);
+        this.setBudgetShow(0);
+        IDataModel model = this.getModel();
+        Boolean iscurency = this.refreshEntryCurrency(model);
+        model.setValue("iscurrency", iscurency);
+        if (mapCustomParam != null) {
+            Object date = mapCustomParam.get("enddate");
+            if (null != date) {
+                model.setValue("startdate", date, 0);
+            }
+        }
+
+        int entryCountIndex = this.getModel().getEntryRowCount("entryentity");
+
+        for(int i = 0; i < entryCountIndex; ++i) {
+            DynamicObject tripexpense = (DynamicObject)model.getValue("expenseitem", i);
+            this.isExpenseIsPassEntry(model, i, tripexpense);
+        }
+
+        this.setTripExenseItemIcon();
+        ShowInvoiceCloudPageUtil.registCheckback(this);
+        this.setExpenseEntryLableCount();
+        if (model.getEntryEntity("entryentity").stream().anyMatch((v) -> {
+            return "2".equals(v.getString("settlementtype"));
+        })) {
+            this.getView().setEnable(Boolean.FALSE, (Integer)mapCustomParam.get("index"), new String[]{"tripcurrency"});
+        }
+
+        ShowPageUtils.setMobilePageFormStatus(this.getView());
+        this.vehicleVisible();
+        if (model.getEntryRowCount("entryentity") == 0) {
+        }
+
+        this.setTripDateControl();
+        ErMobWorkFlowOtherViewEditUtils.setWorkFlowEditView(this.getView(), mapCustomParam, model, 4);
+    }
+
+    private void setBudgetShow(int rowIndex) {
+        CardEntry tripCardEntry = (CardEntry)this.getControl("tripentry");
+        if (tripCardEntry != null) {
+            if (!BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) && !BudgetCommonUtil.getIsQueryEASBudgetFlag(this.getPageCache())) {
+                tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetamount"});
+                tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetmsg"});
+            } else {
+                IFormView parentView = this.getView().getParentView();
+                if (parentView != null) {
+                    String budgeMsgValue = (String)ErCommonUtils.getEMParameter(ErCommonUtils.getPk(parentView.getModel().getValue("company")), "budgeMsgControl");
+                    if (StringUtils.isNotEmpty(budgeMsgValue)) {
+                        if ("0".equals(budgeMsgValue)) {
+                            tripCardEntry.setChildVisible(true, rowIndex, new String[]{"budgetamount"});
+                            tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetmsg"});
+                        } else if ("1".equals(budgeMsgValue)) {
+                            tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetamount"});
+                            tripCardEntry.setChildVisible(true, rowIndex, new String[]{"budgetmsg"});
+                        }
+                    } else {
+                        tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetamount"});
+                        tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetmsg"});
+                    }
+                } else {
+                    tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetamount"});
+                    tripCardEntry.setChildVisible(false, rowIndex, new String[]{"budgetmsg"});
+                }
+            }
+        }
+
+    }
+
+    private void setTripDateControl() {
+        Object company = this.getView().getParentView().getModel().getValue("company");
+        if (org.apache.commons.lang3.StringUtils.equals(SystemParamterUtil.getTripReimDateSelectRange(ErCommonUtils.getPk(company)), "0")) {
+            DateEdit startDate = (DateEdit)this.getControl("startdate");
+            DateEdit endDate = (DateEdit)this.getControl("enddate");
+            LocalDate now = LocalDate.now();
+            startDate.setMaxDate(ErCommonUtils.getDateFromLocalDate(now));
+            endDate.setMaxDate(ErCommonUtils.getDateFromLocalDate(now));
+        }
+
+    }
+
+    protected void vehicleVisible() {
+        String vihicleKey = null;
+        if (!this.readOnly() && this.getVihicleFromStdConfig()) {
+            vihicleKey = "vehicles";
+        } else {
+            vihicleKey = "vehicle";
+        }
+
+        CardEntry tripentry = (CardEntry)this.getControl("tripentry");
+
+        for(int i = 0; i < this.getModel().getEntryRowCount("tripentry"); ++i) {
+            tripentry.setChildVisible(false, i, new String[]{vihicleKey});
+        }
+
+    }
+
+    protected boolean readOnly() {
+        IFormView parentView = this.getView().getParentView();
+        return parentView != null && !"A".equals(parentView.getModel().getValue("billstatus")) && !"D".equals(parentView.getModel().getValue("billstatus"));
+    }
+
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        IDataModel model = this.getModel();
+        String propName = e.getProperty().getName();
+        ChangeData[] valueSet = e.getChangeSet();
+        Object propValue = valueSet[0].getNewValue();
+        int rowIndex = valueSet[0].getRowIndex();
+        int parentIndex = valueSet[0].getParentRowIndex();
+        switch (propName) {
+            case "startdate":
+                if (propValue != null && model.getValue("triphappendate") == null) {
+                    model.setValue("triphappendate", propValue);
+                }
+
+                this.changeTripDay(rowIndex);
+                break;
+            case "enddate":
+                this.changeTripDay(rowIndex);
+                break;
+            case "vehicles":
+                CoreBaseBillServiceHelper.refreshVehicleRelateEntry(model, (String)propValue, rowIndex);
+                DynamicObjectCollection currItemEntry = ((DynamicObject)model.getDataEntity(true).getDynamicObjectCollection("tripentry").get(rowIndex)).getDynamicObjectCollection("entryentity");
+                if (currItemEntry != null && currItemEntry.size() > 0) {
+                    for(int i = 0; i < currItemEntry.size(); ++i) {
+                        this.getView().updateView("expenseitem", i, rowIndex);
+                    }
+                }
+                break;
+            case "tripexpenseitem":
+                if (BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) && propValue != null) {
+                    BudgetCommonUtil.buildBudgetAmountField(this.getView(), rowIndex);
+                }
+                break;
+            case "std_project":
+                if (BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache())) {
+                    BudgetCommonUtil.buildBudgetAmountField(this.getView(), rowIndex);
+                }
+                break;
+            case "vehicle":
+                if (this.getVihicleFromStdConfig()) {
+                    this.getModel().setValue("vehicles", propValue);
+                }
+                break;
+            case "std_entrycostcenter":
+                if (propValue != null && propValue != "" && ErCostCenterUtil.isLeafCostCenter(propValue)) {
+                    DynamicObject company = (DynamicObject)model.getValue("company");
+                    String selectMode = ErCommonUtils.getCostOrgUseMode((Long)company.getPkValue());
+                    if (!"0".equals(selectMode)) {
+                        ErCostCenterUtil.costEntryCenterChangeForTripMob(this.getView(), propValue, rowIndex);
+                    }
+                }
+                break;
+            case "expenseitem":
+                if (propValue != null) {
+                    this.setCurrentExpenseItemIcon(rowIndex, parentIndex, (Long)((DynamicObject)propValue).getPkValue());
+                }
+        }
+
+        if ("entrycostcompany".equals(propName) || "entrycostdept".equals(propName) || "triphappendate".equals(propName) || "tripexpenseitem".equals(propName)) {
+            this.handleExpenseEntry(rowIndex);
+        }
+
+    }
+
+    private void handleExpenseEntry(int tripIndex) {
+        DynamicObject trip = this.getModel().getEntryRowEntity("tripentry", tripIndex);
+        DynamicObject tripEntryCostcompany = trip.getDynamicObject("entrycostcompany");
+        DynamicObject tripEntryCostdept = trip.getDynamicObject("entrycostdept");
+        Date tripEntryHappendate = trip.getDate("triphappendate");
+        DynamicObject tripEntryExpenseitem = trip.getDynamicObject("tripexpenseitem");
+        Long quotaCtrlDeptId = QuotaCtrlUtil.getQuotaCtrlDeptId(tripEntryExpenseitem, tripEntryCostdept, this.getView().getParentView().getModel());
+        trip.getDynamicObjectCollection("entryentity").forEach((v) -> {
+            v.set("travelcostcompany", tripEntryCostcompany);
+            v.set("travelcostdept", tripEntryCostdept);
+            v.set("travelhappendate", tripEntryHappendate);
+            v.set("travelexpenseitem", tripEntryExpenseitem);
+            v.set("travelquotactldept_id", quotaCtrlDeptId);
+        });
+    }
+
+    protected boolean getVihicleFromStdConfig() {
+        return org.apache.commons.lang3.StringUtils.equals(ErStdConfig.get("notMultiVehicles"), "true");
+    }
+
+    private void changeTripDay(int tripEntryIndex) {
+        IDataModel model = this.getModel();
+        Date startDate = (Date)model.getValue("startdate", tripEntryIndex);
+        Date endDate = (Date)model.getValue("enddate", tripEntryIndex);
+        Long tripDays = CommonServiceHelper.calcDays(startDate, endDate);
+        model.setValue("tripday", tripDays, tripEntryIndex);
+    }
+
+    public void click(EventObject evt) {
+        super.click(evt);
+        Control source = (Control)evt.getSource();
+        String key = source.getKey();
+        IDataModel model = this.getModel();
+        FormShowParameter showParameter = this.getView().getFormShowParameter();
+        Map<String, Object> mapCustomParam = showParameter.getCustomParams();
+        int stauts = (Integer)mapCustomParam.get("status");
+        IFormView pView = this.getView().getParentView();
+        IDataModel pModel = pView.getModel();
+        switch (key) {
+            case "btn_addexpenseitem":
+                if (!this.requiredProps(model, requiredProps)) {
+                    return;
+                }
+
+                if (this.checkTripArea(model)) {
+                    return;
+                }
+
+                DynamicObject company = (DynamicObject)pModel.getValue("company");
+                Long companyId = company == null ? 0L : (Long)company.getPkValue();
+                int curIndex = model.getEntryCurrentRowIndex("entryentity");
+                mapCustomParam.put("curIndex", curIndex);
+                this.openTripExpneseF7SelectView(mapCustomParam, companyId);
+                break;
+            case "btn_save":
+                if (!this.requiredProps(model, requiredProps)) {
+                    return;
+                }
+
+                if (this.checkTripArea(model)) {
+                    return;
+                }
+
+                if (!this.isAllTripItemHasValue()) {
+                    return;
+                }
+
+                DynamicObject dataEntity = this.getModel().getDataEntity(true);
+                DynamicObjectCollection tripEntryDOs = dataEntity.getDynamicObjectCollection("tripentry");
+                Boolean confirm = Boolean.FALSE;
+                Iterator var18 = tripEntryDOs.iterator();
+
+                while(var18.hasNext()) {
+                    DynamicObject dobjet = (DynamicObject)var18.next();
+                    Object from = dobjet.get("from");
+                    Object to = dobjet.get("to");
+                    if (from.equals(to)) {
+                        confirm = Boolean.TRUE;
+                    }
+                }
+
+                if (confirm) {
+                    this.getView().showConfirm(ResManager.loadKDString("出发地与目的地相同,是否继续?", "TripReimburseConsumcordPlugin_0", "fi-er-formplugin", new Object[0]), MessageBoxOptions.OKCancel, new ConfirmCallBackListener("ok", this));
+                } else {
+                    this.clickOk(model, mapCustomParam, stauts, pView, pModel);
+                }
+                break;
+            case "labelap_edit":
+                model.setValue("editentry", "1");
+                this.getView().setVisible(Boolean.TRUE, new String[]{"labelap_done"});
+                this.getView().setVisible(Boolean.FALSE, new String[]{"labelap_edit"});
+                break;
+            case "imageap_delete":
+                model.setValue("editentry", "2");
+                break;
+            case "labelap_done":
+                model.setValue("editentry", "3");
+                this.getView().setVisible(Boolean.FALSE, new String[]{"labelap_done"});
+                this.getView().setVisible(Boolean.TRUE, new String[]{"labelap_edit"});
+        }
+
+    }
+
+    private boolean checkTripArea(IDataModel model) {
+        if (this.getModel().getDataEntity().getBoolean("isopentripstd") && (ErBillStatusEnum.A.name().equalsIgnoreCase((String)model.getValue("billstatus")) || ErBillStatusEnum.D.name().equalsIgnoreCase((String)model.getValue("billstatus")))) {
+            return !this.requiredProps(model, new String[]{"tripentryarea"});
+        } else {
+            return false;
+        }
+    }
+
+    protected void openTripExpneseF7SelectView(Map<String, Object> mapCustomParam, Long companyId) {
+        openTripExpneseF7SelectView(this, this.getView(), mapCustomParam, companyId, "showEspenseItem");
+    }
+
+    public static void openTripExpneseF7SelectView(IFormPlugin plugin, IFormView view, Map<String, Object> mapCustomParam, Long companyId, String callBackActionId) {
+        MobileListShowParameter parameter = new MobileListShowParameter();
+        parameter.setBillFormId("er_tripexpenseitem");
+        parameter.setFormId("bos_moblisttabf7");
+        parameter.setCustomParams(mapCustomParam);
+        parameter.getOpenStyle().setShowType(ShowType.Floating);
+        parameter.setLookUp(true);
+        ListFilterParameter listFilterParameter = new ListFilterParameter();
+        String selectExpensePros = "id,number,longnumber,expenseitemicon,isdefault,isvactax,ctrltype";
+        QFilter qA = new QFilter("enable", "=", Boolean.TRUE);
+        QFilter bdFilter = BaseDataServiceHelper.getBaseDataFilter("er_tripexpenseitem", companyId);
+        DynamicObjectCollection expenseItems = QueryServiceHelper.query("er_tripexpenseitem", selectExpensePros, new QFilter[]{qA, bdFilter});
+        List<Object> list = (List)expenseItems.stream().map((d) -> {
+            return d.get("id");
+        }).collect(Collectors.toList());
+        listFilterParameter.getQFilters().add(new QFilter("id", "in", list.toArray()));
+        parameter.setListFilterParameter(listFilterParameter);
+        parameter.setCloseCallBack(new CloseCallBack(plugin, callBackActionId));
+        parameter.setAppId("18XD+/5EDN8X");
+        parameter.setHasRight(true);
+        view.showForm(parameter);
+    }
+
+    private void clickOk(IDataModel model, Map<String, Object> mapCustomParam, int stauts, IFormView pView, IDataModel pModel) {
+        Map<String, Object> map = new HashMap();
+        int tripcurrentRowIndex = 0;
+        long firstPageCurrencyId = ErCommonUtils.getPk(pModel.getValue("currency"));
+        long secondPageCurrencyId = ErCommonUtils.getPk(model.getValue("currency"));
+        DynamicObjectCollection trip = (DynamicObjectCollection)model.getDataEntity(true).get("tripentry");
+        DynamicObjectCollection ptrip = (DynamicObjectCollection)pModel.getDataEntity(true).get("tripentry");
+        if (firstPageCurrencyId != secondPageCurrencyId && ptrip.isEmpty()) {
+            pView.updateView();
+            this.getView().sendFormAction(pView);
+            this.getView().close();
+        } else {
+            ActionLocalCache.get().put("isDeleteEntryEntity", true);
+            String pageId;
+            RedisModelCache redisModelCache;
+            if (stauts == 0) {
+                this.copyInvoiceFromChildToParentPage(model, pModel);
+                EntryCopyUtil.copyColl2TargetColl(ptrip, trip);
+                this.refreshTotalAmount(pModel, "tripentry", "tripamount", "amount");
+                pageId = pView.getPageId();
+                redisModelCache = new RedisModelCache((IRefrencedataProvider)null, this.getModel().getDataEntityType(), pageId);
+                redisModelCache.storeAll(this.getModel().getDataEntity(true));
+                pView.setVisible(Boolean.FALSE, new String[]{"next"});
+                pView.setVisible(Boolean.TRUE, new String[]{"tbmain", "save", "submit", "tripentry", "flexpanel_mytrip", "listcard_tripentry", "listcardviewap", "btn_addsection"});
+                this.getView().sendFormAction(pView);
+                pView.updateView();
+                int pEntryRowCount = pModel.getEntryRowCount("tripentry");
+                tripcurrentRowIndex = pEntryRowCount - 1;
+            } else if (stauts == 1) {
+                tripcurrentRowIndex = Integer.parseInt(mapCustomParam.get("index").toString());
+                pModel.setValue("enddate", model.getValue("enddate"), tripcurrentRowIndex);
+                this.copyInvoiceFromChildToParentPage(model, pModel);
+                EntryCopyUtil.updateColl2TargetColl(ptrip, trip, tripcurrentRowIndex);
+                pageId = pView.getPageId();
+                redisModelCache = new RedisModelCache((IRefrencedataProvider)null, this.getModel().getDataEntityType(), pageId);
+                redisModelCache.storeAll(this.getModel().getDataEntity(true));
+                pView.setVisible(Boolean.FALSE, new String[]{"next"});
+                pView.setVisible(Boolean.TRUE, new String[]{"tbmain", "save", "submit", "tripentry", "flexpanel_mytrip", "listcard_tripentry", "btn_addsection"});
+                pView.updateView();
+                this.getView().sendFormAction(pView);
+            }
+
+            map.put("tripcurrentRowIndex", tripcurrentRowIndex);
+            map.put("tripentryarea", model.getValue("tripentryarea"));
+            this.getView().returnDataToParent(map);
+            this.getView().close();
+        }
+    }
+
+    private boolean isAllTripItemHasValue() {
+        DynamicObject dataEntity = this.getModel().getDataEntity(true);
+        DynamicObjectCollection tripEntryDOs = dataEntity.getDynamicObjectCollection("tripentry");
+        if (tripEntryDOs != null && !tripEntryDOs.isEmpty()) {
+            DynamicObjectCollection tripItemEntryDOs = ((DynamicObject)tripEntryDOs.get(0)).getDynamicObjectCollection("entryentity");
+            if (tripEntryDOs != null && !tripItemEntryDOs.isEmpty()) {
+                List<Integer> emptyTripItemRowIndexs = Lists.newLinkedList();
+
+                for(int i = 0; i < tripItemEntryDOs.size(); ++i) {
+                    DynamicObject tripItemEntryDO = (DynamicObject)tripItemEntryDOs.get(i);
+                    Object tripItemDO = tripItemEntryDO.get("expenseitem");
+                    if (tripItemDO == null) {
+                        emptyTripItemRowIndexs.add(i + 1);
+                    }
+                }
+
+                if (emptyTripItemRowIndexs.isEmpty()) {
+                    return true;
+                } else {
+                    logger.info("这些费用明细分录上的差旅项目为空:" + org.apache.commons.lang3.StringUtils.join(emptyTripItemRowIndexs, ","));
+                    this.getView().showTipNotification(String.format(ResManager.loadKDString("请填写第%s行上的差旅项目。", "TripReimburseConsumcordPlugin_1", "fi-er-formplugin", new Object[0]), org.apache.commons.lang3.StringUtils.join(emptyTripItemRowIndexs, ",")));
+                    return false;
+                }
+            } else {
+                logger.info("费用明细二级分录为空");
+                return true;
+            }
+        } else {
+            logger.info("行程分录为空");
+            return true;
+        }
+    }
+
+    private void copyInvoiceFromChildToParentPage(IDataModel model, IDataModel pModel) {
+        DynamicObjectCollection invoiceHeadEntry = model.getDataEntity(true).getDynamicObjectCollection("invoiceentry");
+        DynamicObjectCollection pInvoiceHeadEntry = pModel.getDataEntity(true).getDynamicObjectCollection("invoiceentry");
+        DynamicObjectCollection invoiceItemEntry = model.getDataEntity(true).getDynamicObjectCollection("invoiceitementry");
+        DynamicObjectCollection pInvoiceItemEntry = pModel.getDataEntity(true).getDynamicObjectCollection("invoiceitementry");
+        pInvoiceHeadEntry.clear();
+        EntryCopyUtil.copyColl2TargetColl(pInvoiceHeadEntry, invoiceHeadEntry);
+        pInvoiceItemEntry.clear();
+        EntryCopyUtil.copyColl2TargetColl(pInvoiceItemEntry, invoiceItemEntry);
+    }
+
+    private void copyInvoiceFromParentToChildPage(IDataModel pModel, IDataModel model) {
+        DynamicObjectCollection invoiceHeadEntry = model.getDataEntity(true).getDynamicObjectCollection("invoiceentry");
+        DynamicObjectCollection pInvoiceHeadEntry = pModel.getDataEntity(true).getDynamicObjectCollection("invoiceentry");
+        DynamicObjectCollection invoiceItemEntry = model.getDataEntity(true).getDynamicObjectCollection("invoiceitementry");
+        DynamicObjectCollection pInvoiceItemEntry = pModel.getDataEntity(true).getDynamicObjectCollection("invoiceitementry");
+        DynamicObjectCollection invoiceMergeEntry = model.getDataEntity(true).getDynamicObjectCollection("invoicemerge");
+        DynamicObjectCollection pinvoiceMergeEntry = pModel.getDataEntity(true).getDynamicObjectCollection("invoicemerge");
+        invoiceHeadEntry.clear();
+        EntryCopyUtil.copyColl2TargetColl(invoiceHeadEntry, pInvoiceHeadEntry);
+        invoiceItemEntry.clear();
+        EntryCopyUtil.copyColl2TargetColl(invoiceItemEntry, pInvoiceItemEntry);
+        invoiceMergeEntry.clear();
+        EntryCopyUtil.copyColl2TargetColl(invoiceMergeEntry, pinvoiceMergeEntry);
+    }
+
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        super.closedCallBack(closedCallBackEvent);
+        IDataModel model = this.getModel();
+        int curEntryIndex;
+        if (!"showEspenseItem".equalsIgnoreCase(closedCallBackEvent.getActionId()) && !"er_tripexpenseitem".equalsIgnoreCase(closedCallBackEvent.getActionId())) {
+            if (this.getExpenseEditForm().equalsIgnoreCase(closedCallBackEvent.getActionId())) {
+                curEntryIndex = (Integer)closedCallBackEvent.getReturnData();
+                DynamicObject expenseItem = (DynamicObject)model.getValue("expenseitem", curEntryIndex);
+                Boolean isPass = this.isExpenseIsPassEntry(model, curEntryIndex, expenseItem);
+                model.setValue("ispassentry", isPass, curEntryIndex);
+                this.getView().updateView("entryentity", curEntryIndex);
+            }
+        } else if (closedCallBackEvent.getReturnData() != null && closedCallBackEvent.getReturnData() instanceof ListSelectedRowCollection) {
+            ListSelectedRowCollection returnData = (ListSelectedRowCollection)closedCallBackEvent.getReturnData();
+            long expenseitemId = 0L;
+            if (returnData.size() > 0) {
+                expenseitemId = Long.parseLong(returnData.get(0).getPrimaryKeyValue().toString());
+            }
+
+            DynamicObject selectExpenseitem = CommonServiceHelper.getObjById("er_tripexpenseitem", expenseitemId);
+            if (selectExpenseitem == null) {
+                return;
+            }
+
+            model.batchCreateNewEntryRow("entryentity", 1);
+            curEntryIndex = model.getEntryRowCount("entryentity") - 1;
+            this.fillEntryEntityData(model, selectExpenseitem, curEntryIndex);
+            model.setValue("pic", selectExpenseitem.getString("expenseitemicon"), curEntryIndex);
+            this.getView().updateView("pic", curEntryIndex);
+            this.getView().updateView("expenseitem", curEntryIndex);
+            this.getView().setEnable(Boolean.FALSE, curEntryIndex, new String[]{"expenseitem"});
+            this.isExpenseIsPassEntry(model, curEntryIndex, selectExpenseitem);
+            boolean ispassentry = (Boolean)model.getValue("ispassentry", curEntryIndex);
+            if (ispassentry) {
+                Map<String, Object> paramMap = new HashMap();
+                paramMap.put("formId", "er_tripreimexpenseitem_m");
+                paramMap.put("formName", ResManager.loadKDString("费用明细", "TripReimburseConsumcordPlugin_3", "fi-er-formplugin", new Object[0]));
+                paramMap.put("formType", "5");
+                paramMap.put("needCallBack", Boolean.TRUE);
+                Map<String, Object> mapCustomParam = new HashMap();
+                mapCustomParam.put("iscurrency", this.refreshEntryCurrency(model));
+                mapCustomParam.put("expenseitem", expenseitemId);
+                mapCustomParam.put("index", curEntryIndex);
+                mapCustomParam.put("taxrate", model.getValue("taxrate", curEntryIndex));
+                mapCustomParam.put("entrycurrency", ErCommonUtils.getPk(model.getValue("entrycurrency", curEntryIndex)));
+                mapCustomParam.put("exchangerate", model.getValue("exchangerate", curEntryIndex));
+                mapCustomParam.put("detailquotetype", model.getValue("detailquotetype", curEntryIndex));
+                mapCustomParam.put("status", 0);
+                paramMap.put("customParam", mapCustomParam);
+                ShowPageUtils.showPage(paramMap, this);
+            }
+        }
+
+        AmountChangeUtil.updateExpenseDetailAmountLabelForMob(this.getView(), model);
+        this.setExpenseEntryLableCount();
+        this.getModel().setValue("editentry", 0);
+    }
+
+    private void setTripExenseItemIcon() {
+        DynamicObjectCollection tripEntrys = this.getModel().getDataEntity(true).getDynamicObjectCollection("tripentry");
+
+        for(int i = 0; i < tripEntrys.size(); ++i) {
+            DynamicObject tripEntry = (DynamicObject)tripEntrys.get(i);
+            DynamicObjectCollection entryEntitys = tripEntry.getDynamicObjectCollection("entryentity");
+
+            for(int entryEntityIndex = 0; entryEntityIndex < entryEntitys.size(); ++entryEntityIndex) {
+                DynamicObject entryEntity = (DynamicObject)entryEntitys.get(entryEntityIndex);
+                DynamicObject tripExpenseItemDO = entryEntity.getDynamicObject("expenseitem");
+                if (tripExpenseItemDO != null) {
+                    DynamicObject tripExpenseItemDOFromDB = BusinessDataServiceHelper.loadSingleFromCache(tripExpenseItemDO.getPkValue(), "er_tripexpenseitem", "expenseitemicon");
+                    logger.info("loadSingleFromCache:" + tripExpenseItemDOFromDB);
+                    this.getModel().setValue("pic", tripExpenseItemDOFromDB.getString("expenseitemicon"), entryEntityIndex, i);
+                }
+            }
+        }
+
+    }
+
+    private void setCurrentExpenseItemIcon(int rowIndex, int parentIndex, Long tripExpenseId) {
+        DynamicObject tripExpenseItemDOFromDB = BusinessDataServiceHelper.loadSingleFromCache(tripExpenseId, "er_tripexpenseitem", "expenseitemicon");
+        logger.info("loadSingleFromCache:" + tripExpenseItemDOFromDB);
+        this.getModel().setValue("pic", tripExpenseItemDOFromDB.getString("expenseitemicon"), rowIndex, parentIndex);
+        this.getView().updateView("pic", rowIndex, parentIndex);
+    }
+
+    private void fillEntryEntityData(IDataModel model, DynamicObject selectExpenseitem, int index) {
+        DynamicObject tripentry = (DynamicObject)model.getDataEntity(true).getDynamicObjectCollection("tripentry").get(0);
+        model.setValue("expenseitem", selectExpenseitem.getPkValue(), index);
+        model.setValue("pic", selectExpenseitem.getString("expenseitemicon"), index);
+        int curTripIndex = model.getEntryCurrentRowIndex("tripentry");
+        model.setValue("daycount", model.getValue("tripday", curTripIndex), index);
+        model.setValue("pic", selectExpenseitem.getString("expenseitemicon"), index);
+        TripReimburseServiceHelper.whenTripItemChanged(model, selectExpenseitem, index, curTripIndex);
+        boolean isCurrencyShowinTripentry = !DailyBillServiceHelper.isNewTripReim(this.getModel()) && SystemParamterUtil.getIsCurrencyShowinTripentry(ErCommonUtils.getPk(this.getModel().getValue("company")));
+        DynamicObject tripEntryCostcompany;
+        if (isCurrencyShowinTripentry) {
+            tripEntryCostcompany = tripentry.getDynamicObject("tripcurrency");
+            model.setValue("entrycurrency", ErCommonUtils.getPk(tripEntryCostcompany), index);
+            BigDecimal tripexchangerate = tripentry.getBigDecimal("tripexchangerate");
+            model.setValue("exchangerate", tripexchangerate, index);
+            String tripquotetype = (String)ObjectUtils.defaultIfNull(tripentry.getString("tripquotetype"), "0");
+            model.setValue("detailquotetype", tripquotetype, index);
+        } else {
+            model.setValue("entrycurrency", model.getValue("currency"), index);
+            model.setValue("exchangerate", BigDecimal.ONE, index);
+            model.setValue("detailquotetype", BigDecimal.ZERO, index);
+        }
+
+        model.setValue("trip2travelers", tripentry.getDynamicObjectCollection("travelers"), index);
+        model.setValue("triparea", tripentry.getDynamicObject("tripentryarea"), index);
+        tripEntryCostcompany = tripentry.getDynamicObject("entrycostcompany");
+        DynamicObject tripEntryCostdept = tripentry.getDynamicObject("entrycostdept");
+        Date tripEntryHappendate = tripentry.getDate("triphappendate");
+        DynamicObject tripEntryExpenseitem = tripentry.getDynamicObject("tripexpenseitem");
+        Long quotaCtrlDeptId = QuotaCtrlUtil.getQuotaCtrlDeptId(tripEntryExpenseitem, tripEntryCostdept, this.getView().getParentView().getModel());
+        model.setValue("travelcostcompany", tripEntryCostcompany, index);
+        model.setValue("travelcostdept", tripEntryCostdept, index);
+        model.setValue("travelhappendate", tripEntryHappendate, index);
+        model.setValue("travelexpenseitem", tripEntryExpenseitem, index);
+        model.setValue("travelquotactldept", quotaCtrlDeptId, index);
+    }
+
+    private Boolean refreshEntryCurrency(IDataModel model) {
+        boolean iscurrency = (Boolean)model.getValue("iscurrency");
+        if (!iscurrency) {
+            iscurrency = CommonServiceHelper.initCurrency();
+        }
+
+        int entryRows = model.getEntryRowCount("entryentity");
+
+        for(int i = 0; i < entryRows; ++i) {
+            model.setValue("isMulticurrency", iscurrency, i);
+        }
+
+        return iscurrency;
+    }
+
+    protected BigDecimal refreshTotalAmount(IDataModel model, String entryField, String entryAmountField, String totalAmountField) {
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        DynamicObjectCollection entrys = model.getEntryEntity(entryField);
+
+        BigDecimal tripAmount;
+        for(Iterator var7 = entrys.iterator(); var7.hasNext(); totalAmount = totalAmount.add(tripAmount)) {
+            DynamicObject entry = (DynamicObject)var7.next();
+            tripAmount = entry.getBigDecimal(entryAmountField);
+        }
+
+        model.setValue(totalAmountField, totalAmount);
+        if (model.getProperty("approveamount") != null) {
+            model.setValue("approveamount", totalAmount);
+        }
+
+        if (model.getProperty("encashamount") != null) {
+            model.setValue("encashamount", totalAmount);
+        }
+
+        return totalAmount;
+    }
+
+    private void setExpenseEntryLableCount() {
+        Label eicount = (Label)this.getView().getControl("eicount");
+        int count = this.getModel().getEntryRowCount("entryentity");
+        eicount.setText("(" + count + ")");
+    }
+
+    public void entryRowClick(RowClickEvent arg0) {
+        IDataModel model = this.getModel();
+        DynamicObject dataEntity = model.getDataEntity(true);
+        if (this.requiredProps(this.getModel(), requiredProps)) {
+            if (!this.checkTripArea(model)) {
+                int selectedRowIndex = arg0.getRow();
+                this.choooseEntryRow(selectedRowIndex);
+                boolean needdropin = false;
+                DynamicObject expenseEntryRow = this.getModel().getEntryRowEntity("entryentity", selectedRowIndex);
+                if (expenseEntryRow != null) {
+                    String ordernum = expenseEntryRow.getString("ordernum");
+                    String orderformid = expenseEntryRow.getString("orderformid");
+                    if (org.apache.commons.lang3.StringUtils.isNoneEmpty(new CharSequence[]{orderformid, ordernum})) {
+                        needdropin = true;
+                    }
+
+                    DynamicObject expenseitem = expenseEntryRow.getDynamicObject("expenseitem");
+                    this.isExpenseIsPassEntry(model, selectedRowIndex, expenseitem);
+                }
+
+                if (expenseEntryRow != null && "2".equals(expenseEntryRow.getString("settlementtype")) && needdropin) {
+                    DynamicObject dynamicObject = expenseEntryRow.getDynamicObject("expenseitem");
+                    if (dynamicObject == null || org.apache.commons.lang3.StringUtils.isEmpty(dynamicObject.getString("attribute"))) {
+                        this.getView().showTipNotification(ResManager.loadKDString("请先选择差旅项目。", "TripReimburseConsumcordPlugin_4", "fi-er-formplugin", new Object[0]));
+                        return;
+                    }
+
+                    Map<String, Object> paramMap = new HashMap();
+                    Map<String, Object> mapCustomParam = new HashMap();
+                    paramMap.put("formId", "er_reimbursedetail_mb");
+                    paramMap.put("formName", ResManager.loadKDString("差旅报销费用明细月结分录详情", "TripReimburseConsumcordPlugin_5", "fi-er-formplugin", new Object[0]));
+                    paramMap.put("formType", "5");
+                    paramMap.put("needCallBack", Boolean.TRUE);
+                    IPageCache pageCache = this.getPageCache();
+                    mapCustomParam.put("ordernum", expenseEntryRow.get("ordernum"));
+                    mapCustomParam.put("currencyId", expenseEntryRow.getDynamicObject("entrycurrency").getPkValue());
+                    mapCustomParam.put("orderformid", expenseEntryRow.get("orderformid"));
+                    mapCustomParam.put("vehicleConType", pageCache.get("vehicleConType"));
+                    mapCustomParam.put("index", selectedRowIndex);
+                    mapCustomParam.put("overdesc", expenseEntryRow.getString("overdesc"));
+                    boolean isOpendStd = dataEntity.getBoolean("isopentripstd");
+                    mapCustomParam.put("isControl", isOpendStd);
+                    if (isOpendStd) {
+                        boolean isOver = "1".equals(expenseEntryRow.getString("isover"));
+                        mapCustomParam.put("checkCabinIsOver", isOver);
+                    }
+
+                    paramMap.put("customParam", mapCustomParam);
+                    ShowPageUtils.showPage(paramMap, this);
+                }
+
+            }
+        }
+    }
+
+    private void choooseEntryRow(int selectIndex) {
+        Map<String, Object> mapCustomParam = new HashMap();
+        DynamicObjectCollection tripentrys = this.getModel().getDataEntity(true).getDynamicObjectCollection("tripentry");
+        if (tripentrys != null && !tripentrys.isEmpty()) {
+            DynamicObject tripentry = (DynamicObject)tripentrys.get(this.getModel().getEntryCurrentRowIndex("tripentry"));
+            DynamicObjectCollection entrys = tripentry.getDynamicObjectCollection("entryentity");
+            if (entrys != null && !entrys.isEmpty()) {
+                DynamicObject selectEntry = (DynamicObject)entrys.get(selectIndex);
+                Boolean iscurrency = (Boolean)this.getView().getParentView().getModel().getValue("iscurrency");
+                boolean ispassentry = selectEntry.getBoolean("ispassentry");
+                String invoiceno_entry = selectEntry.getString("invoiceno_entry");
+                if (org.apache.commons.lang3.StringUtils.isNotBlank(invoiceno_entry)) {
+                    ispassentry = true;
+                }
+
+                String settlementtype = selectEntry.getString("settlementtype");
+                boolean hasOrder = false;
+                String ordernum = selectEntry.getString("ordernum");
+                String orderformid = selectEntry.getString("orderformid");
+                if (org.apache.commons.lang3.StringUtils.isNotEmpty(ordernum) || org.apache.commons.lang3.StringUtils.isNotEmpty(orderformid)) {
+                    hasOrder = true;
+                }
+
+                if ("2".equalsIgnoreCase(settlementtype) && hasOrder) {
+                    ispassentry = false;
+                }
+
+                if (selectEntry.getDynamicObject("expenseitem") == null) {
+                    ispassentry = false;
+                }
+
+                if (ispassentry) {
+                    Map<String, Object> paramMap = new HashMap();
+                    paramMap.put("formId", this.getExpenseEditForm());
+                    paramMap.put("formName", ResManager.loadKDString("费用明细", "TripReimburseConsumcordPlugin_3", "fi-er-formplugin", new Object[0]));
+                    paramMap.put("formType", "5");
+                    paramMap.put("needCallBack", Boolean.TRUE);
+                    Object parentIndex = this.getView().getFormShowParameter().getCustomParam("index");
+                    mapCustomParam.put("index", selectIndex);
+                    mapCustomParam.put("parentIndex", parentIndex);
+                    mapCustomParam.put("status", 1);
+                    Object company = this.getModel().getValue("company");
+                    if (company != null) {
+                        Long pkValue = (Long)((DynamicObject)company).getPkValue();
+                        mapCustomParam.put("company", pkValue.toString());
+                    }
+
+                    mapCustomParam.put("iscurrency", iscurrency);
+                    mapCustomParam.put("entrycurrency", ErCommonUtils.getPk(selectEntry.getDynamicObject("entrycurrency")));
+                    mapCustomParam.put("exchangerate", selectEntry.getBigDecimal("exchangerate"));
+                    mapCustomParam.put("offset", selectEntry.getBoolean("offset"));
+                    mapCustomParam.put("wbsrcbilltype", selectEntry.getString("wbsrcbilltype"));
+                    mapCustomParam.put("invoiceno", selectEntry.getString("invoiceno_entry"));
+                    mapCustomParam.put("automapinvoice", this.getModel().getValue("automapinvoice"));
+                    FormShowParameter showParameter = this.getView().getFormShowParameter();
+                    Map<String, Object> mapCustomParams = showParameter.getCustomParams();
+                    ErMobWorkFlowOtherViewEditUtils.setWorkFlowParams(mapCustomParam, mapCustomParams);
+                    paramMap.put("customParam", mapCustomParam);
+                    ShowPageUtils.showPage(paramMap, this);
+                }
+            }
+        }
+    }
+
+    protected String getExpenseEditForm() {
+        return "er_tripreimexpenseitem_m";
+    }
+
+    protected boolean requiredProps(IDataModel model, String[] props) {
+        String[] var3 = props;
+        int var4 = props.length;
+
+        for(int var5 = 0; var5 < var4; ++var5) {
+            String propName = var3[var5];
+            IDataEntityProperty property = model.getProperty(propName);
+            Object propValue = model.getValue(propName);
+            if (propValue == null || property instanceof MulBasedataProp && ((MulBasedataDynamicObjectCollection)propValue).size() == 0) {
+                String displayNameStr = null;
+
+                try {
+                    LocaleString displayName = (LocaleString)property.getClass().getMethod("getDisplayName").invoke(property);
+                    displayNameStr = displayName.getLocaleValue();
+                } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException var11) {
+                    logger.error(var11);
+                }
+
+                this.getView().showTipNotification(String.format(ResManager.loadKDString("请填写“%s”。", "TripReimburseConsumcordPlugin_6", "fi-er-formplugin", new Object[0]), displayNameStr));
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean isExpenseIsPassEntry(IDataModel model, int index, DynamicObject tripexpense) {
+        if (tripexpense == null) {
+            return false;
+        } else {
+            Boolean isCurrency = CommonServiceHelper.initCurrency();
+            String attribute = tripexpense.getString("attribute");
+            boolean isvactax = tripexpense.getBoolean("isvactax");
+            boolean isOpenStd = (Boolean)this.getModel().getValue("isopentripstd");
+            if ((!isOpenStd || !Arrays.asList(STDCTRL_ATTRIBUTE).contains(attribute)) && !attribute.equals("2") && !isvactax && !isCurrency && !attribute.equals("6") && !attribute.equals("1")) {
+                return false;
+            } else {
+                model.setValue("ispassentry", Boolean.TRUE, index, 0);
+                return true;
+            }
+        }
+    }
+
+    public void beforeClick(BeforeClickEvent evt) {
+        super.beforeClick(evt);
+        Control source = (Control)evt.getSource();
+        String key = source.getKey();
+        IDataModel model = this.getModel();
+        if (org.apache.commons.lang3.StringUtils.equals(key, "btn_save")) {
+            boolean hasNullTripItem = model.getDataEntity(true).getDynamicObjectCollection("tripentry").stream().flatMap((tripEntry) -> {
+                return tripEntry.getDynamicObjectCollection("entryentity").stream();
+            }).anyMatch((entryEntity) -> {
+                return entryEntity.getDynamicObject("expenseitem") == null;
+            });
+            if (hasNullTripItem) {
+                this.getView().showTipNotification(ResManager.loadKDString("差旅项目不能为空,请填写差旅项目。", "TripReimburseConsumcordPlugin_10", "fi-er-formplugin", new Object[0]));
+                evt.setCancel(true);
+                return;
+            }
+        }
+
+    }
+
+    public void beforeClosed(BeforeClosedEvent e) {
+        e.setCheckDataChange(false);
+        super.beforeClosed(e);
+    }
+
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        super.confirmCallBack(messageBoxClosedEvent);
+        if (org.apache.commons.lang3.StringUtils.equals("submit", messageBoxClosedEvent.getCallBackId()) && messageBoxClosedEvent.getResult() == MessageBoxResult.Yes) {
+            OperateOption operateOption = OperateOption.create();
+            operateOption.setVariableValue("afterconfirm", "true");
+            this.getView().invokeOperation("submit", operateOption);
+        }
+
+        if (org.apache.commons.lang3.StringUtils.equals("ok", messageBoxClosedEvent.getCallBackId()) && MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+            FormShowParameter showParameter = this.getView().getFormShowParameter();
+            Map<String, Object> mapCustomParam = showParameter.getCustomParams();
+            int stauts = (Integer)mapCustomParam.get("status");
+            this.clickOk(this.getModel(), mapCustomParam, stauts, this.getView().getParentView(), this.getView().getParentView().getModel());
+        }
+
+    }
+
+    public void afterDeleteRow(AfterDeleteRowEventArgs e) {
+        String name = e.getEntryProp().getName();
+        if (org.apache.commons.lang3.StringUtils.equals(name, "entryentity")) {
+            this.setExpenseEntryLableCount();
+            if (((DynamicObject)this.getModel().getDataEntity(true).getDynamicObjectCollection("tripentry").get(0)).getDynamicObjectCollection("entryentity").size() == 0) {
+                this.getView().setVisible(Boolean.FALSE, new String[]{"labelap_done", "labelap_edit"});
+            }
+
+            this.getView().updateView("entryentity");
+        }
+
+    }
+
+    public void afterAddRow(AfterAddRowEventArgs e) {
+        String name = e.getEntryProp().getName();
+        if (org.apache.commons.lang3.StringUtils.equals(name, "entryentity")) {
+            this.setExpenseEntryLableCount();
+            this.getView().setVisible(Boolean.TRUE, new String[]{"labelap_edit"});
+            this.getView().setVisible(Boolean.FALSE, new String[]{"labelap_done"});
+            if (!org.apache.commons.lang3.StringUtils.equals((String)this.getModel().getValue("editentry"), "2") && ((DynamicObject)this.getModel().getDataEntity(true).getDynamicObjectCollection("tripentry").get(0)).getDynamicObjectCollection("entryentity").size() == 1) {
+                this.getModel().setValue("editentry", 0);
+            }
+        }
+
+    }
+}

+ 556 - 0
src/main/java/kd/fi/er/formplugin/mobile/TripReqSectionEx.java

@@ -0,0 +1,556 @@
+package kd.fi.er.formplugin.mobile;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.EventObject;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.TreeMap;
+import kd.bos.bill.AbstractMobBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.cache.RedisModelCache;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.IRefrencedataProvider;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.datamodel.events.AfterDeleteRowEventArgs;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IFormView;
+import kd.bos.form.IMobileView;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.cardentry.CardEntry;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeClosedEvent;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.DateTimeEdit;
+import kd.bos.form.field.FieldEdit;
+import kd.bos.form.field.MulBasedataEdit;
+import kd.fi.er.business.servicehelper.CommonServiceHelper;
+import kd.fi.er.business.utils.AmountUtils;
+import kd.fi.er.business.utils.ErCommonUtils;
+import kd.fi.er.business.utils.ErStdConfig;
+import kd.fi.er.business.utils.SystemParamterUtil;
+import kd.fi.er.business.utils.TripBillTravelerUtils;
+import kd.fi.er.common.ShowPageUtils;
+import kd.fi.er.formplugin.budget.BudgetCommonUtil;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+
+public class TripReqSectionEx extends AbstractMobBillPlugIn implements ClickListener {
+    public TripReqSectionEx() {
+    }
+
+    public void registerListener(EventObject e) {
+        this.addClickListeners(new String[]{"btn_save", "btn_addsection"});
+        IFormView view = this.getView();
+        MulBasedataEdit travelersF7 = (MulBasedataEdit)this.getControl("travelers");
+        DynamicObject company = (DynamicObject)view.getParentView().getModel().getValue("company");
+        DynamicObject org = (DynamicObject)view.getParentView().getModel().getValue("org");
+        TripBillTravelerUtils.getF7FilterInfo(company, org, travelersF7);
+    }
+
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        FormShowParameter param = this.getView().getFormShowParameter();
+        IDataModel model = this.getModel();
+        IFormView parentView = this.getView().getParentView();
+        IDataModel parentModel = parentView.getModel();
+        model.setValue("currency", ErCommonUtils.getPk(parentModel.getValue("currency")));
+        model.setValue("billstatus", parentModel.getValue("billstatus"));
+        CoreBaseBillEdit coreBaseBillEdit = new CoreBaseBillEdit();
+        Boolean isCurrency = coreBaseBillEdit.refreshIsCurrency(parentModel);
+        model.setValue("iscurrency", isCurrency);
+        model.setValue("istravelers", parentModel.getValue("istravelers"));
+        model.setValue("isloan", parentModel.getValue("isloan"));
+        model.setValue("ismulwayto", parentModel.getValue("ismulwayto"));
+        model.setValue("bizdate", parentModel.getValue("bizdate"));
+        CommonServiceHelper.setMulWayToVisible(parentModel, this.getView());
+        if (param.getCustomParam("entryedit") != null) {
+            this.getView().setVisible(false, new String[]{"btn_addsection"});
+            int index = (Integer)param.getCustomParam("index");
+            DynamicObject dobject = parentModel.getEntryRowEntity("tripentry", index);
+            DynamicObjectCollection dc = model.getEntryEntity("tripentry");
+            dc.add(dobject);
+            model.setValue("index", index + 1, 0);
+        } else {
+            Long cityId = ((IMobileView)this.getView()).getCurrentCityId();
+            int rowIndex = model.createNewEntryRow("tripentry");
+            Object to = param.getCustomParam("to");
+            Object date = param.getCustomParam("enddate");
+            if (null != to) {
+                cityId = Long.valueOf(to.toString());
+            }
+
+            if (null != date) {
+                model.setValue("startdate", date, 0);
+            }
+
+            model.setValue("from", cityId, 0);
+            int count = parentModel.getEntryRowCount("tripentry");
+            model.setValue("index", count + 1, rowIndex);
+            this.initTripEntryDefaultData(model, rowIndex);
+            Object currencyId = ErCommonUtils.getPk(parentModel.getValue("currency"));
+            model.setValue("rcurrency", currencyId, rowIndex);
+            model.setValue("tripcurrency", currencyId, rowIndex);
+            Long[] applierIds = new Long[]{ErCommonUtils.getPk(parentModel.getValue("applier"))};
+            model.setValue("travelers", applierIds, rowIndex);
+            model.setValue("entrycostdept", parentModel.getValue("costdept"), rowIndex);
+            model.setValue("entrycostcompany", parentModel.getValue("costcompany"), rowIndex);
+            model.setValue("std_entrycostcenter", parentModel.getValue("std_costcenter"), rowIndex);
+            model.setValue("company", parentModel.getValue("company"), rowIndex);
+        }
+
+    }
+
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        FormShowParameter formShowParameter = this.getView().getFormShowParameter();
+        Map<String, Object> customParams = formShowParameter.getCustomParams();
+        boolean isQueryBudget = (Boolean)customParams.get("isquerybudget");
+        BudgetCommonUtil.setIsQueryBudgetFlag(this.getPageCache(), isQueryBudget);
+        Long companyId = ErCommonUtils.getPk(this.getView().getParentView().getModel().getValue("company"));
+        this.setTripExpenseItemShow(companyId, 0);
+        this.setBudgetShow(0);
+        this.setVehicleVisible();
+        if (Objects.nonNull(this.getModel().getDataEntityType().getProperty("costorgusemode"))) {
+            this.getModel().setValue("costorgusemode", this.getView().getParentView().getModel().getValue("costorgusemode"));
+        }
+
+        ShowPageUtils.setMobilePageFormStatus(this.getView());
+        if (StringUtils.equals("1", ErCommonUtils.getTripDateSelectRange(companyId))) {
+            DateTimeEdit tripDate = (DateTimeEdit)this.getControl("startdate");
+            tripDate.setMinDate(ErCommonUtils.getDateFromLocalDate(LocalDate.now()));
+            tripDate = (DateTimeEdit)this.getControl("enddate");
+            tripDate.setMinDate(ErCommonUtils.getDateFromLocalDate(LocalDate.now()));
+        }
+
+    }
+
+    private void setVehicleVisible() {
+        String vihicleKey = null;
+        if (!this.readOnly() && this.getVihicleFromStdConfig()) {
+            vihicleKey = "vehicles";
+        } else {
+            vihicleKey = "vehicle";
+        }
+
+        CardEntry tripentry = (CardEntry)this.getControl("tripentry");
+        int tripentryLen = this.getModel().getEntryRowCount("tripentry");
+
+        for(int i = 0; i < tripentryLen; ++i) {
+            tripentry.setChildVisible(false, i, new String[]{vihicleKey});
+        }
+
+    }
+
+    protected boolean readOnly() {
+        IFormView parentView = this.getView().getParentView();
+        return parentView != null && !"A".equals(parentView.getModel().getValue("billstatus")) && !"D".equals(parentView.getModel().getValue("billstatus"));
+    }
+
+    protected boolean getVihicleFromStdConfig() {
+        return StringUtils.equals(ErStdConfig.get("notMultiVehicles"), "true");
+    }
+
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        IDataModel model = this.getModel();
+        String propName = e.getProperty().getName();
+        ChangeData[] valueSet = e.getChangeSet();
+        int rowIndex = valueSet[0].getRowIndex();
+        Object propValue = valueSet[0].getNewValue();
+        BigDecimal tripOriAmount;
+        BigDecimal exchangeRate;
+        String tripQuoteType;
+        BigDecimal tripAmount;
+        Date startDate;
+        Date endDate;
+        Long tripDays;
+        switch (propName) {
+            case "triporiamount":
+                tripOriAmount = (BigDecimal)propValue;
+                exchangeRate = (BigDecimal)ObjectUtils.defaultIfNull((BigDecimal)model.getValue("tripexchangerate", rowIndex), BigDecimal.ONE);
+                tripQuoteType = (String)ObjectUtils.defaultIfNull((String)model.getValue("tripquotetype", rowIndex), "0");
+                tripAmount = AmountUtils.getCurrencyAmount(tripOriAmount, exchangeRate, AmountUtils.getCurrencyPrecision(model, "currency"), tripQuoteType);
+                model.setValue("tripamount", tripAmount, rowIndex);
+                break;
+            case "tripcurrency":
+                IDataModel parentModel = this.getView().getParentView().getModel();
+                DynamicObject tripCurrency = (DynamicObject)propValue;
+                DynamicObject currency = (DynamicObject)parentModel.getValue("currency");
+                if (tripCurrency != null && currency != null) {
+                    long sourceCurrencyId = tripCurrency.getLong("id");
+                    long targetCurrencyId = currency.getLong("id");
+                    long companyId = (Long)parentModel.getValue("company_Id");
+                    Object costCompany = parentModel.getValue("costcompany");
+                    Object bizdate = parentModel.getValue("bizdate");
+                    Map<String, Object> exchangeMap = CommonServiceHelper.getExchangeRateFromSysParams(companyId, costCompany, sourceCurrencyId, targetCurrencyId, bizdate);
+                    String quoteType = (String)ObjectUtils.defaultIfNull((String)exchangeMap.get("quoteType"), "0");
+                    exchangeRate = (BigDecimal)ObjectUtils.defaultIfNull((BigDecimal)exchangeMap.get("exchangeRate"), BigDecimal.ONE);
+                    if (this.getModel().getProperty("tripquotetype") != null) {
+                        this.getModel().setValue("tripquotetype", quoteType, rowIndex);
+                    }
+
+                    this.getModel().setValue("tripexchangerate", exchangeRate, rowIndex);
+                }
+
+                if (tripCurrency == null && valueSet[0].getOldValue() != null) {
+                    DynamicObject oldValue = (DynamicObject)valueSet[0].getOldValue();
+                    model.setValue("tripcurrency", ErCommonUtils.getPk(oldValue), rowIndex);
+                }
+                break;
+            case "tripexchangerate":
+                exchangeRate = (BigDecimal)ObjectUtils.defaultIfNull((BigDecimal)propValue, BigDecimal.ONE);
+                tripOriAmount = (BigDecimal)model.getValue("triporiamount");
+                if (tripOriAmount.compareTo(BigDecimal.ZERO) != 0) {
+                    tripQuoteType = (String)ObjectUtils.defaultIfNull((String)model.getValue("tripquotetype", rowIndex), "0");
+                    tripAmount = AmountUtils.getCurrencyAmount(tripOriAmount, exchangeRate, AmountUtils.getCurrencyPrecision(model, "currency"), tripQuoteType);
+                    model.setValue("tripamount", tripAmount, rowIndex);
+                }
+                break;
+            case "startdate":
+                startDate = (Date)propValue;
+                endDate = (Date)model.getValue("enddate");
+                tripDays = CommonServiceHelper.calcDays(startDate, endDate);
+                model.setValue("tripday", tripDays, rowIndex);
+                break;
+            case "enddate":
+                endDate = (Date)propValue;
+                startDate = (Date)model.getValue("startdate");
+                tripDays = CommonServiceHelper.calcDays(startDate, endDate);
+                model.setValue("tripday", tripDays, rowIndex);
+                break;
+            case "tripexpenseitem":
+                if (BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) && propValue != null) {
+                    BudgetCommonUtil.buildBudgetAmountField(this.getView(), rowIndex);
+                }
+                break;
+            case "std_project":
+                if (BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache())) {
+                    BudgetCommonUtil.buildBudgetAmountField(this.getView(), rowIndex);
+                }
+                break;
+            case "vehicle":
+                if (this.getVihicleFromStdConfig()) {
+                    this.getModel().setValue("vehicles", propValue);
+                }
+        }
+
+    }
+
+    public void click(EventObject evt) {
+        Control source = (Control)evt.getSource();
+        String key = source.getKey();
+        IDataModel model = this.getModel();
+        IDataModel parentModel = this.getView().getParentView().getModel();
+        Long companyId = ErCommonUtils.getPk(parentModel.getValue("company"));
+        switch (key) {
+            case "btn_save":
+                StringBuilder requireds = new StringBuilder();
+                requireds.append("from,to,startdate,enddate,vehicles");
+                Boolean isLoan = (Boolean)model.getValue("isloan");
+//                if (isLoan || BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) || BudgetCommonUtil.getIsQueryEASBudgetFlag(this.getPageCache()) || BudgetCommonUtil.getIsTripReqShowExpenseitemFlag(this.getPageCache()) || this.getModel().getDataEntity(true).getBoolean("istravelers") || SystemParamterUtil.getTripexpenseitemMustInput(companyId)) {
+//                    requireds.append(",tripexpenseitem");
+//                }
+
+                DynamicObject dataEntity = model.getDataEntity(true);
+                DynamicObjectCollection tripentry = dataEntity.getDynamicObjectCollection("tripentry");
+                Boolean confirm = Boolean.FALSE;
+                Boolean istravelers = (Boolean)this.getModel().getValue("istravelers");
+                Iterator var21 = tripentry.iterator();
+
+                while(var21.hasNext()) {
+                    DynamicObject dobjet = (DynamicObject)var21.next();
+                    String vehicles = (String)model.getValue("vehicles");
+                    if (vehicles == null) {
+                        this.getView().showTipNotification(String.format(ResManager.loadKDString("请填写“交通工具”。", "CommonServiceHelper_1", "fi-er-business", new Object[0])));
+                        return;
+                    }
+
+                    String[] split = vehicles.split(",");
+                    if (split == null || split.length == 0) {
+                        this.getView().showTipNotification(String.format(ResManager.loadKDString("请填写“交通工具”。", "CommonServiceHelper_1", "fi-er-business", new Object[0])));
+                        return;
+                    }
+
+                    DynamicObjectCollection travelers = dobjet.getDynamicObjectCollection("travelers");
+                    if (istravelers && (travelers == null || travelers.size() == 0)) {
+                        this.getView().showTipNotification(String.format(ResManager.loadKDString("请填写“出差人”。", "TripReqSection_7", "fi-er-formplugin", new Object[0])));
+                        return;
+                    }
+
+                    if (!CommonServiceHelper.requireValidate(dobjet, requireds.toString().split(","), this)) {
+                        return;
+                    }
+
+                    Object from = dobjet.get("from");
+                    Object to = dobjet.get("to");
+                    if (from.equals(to)) {
+                        confirm = Boolean.TRUE;
+                    }
+
+                    dobjet.set("triporiaccappamount", dobjet.get("triporiamount"));
+                    dobjet.set("tripaccappamount", dobjet.get("tripamount"));
+                    dobjet.set("oriaccbalanceamount", dobjet.get("triporiamount"));
+                    dobjet.set("accbalanceamount", dobjet.get("tripamount"));
+                }
+
+                if (parentModel.getValue("istravelers") != null && !(Boolean)parentModel.getValue("istravelers")) {
+                    String error = this.validateTripDate(parentModel);
+                    if (StringUtils.isNotBlank(error)) {
+                        this.getView().showErrorNotification(error);
+                        return;
+                    }
+                }
+
+                if (confirm) {
+                    this.getView().showConfirm(ResManager.loadKDString("出发地与目的地相同,是否继续?", "TripReqSection_0", "fi-er-formplugin", new Object[0]), MessageBoxOptions.OKCancel, new ConfirmCallBackListener("ok", this));
+                } else {
+                    this.clickOk(model, parentModel, dataEntity, tripentry);
+                }
+                break;
+            case "btn_addsection":
+                int tripentryCurIndex = model.getEntryCurrentRowIndex("tripentry");
+                model.setValue("tripcurrency", ErCommonUtils.getPk(parentModel.getValue("currency")), tripentryCurIndex);
+                Long[] applierIds = new Long[]{ErCommonUtils.getPk(parentModel.getValue("applier"))};
+                model.setValue("travelers", applierIds, tripentryCurIndex);
+                this.setTripExpenseItemShow(companyId, tripentryCurIndex);
+                this.setBudgetShow(tripentryCurIndex);
+                this.setVehicleVisible();
+        }
+
+    }
+
+    private void clickOk(IDataModel model, IDataModel parentModel, DynamicObject dataEntity, DynamicObjectCollection tripentry) {
+        if (tripentry != null && tripentry.size() >= 1) {
+            long firstPageCurrencyId = ErCommonUtils.getPk(parentModel.getValue("currency"));
+            long secondPageCurrencyId = ErCommonUtils.getPk(model.getValue("currency"));
+            IFormView parentView = this.getView().getParentView();
+            DynamicObject parentDataEntity = parentModel.getDataEntity(true);
+            DynamicObjectCollection partripentry = parentDataEntity.getDynamicObjectCollection("tripentry");
+            if (partripentry.isEmpty() && firstPageCurrencyId != secondPageCurrencyId) {
+                parentView.updateView();
+                this.getView().sendFormAction(parentView);
+                this.getView().close();
+            } else {
+                FormShowParameter param = this.getView().getFormShowParameter();
+                String pageId = parentView.getPageId();
+                if (param.getCustomParam("entryedit") != null) {
+                    int index = (Integer)param.getCustomParam("index");
+                    partripentry.remove(index);
+                    partripentry.addAll(index, tripentry);
+                } else {
+                    partripentry.addAll(tripentry);
+                }
+
+                RedisModelCache redisModelCache = new RedisModelCache((IRefrencedataProvider)null, model.getDataEntityType(), pageId);
+                redisModelCache.storeAll(dataEntity);
+                parentView.updateView();
+                this.getView().sendFormAction(parentView);
+                this.getView().close();
+            }
+        } else {
+            this.getView().showTipNotification(ResManager.loadKDString("请填写行程信息。", "TripReqSection_5", "fi-er-formplugin", new Object[0]));
+        }
+    }
+
+    private String validateTripDate(IDataModel parentModel) {
+        DynamicObjectCollection parentTripEntry = parentModel.getEntryEntity("tripentry");
+        int parentSize = parentTripEntry.size();
+        DynamicObjectCollection curEntryEntity = this.getModel().getEntryEntity("tripentry");
+        int curSize = curEntryEntity.size();
+        Map<Integer, Object> sortMap = new TreeMap();
+        if (curSize > 0) {
+            curEntryEntity.forEach((entity) -> {
+                sortMap.put(entity.getInt("index"), entity);
+            });
+        }
+
+        if (parentSize > 0) {
+            parentTripEntry.forEach((entity) -> {
+                if (!sortMap.containsKey(entity.getInt("seq"))) {
+                    sortMap.put(entity.getInt("seq"), entity);
+                }
+
+            });
+        }
+
+        Date startDate = null;
+        Date endDate = null;
+        String tip = null;
+
+        for(int i = 0; i < curEntryEntity.size(); ++i) {
+            DynamicObject curTripEntry = (DynamicObject)curEntryEntity.get(i);
+            int index = curTripEntry.getInt("index");
+            DynamicObject lastTripEntry = (DynamicObject)sortMap.get(index - 1);
+            if (lastTripEntry != null) {
+                startDate = curTripEntry.getDate("startdate");
+                endDate = lastTripEntry.getDate("enddate");
+                if (startDate.before(endDate)) {
+                    tip = ResManager.loadKDString("第%1$s程行程期间不能早于第%2$s程行程期间。", "TripReqSection_2", "fi-er-formplugin", new Object[0]);
+                    return String.format(tip, index, index - 1);
+                }
+            }
+
+            DynamicObject nextTripEntry = (DynamicObject)sortMap.get(index + 1);
+            if (nextTripEntry != null) {
+                endDate = curTripEntry.getDate("enddate");
+                startDate = nextTripEntry.getDate("startdate");
+                if (startDate.before(endDate)) {
+                    tip = ResManager.loadKDString("第%1$s程行程期间不能晚于第%2$s程行程期间。", "TripReqSection_4", "fi-er-formplugin", new Object[0]);
+                    return String.format(tip, index, index + 1);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private void setTripExpenseItemShow(Long companyId, int rowIndex) {
+        Boolean isLoan = (Boolean)this.getModel().getValue("isloan");
+        CardEntry tripCardEntry = (CardEntry)this.getControl("tripentry");
+        if (!isLoan && !BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) && !BudgetCommonUtil.getIsQueryEASBudgetFlag(this.getPageCache()) && !BudgetCommonUtil.getIsTripReqShowExpenseitemFlag(this.getPageCache()) && !this.getModel().getDataEntity(true).getBoolean("istravelers") && !SystemParamterUtil.getTripexpenseitemMustInput(companyId)) {
+            tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardtripexpenseitem", "tripexpenseitem"});
+        } else {
+            tripCardEntry.setChildVisible(true, rowIndex, new String[]{"cardtripexpenseitem", "tripexpenseitem"});
+            FieldEdit editor = (FieldEdit)this.getView().getControl("tripexpenseitem");
+            editor.setMustInput(false);
+        }
+
+    }
+
+    private void setBudgetShow(int rowIndex) {
+        CardEntry tripCardEntry = (CardEntry)this.getControl("tripentry");
+        if (tripCardEntry != null) {
+            if (!BudgetCommonUtil.getIsQueryBudgetFlag(this.getPageCache()) && !BudgetCommonUtil.getIsQueryEASBudgetFlag(this.getPageCache())) {
+                tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget", "budgetamount"});
+                tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget1", "budgetmsg"});
+            } else {
+                IFormView parentView = this.getView().getParentView();
+                if (parentView != null) {
+                    String budgeMsgValue = (String)ErCommonUtils.getEMParameter(ErCommonUtils.getPk(parentView.getModel().getValue("company")), "budgeMsgControl");
+                    if (StringUtils.isNotEmpty(budgeMsgValue)) {
+                        if ("0".equals(budgeMsgValue)) {
+                            tripCardEntry.setChildVisible(true, rowIndex, new String[]{"cardbudget", "budgetamount"});
+                            tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget1", "budgetmsg"});
+                        } else if ("1".equals(budgeMsgValue)) {
+                            tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget", "budgetamount"});
+                            tripCardEntry.setChildVisible(true, rowIndex, new String[]{"cardbudget1", "budgetmsg"});
+                        }
+                    } else {
+                        tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget", "budgetamount"});
+                        tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget1", "budgetmsg"});
+                    }
+                } else {
+                    tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget", "budgetamount"});
+                    tripCardEntry.setChildVisible(false, rowIndex, new String[]{"cardbudget1", "budgetmsg"});
+                }
+            }
+        }
+
+    }
+
+    private void initTripEntryDefaultData(IDataModel model, int rowIndex) {
+        model.setValue("tripexchangerate", BigDecimal.ONE, rowIndex);
+    }
+
+    public void afterDeleteRow(AfterDeleteRowEventArgs e) {
+        super.afterDeleteRow(e);
+        int[] rowIndexs = e.getRowIndexs();
+        int rowIndex = rowIndexs[0];
+
+        for(int tripEntrySize = this.getModel().getEntryRowCount("tripentry"); rowIndex < tripEntrySize; ++rowIndex) {
+            int index = (Integer)this.getModel().getValue("index", rowIndex);
+            this.getModel().setValue("index", index - 1, rowIndex);
+        }
+
+    }
+
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        IDataModel model = this.getModel();
+        IDataModel paremodel = this.getView().getParentView().getModel();
+        int rowIndex = model.getEntryCurrentRowIndex("tripentry");
+        int thisCount = model.getEntryRowCount("tripentry");
+        DynamicObjectCollection tripentryCol = model.getEntryEntity("tripentry");
+        int tripenytryCount = tripentryCol.size();
+        if (thisCount != 0) {
+            int tripEntryRowCount;
+            if ("newtripentry".equalsIgnoreCase(afterDoOperationEventArgs.getOperateKey())) {
+                if (tripenytryCount > 1) {
+                    Object lastCity = ((DynamicObject)tripentryCol.get(tripenytryCount - 2)).get("to_Id");
+                    Object nextStartDate = ((DynamicObject)tripentryCol.get(tripenytryCount - 2)).get("enddate");
+                    if (lastCity != null) {
+                        model.setValue("from", lastCity, tripenytryCount - 1);
+                    }
+
+                    if (nextStartDate != null) {
+                        model.setValue("startdate", nextStartDate, tripenytryCount - 1);
+                    }
+                }
+
+                tripEntryRowCount = model.getEntryRowCount("tripentry") + paremodel.getEntryRowCount("tripentry");
+                model.setValue("index", tripEntryRowCount, model.getEntryRowCount("tripentry") - 1);
+                Object currencyId = ErCommonUtils.getPk(paremodel.getValue("currency"));
+                model.setValue("rcurrency", currencyId, rowIndex);
+                model.setValue("tripcurrency", currencyId, rowIndex);
+                this.initTripEntryDefaultData(model, rowIndex);
+            }
+
+            tripEntryRowCount = model.getEntryRowCount("tripentry");
+            int parentTripEntryRowCount = paremodel.getEntryRowCount("tripentry");
+            if (Objects.equals(afterDoOperationEventArgs.getOperateKey(), "deletetripentry")) {
+                for(int i = 0; i < tripEntryRowCount; ++i) {
+                    model.setValue("index", parentTripEntryRowCount + i + 1, i);
+                }
+            }
+
+        }
+    }
+
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        super.confirmCallBack(messageBoxClosedEvent);
+        if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+            IFormView parentView = this.getView().getParentView();
+            IDataModel parentModel = parentView.getModel();
+            DynamicObject dataEntity = this.getModel().getDataEntity(true);
+            DynamicObjectCollection tripentry = dataEntity.getDynamicObjectCollection("tripentry");
+            this.clickOk(this.getModel(), parentModel, dataEntity, tripentry);
+        }
+
+    }
+
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        super.closedCallBack(closedCallBackEvent);
+        if ("people_choose".equalsIgnoreCase(closedCallBackEvent.getActionId())) {
+            ListSelectedRowCollection rowCollection = (ListSelectedRowCollection)closedCallBackEvent.getReturnData();
+            int index = this.getModel().getEntryCurrentRowIndex("tripentry");
+            Object[] users = null;
+            if (rowCollection != null) {
+                users = rowCollection.stream().map((v) -> {
+                    return v.getPrimaryKeyValue();
+                }).toArray();
+            } else {
+                users = new Object[0];
+            }
+
+            this.getModel().setValue("travelers", users, index);
+        }
+
+    }
+
+    public void beforeClosed(BeforeClosedEvent e) {
+        e.setCheckDataChange(false);
+        super.beforeClosed(e);
+    }
+}

+ 17 - 8
src/main/java/sys/sc/formplugin/TestPlugin.java

@@ -369,16 +369,25 @@ public class TestPlugin  extends AbstractListPlugin {
                         existingDeptEntry.set("position", postName);
                         isUpdated = true;
                     }
-                    if ("总经理".contains(postName)) {
-                        //设置为负责人
-                        existingDeptEntry.set("isincharge",true);
-                        isUpdated = true;
-                    }
+//                    if ("总经理".contains(postName)) {
+//                        //设置为负责人
+//                        existingDeptEntry.set("isincharge",true);
+//                        isUpdated = true;
+//                    }
                     //如果职位为空,则赋值无
                     if ("".equals(existingDeptEntry.getString("position"))) {
                         existingDeptEntry.set("position", "无");
                         isUpdated = true;
                     }
+                    //员工状态不为在职,试用期,退二线则设置人员状态为禁用
+                    String nckd_status=personData.getString("nckd_status");
+                    if ((!("01".equals(nckd_status)))  && !("02".equals(nckd_status)) && !("04".equals(nckd_status)))
+                    {
+                        //设置使用状态为禁用
+                        existingUser.set("enable","0");
+                        isUpdated=true;
+
+                    }
                     // 如果有更新则保存
                     if (isUpdated) {
                         SaveServiceHelper.save(new DynamicObject[]{existingUser});
@@ -454,9 +463,9 @@ public class TestPlugin  extends AbstractListPlugin {
                         bumeninfo.set("position", postName);
                     }
                     //如果人员的岗位为总经理,则设置为负责人
-                    if(("总经理").contains(postName)) {
-                        bumeninfo.set("isincharge",true);
-                    }
+//                    if(("总经理").contains(postName)) {
+//                        bumeninfo.set("isincharge",true);
+//                    }
                     //所在岗位名称
                     String positionnumber = personData.getString("nckd_posidname");
                     if ("".equals(positionnumber)) {

+ 24 - 8
src/main/java/sys/sc/task/UpdateDataDailyTask.java

@@ -409,16 +409,25 @@ public class UpdateDataDailyTask extends AbstractTask {
                     existingDeptEntry.set("position", postName);
                     isUpdated = true;
                 }
-                if ("总经理".contains(postName)) {
-                    //设置为负责人
-                    existingDeptEntry.set("isincharge",true);
-                    isUpdated = true;
-                }
+//                if ("总经理".contains(postName)) {
+//                    //设置为负责人
+//                    existingDeptEntry.set("isincharge",true);
+//                    isUpdated = true;
+//                }
                 //如果职位为空,则赋值无
                 if ("".equals(existingDeptEntry.getString("position"))) {
                     existingDeptEntry.set("position", "无");
                     isUpdated = true;
                 }
+                //员工状态不为在职,试用期,退二线则设置人员状态为禁用
+                String nckd_status=personData.getString("nckd_status");
+                if ((!("01".equals(nckd_status)))  && !("02".equals(nckd_status)) && !("04".equals(nckd_status)))
+                {
+                    //设置使用状态为禁用
+                    existingUser.set("enable","0");
+                    isUpdated=true;
+
+                }
                 // 如果有更新则保存
                 if (isUpdated) {
                     SaveServiceHelper.save(new DynamicObject[]{existingUser});
@@ -439,6 +448,12 @@ public class UpdateDataDailyTask extends AbstractTask {
                 }else {
                     userinfo.set("gender", personData.get("nckd_gender"));
                 }
+                //员工状态不为在职,试用期,退二线则设置人员状态为禁用
+                String nckd_status=personData.getString("nckd_status");
+                if ((!("01".equals(nckd_status)))  && !("02".equals(nckd_status)) && !("04".equals(nckd_status))) {
+                    //设置使用状态为禁用
+                    userinfo.set("enable","0");
+                }
                 //人员手机号
                 userinfo.set("phone", personData.get("nckd_sjh"));
                 // 设置其他固定字段
@@ -499,9 +514,9 @@ public class UpdateDataDailyTask extends AbstractTask {
                     bumeninfo.set("position", postName);
                 }
                 //如果人员的岗位为总经理,则设置为负责人
-                if(("总经理").contains(postName)) {
-                    bumeninfo.set("isincharge",true);
-                }
+//                if(("总经理").contains(postName)) {
+//                    bumeninfo.set("isincharge",true);
+//                }
                 //所在岗位名称
                 String positionnumber = personData.getString("nckd_posidname");
                 if ("".equals(positionnumber)) {
@@ -509,6 +524,7 @@ public class UpdateDataDailyTask extends AbstractTask {
                 }else {
                     bumeninfo.set("post", positionnumber);
                 }
+
                 //新增人员头像
                 UserUtils.createAvatar(new DynamicObject[]{userinfo});
                 // 保存新用户信息