Bladeren bron

创建商旅财务底稿确认单任务:
1.核定金额默认=补助金额+补助调整金额
2.补助金额等于财务确认天数*补助标准

lisheng 3 weken geleden
bovenliggende
commit
e512391eb0

+ 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;
+    }
 }

+ 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,