Bläddra i källkod

1.新增人员岗位、职级备份表及调度任务
2.同步所有人员差旅标准

lisheng 3 dagar sedan
förälder
incheckning
bcf97bbc08

+ 6 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/Helper/PersonReimQuotaHelper.java

@@ -213,6 +213,12 @@ public class PersonReimQuotaHelper {
             // 存在则修改
             if(realReimSettingQuery != null){
                 DynamicObject reimSettingInfo = BusinessDataServiceHelper.loadSingle(realReimSettingQuery.get("id"),"er_reimbursesetting_rel");
+                DynamicObject reimburseLever = reimSettingInfo.getDynamicObject("reimburselevel");
+                if(reimburseLever != null && reimburseLever.getString("id").equals(reimLever.getString("id"))){
+                    // 职级未发生改变,直接返回
+                    return;
+                }
+
                 reimSettingInfo.set("reimburselevel",reimLever.get("id"));
                 SaveServiceHelper.save(new DynamicObject[]{ reimSettingInfo });
             }

+ 122 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/PersonJobPositionBakTask.java

@@ -0,0 +1,122 @@
+package nckd.jimin.jyyy.fi.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.api.StopTask;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import nckd.jimin.jyyy.fi.common.constant.BillTypeConstants;
+import nckd.jimin.jyyy.fi.common.constant.JobPositionBakBillConstant;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * 人员岗位职级备份任务
+ */
+public class PersonJobPositionBakTask extends AbstractTask implements StopTask {
+    private static final Log logger = LogFactory.getLog(PersonJobPositionBakTask.class);
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        logger.info("PersonJobPositionBakTask begin ");
+        // 将备份表中最新的岗位、职级信息保存
+        Map<String, DynamicObject> hisBakBillMap = getHisPersonJobPositionBak();
+        List<Object> hisBakBillIdList = hisBakBillMap.values().stream().map(r -> r.getPkValue()).collect(Collectors.toList());
+
+        logger.info("hisBakBillIdList size " + hisBakBillIdList.size());
+
+        // 创建最新的人员表
+        List<DynamicObject> newJobPosotionBakBill = createNewJobPosotionBakBill(hisBakBillMap);
+
+        logger.info("newJobPosotionBakBill size " + newJobPosotionBakBill.size());
+
+        SaveServiceHelper.save(newJobPosotionBakBill.toArray(new DynamicObject[0]));
+        DeleteServiceHelper.delete(JobPositionBakBillConstant.ENTITYID,new QFilter(JobPositionBakBillConstant.ID, QCP.in,hisBakBillIdList).toArray());
+
+        logger.info("PersonJobPositionBakTask end ");
+
+    }
+
+    protected List<DynamicObject> createNewJobPosotionBakBill(Map<String, DynamicObject> hisBakBillMap){
+        List<DynamicObject> bakBillList = new ArrayList<>();
+        // 查询当前生效的人员岗位信息
+        DynamicObjectCollection positionCol = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPPOSORGREL, "person.id,position.id,company.id", new QFilter[]{
+                new QFilter("businessstatus", QCP.equals, "1"),
+                new QFilter("iscurrentversion", QCP.equals, "1"),
+                new QFilter("datastatus", QCP.equals, "1"),
+                new QFilter("isprimary", QCP.equals, "1")
+        });
+
+        // 查询最新的同步时间是不是当前月,是的历史岗位、职级信息不变
+        DynamicObjectCollection newestBakBillCol = QueryServiceHelper.query(JobPositionBakBillConstant.ENTITYID, JobPositionBakBillConstant.KEY_NCKD_UPDATETIME, QFilter.isNotNull(JobPositionBakBillConstant.ID).toArray(), "nckd_updatetime desc", 1);
+        // 是否更新
+        boolean isOnlyUpdateNew = false;
+        if(newestBakBillCol != null && newestBakBillCol.size() > 0){
+            Date updateTime = newestBakBillCol.get(0).getDate(JobPositionBakBillConstant.KEY_NCKD_UPDATETIME);
+            if(updateTime != null
+                    && updateTime.getYear() == Calendar.getInstance().get(Calendar.YEAR)
+                    && updateTime.getMonth() == Calendar.getInstance().get(Calendar.MONTH)){
+                isOnlyUpdateNew = true;
+            }
+        }
+
+        // 查询当前生效的人员职级信息
+        Map<Long, Long> personJobMap = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPJOBREL, "person.id,joblevel.id", new QFilter[]{
+                new QFilter("businessstatus", QCP.equals, "1"),
+                new QFilter("datastatus", QCP.equals, "1"),
+                new QFilter("iscurrentversion", QCP.equals, "1")
+        }).stream().collect(Collectors.toMap(r -> r.getLong("person.id"), r -> r.getLong("joblevel.id"), (k1, k2) -> k1));
+        for(DynamicObject position : positionCol){
+            long personId = position.getLong("person.id");
+            DynamicObject userInfo = CommonUtils.getUserByHrPersonId(personId);
+            if(userInfo != null) {
+                DynamicObject bakBillInfo = BusinessDataServiceHelper.newDynamicObject(JobPositionBakBillConstant.ENTITYID);
+                bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_USER, userInfo);
+                bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW, position.getLong("company.id"));
+                bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_POSITION_NEW, position.getLong("position.id"));
+                bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_UPDATETIME, new Date());
+                if(personJobMap.containsKey(personId)){
+                    bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW, personJobMap.get(personId));
+                }
+                bakBillList.add(bakBillInfo);
+
+                if(hisBakBillMap.containsKey(personId)){
+                    DynamicObject hisBakInfo = hisBakBillMap.get(personId);
+                    if(hisBakInfo != null){
+                        if(isOnlyUpdateNew){
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD));
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD));
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_OLD));
+                        }else{
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW));
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_POSITION_NEW));
+                            bakBillInfo.set(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_OLD, hisBakInfo.get(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW));
+                        }
+                    }
+                }
+            }
+        }
+        return bakBillList;
+    }
+
+    protected Map<String, DynamicObject> getHisPersonJobPositionBak(){
+        Set<Long> bakBillIdSet = QueryServiceHelper.query(JobPositionBakBillConstant.ENTITYID, JobPositionBakBillConstant.ID, QFilter.isNotNull(JobPositionBakBillConstant.ID).toArray())
+                .stream()
+                .map(r -> r.getLong(JobPositionBakBillConstant.ID))
+                .collect(Collectors.toSet());
+        return Arrays.stream(BusinessDataServiceHelper.load(bakBillIdSet.toArray(new Long[0]), EntityMetadataCache.getDataEntityType(JobPositionBakBillConstant.ENTITYID)))
+                .collect(Collectors.toMap(r -> r.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getString(JobPositionBakBillConstant.ID), r -> r, (a, b) -> a));
+    }
+}

+ 27 - 70
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/PersonReimLeverSyncTask.java

@@ -11,18 +11,13 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.schedule.api.StopTask;
 import kd.bos.schedule.executor.AbstractTask;
 import kd.bos.servicehelper.QueryServiceHelper;
-import kd.bos.util.StringUtils;
 import nckd.jimin.jyyy.fi.common.constant.BillTypeConstants;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
 import nckd.jimin.jyyy.fi.plugin.operate.Helper.PersonReimQuotaHelper;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 
 /**
@@ -38,76 +33,38 @@ public class PersonReimLeverSyncTask extends AbstractTask implements StopTask {
     protected PersonReimQuotaHelper getPersonReimQuotaHelper() {
         return Optional.ofNullable(personReimQuotaHelper).orElse(new PersonReimQuotaHelper());
     }
-    private static final String SYNCDATE = "syncdate";
     @Override
     public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
         log.info("-------- PersonReimLeverSyncTask 启动同步人员报销级别任务 --------");
 
-        LocalDate yesterday = getYesterday(map);
-        // 昨天最早的日期时间(00:00:00)
-        LocalDateTime startOfYesterday = yesterday.atStartOfDay();
-        Date beginDate = Date.from(startOfYesterday.atZone(ZoneId.systemDefault()).toInstant());
-        // 昨天最晚的日期时间(23:59:59)
-        LocalDateTime endOfYesterday = yesterday.atTime(LocalTime.MAX);
-        Date endDate = Date.from(endOfYesterday.atZone(ZoneId.systemDefault()).toInstant());
-
-
-
-        // 获取昨天
-        DynamicObjectCollection changeJobCol = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPJOBREL, "person.id,person.number,joblevel.id", new QFilter[]{
-                new QFilter("startdate", QCP.large_equals, beginDate),
-                new QFilter("startdate", QCP.less_equals, endDate),
+        // 查询当前生效的人员岗位信息
+        DynamicObjectCollection positionCol = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPPOSORGREL, "person.id,position.id,company.id", new QFilter[]{
                 new QFilter("businessstatus", QCP.equals, "1"),
-                new QFilter("iscurrentversion", QCP.equals, "1")
+                new QFilter("iscurrentversion", QCP.equals, "1"),
+                new QFilter("datastatus", QCP.equals, "1"),
+                new QFilter("isprimary", QCP.equals, "1")
         });
-        log.info("changeJobCol size : {}" , changeJobCol.size());
-        changeJobCol.stream().forEach(changeJob -> syncReunimLever(changeJob));
-        log.info("-------- PersonReimLeverSyncTask 同步人员报销级别任务结束 --------");
-    }
-
-    /**
-     * 获取同步日期
-     * @param map
-     * @return
-     */
-    protected LocalDate getYesterday(Map<String, Object> map) {
-        if(map.containsKey(SYNCDATE) && StringUtils.isNotEmpty((String)map.get(SYNCDATE))){
-            return LocalDate.parse((String)map.get(SYNCDATE), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        }else{
-            return LocalDate.now().minusDays(1);
-        }
-    }
-    /**
-     * 同步人员报销级别
-     * @param changeJob
-     */
-    protected void syncReunimLever(DynamicObject changeJob) {
-        // 获取人员ID
-        Long personId = changeJob.getLong("person.id");
-        // 人员编码
-        String personNumber = changeJob.getString("person.number");
-        // 获取职级ID
-        Long jobId = changeJob.getLong("joblevel.id");
-        DynamicObject potisionInfo = fetchPositionInfo(personId);
-        if(potisionInfo == null) {
-            log.info("人员 {} 职位信息不存在", personId);
-            return;
+        Map<Long, Long> personCompanyMap = positionCol.stream().collect(Collectors.toMap(r -> r.getLong("person.id"), r -> r.getLong("company.id"), (k1, k2) -> k1));
+        // 获取所有人员最新的职级
+        Map<Long, Long> personJobMap = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPJOBREL, "person.id,joblevel.id", new QFilter[]{
+                new QFilter("businessstatus", QCP.equals, "1"),
+                new QFilter("datastatus", QCP.equals, "1"),
+                new QFilter("iscurrentversion", QCP.equals, "1")
+        }).stream().collect(Collectors.toMap(r -> r.getLong("person.id"), r -> r.getLong("joblevel.id"), (k1, k2) -> k1));
+
+        // 获取人员最新的报销级别
+        PersonReimQuotaHelper helper = getPersonReimQuotaHelper();
+
+        for(Map.Entry<Long, Long> entryRow : personJobMap.entrySet()){
+            Long personId = entryRow.getKey();
+            Long jobLeverId = entryRow.getValue();
+            if(personJobMap.containsKey(personId)){
+                DynamicObject userInfo = CommonUtils.getUserByHrPersonId(personId);
+                helper.syncReimLever(userInfo.getLong("id"),personCompanyMap.get(personId),jobLeverId);
+            }
         }
-        String companyNumber = potisionInfo.getString("company.number");
-        DynamicObject company = QueryServiceHelper.queryOne("bos_org", "id", new QFilter("number", QCP.equals, companyNumber).toArray());
-        DynamicObject userInfo = QueryServiceHelper.queryOne("bos_user", "id", new QFilter("number", QCP.equals, personNumber).toArray());
-        getPersonReimQuotaHelper().syncReimLever(userInfo.getLong("id"),jobId,company.getLong("id"));
-
-    }
-    private DynamicObject fetchPositionInfo(Long personId) {
-        return QueryServiceHelper.queryOne(BillTypeConstants.HRPI_EMPPOSORGREL, "company.number", new QFilter[]{
-                new QFilter("businessstatus", QCP.less_equals, "1"),
-                new QFilter("iscurrentversion", QCP.less_equals, "1"),
-                new QFilter("person.id", QCP.equals, personId),
-                new QFilter("isprimary", QCP.less_equals, "1")
-        });
-    }
-
 
 
+        log.info("-------- PersonReimLeverSyncTask 同步人员报销级别任务结束 --------");
+    }
 }