Quellcode durchsuchen

Merge branch '1.0' of codeup.aliyun.com:5ec7ea24405cdab50f3fd8f0/galaxis/manatee into 1.0

 Conflicts:
	src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java
WoNiu vor 5 Jahren
Ursprung
Commit
58d5822836

+ 7 - 0
pom.xml

@@ -58,6 +58,13 @@
         </dependency>
 
         <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.4</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>

+ 19 - 2
src/main/java/com/galaxis/manatee/dao/ChuanyunAskForLeaveDao.java

@@ -1,15 +1,32 @@
 package com.galaxis.manatee.dao;
 
 import com.galaxis.capsule.util.GalaxisRepository;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDo;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDO;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * Created by IntelliJ IDEA.
  * User: xuj
  * Date: 2020/7/24
  */
 @Repository
-public interface ChuanyunAskForLeaveDao extends GalaxisRepository<ChuanyunAskForLeaveDo,String> {
+public interface ChuanyunAskForLeaveDao extends GalaxisRepository<ChuanyunAskForLeaveDO,String> {
+
+    /**
+     * SQL 查询是否存在请假信息,避免重复提交
+     * @param title
+     * @return
+     */
+    @Query(value = "SELECT * FROM chuanyun_askforleave WHERE title = ?1", nativeQuery = true)
+    List<ChuanyunAskForLeaveDO> findByTitleSQL(String title);
 
+    /**
+     * SQL 查询请假信息
+     * @return
+     */
+    @Query(value = "SELECT t.* FROM chuanyun_askforleave t GROUP BY t.title", nativeQuery = true )
+    List<ChuanyunAskForLeaveDO> findAllAskForLeave();
 }

+ 7 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunUserDao.java

@@ -17,4 +17,11 @@ public interface ChuanyunUserDao extends GalaxisRepository<ChuanyunUserDO,String
      * @return  对象
      */
     ChuanyunUserDO findByName(String name);
+
+    /**
+     * 根据钉钉号获取用户对象
+     * @param dingTalkAccount   钉钉号
+     * @return  氚云对象
+     */
+    ChuanyunUserDO findByDingTalkAccountContaining(String dingTalkAccount);
 }

+ 55 - 19
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunAskForLeaveDo.java

@@ -6,9 +6,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONArray;
 import org.springframework.beans.BeanUtils;
-
 import javax.persistence.Entity;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
@@ -24,24 +25,24 @@ import java.util.UUID;
 @Data
 @Entity(name = "CHUANYUN_ASKFORLEAVE")
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class ChuanyunAskForLeaveDo extends BasicDO {
+public class ChuanyunAskForLeaveDO extends BasicDO {
 
     /**
      * 表名
      */
-    public static final String SCHEMA_CODE ="c490c2213711480d8b2c3eee7099e39d";
+    public static final String SCHEMA_CODE ="D001789c490c2213711480d8b2c3eee7099e39d";
 
     /**
      * 标题
      */
-    @JsonProperty("title")
+    @JsonProperty("F0000001")
     private String title;
 
     /**
      * 抄送人
      */
-    @JsonProperty("cs_userids")
-    private String csUserids;
+    @JsonProperty("cc_userids")
+    private String ccUserids;
 
     /**
      * 操作
@@ -66,22 +67,22 @@ public class ChuanyunAskForLeaveDo extends BasicDO {
     private String mainProcessInstanceId;
 
     /**
-     * 发起人
+     * 发起人userId
      */
     @JsonProperty("originator_userid")
     private String originatorUserid;
 
     /**
-     * 发起部门
+     * 发起人姓名
      */
-    @JsonProperty("originator_dept_id")
-    private String originatorDeptId;
+    @JsonProperty("F0000007")
+    private String originatorUserName;
 
     /**
-     * 抄送人
+     * 发起部门
      */
-    @JsonProperty("cc_userids")
-    private String ccUserId;
+    @JsonProperty("originator_dept_id")
+    private String originatorDeptId;
 
     /**
      * 审批结果: 同意 和 不同意
@@ -98,31 +99,54 @@ public class ChuanyunAskForLeaveDo extends BasicDO {
     /**
      * 发起部门
      */
-    @JsonProperty("originator_dept_name")
+    @JsonProperty("F0000002")
     private String originatorDeptName;
 
     /**
      * 请假事由
      */
-    @JsonProperty("leave_type")
+    @JsonProperty("F0000005")
     private String leaveType;
 
     /**
      * 劳动合同所属公司
      */
-    @JsonProperty("contract_owner_ltd")
+    @JsonProperty("F0000004")
     private String contractOwnerLtd;
 
-    @JsonProperty("result")
+    @JsonProperty("F0000006")
     private String result;
 
     /**
+     * 请假开始时间
+     */
+    @JsonProperty("F0000016")
+    private String startTime;
+
+    /**
+     * 请假结束时间
+     */
+    private String endTime;
+
+    /**
+     * 请假时长
+     */
+    @JsonProperty("F0000017")
+    private BigDecimal totalDay;
+
+    /**
+     * 请假人Id
+     */
+    @JsonProperty("F0000018")
+    private String askForLeaveUserId;
+
+    /**
      * 根据ProcessInstanceTopVo获得chuanyunAskForLeaveDo
      * @param processInstanceTopVo   传输数据
      * @return  保存数据
      */
-    public static ChuanyunAskForLeaveDo fromAskForLeaveDTO(OapiProcessinstanceGetResponse.ProcessInstanceTopVo processInstanceTopVo){
-        ChuanyunAskForLeaveDo chuanyunAskForLeaveDo =new ChuanyunAskForLeaveDo();
+    public static ChuanyunAskForLeaveDO fromAskForLeaveDTO(OapiProcessinstanceGetResponse.ProcessInstanceTopVo processInstanceTopVo){
+        ChuanyunAskForLeaveDO chuanyunAskForLeaveDo = new ChuanyunAskForLeaveDO();
         BeanUtils.copyProperties(processInstanceTopVo, chuanyunAskForLeaveDo);
         List<OapiProcessinstanceGetResponse.FormComponentValueVo> formComponentList = processInstanceTopVo.getFormComponentValues();
         if(formComponentList != null && formComponentList.size() > 0) {
@@ -133,6 +157,18 @@ public class ChuanyunAskForLeaveDo extends BasicDO {
                 if ("劳动合同所属公司".equals(formComponentValueVo.getName())) {
                     chuanyunAskForLeaveDo.setContractOwnerLtd(formComponentValueVo.getValue());
                 }
+                if(("[\"开始时间\",\"结束时间\"]").equals(formComponentValueVo.getName())){
+                    try {
+                        JSONArray json = JSONArray.fromObject(formComponentValueVo.getValue());
+                        chuanyunAskForLeaveDo.setStartTime((String)json.get(0));
+                        chuanyunAskForLeaveDo.setEndTime((String)json.get(1));
+                        chuanyunAskForLeaveDo.setTotalDay(new BigDecimal(String.valueOf(json.get(2))));
+                        chuanyunAskForLeaveDo.setTitle((String.valueOf(json.get(0)) + chuanyunAskForLeaveDo.getTitle()));
+                    }catch(Exception e) {
+                        log.warn("请假信息解析异常");
+                        e.printStackTrace();
+                    }
+                }
             }
         }
         chuanyunAskForLeaveDo.setObjectId(UUID.randomUUID().toString());

+ 6 - 1
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunUserDO.java

@@ -39,10 +39,15 @@ public class ChuanyunUserDO extends BasicDO{
     @JsonProperty(value = "Title")
     private String title;
 
-
     /**
      * 工号
      */
     @JsonProperty(value = "EmployeeNumber")
     private String employeeNumber;
+
+    /**
+     * 钉钉工号
+     */
+    @JsonProperty(value = "DingTalkAccount")
+    private String dingTalkAccount;
 }

+ 17 - 9
src/main/java/com/galaxis/manatee/service/DingTalkScheduledTask.java

@@ -1,16 +1,14 @@
 package com.galaxis.manatee.service;
 
-import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
-import com.dingtalk.api.response.OapiAttendanceGetleavestatusResponse;
-import com.dingtalk.api.response.OapiGettokenResponse;
 import com.dingtalk.api.response.OapiProcessinstanceGetResponse;
 import com.dingtalk.api.response.OapiProcessinstanceListidsResponse;
 import com.galaxis.manatee.constant.DingTalkConstant;
 import com.galaxis.manatee.dao.ChuanyunAskForLeaveDao;
+import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
 import com.galaxis.manatee.dao.DingTalkProcessInstanceDao;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDo;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDO;
 import com.galaxis.manatee.entity.ding.DingTalkProcessInstance;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
@@ -52,12 +50,15 @@ public class DingTalkScheduledTask {
      */
     private final ChuanyunAskForLeaveDao chuanyunAskForLeaveDao;
 
-    public DingTalkScheduledTask(DingTalkClient processInstanceListIdsClient, DingTalkClient processInstanceClient,
+    private final ChuanyunUserCompanyDao userCompanyDao;
+
+    public DingTalkScheduledTask(DingTalkClient processInstanceListIdsClient, DingTalkClient processInstanceClient,ChuanyunUserCompanyDao chuanyunUserDao,
                                  ChuanyunAskForLeaveDao chuanyunAskForLeaveDao,DingTalkProcessInstanceDao dingTalkProcessInstanceDao) {
         this.processInstanceListIdsClient = processInstanceListIdsClient;
         this.processInstanceClient = processInstanceClient;
         this.dingTalkProcessInstanceDao = dingTalkProcessInstanceDao;
         this.chuanyunAskForLeaveDao = chuanyunAskForLeaveDao;
+        this.userCompanyDao = chuanyunUserDao;
     }
 
     /**
@@ -99,7 +100,7 @@ public class DingTalkScheduledTask {
             while(flag){
                 LocalDateTime start=LocalDateTime.now();
                 OapiProcessinstanceListidsResponse oapiProcessinstanceListidsResponse=processInstanceListIdsClient.execute(oApiProcessInstanceListIdsRequest,DingTalkConstant.DING_TALK_TOKEN);
-                List<ChuanyunAskForLeaveDo> chuanyunAskForLeaveDoList=new ArrayList<>();
+                List<ChuanyunAskForLeaveDO> chuanyunAskForLeaveDoList=new ArrayList<>();
                 if(oapiProcessinstanceListidsResponse.getErrcode()!=0){
                     log.info(oapiProcessinstanceListidsResponse.getErrmsg());
                     try {
@@ -117,15 +118,22 @@ public class DingTalkScheduledTask {
                         request.setProcessInstanceId(resultId);
                         try {
                             OapiProcessinstanceGetResponse oapiProcessinstanceGetResponse = processInstanceClient.execute(request, DingTalkConstant.DING_TALK_TOKEN);
-                            chuanyunAskForLeaveDoList.add(ChuanyunAskForLeaveDo.fromAskForLeaveDTO(oapiProcessinstanceGetResponse.getProcessInstance()));
+                            ChuanyunAskForLeaveDO chuanyunAskForLeaveDo = ChuanyunAskForLeaveDO.fromAskForLeaveDTO(oapiProcessinstanceGetResponse.getProcessInstance());
+                            List<ChuanyunAskForLeaveDO> existsAskForLeave = chuanyunAskForLeaveDao.findByTitleSQL(chuanyunAskForLeaveDo.getTitle());
+                            if(existsAskForLeave != null && !existsAskForLeave.isEmpty()) {
+                                return;
+                            }
+                            chuanyunAskForLeaveDoList.add(chuanyunAskForLeaveDo);
                         } catch (ApiException e) {
                             e.printStackTrace();
                         }
                     }
                 });
 
-                //保存id列表和实例列表
-                chuanyunAskForLeaveDao.saveAll(chuanyunAskForLeaveDoList);
+                //保存id列表和实例列表,如果有更新的内容
+                if(chuanyunAskForLeaveDoList.size() > 0) {
+                    chuanyunAskForLeaveDao.saveAll(chuanyunAskForLeaveDoList);
+                }
                 log.info(businessTripProcessCode+"下一个cursor为"+oapiProcessinstanceListidsResponse.getResult().getNextCursor()+"保存成功"+"耗时"+ ChronoUnit.SECONDS.between(start,LocalDateTime.now())+"秒");
                 flag=null!=oapiProcessinstanceListidsResponse.getResult().getNextCursor();
                 if (flag){

+ 98 - 54
src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java

@@ -4,10 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.galaxis.capsule.dto.PageDTO;
 import com.galaxis.manatee.constant.ChuanYunConstant;
 import com.galaxis.manatee.dao.*;
@@ -16,19 +12,16 @@ import com.galaxis.manatee.entity.chuanyun.dto.*;
 import com.galaxis.manatee.exception.BigSizeException;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import com.galaxis.manatee.manager.ClawFeign;
-import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
-import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
-import com.mysql.cj.x.protobuf.MysqlxExpr;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.beans.BeanUtils;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.*;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -106,9 +99,11 @@ public class ChuanyunBasicDataScheduledTask {
      */
     @Scheduled(fixedDelay = 3600000L)
     private void getDataFromChuanyun() {
+
         //项目人力成本
-        saveLaborCost();
-//        saveAskForLeave();
+//        saveLaborCost();
+        //钉钉请假
+        saveAskForLeave();
         //专项费用分摊
         getSpecialProcedure();
         //获取人员-归属公司信息
@@ -119,14 +114,14 @@ public class ChuanyunBasicDataScheduledTask {
         getCostCollection();
         //获取集团项目数据
         getGroupProject();
+        //获取用户数据
+        getUserList();
         //支出档案类型
         getProjectType();
         //获取报销科目
         getReimbursementSubject();
         //获取成本中心
         getCost();
-        //获取用户数据
-        getUserList();
         //获取公司信息
         getCompany();
         //获取供应商
@@ -392,42 +387,37 @@ public class ChuanyunBasicDataScheduledTask {
      */
     private void saveAskForLeave() {
         var objectMapper = new ObjectMapper();
-        var page = 1;
-        var size = 20;
-        var flag = true;
-        while (flag) {
-            Map<String,String> map = new HashMap<>(1);
-            map.put("page",String.valueOf(page));
-            map.put("size",String.valueOf(size));
-            //获取请假的信息
-            List<ChuanyunAskForLeaveDo> askForLeaveList = chuanyunAskForLeaveDao.findAll();
-            askForLeaveList.forEach(askForLeave -> {
-                try {
-                    var purcostString = objectMapper.writeValueAsString(askForLeave);
-//                  chuanYunManager.save(ChuanyunAskForLeaveDo.SCHEMA_CODE, purcostString, true);
-                    ChuanyunSaveDTO chuanyunSaveDTO;
-                      //根据项目号判断是否存在
-                    List<String> macthers = new ArrayList<>();
-                    macthers.add("F0000001_2,"+askForLeave.getTitle());
-                    var filter= Filter.instance(0,1,true,"And",macthers);
-                    var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunAskForLeaveDo.SCHEMA_CODE,filter);
-                    if (chuanyunFindAllResponse.getReturnData() == null) {
-                        //新增
-                        chuanyunSaveDTO =chuanYunManager.save(ChuanyunAskForLeaveDo.SCHEMA_CODE,purcostString,true);
-                    }else {
-                        //更新
-                        chuanyunSaveDTO = chuanYunManager.update(ChuanyunAskForLeaveDo.SCHEMA_CODE,askForLeave.getObjectId(),purcostString);
-                    }
-                    if(chuanyunSaveDTO.getSuccessful()){
+        //获取请假的信息
+        List<ChuanyunAskForLeaveDO> askForLeaveList = chuanyunAskForLeaveDao.findAll();
+        askForLeaveList.forEach(askForLeave -> {
+            try {
+                //根据钉钉号获取氚云用户Id
+                ChuanyunUserDO chuanyunUserDO=chuanyunUserDao.findByDingTalkAccountContaining(askForLeave.getOriginatorUserid());
+                askForLeave.setAskForLeaveUserId(chuanyunUserDO.getObjectId());
+                //根据dingTalkUserId获取chuanyunUser
+                var purcostString = objectMapper.writeValueAsString(AskForLeaveDTO.fromChuanyunAskForLeaveDO(askForLeave));
+                ChuanyunSaveDTO chuanyunSaveDTO;
+                //根据项目号判断是否存在
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000001_2,"+askForLeave.getTitle());
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                ChuanyunFindAllBizDTO<LinkedHashMap<String,String>> chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunAskForLeaveDO.SCHEMA_CODE,filter);
+                if (chuanyunFindAllResponse.getReturnData() == null) {
+                    //新增
+                    chuanyunSaveDTO =chuanYunManager.save(ChuanyunAskForLeaveDO.SCHEMA_CODE,purcostString,true);
+                }else {
+                    //更新
+                    chuanyunSaveDTO = chuanYunManager.update(ChuanyunAskForLeaveDO.SCHEMA_CODE,chuanyunFindAllResponse.getReturnData().getBizObjectArray().get(0).get("ObjectId"),purcostString);
+                }
+                if(chuanyunSaveDTO.getSuccessful()){
 //                        log.info("新增请假信息成功");
-                    }else{
-                        log.warn("新增请假信息失败");
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
+                }else{
+                    log.warn("新增请假信息失败");
                 }
-            });
-        }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
     }
 
     /**
@@ -508,11 +498,6 @@ public class ChuanyunBasicDataScheduledTask {
             list.forEach(chuanyunLaborCostDTO -> {
                 try {
                     if(chuanyunLaborCostDTO != null) {
-                        //日期格式化
-                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
-                        String newDate = dateTimeFormatter.format(chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().getPeriod());
-                        LocalDateTime dt = LocalDateTime.parse(newDate,dateTimeFormatter);
-                        chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().setPeriod(dt);
                         LaborCostDTO laborCostDTO = new LaborCostDTO(chuanyunLaborCostDTO);
                         laborCostDTO.setDataType("U9");
                         var purcostString=objectMapper.writeValueAsString(laborCostDTO);
@@ -1101,8 +1086,6 @@ public class ChuanyunBasicDataScheduledTask {
         private BigDecimal amount;
 
         @JsonProperty("F0000002")
-        @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
-        @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
         private LocalDateTime logDate;
 
         @JsonProperty("F0000004")
@@ -1208,4 +1191,65 @@ public class ChuanyunBasicDataScheduledTask {
             }
         }
     }
+
+    @Data
+    static class AskForLeaveDTO{
+
+        /**
+         * 标题
+         */
+        @JsonProperty("F0000001")
+        private String title;
+
+        /**
+         * 发起人姓名
+         */
+        @JsonProperty("F0000007")
+        private String originatorUserName;
+
+        /**
+         * 发起部门
+         */
+        @JsonProperty("F0000002")
+        private String originatorDeptName;
+
+        /**
+         * 请假事由
+         */
+        @JsonProperty("F0000005")
+        private String leaveType;
+
+        /**
+         * 劳动合同所属公司
+         */
+        @JsonProperty("F0000004")
+        private String contractOwnerLtd;
+
+        @JsonProperty("F0000006")
+        private String result;
+
+        /**
+         * 请假开始时间
+         */
+        @JsonProperty("F0000016")
+        private String startTime;
+
+        /**
+         * 请假时长
+         */
+        @JsonProperty("F0000017")
+        private BigDecimal totalDay;
+
+        /**
+         * 请假人Id
+         */
+        @JsonProperty("F0000018")
+        private String askForLeaveUserId;
+
+        public static AskForLeaveDTO fromChuanyunAskForLeaveDO(ChuanyunAskForLeaveDO chuanyunAskForLeaveDO) {
+            AskForLeaveDTO askForLeaveDTO=new AskForLeaveDTO();
+            BeanUtils.copyProperties(chuanyunAskForLeaveDO,askForLeaveDTO);
+            return askForLeaveDTO;
+        }
+    }
 }

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 10
src/main/java/com/galaxis/manatee/task/ChuanyunProjectScheduledTask.java