2 Commits 01bed4df38 ... 6fa464ef32

Autor SHA1 Mensaje Fecha
  lisheng 6fa464ef32 商旅对账单: hace 1 mes
  lisheng e512391eb0 创建商旅财务底稿确认单任务: hace 1 mes

+ 18 - 3
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/constant/travelcheck/BusTravelCheckBillConstant.java

@@ -23,7 +23,8 @@ public interface BusTravelCheckBillConstant extends BillConstant {
 
     String NCKD_NCKD_SOURCEBILLID = "nckd_sourcebillid"; // 底稿确认单
 
-    List<String> BZ_EDITFIELD = Arrays.asList(NCKD_BZ_ENTRY.NCKD_BZ_SUPDAYS,NCKD_BZ_ENTRY.NCKD_BZ_SUMDAYS,NCKD_BZ_ENTRY.NCKD_BZ_ADJAMOUNT,NCKD_BZ_ENTRY.NCKD_BZ_CHECKAMT,NCKD_BZ_ENTRY.NCKD_BZ_DESCRIBE);
+    List<String> BZ_EDITFIELD = Arrays.asList(NCKD_BZ_ENTRY.NCKD_BZ_SUPDAYS,NCKD_BZ_ENTRY.NCKD_BZ_SUMDAYS,NCKD_BZ_ENTRY.NCKD_BZ_ADJAMOUNT,NCKD_BZ_ENTRY.NCKD_BZ_CHECKAMT,
+            NCKD_BZ_ENTRY.NCKD_BZ_DESCRIBE,NCKD_BZ_ENTRY.NCKD_BZ_PAYERBANK,NCKD_BZ_ENTRY.NCKD_BZ_ACCOUNT);
     List<String> SL_EDITFIELD = Arrays.asList(NCKD_SL_ENTRY.NCKD_SL_DESCRIBE);
     List<String> YC_EDITFIELD = Arrays.asList(NCKD_YC_ENTRY.NCKD_YC_DESCRIBE);
 
@@ -84,16 +85,28 @@ public interface BusTravelCheckBillConstant extends BillConstant {
          * 事由
          */
         String NCKD_DESCRIPTION = "nckd_description";
-
         /**
          * 未涵盖日期范围
          */
+        String NCKD_BZDATERANGE = "nckd_bzdaterange";
+        /**
+         * 未涵盖日期范围 - 开始时间
+         */
+        String NCKD_BZDATERANGE_RSTARTDATE = "nckd_rstartdate";
+        /**
+         * 未涵盖日期范围 - 结束时间
+         */
+        String NCKD_BZDATERANGE_RENDDATE = "nckd_renddate";
+
+        /**
+         * 出差天数
+         */
         String NCKD_SUPDAYS = "nckd_supdays";
 
         /**
          * 财务建议出差天数
          */
-        String NCKD_CHECKSUPDAY = "nckd_checksupday";
+        String NCKD_CHECKSUPDAYS = "nckd_checksupdays";
 
         /**
          * 补助金额
@@ -118,6 +131,8 @@ public interface BusTravelCheckBillConstant extends BillConstant {
         String NCKD_BZ_SUPDAYS = "nckd_bz_supdays"; // 补助未涵盖天数
         String NCKD_BZ_ADJAMOUNT = "nckd_bz_adjamount"; // 补助调整金额
         String NCKD_BZ_FINANDRAFT = "nckd_bz_finandraft"; // 财务对账底稿
+        String NCKD_BZ_PAYERBANK = "nckd_bz_payerbank"; // 银行账号
+        String NCKD_BZ_ACCOUNT = "nckd_bz_account"; // 开户行
     }
 
 

+ 53 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/util/CommonUtils.java

@@ -9,12 +9,16 @@ import kd.bos.dataentity.utils.StringUtils;
 import kd.bos.entity.operate.result.IOperateInfo;
 import kd.bos.entity.operate.result.OperateErrorInfo;
 import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDBizException;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.org.OrgUnitServiceHelper;
+import kd.bos.servicehelper.org.OrgViewType;
 
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -181,4 +185,53 @@ public class CommonUtils {
         }
         return idMap;
     }
+
+    public static int getDaysByWorkCalandar(Date startTime, Date endTime,DynamicObject org){
+        // 获取组织下的工作日历
+        DynamicObject workCalendar = getWorkCalandar(org.getLong("id"));
+        List<Date> notWorkDayList = new ArrayList<>();
+        if(workCalendar != null){
+            notWorkDayList = QueryServiceHelper.query("bd_workcalendar", "dateentry.workdate", new QFilter[]{
+                    new QFilter("dateentry.datetype", QCP.equals, "3"),
+                    new QFilter("dateentry.workdate", QCP.large_equals, startTime),
+                    new QFilter("dateentry.workdate", QCP.less_equals, endTime),
+                    new QFilter("id", QCP.equals, workCalendar.getPkValue())
+            }).stream().map(r -> r.getDate("dateentry.workdate")).collect(Collectors.toList());
+        }
+        startTime = CommonUtils.getStartOfDay(startTime);
+        endTime = CommonUtils.getStartOfDay(endTime);
+        // 计算开始日期和结束日期之间总天数,时间转成日期,然后相减
+        long diffInMillis = endTime.getTime() - startTime.getTime();
+        int totalDays = (int) (diffInMillis / (24 * 60 * 60 * 1000)) + 1;
+
+        // 计算工作日天数(总天数减去非工作日天数)
+        int workDays = totalDays - notWorkDayList.size();
+
+        return workDays;
+    }
+
+    public static BigDecimal getBzAmount(){
+        DynamicObject tripExpenseItem = QueryServiceHelper.queryOne("er_tripexpenseitem", "nckd_travelbzstd", new QFilter("longnumber", QCP.equals, "004").toArray());
+        if(tripExpenseItem == null){
+            throw new KDBizException("没有配置补助的差旅标准。");
+        }
+        BigDecimal bzAmount = tripExpenseItem.getBigDecimal("nckd_travelbzstd");
+        if(bzAmount == null || bzAmount.compareTo(BigDecimal.ZERO) <= 0){
+            throw new KDBizException("差旅补助金额不能为0。");
+        }
+        return bzAmount;
+    }
+
+    public static DynamicObject getWorkCalandar(Long orgId){
+        DynamicObject workCalendar = QueryServiceHelper.queryOne("bd_workcalendar", "id", new QFilter("org", QCP.equals, orgId).toArray());
+        if(workCalendar == null){
+            Map<Long, Long> parentOrgMap = OrgUnitServiceHelper.getDirectSuperiorOrg(OrgViewType.Admin, Collections.singletonList(orgId));
+            if(!parentOrgMap.containsKey(orgId)){
+                return null;
+            }else{
+                return getWorkCalandar(parentOrgMap.get(orgId));
+            }
+        }
+        return workCalendar;
+    }
 }

+ 59 - 15
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/travelcheck/BusTravelCheckBillEdit.java

@@ -1,21 +1,14 @@
 package nckd.jimin.jyyy.fi.plugin.form.travelcheck;
 
-import com.grapecity.documents.excel.Q;
 import kd.bos.bill.AbstractBillPlugIn;
 import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
-import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.MainEntityType;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
-import kd.bos.form.ShowType;
-import kd.bos.form.control.EntryGrid;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
-import kd.bos.form.events.HyperLinkClickEvent;
-import kd.bos.form.events.HyperLinkClickListener;
 import kd.bos.form.operate.FormOperate;
-import kd.bos.list.ListShowParameter;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
@@ -25,8 +18,11 @@ import nckd.jimin.jyyy.fi.common.constant.BillConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.BusTravelCheckBillConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.FinanceBillConfirmConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.TripReqBillConstant;
-import nckd.jimin.jyyy.fi.common.constant.travelcheck.TravelFinanDraftConstant;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.EventObject;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +30,7 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTravelCheckBillConstant {
+    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 
     @Override
     public void beforeBindData(EventObject e) {
@@ -143,13 +140,57 @@ public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTra
         int rowIndex = e.getChangeSet()[0].getRowIndex();
         Object oldValue = e.getChangeSet()[0].getOldValue();
         Object newValue = e.getChangeSet()[0].getNewValue();
+        DynamicObject entryRow = getModel().getEntryRowEntity(NCKD_BZ_SUPDATA.ENTITYID, rowIndex);
         // 出差申请单号
-        if(BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL.equals(name)){
+        if(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL.equals(name)){
             tripReqBillChanged(oldValue, newValue, rowIndex);
         }
-        if(BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUPDAYS.equals( name) || BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUAPMT.equals(name)){
+        if(NCKD_BZ_SUPDATA.NCKD_SUPDAYS.equals( name) || BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUAPMT.equals(name)){
             updateBzEntryFromUnCoveredData(rowIndex);
         }
+        //监听单据内设置字段的值改变,用于计算新的日期范围控件的最早可选日期
+
+//        if (NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE.equals(name)){
+//            Date startDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE);
+//            Date tripStartDate = new Date(entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDate(TripReqBillConstant.RSTARTDATE).getTime());
+//            if(startDate != null && tripStartDate != null && startDate.before(tripStartDate)){
+//                getView().showTipNotification("未涵盖日期范围不能早于行程开始时间。");
+//                entryRow.set(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE,oldValue);
+//                getView().updateView(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE,rowIndex);
+//                return;
+//            }
+//        }
+//        if(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE.equals(name)){
+//            Date endDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE);
+//            Date tripEndDate = new Date(entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDate(TripReqBillConstant.RENDDATE).getTime());
+//            if(endDate != null && tripEndDate != null && endDate.after(tripEndDate)){
+//                getView().showTipNotification("未涵盖日期范围不能晚于行程结束时间。");
+//                entryRow.set(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE,oldValue);
+//                getView().updateView(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE,rowIndex);
+//                return;
+//            }
+//        }
+        if (NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE.equals(name) ||
+                NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE.equals(name)){
+            Date startDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE);
+            Date endDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE);
+
+            if (startDate != null && endDate != null){
+                DynamicObject applierCpmpany = entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDynamicObject(TripReqBillConstant.COMPANY);
+                int days = CommonUtils.getDaysByWorkCalandar(startDate, endDate, applierCpmpany);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUPDAYS, days, rowIndex);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS, days, rowIndex);
+            }else{
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUPDAYS, 0, rowIndex);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS, 0, rowIndex);
+            }
+        }
+
+        if(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS.equals(name)){
+            Integer checkSupDay = (Integer) getModel().getValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS);
+            BigDecimal bzAmount = CommonUtils.getBzAmount();
+            getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUAPMT, bzAmount.multiply(new BigDecimal(checkSupDay)), rowIndex);
+        }
     }
     protected void tripReqBillChanged(Object oldValue , Object newValue, int rowIndex){
         if(oldValue != null){
@@ -177,11 +218,14 @@ public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTra
     protected int getApplierBzEntryRow(Long applierId){
         int entryRowCount = this.getModel().getEntryRowCount(NCKD_BZ_ENTRY.ENTITYID);
         for(int i = 0 ; i < entryRowCount ; i++){
-            DynamicObject traverInfo = (DynamicObject) getModel().getValue(NCKD_BZ_ENTRY.NCKD_BZ_TRAVELER, i);
-            // 通过出差人查询对应的补助分录
-            if(traverInfo != null
-                    && traverInfo.getLong(ID) == applierId){
-                return i;
+            DynamicObject bzInfo = (DynamicObject) getModel().getValue(NCKD_BZ_ENTRY.NCKD_BZ_INFO, i);
+            if(bzInfo != null){
+                DynamicObject traverInfo = bzInfo.getDynamicObject(NCKD_BZ_ENTRY.NCKD_BZ_TRAVELER);
+                // 通过出差人查询对应的补助分录
+                if(traverInfo != null
+                        && traverInfo.getLong(ID) == applierId){
+                    return i;
+                }
             }
         }
         return -1;

+ 74 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/DepSecretaryOp.java

@@ -0,0 +1,74 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import nckd.jimin.jyyy.fi.common.constant.travelcheck.DepSecretaryConstant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class DepSecretaryOp extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_SECRETARY);
+        e.getFieldKeys().add(DepSecretaryConstant.ENTITYID_ENTRY);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_ORG);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_REMARK);
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntitys = this.getDataEntities();
+                for (ExtendedDataEntity dataEntity : dataEntitys) {
+                    // 校验存在重复的部门名称
+                    DynamicObject billInfo = dataEntity.getDataEntity();
+                    DynamicObjectCollection entryCol = billInfo.getDynamicObjectCollection(DepSecretaryConstant.ENTITYID_ENTRY);
+                    // 查询重复的部门
+                    Map<String,List<String>> repeatDept = new HashMap<>();
+                    for(DynamicObject entry : entryCol){
+                        DynamicObject dept = entry.getDynamicObject(DepSecretaryConstant.NCKD_ORG);
+                        if(dept != null){
+                            String deptName = dept.getString("fullname");
+                            String seqStr = String.format("第%s行",dept.getInt("seq") + 1);
+                            if(repeatDept.containsKey(deptName)){
+                                List<String> seqList = repeatDept.get(deptName);
+                                seqList.add(seqStr);
+                            }else{
+                                List<String> seqList = new ArrayList<>();
+                                seqList.add(seqStr);
+                                repeatDept.put(deptName,seqList);
+                            }
+                        }
+                    }
+
+                    StringBuffer showMsg = new StringBuffer();
+                    for(Map.Entry<String,List<String>> entry : repeatDept.entrySet()){
+                        if(entry.getValue().size() > 1){
+                            showMsg.append("部门名称重复:")
+                                    .append(entry.getKey())
+                                    .append("(").append(entry.getValue().stream().collect(Collectors.joining(","))).append(")").append("\r\n");
+                        }
+                    }
+                    if(showMsg.length() > 0){
+                        this.addErrorMessage(dataEntity,showMsg.toString());
+                        return;
+                    }
+                }
+            }
+        });
+    }
+}

+ 21 - 66
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/TravelFinanConfirmCreateTask.java

@@ -7,7 +7,6 @@ import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.db.tx.TX;
 import kd.bos.db.tx.TXHandle;
 import kd.bos.entity.EntityMetadataCache;
-import kd.bos.exception.KDBizException;
 import kd.bos.exception.KDException;
 import kd.bos.id.ID;
 import kd.bos.logging.Log;
@@ -19,8 +18,6 @@ import kd.bos.schedule.executor.AbstractTask;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
-import kd.bos.servicehelper.org.OrgUnitServiceHelper;
-import kd.bos.servicehelper.org.OrgViewType;
 import kd.bos.util.CollectionUtils;
 import nckd.jimin.jyyy.fi.common.constant.BillTypeConstants;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.*;
@@ -49,7 +46,6 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
             logger.info(String.format("期间[%s]已经存在商旅对账确认单,请勿重复创建!", period));
             return;
         }
-
         try(TXHandle tx = TX.requiresNew(this.getClass().getName())){
             try {
 
@@ -191,7 +187,7 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
 
     protected void createBzEntry(DynamicObject financeConfirmInfo){
         long confirmBillId = financeConfirmInfo.getLong(FinanceBillConfirmConstant.ID);
-        BigDecimal bzAmount = getBzAmount();
+        BigDecimal bzAmount = CommonUtils.getBzAmount();
         // 获取本月月初
         LocalDateTime firstDayStart = LocalDate.now().withDayOfMonth(1).atStartOfDay();
         // 转换为Date对象
@@ -221,19 +217,6 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
         createCheckBzEntry(bzEntryCol,draftBillIdList);
     }
 
-    protected BigDecimal getBzAmount(){
-        DynamicObject tripExpenseItem = QueryServiceHelper.queryOne("er_tripexpenseitem", "nckd_travelbzstd", new QFilter("longnumber", QCP.equals, "004").toArray());
-        if(tripExpenseItem == null){
-            throw new KDBizException("没有配置补助的差旅标准。");
-        }
-        BigDecimal bzAmount = tripExpenseItem.getBigDecimal("nckd_travelbzstd");
-        if(bzAmount == null || bzAmount.compareTo(BigDecimal.ZERO) <= 0){
-            throw new KDBizException("差旅补助金额不能为0。");
-        }
-        return bzAmount;
-    }
-
-
     protected void createCheckBzEntry(DynamicObjectCollection bzEntryCol,List<Long> draftBillIdList){
         DynamicObject[] draftBillArray = BusinessDataServiceHelper.load(draftBillIdList.toArray(), EntityMetadataCache.getDataEntityType(TravelFinanDraftConstant.ENTITYID_F7));
 
@@ -254,6 +237,7 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
             DynamicObject applierInfo = BusinessDataServiceHelper.loadSingleFromCache(applierId, "bos_user");
             bzEntry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_TRAVELER, applierInfo);
             bzEntry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_TRAVELDAYS, sumDays);
+            bzEntry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_SUMDAYS, sumDays);
             bzEntry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_AMOUNT, sumAmount);
             bzEntry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_CHECKAMT, sumAmount);
             // 设置出差人信息,工号、部门、岗位。 银行账户、开户行
@@ -268,9 +252,8 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
             DynamicObject userInfo = QueryServiceHelper.queryOne("bos_user", "number,entryentity.dpt,entryentity.orgstructure.fullname,entryentity.post.name",
                     new QFilter(FinanceBillConfirmConstant.ID, QCP.equals, traveler.getLong(FinanceBillConfirmConstant.ID)).toArray());
             long deptId = userInfo.getLong("entryentity.dpt");
-            Map<String, Object> companyInfoMap = OrgUnitServiceHelper.getCompanyfromOrg(deptId);
-            Object companyId = companyInfoMap.get("id");
-            DynamicObject company = BusinessDataServiceHelper.loadSingleFromCache(companyId, "bos_org");
+            DynamicObject orgRelation = BusinessDataServiceHelper.loadSingle("bos_org_orgrelation_dept", "fromorg", new QFilter("toorg", QCP.equals, deptId).toArray());
+            DynamicObject company = Objects.isNull(orgRelation)?null:orgRelation.getDynamicObject("fromorg");
             DynamicObject travelDeptSecretary = getTravelDeptSecretary(traveler.getLong(FinanceBillConfirmConstant.ID), deptId);
             if (FinanceBillConfirmConstant.NCKD_BZ_ENTRY.ENTITYID.equals(entryEntityName)) {
                 entry.set(FinanceBillConfirmConstant.NCKD_BZ_ENTRY.NCKD_BZ_DEPFULLNAME, userInfo.getString("entryentity.orgstructure.fullname"));
@@ -358,23 +341,30 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
                 List<DynamicObject> tripReimInvoiceList = tripReimInvoiceData.get(billno);
                 tripReimInvoiceList.stream().forEach(tripReimInvoice -> getDraftData(draftEntryCol.addNew(),"7",
                         String.join("-",tripReimInvoice.getString("tripBillno"),tripReimInvoice.getString("invoiceentry.invoiceno")),
-                        tripReimInvoice.getDate("invoiceentry.carrierdate"),null,
+                        tripReimInvoice.getDate("invoiceentry.carrierdate"),tripReimInvoice.getDate("invoiceentry.carrierdate"),
                         tripReimInvoice.getString("invoiceentry.istartcity"),tripReimInvoice.getString("invoiceentry.idestcity"),tripReimInvoice.getBigDecimal("invoiceentry.totalamount")));
             };
 
-            // 获取draftEntryCol中开始时间的额最早时间  和结束时间的最晚时间
-            Date earliestTime = draftEntryCol.stream()
-                    .filter(d -> d.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_STARTDATE) != null)
-                    .map(d -> d.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_STARTDATE))
-                    .min(Comparator.comparing(Date::getTime)).orElse(null);
+            // 获取draftEntryCol所有的开始时间和结束时间,在获取其中的最早时间和最晚时间
+            List<Date> allDateList = new ArrayList<>();
+            for(DynamicObject draftEntry : draftEntryCol){
+                Date startDate = draftEntry.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_STARTDATE);
+                Date endDate = draftEntry.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_FINISHDATE);
+                if(startDate != null){
+                    allDateList.add(startDate);
+                }
+                if(endDate != null){
+                    allDateList.add(endDate);
+                }
+            }
 
-            Date latestTime = draftEntryCol.stream()
-                    .filter(d -> d.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_FINISHDATE) != null)
-                    .map(d -> d.getDate(TravelFinanDraftConstant.NCKD_DETAILENTITY.NCKD_FINISHDATE))
+            Date earliestTime = allDateList.stream()
+                    .min(Comparator.comparing(Date::getTime)).orElse(null);
+            Date latestTime = allDateList.stream()
                     .max(Comparator.comparing(Date::getTime)).orElse(null);
             //获取latestTime与earliestTime 的日期相差天数,加上1
             if(earliestTime != null && latestTime != null){
-                int days = getDays(earliestTime, latestTime, tripReqBill.getDynamicObject(TripReqBillConstant.COMPANY));
+                int days = CommonUtils.getDaysByWorkCalandar(earliestTime, latestTime, tripReqBill.getDynamicObject(TripReqBillConstant.COMPANY));
                 travelFinanDraftInfo.set(TravelFinanDraftConstant.NCKD_SUMDAYS, days);
                 // 查询补助金额
                 travelFinanDraftInfo.set(TravelFinanDraftConstant.NCKD_AMOUNT, bzAmount.multiply(BigDecimal.valueOf(days)));
@@ -386,42 +376,7 @@ public class TravelFinanConfirmCreateTask extends AbstractTask {
         }
     }
 
-    protected int getDays(Date startTime, Date endTime,DynamicObject org){
-        // 获取组织下的工作日历
-        DynamicObject workCalendar = getWorkCalandar(org.getLong("id"));
-        List<Date> notWorkDayList = new ArrayList<>();
-        if(workCalendar != null){
-            notWorkDayList = QueryServiceHelper.query("bd_workcalendar", "dateentry.workdate", new QFilter[]{
-                    new QFilter("dateentry.datetype", QCP.equals, "3"),
-                    new QFilter("dateentry.workdate", QCP.large_equals, startTime),
-                    new QFilter("dateentry.workdate", QCP.less_equals, endTime),
-                    new QFilter("id", QCP.equals, workCalendar.getPkValue())
-            }).stream().map(r -> r.getDate("dateentry.workdate")).collect(Collectors.toList());
-        }
-        startTime = CommonUtils.getStartOfDay(startTime);
-        endTime = CommonUtils.getStartOfDay(endTime);
-        // 计算开始日期和结束日期之间总天数,时间转成日期,然后相减
-        long diffInMillis = endTime.getTime() - startTime.getTime();
-        int totalDays = (int) (diffInMillis / (24 * 60 * 60 * 1000)) + 1;
 
-        // 计算工作日天数(总天数减去非工作日天数)
-        int workDays = totalDays - notWorkDayList.size();
-
-        return workDays;
-    }
-
-    protected DynamicObject getWorkCalandar(Long orgId){
-        DynamicObject workCalendar = QueryServiceHelper.queryOne("bd_workcalendar", "id", new QFilter("org", QCP.equals, orgId).toArray());
-        if(workCalendar == null){
-            Map<Long, Long> parentOrgMap = OrgUnitServiceHelper.getDirectSuperiorOrg(OrgViewType.Admin, Collections.singletonList(orgId));
-            if(!parentOrgMap.containsKey(orgId)){
-                return null;
-            }else{
-                return getWorkCalandar(parentOrgMap.get(orgId));
-            }
-        }
-        return workCalendar;
-    }
 
 
     protected DynamicObject getDraftData( DynamicObject draftEntry , String source, String orderNum, Date startTime,