瀏覽代碼

1.新增项目业务变更

WoNiu 4 年之前
父節點
當前提交
6e8a0fbed0

+ 11 - 0
src/main/java/com/galaxis/manatee/constant/DingTalkConstant.java

@@ -47,6 +47,11 @@ public class DingTalkConstant {
     public static String PROCESS_CODE_ASKFORLEAVE;
 
     /**
+     * 项目实施变更
+     */
+    public static String PROCESS_CODE_PROJECT_CHANGE;
+
+    /**
      * 业务招待申请
      */
     public static String PROCESS_CODE_BUSINESSENTERTAINMENT;
@@ -81,6 +86,12 @@ public class DingTalkConstant {
         DingTalkConstant.PROCESS_CODE_BUSINESSENTERTAINMENT = businessEntertainment;
     }
 
+    @Value(value = "${dingTalk.processCode.projectChange}")
+    public void setProcessCodeProjectChange(String ProcessCodeProjectChange) {
+        DingTalkConstant.PROCESS_CODE_PROJECT_CHANGE = ProcessCodeProjectChange;
+    }
+
+
     @Value(value = "${dingTalk.AgentId}")
     public void setAgentId(Long agentId) {
         DingTalkConstant.DING_TALK_AGENTID = agentId;

+ 31 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunProjectChangeDao.java

@@ -0,0 +1,31 @@
+package com.galaxis.manatee.dao;
+
+import com.galaxis.capsule.util.GalaxisRepository;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectChangeDO;
+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 ChuanyunProjectChangeDao extends GalaxisRepository<ChuanyunProjectChangeDO,String> {
+    /**
+     * SQL 查询是否存在项目实施变更信息,避免重复提交
+     * @param title
+     * @return
+     */
+    @Query(value = "SELECT * FROM CHUANYUN_PROJECT_CHANGE WHERE title = ?1", nativeQuery = true)
+    List<ChuanyunProjectChangeDO> findByTitleSQL(String title);
+
+    /**
+     * SQL 查询项目实施变更信息
+     * @return
+     */
+    @Query(value = "SELECT t.* FROM CHUANYUN_PROJECT_CHANGE t GROUP BY t.title", nativeQuery = true )
+    List<ChuanyunProjectChangeDO> findAllAskForLeave();
+}

+ 260 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectChangeDO.java

@@ -0,0 +1,260 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.dingtalk.api.response.OapiProcessinstanceGetResponse;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+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.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: xuj
+ * Date: 2020/7/23
+ * @author xuj
+ */
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity(name = "CHUANYUN_PROJECT_CHANGE")
+@JsonIgnoreProperties(ignoreUnknown = true)
+
+public class ChuanyunProjectChangeDO extends BasicDO {
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D00178958e5a5f6ce9f4bf481d293ffa07d69ba";
+
+    /**
+     * 标题
+     */
+    @JsonProperty("F0000001")
+    private String title;
+
+    /**
+     * 抄送人
+     */
+    @JsonProperty("cc_userids")
+    private String ccUserids;
+
+    /**
+     * 操作
+     */
+    @JsonProperty("biz_action")
+    private String bizAction;
+
+    /**
+     * 创建时间
+     */
+    @JsonProperty("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 结束时间
+     */
+    @JsonProperty("finish_time")
+    private LocalDateTime finishTime;
+
+    @JsonProperty("main_process_instance_id")
+    private String mainProcessInstanceId;
+
+    @JsonProperty("is_cancel")
+    private int isCancel;
+
+    /**
+     * 发起人userId
+     */
+    @JsonProperty("originator_userid")
+    private String originatorUserid;
+
+    /**
+     * 发起人姓名
+     */
+    @JsonProperty("originator_User_Name")
+    private String originatorUserName;
+
+    /**
+     * 发起部门id
+     */
+    @JsonProperty("originator_dept_id")
+    private String originatorDeptId;
+
+    /**
+     * 发起部门名称
+     */
+    @JsonProperty("originator_Dept_Name")
+    private String originatorDeptName;
+
+    /**
+     * 审批结果: 同意 和 不同意
+     */
+    @JsonProperty("F0000015")
+    private String approvalResult;
+
+    /**
+     * 审批实例业务编号
+     */
+    @JsonProperty("F0000014")
+    private String businessId;
+
+    /**
+     * 变更类型
+     */
+    @JsonProperty("F0000002")
+    private String changeType;
+
+    /**
+     * 项目名称
+     */
+    @JsonProperty("F0000003")
+    private String projectName;
+
+    /**
+     * 变更事项
+     */
+    @JsonProperty("F0000004")
+    private String changes;
+
+    /**
+     * 项目合同内容是否变更
+     */
+    @JsonProperty("F0000005")
+    private String projectContractContentIsChange;
+
+    /**
+     * 采购合同内容是否变更
+     */
+    @JsonProperty("F0000006")
+    private String procurementContractContentIsChange;
+
+    /**
+     * 变更方案要求完成日期
+     */
+    @JsonProperty("F0000007")
+    private String completeTime;
+
+    /**
+     * 变更涉及部门
+     */
+    @JsonProperty("F0000008")
+    private String changeInvolveDeptName;
+
+    @JsonProperty("F0000013")
+    private String result;
+
+    /**
+     * 变更内容描述
+     */
+    @JsonProperty("F0000010")
+    private String changeContentDescribe;
+
+    /**
+     * 变更影响描述
+     */
+    @JsonProperty("F0000011")
+    private String changeInfluenceDescribe;
+
+    /**
+     * 备注
+     */
+    @JsonProperty("F0000012")
+    private String remarks;
+
+    /**
+     * 申请人Id
+     */
+    @JsonProperty("F0000016")
+    private String projectChangeUserId;
+
+    /**
+     * 根据ProcessInstanceTopVo获得chuanyunProjectChangeDO
+     * @param processInstanceTopVo   传输数据
+     * @return  保存数据
+     */
+    public static ChuanyunProjectChangeDO fromProjectChangeDTO(OapiProcessinstanceGetResponse.ProcessInstanceTopVo processInstanceTopVo){
+        ChuanyunProjectChangeDO chuanyunProjectChangeDO = new ChuanyunProjectChangeDO();
+        chuanyunProjectChangeDO.setIsCancel(0);
+        if(processInstanceTopVo.getOperationRecords()!= null) {
+            if(processInstanceTopVo.getOperationRecords().get(0).getUserid().equals(processInstanceTopVo.getOperationRecords().get(processInstanceTopVo.getOperationRecords().size() -1).getUserid())
+                    && processInstanceTopVo.getOperationRecords().get(0).getUserid().equals(processInstanceTopVo.getOriginatorUserid())  ) {
+                if(processInstanceTopVo.getOperationRecords().get(0).getOperationType().equals("START_PROCESS_INSTANCE")
+                        && processInstanceTopVo.getOperationRecords().get(processInstanceTopVo.getOperationRecords().size() -1).getOperationType().equals("TERMINATE_PROCESS_INSTANCE")) {
+                    chuanyunProjectChangeDO.setIsCancel(1);
+                }
+            }
+        }
+        BeanUtils.copyProperties(processInstanceTopVo, chuanyunProjectChangeDO);
+        List<OapiProcessinstanceGetResponse.FormComponentValueVo> formComponentList = processInstanceTopVo.getFormComponentValues();
+        if(formComponentList != null && formComponentList.size() > 0) {
+            for (OapiProcessinstanceGetResponse.FormComponentValueVo formComponentValueVo : formComponentList) {
+                if ("变更类型".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setChangeType(formComponentValueVo.getValue());
+                }
+                if ("项目名称".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setProjectName(formComponentValueVo.getValue());
+                }
+                if ("涉及变更项".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setChanges(formComponentValueVo.getValue());
+                }
+                if ("销售合同内容是否变更".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setProjectContractContentIsChange(formComponentValueVo.getValue());
+                }
+                if ("采购合同内容是否变更".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setProcurementContractContentIsChange(formComponentValueVo.getValue());
+                }
+                if ("变更方案要求完成日期".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setCompleteTime(formComponentValueVo.getValue());
+                }
+                if ("变更涉及部门".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setChangeInvolveDeptName(formComponentValueVo.getValue());
+                }
+                if ("变更内容描述".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setChangeContentDescribe(formComponentValueVo.getValue());
+                }
+                if ("变更影响描述".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setChangeInfluenceDescribe(formComponentValueVo.getValue());
+                }
+                if ("备注".equals(formComponentValueVo.getName())) {
+                    chuanyunProjectChangeDO.setRemarks(formComponentValueVo.getValue());
+                }
+            }
+        }
+        String statusA = processInstanceTopVo.getStatus();
+        if ("COMPLETED".equals(processInstanceTopVo.getStatus())){
+            chuanyunProjectChangeDO.setStatus(1);
+            chuanyunProjectChangeDO.setApprovalResult("流程已结束");
+        }else if("RUNNING".equals(statusA)){
+            chuanyunProjectChangeDO.setStatus(2);
+            chuanyunProjectChangeDO.setApprovalResult("流程进行中");
+        }else if ("TERMINATED".equals(statusA)){
+            chuanyunProjectChangeDO.setStatus(3);
+            chuanyunProjectChangeDO.setApprovalResult("流程已作废");
+        }
+        Date cratedate = new Date();
+        LocalDateTime crateDateTime = LocalDateTime.now();
+        cratedate = processInstanceTopVo.getCreateTime();
+        crateDateTime = cratedate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        chuanyunProjectChangeDO.setCreateTime(crateDateTime);
+        Date finishdate = new Date();
+        LocalDateTime finishDateTime = LocalDateTime.now();
+        finishdate = processInstanceTopVo.getFinishTime();
+        if(finishdate != null) {
+            finishDateTime = finishdate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            chuanyunProjectChangeDO.setFinishTime(finishDateTime);
+        }
+        chuanyunProjectChangeDO.setTitle(chuanyunProjectChangeDO.getCreateTime().toLocalDate() + " " + chuanyunProjectChangeDO.getTitle() + " " + chuanyunProjectChangeDO.getBusinessId());
+        chuanyunProjectChangeDO.setObjectId(UUID.randomUUID().toString());
+        return chuanyunProjectChangeDO;
+    }
+}

+ 67 - 1
src/main/java/com/galaxis/manatee/service/DingTalkScheduledTask.java

@@ -7,9 +7,11 @@ import com.dingtalk.api.response.OapiProcessinstanceListidsResponse;
 import com.galaxis.manatee.constant.DingTalkConstant;
 import com.galaxis.manatee.dao.ChuanyunAskForLeaveDao;
 import com.galaxis.manatee.dao.ChuanyunBusinessEntertainmentDao;
+import com.galaxis.manatee.dao.ChuanyunProjectChangeDao;
 import com.galaxis.manatee.dao.DingTalkProcessInstanceDao;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunBusinessEntertainmentDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectChangeDO;
 import com.galaxis.manatee.entity.ding.DingTalkProcessInstance;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
@@ -52,14 +54,16 @@ public class DingTalkScheduledTask {
     private final ChuanyunAskForLeaveDao chuanyunAskForLeaveDao;
 
     private final ChuanyunBusinessEntertainmentDao chuanyunBusinessEntertainmentDao;
+    private final ChuanyunProjectChangeDao chuanyunProjectChangeDao;
 
     public DingTalkScheduledTask(DingTalkClient processInstanceListIdsClient, DingTalkClient processInstanceClient,
-                                 ChuanyunAskForLeaveDao chuanyunAskForLeaveDao, DingTalkProcessInstanceDao dingTalkProcessInstanceDao, ChuanyunBusinessEntertainmentDao chuanyunBusinessEntertainmentDao) {
+                                 ChuanyunAskForLeaveDao chuanyunAskForLeaveDao, DingTalkProcessInstanceDao dingTalkProcessInstanceDao, ChuanyunBusinessEntertainmentDao chuanyunBusinessEntertainmentDao, ChuanyunProjectChangeDao chuanyunProjectChangeDao) {
         this.processInstanceListIdsClient = processInstanceListIdsClient;
         this.processInstanceClient = processInstanceClient;
         this.dingTalkProcessInstanceDao = dingTalkProcessInstanceDao;
         this.chuanyunAskForLeaveDao = chuanyunAskForLeaveDao;
         this.chuanyunBusinessEntertainmentDao = chuanyunBusinessEntertainmentDao;
+        this.chuanyunProjectChangeDao = chuanyunProjectChangeDao;
     }
 
     /**
@@ -91,6 +95,14 @@ public class DingTalkScheduledTask {
         updateChuanyunBusinessEntertainment(DingTalkConstant.PROCESS_CODE_BUSINESSENTERTAINMENT);
     }
 
+    /**
+     * 每个小时定期更新项目实施变更申请数据
+     */
+    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+    void updateProjectChangeProcessInstanceIdList() throws ApiException {
+        updateChuanyunProjectChangeProcessInstanceIdList(DingTalkConstant.PROCESS_CODE_PROJECT_CHANGE);
+    }
+
 
     private void updateChuanyunBusinessEntertainment(String businessTripProcessCode) throws ApiException {
         var flag=true;
@@ -250,4 +262,58 @@ public class DingTalkScheduledTask {
             }
         }
     }
+
+    private void updateChuanyunProjectChangeProcessInstanceIdList(String businessTripProcessCode) throws ApiException {
+        var flag=true;
+        //单个请求
+        var oApiProcessInstanceListIdsRequest=new OapiProcessinstanceListidsRequest();
+        oApiProcessInstanceListIdsRequest.setProcessCode(businessTripProcessCode);
+        oApiProcessInstanceListIdsRequest.setStartTime(LocalDateTime.now().minusDays(90).toInstant(ZoneOffset.UTC).toEpochMilli());
+        oApiProcessInstanceListIdsRequest.setEndTime(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli());
+        oApiProcessInstanceListIdsRequest.setCursor(0L);
+        oApiProcessInstanceListIdsRequest.setSize(20L);
+        while(flag){
+            LocalDateTime start=LocalDateTime.now();
+            OapiProcessinstanceListidsResponse oapiProcessinstanceListidsResponse=processInstanceListIdsClient.execute(oApiProcessInstanceListIdsRequest,DingTalkConstant.DING_TALK_TOKEN);
+            List<ChuanyunProjectChangeDO> chuanyunProjectChangeDOList=new ArrayList<>();
+            if(oapiProcessinstanceListidsResponse.getErrcode()!=0){
+                log.info(oapiProcessinstanceListidsResponse.getErrmsg());
+                try {
+                    Thread.sleep(5000);
+                } catch (InterruptedException e) {
+                    log.error(e.getMessage());
+                }
+                continue;
+            }
+            //逐个请求
+            oapiProcessinstanceListidsResponse.getResult().getList().forEach(resultId->{
+                Optional<DingTalkProcessInstance> instance=dingTalkProcessInstanceDao.findById(resultId);
+                if(instance.isEmpty()){
+                    //&&instance.get()==null
+                    //淘宝SDK方法
+                    OapiProcessinstanceGetRequest request=new OapiProcessinstanceGetRequest();
+                    request.setProcessInstanceId(resultId);
+                    try {
+                        OapiProcessinstanceGetResponse oapiProcessinstanceGetResponse = processInstanceClient.execute(request, DingTalkConstant.DING_TALK_TOKEN);
+                        ChuanyunProjectChangeDO chuanyunProjectChangeDO = ChuanyunProjectChangeDO.fromProjectChangeDTO(oapiProcessinstanceGetResponse.getProcessInstance());
+                        List<ChuanyunProjectChangeDO>   existsProjectChange = chuanyunProjectChangeDao.findByTitleSQL(chuanyunProjectChangeDO.getTitle());
+                        if(existsProjectChange != null && !existsProjectChange.isEmpty()) {
+                            chuanyunProjectChangeDao.deleteById(existsProjectChange.get(0).getObjectId());
+                        }
+                        chuanyunProjectChangeDOList.add(chuanyunProjectChangeDO);
+                    } catch (ApiException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+
+            //保存id列表和实例列表
+            chuanyunProjectChangeDao.saveAll(chuanyunProjectChangeDOList);
+            log.info(businessTripProcessCode+"下一个cursor为"+oapiProcessinstanceListidsResponse.getResult().getNextCursor()+"保存成功"+"耗时"+ ChronoUnit.SECONDS.between(start,LocalDateTime.now())+"秒");
+            flag=null!=oapiProcessinstanceListidsResponse.getResult().getNextCursor();
+            if (flag){
+                oApiProcessInstanceListIdsRequest.setCursor(oapiProcessinstanceListidsResponse.getResult().getNextCursor());
+            }
+        }
+    }
 }

+ 2 - 0
src/main/resources/application.yml

@@ -31,6 +31,8 @@ dingTalk:
     askForLeave: PROC-EF6Y0XWVO2-GBP690HMRWVELM4WJ0WT1-DEP53YII-PR1
     #业务招待申请
     businessEntertainment: PROC-08523C7E-2093-4241-A25D-82F7CBBBD34B
+    #项目实施变更
+    projectChange: PROC-FF6YHERSO2-94WBIS9JPMM63IJAGA5T1-AWUCG3QI-15
 
 #阿里云
 aliyun: