浏览代码

添加OA审批撤销回调功能,mjava新添撤销流程接口

fyz 3 月之前
父节点
当前提交
c40c5458bc

+ 63 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/delegate/DDDelegate.java

@@ -0,0 +1,63 @@
+package com.malk.lanyun.delegate;
+
+import com.malk.delegate.DDEvent;
+import com.malk.lanyun.service.TimerService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+/**
+ * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+@Primary
+public class DDDelegate implements DDEvent {
+
+    @Autowired
+    TimerService timerService;
+    // 审批任务回调执行业务逻辑
+    @Async
+    @Override
+    public void executeEvent_Task_Finish(String processInstanceId, String processCode, boolean isAgree, String remark) {
+        log.info("executeEvent_Task_Finish");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Start");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Redirect(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Redirect");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Instance_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Instance_Start");
+    }
+
+
+    // 审批实例回调执行业务逻辑
+    @Async
+    @Override
+    public void executeEvent_Instance_Finish(String processInstanceId, String processCode, boolean isAgree, boolean isTerminate, String staffId) {
+        log.info("executeEvent_Instance_Finish");
+        String approveResult = isAgree ? "agree" : "refuse";
+        if (isTerminate) approveResult = "terminated";
+        if  (isTerminate){
+            log.info("开始执行撤销回调");
+            timerService.terminateDataById(processInstanceId);
+        }
+        log.info("审批实例回调执行业务逻辑, {}", approveResult);
+    }
+}

+ 7 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/TimerService.java

@@ -116,4 +116,11 @@ public interface TimerService {
     void getProject(String formInstId, String projectCode, String monthAmount);
     void getProject(String formInstId, String projectCode, String monthAmount);
 
 
     void updateOutputPredict();
     void updateOutputPredict();
+
+
+    /**
+     * OA撤销流程回调终止宜搭流程实例
+     * @param processInstanceId
+     */
+    void terminateDataById(String processInstanceId);
 }
 }

+ 7 - 6
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/NCServiceImpl.java

@@ -634,7 +634,8 @@ public class NCServiceImpl implements NCService {
                     "\t\tLEFT JOIN bd_accasoa ON gl_detail.pk_accasoa = bd_accasoa.pk_accasoa\n" +
                     "\t\tLEFT JOIN bd_accasoa ON gl_detail.pk_accasoa = bd_accasoa.pk_accasoa\n" +
                     "\t\tLEFT JOIN bd_account ON bd_accasoa.pk_account = bd_account.pk_account \n" +
                     "\t\tLEFT JOIN bd_account ON bd_accasoa.pk_account = bd_account.pk_account \n" +
                     "\tWHERE\n" +
                     "\tWHERE\n" +
-                    "\t\tsubstring( bd_account.CODE, 0, 5 ) IN ( '6602', '6601' ) \n" +
+                    "\t\t substring( bd_account.CODE, 0, 5 ) IN ( '6602', '6601' ) \n" +
+                    "\t\tAND bd_account.CODE != '660248' \n" +
                     "\t\tAND gl_detail.yearv = '"+year+"' \n" +
                     "\t\tAND gl_detail.yearv = '"+year+"' \n" +
                     "\t\tAND gl_detail.adjustperiod = '"+month+"' \n" +
                     "\t\tAND gl_detail.adjustperiod = '"+month+"' \n" +
                     "\t\tAND org_accountingbook.CODE IN ( 'A01-0004', 'A02-0004', 'A11-0004', 'A03-0004', 'A06-0004', 'A04-0004', 'A05-0004', 'A10-0004' ) \n" +
                     "\t\tAND org_accountingbook.CODE IN ( 'A01-0004', 'A02-0004', 'A11-0004', 'A03-0004', 'A06-0004', 'A04-0004', 'A05-0004', 'A10-0004' ) \n" +
@@ -779,12 +780,12 @@ public class NCServiceImpl implements NCService {
 
 
             String delete = "DELETE \n" +
             String delete = "DELETE \n" +
                     "FROM\n" +
                     "FROM\n" +
-                    "\t`lanyun_project_analysis` \n" +
+                    " `lanyun_project_analysis_copy1` \n" +
                     "WHERE\n" +
                     "WHERE\n" +
-                    "\tmonthString = '"+ yearAndMonth +"' \n" +
-                    "\t";
+                    " monthString = '"+ yearAndMonth +"'";
 
 
-            ps[0].executeQuery(delete);
+            PreparedStatement preparedStatement = mysqlCon.prepareStatement(delete);
+            preparedStatement.execute();
 
 
             String insert = "INSERT INTO `dingtalk`.`lanyun_project_analysis_copy1`(`project_name`, `belong_project`, `month`, `status`, `predict_income`, " +
             String insert = "INSERT INTO `dingtalk`.`lanyun_project_analysis_copy1`(`project_name`, `belong_project`, `month`, `status`, `predict_income`, " +
                     "`open`, `income`, `person`, `person_cost`, `material`, `other_cost`, `cost_sum`, `taxes`, `gross_profit`, `gross_margin`, `overhead`, " +
                     "`open`, `income`, `person`, `person_cost`, `material`, `other_cost`, `cost_sum`, `taxes`, `gross_profit`, `gross_margin`, `overhead`, " +
@@ -984,7 +985,7 @@ public class NCServiceImpl implements NCService {
         String sql = "SELECT\n" +
         String sql = "SELECT\n" +
                 "\t* \n" +
                 "\t* \n" +
                 "FROM\n" +
                 "FROM\n" +
-                "\t`lanyun_project_analysis` \n" +
+                "\t`lanyun_project_analysis_copy1` \n" +
                 "WHERE\n" +
                 "WHERE\n" +
                 "\tmonthString >= '"+ yearAndMonth +"' \n" +
                 "\tmonthString >= '"+ yearAndMonth +"' \n" +
                 "\tAND is_cogradient = '否' \n" +
                 "\tAND is_cogradient = '否' \n" +

+ 55 - 55
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/SyncAssetsImpl.java

@@ -41,63 +41,63 @@ public class SyncAssetsImpl implements SyncAssetsService {
     public void SynAssetsItem() {
     public void SynAssetsItem() {
 
 
         YDParam ydParam = new YDParam();
         YDParam ydParam = new YDParam();
-//        ydParam = YDParam.builder()
-//                .appType("APP_ERBDTFS82HOVBPL3NFH0")
-//                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
-//                .formUuid("FORM-F3695066AABE41F6AF241489F8558ACA78OI")  //资产档案
+        ydParam = YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-F3695066AABE41F6AF241489F8558ACA78OI")  //资产档案
 //                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lu2eb47g","否")))
 //                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lu2eb47g","否")))
-//                .build();
-//        //pagesize设为1获取总数
-//        ydParam.setPageSize(1);
-//        long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
-//        float pageSize = 50;
-//        ydParam.setCurrentPage(1);
-//        ydParam.setPageSize((int) pageSize);
+                .build();
+        //pagesize设为1获取总数
+        ydParam.setPageSize(1);
+        long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
+        float pageSize = 50;
+        ydParam.setCurrentPage(1);
+        ydParam.setPageSize((int) pageSize);
         List<Map> dataList = new ArrayList<>();
         List<Map> dataList = new ArrayList<>();
-//        for (int page = 1; page <= Math.ceil(totalCount / pageSize); page++) {
-//            ydParam.setCurrentPage(page);
-//            //  1次获取50条
-//            dataList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
-//            dataList.forEach(dataItem -> {
-//                Map formMap = (Map) dataItem.get("formData");
-//                //资产状态
-//                String status = formMap.get("selectField_lty0oyvd").toString();
-//                if (!"报废".equals(status)){
-//                    //净值
-//                    float metValue = UtilMap.getFloat((Map) formMap,"numberField_lu2ejqd4");
-//                    //月折旧额
-//                    float depreciation = UtilMap.getFloat((Map) formMap,"numberField_lu2eb47d");
-//                    //已计提期数
-//                    int count = UtilMap.getInt((Map) formMap,"numberField_lutjo2dt");
-//                    long toMonth = DateUtil.beginOfMonth(new Date()).getTime();
-//                    //购入日期
-//                    long buyTime = Long.parseLong(formMap.get("dateField_lty0oyv9").toString());
-//                    if (metValue > 0 && depreciation > 0 && buyTime < toMonth){
-//                        log.info("metValue:"+metValue);
-//                        log.info("depreciation:"+depreciation);
-//                        float updateDepreciation = (metValue - depreciation) >0 ? (metValue - depreciation) : 0;
-//                        if (ObjectUtil.isNotEmpty(formMap.get("dateField_lty0oyva"))){
-//                            //折旧截止日
-//                            long endTime = Long.parseLong(formMap.get("dateField_lty0oyva").toString());
-//                            String endDate = DateUtil.date(endTime).toString("yyyy-MM");
-//                            long parseTime = DateUtil.beginOfMonth(DateUtil.parse(endDate, "yyyy-MM")).getTime();
-//                            if (toMonth <= parseTime){
-//                                count = count + 1;
-//                            }
-//                        }
-//                        DateBetween dateBetween = new DateBetween(DateUtil.date(buyTime),DateUtil.date(toMonth));
-//                        long months = dateBetween.betweenMonth(true) + 1;
-//                        // 更新
-//                        ydClient.operateData(YDParam.builder()
-//                                .appType("APP_ERBDTFS82HOVBPL3NFH0")
-//                                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
-//                                .formInstanceId((String) dataItem.get("formInstanceId"))
-//                                .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_lu2ejqd4, numberField_lutjo2dt, numberField_m207nu7h",updateDepreciation,count,months)))
-//                                .build(), YDConf.FORM_OPERATION.update);
-//                    }
-//                }
-//            });
-//        }
+        for (int page = 1; page <= Math.ceil(totalCount / pageSize); page++) {
+            ydParam.setCurrentPage(page);
+            //  1次获取50条
+            dataList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
+            dataList.forEach(dataItem -> {
+                Map formMap = (Map) dataItem.get("formData");
+                //资产状态
+                String status = formMap.get("selectField_lty0oyvd").toString();
+                if (!"报废".equals(status)){
+                    //净值
+                    float metValue = UtilMap.getFloat((Map) formMap,"numberField_lu2ejqd4");
+                    //月折旧额
+                    float depreciation = UtilMap.getFloat((Map) formMap,"numberField_lu2eb47d");
+                    //已计提期数
+                    int count = UtilMap.getInt((Map) formMap,"numberField_lutjo2dt");
+                    long toMonth = DateUtil.beginOfMonth(new Date()).getTime();
+                    //购入日期
+                    long buyTime = Long.parseLong(formMap.get("dateField_lty0oyv9").toString());
+                    if (metValue > 0 && depreciation > 0 && buyTime < toMonth){
+                        log.info("metValue:"+metValue);
+                        log.info("depreciation:"+depreciation);
+                        float updateDepreciation = (metValue - depreciation) >0 ? (metValue - depreciation) : 0;
+                        if (ObjectUtil.isNotEmpty(formMap.get("dateField_lty0oyva"))){
+                            //折旧截止日
+                            long endTime = Long.parseLong(formMap.get("dateField_lty0oyva").toString());
+                            String endDate = DateUtil.date(endTime).toString("yyyy-MM");
+                            long parseTime = DateUtil.beginOfMonth(DateUtil.parse(endDate, "yyyy-MM")).getTime();
+                            if (toMonth <= parseTime){
+                                count = count + 1;
+                            }
+                        }
+                        DateBetween dateBetween = new DateBetween(DateUtil.date(buyTime),DateUtil.date(toMonth));
+                        long months = dateBetween.betweenMonth(true) + 1;
+                        // 更新
+                        ydClient.operateData(YDParam.builder()
+                                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                                .formInstanceId((String) dataItem.get("formInstanceId"))
+                                .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_lu2ejqd4, numberField_lutjo2dt, numberField_m207nu7h",updateDepreciation,count,months)))
+                                .build(), YDConf.FORM_OPERATION.update);
+                    }
+                }
+            });
+        }
         ydParam = YDParam.builder()
         ydParam = YDParam.builder()
                 .appType("APP_ERBDTFS82HOVBPL3NFH0")
                 .appType("APP_ERBDTFS82HOVBPL3NFH0")
                 .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
                 .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")

+ 29 - 5
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/TimerServiceImpl.java

@@ -1094,11 +1094,11 @@ public class TimerServiceImpl implements TimerService {
         //本周已出库项目
         //本周已出库项目
 //        long beginWeek = DateUtil.beginOfWeek(DateUtil.date()).getTime();
 //        long beginWeek = DateUtil.beginOfWeek(DateUtil.date()).getTime();
 //        long endWeek = DateUtil.endOfWeek(DateUtil.date()).getTime();
 //        long endWeek = DateUtil.endOfWeek(DateUtil.date()).getTime();
-        String startDate = data.get("startDate").toString();
-        String endDate = data.get("endDate").toString();
-        String[] dateList = new String[2];
-        dateList[0] = String.valueOf(startDate);
-        dateList[1] = String.valueOf(endDate);
+        String[] dateList = {
+                String.valueOf(data.get("startDate")),
+                String.valueOf(data.get("endDate"))
+        };
+
         List<Map> alredyList = ydService.queryFormData_all(YDParam.builder()
         List<Map> alredyList = ydService.queryFormData_all(YDParam.builder()
                 .appType("APP_ERBDTFS82HOVBPL3NFH0")
                 .appType("APP_ERBDTFS82HOVBPL3NFH0")
                 .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
                 .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
@@ -1494,4 +1494,28 @@ public class TimerServiceImpl implements TimerService {
         });
         });
 
 
     }
     }
+
+    @Override
+    public void terminateDataById(String processInstanceId) {
+        String[] forms = {"FORM-777EB143B87D45F2ACB228A024290E1A9GSF","FORM-FB29F35DF0A04DC2A5F2860E9593C9C6XCMT","FORM-B33388047A42479BB6387F9E0B453588EZ4P","FORM-210DA087671044F8A5CD72F0E9E89060SZ8Q"};
+        for (int i = 0; i < forms.length; i++) {
+            List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                    .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                    .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                    .formUuid(forms[i])
+                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lyh4y3th", processInstanceId)))
+                    .build());
+            if (dataList.size()>0){
+                dataList.forEach(e->{
+                    log.info("记录数:{}",UtilMap.getString(e, "formInstanceId"));
+                    ydClient.operateData(YDParam.builder()
+                            .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                            .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                            .processInstanceId(UtilMap.getString(e, "formInstanceId"))
+                            .build(), YDConf.FORM_OPERATION.terminate);
+                });
+                break;
+            }
+        }
+    }
 }
 }

+ 2 - 1
mjava/src/main/java/com/malk/server/aliwork/YDConf.java

@@ -80,12 +80,13 @@ public class YDConf {
         multi_update,               // 批量更新
         multi_update,               // 批量更新
         start,                      // 发起流程
         start,                      // 发起流程
         batchSave,                  // 批量创建
         batchSave,                  // 批量创建
+        terminate,                  // 终止流程
     }
     }
 
 
     /**
     /**
      * 关联表单处理
      * 关联表单处理
      *
      *
-     * @param formType: "receipt" 跳转为表单【若是流程,则权限体系会失效,但也会显示审批节点】; formType: "process" 为流程
+     * @param : "receipt" 跳转为表单【若是流程,则权限体系会失效,但也会显示审批节点】; formType: "process" 为流程
      * @apiNote ppExt 接口更新, 传入jsonString或List都可以. 返回数据都是两层json解析, 组件 + _id格式
      * @apiNote ppExt 接口更新, 传入jsonString或List都可以. 返回数据都是两层json解析, 组件 + _id格式
      */
      */
     public List<Map> associationForm(String formUuid, String formInstanceId, String title, String subTitle, boolean isProcess) {
     public List<Map> associationForm(String formUuid, String formInstanceId, String title, String subTitle, boolean isProcess) {

+ 3 - 0
mjava/src/main/java/com/malk/service/aliwork/impl/YDClientImpl.java

@@ -87,6 +87,9 @@ public class YDClientImpl implements YDClient {
             case batchSave:
             case batchSave:
                 ddr_new = (DDR_New) UtilHttp.doPost(getRequestUrl("/forms/instances/batchSave"), ddClient.initTokenHeader(), null, _initBodyParam(ydParam), DDR_New.class);
                 ddr_new = (DDR_New) UtilHttp.doPost(getRequestUrl("/forms/instances/batchSave"), ddClient.initTokenHeader(), null, _initBodyParam(ydParam), DDR_New.class);
                 break;
                 break;
+            case terminate:
+                ddr_new = (DDR_New) UtilHttp.doPut(getRequestUrl("/processes/instances/terminate"), ddClient.initTokenHeader(), bodys, DDR_New.class);
+                break;
             default:
             default:
                 break;
                 break;
         }
         }