diff --git a/src/main/java/com/budwk/app/todo/service/TodoService.java b/src/main/java/com/budwk/app/todo/service/TodoService.java new file mode 100644 index 00000000..c9997450 --- /dev/null +++ b/src/main/java/com/budwk/app/todo/service/TodoService.java @@ -0,0 +1,66 @@ +package com.budwk.app.todo.service; + +import com.budwk.app.flow.entity.ProcessTask; + +/** + * @ClassName TodoService + * @Author JyuHsin + * @Date 2026/3/12 14:12 + * @Version 1.0 + * @Description TODO + */ +public interface TodoService { + + /** + * 调用本接口,发起一个待办任务 + * 若是首个任务,则会同时创建一条事务 + * 若非首个任务,则需关联上一条待办任务 + * + * @param task + */ + void addTransaction(ProcessTask task); + + /** + * 调用本接口,对当前节点的任务进行办理,当前任务进入已办 + * + * @param task + */ + void taskHandle(ProcessTask task); + + /** + * 调用本接口,发起任务转办,转办给转办人(可以多个),被转办人可以在我的代办列表查看任务 + * + * @param task + */ + void taskComplaint(ProcessTask task); + + /** + * 调用本接口,对当前节点的任务进行撤回,并创建出新的任务节点 + * 建议不调用本接口,因为会创建新的任务节点 + * 如果撤回,可调用taskTerminate,这个接口只操作本任务 + * @param task + */ + void taskWithdraw(ProcessTask task); + + /** + * 调用本接口,发起任务终止,结束该任务 + * + * @param task + */ + void taskTerminate(ProcessTask task); + + /** + * 调用本接口,对删除任务的事务进行恢复 + * + * @param task + */ + void transRecover(ProcessTask task); + + /** + * 调用本接口,对当前任务的事务进行删除 + * + * @param task + */ + void transDeleted(ProcessTask task); + +} diff --git a/src/main/java/com/budwk/app/todo/service/impl/TodoServiceImpl.java b/src/main/java/com/budwk/app/todo/service/impl/TodoServiceImpl.java new file mode 100644 index 00000000..b5b3a38a --- /dev/null +++ b/src/main/java/com/budwk/app/todo/service/impl/TodoServiceImpl.java @@ -0,0 +1,279 @@ +package com.budwk.app.todo.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.sms.impl.ncu.util.SmsTokenUtil; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessDefine; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; +import com.budwk.app.flow.enums.ProcessInstanceStateEnum; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.todo.service.TodoService; +import com.budwk.app.todo.util.TodoPlatformTokenUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.web.commons.base.Globals; +import lombok.extern.slf4j.Slf4j; +import org.apache.batik.dom.svg12.Global; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @ClassName TodoServiceImpl + * @Author JyuHsin + * @Date 2026/3/12 14:12 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +public class TodoServiceImpl implements TodoService { + + @Inject + private Dao dao; + @Inject + private RedisService redisService; + @Inject + private FlowEngine flowEngine; + @Inject + private TodoPlatformTokenUtil tokenUtil; + + @Override + public void addTransaction(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/addTransaction"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + ProcessDefine define = dao.fetch(ProcessDefine.class, instance.getProcessDefineId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + List taskActorList = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + String handlers = taskActorList.stream().map(ProcessTaskActor::getActorAccount).collect(Collectors.joining(",")); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("nodeId", task.getId()); + params.put("nodeName", task.getTaskName()); + params.put("taskId", task.getId()); + params.put("taskName", task.getDisplayName()); + params.put("transTypeCode", define.getName()); + params.put("transTypeName", define.getDisplayName()); + params.put("handlers", handlers); + if(!ObjectUtil.equals(0, task.getTaskParentId())) { + params.put("previousTaskId", task.getTaskParentId()); + } + params.put("canDelegate", 0); + params.put("autoCreateTransType", true); + params.put("initiator", sysUser.getLoginname()); + params.put("initiatorName", sysUser.getUsername()); + params.put("serialNumber", task.getId()); + params.put("handleUrl", Globals.AppDomain + task.getFormKey()); + params.put("mHandleUrl", Globals.AppDomain + task.getH5FormKey()); + + log.info("【log】调用创建待办任务接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用创建待办任务接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用创建待办任务接口成功"); + } else { + log.info("【log】调用创建待办任务接口失败:{}", resultJsonBody.getStr("message")); + } + } + + @Override + public void taskHandle(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/taskHandle"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("handler", SecurityUtil.getUserLoginname()); + params.put("previousTaskId", task.getId()); + params.put("status", instance.getState().equals(ProcessInstanceStateEnum.FINISHED.getCode()) ? "end" : "none"); + + log.info("【log】调用办理待办任务接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用办理待办任务接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用办理待办任务接口成功"); + } else { + log.info("【log】调用办理待办任务接口失败:{}", resultJsonBody.getStr("message")); + } + } + + @Override + public void taskComplaint(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/taskComplaint"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + List taskActorList = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + String handlers = taskActorList.stream().map(ProcessTaskActor::getActorAccount).collect(Collectors.joining(",")); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("createTime", ""); + params.put("creater", sysUser.getLoginname()); + params.put("creator", sysUser.getLoginname()); + params.put("handlers", handlers); + params.put("handlingGroup", ""); + params.put("operator", sysUser.getLoginname()); + params.put("taskId", task.getId()); + + log.info("【log】调用转办待办任务接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用转办待办任务接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用转办待办任务接口成功"); + } else { + log.info("【log】调用转办待办任务接口失败:{}", resultJsonBody.getStr("message")); + } + } + + @Override + public void taskWithdraw(ProcessTask task) { + /*String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/taskWithdraw"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("taskId", task.getId()); + params.put("creater", sysUser.getLoginname()); + params.put("creator", sysUser.getLoginname()); + params.put("status", "end"); + + log.info("【log】调用撤回待办任务接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用撤回待办任务接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用撤回待办任务接口成功"); + } else { + log.info("【log】调用撤回待办任务接口失败:{}", resultJsonBody.getStr("message")); + }*/ + } + + @Override + public void taskTerminate(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/taskTerminate"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("creater", sysUser.getLoginname()); + params.put("creator", sysUser.getLoginname()); + params.put("handlers", ""); + params.put("operator", SecurityUtil.getUserLoginname()); + params.put("taskId", task.getId()); + + log.info("【log】调用终止待办任务接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用终止待办任务接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用终止待办任务接口成功"); + } else { + log.info("【log】调用终止待办任务接口失败:{}", resultJsonBody.getStr("message")); + } + } + + @Override + public void transRecover(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/transRecover"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("creater", sysUser.getLoginname()); + params.put("taskId", task.getId()); + + log.info("【log】调用事务恢复接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用事务恢复接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用事务恢复接口成功"); + } else { + log.info("【log】调用事务恢复接口失败:{}", resultJsonBody.getStr("message")); + } + } + + @Override + public void transDeleted(ProcessTask task) { + String url = "https://poa.ncu.edu.cn/apis/ttc/v1/transaction/poa/transDeleted"; + String token = tokenUtil.getToken(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + Sys_user sysUser = dao.fetch(Sys_user.class, instance.getOperator()); + + Map params = new HashMap<>(); + params.put("appId", "72e34a101d3011f1a74cbae5193504f4"); + params.put("creater", sysUser.getLoginname()); + params.put("creator", sysUser.getLoginname()); + params.put("taskId", task.getId()); + + log.info("【log】调用事务删除接口,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(url) + .header("Authorization", token) + .header("Content-Type", "application/json") + .form(params).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】调用事务删除接口,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 0) { + log.info("【log】调用事务删除接口成功"); + } else { + log.info("【log】调用事务删除接口失败:{}", resultJsonBody.getStr("message")); + } + } +} diff --git a/src/main/java/com/budwk/app/todo/util/TodoPlatformTokenUtil.java b/src/main/java/com/budwk/app/todo/util/TodoPlatformTokenUtil.java new file mode 100644 index 00000000..b2036ac3 --- /dev/null +++ b/src/main/java/com/budwk/app/todo/util/TodoPlatformTokenUtil.java @@ -0,0 +1,62 @@ +package com.budwk.app.todo.util; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.constant.RedisConstant; +import lombok.extern.slf4j.Slf4j; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName TodoPlatformUtil + * @Author JyuHsin + * @Date 2026/3/12 14:05 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +public class TodoPlatformTokenUtil { + + @Inject + private RedisService redisService; + + private static final String TOKEN_URL = "https://poa.ncu.edu.cn/oauth2/token"; + private static final String CLINT_ID = "dP7SXC1MoYAJHPh6k8Cgsda8tGY="; + private static final String CLINT_SECRET = "PFAwVcXOsVFzP3Jwb4RyO5V97o8j8zNTQ8QSTre8oIc="; + private static final String SCOPE = "ttc:v1:writeTransaction"; + + public String getToken() { + String key = RedisConstant.REDIS_TODO_TOKEN_KEY; + String token = redisService.get(key); + if (StrUtil.isBlank(token)) { + // 构造表单参数 + Map param = new HashMap<>(); + param.put("grant_type", "client_credentials"); + param.put("client_id", CLINT_ID); + param.put("client_secret", CLINT_SECRET); + param.put("scope", SCOPE); + + String body = HttpUtil.createPost(TOKEN_URL) + .header("Content-Type", "application/x-www-form-urlencoded") + .formStr(param).execute().body(); + + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】获取待办token接口回调数据:{}", Json.toJson(resultJsonBody)); + if (StrUtil.isNotBlank(resultJsonBody.getStr("access_token"))) { + String accessToken = resultJsonBody.getStr("access_token"); + Integer expiresIn = resultJsonBody.getInt("expires_in"); + redisService.setex(key, expiresIn, accessToken); + return accessToken; + } + } + return token; + } +}