From be0be45af37aec319fc5f40add1cfa213dc1f2aa Mon Sep 17 00:00:00 2001 From: "459816669@qq.com" <459816669@qq.com> Date: Sat, 27 Feb 2021 13:44:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +- .../controller/common/CommonController.java | 25 +- .../dingtalk/DingTalkCallBackController.java | 78 +++ .../dingtalk/SyncInitDataController.java | 4 + .../controller/flowable/FlowController.java | 7 +- .../flowable/FlowUserController.java | 2 +- .../controller/system/SysIndexController.java | 4 + .../system/SysProfileController.java | 9 +- .../src/main/resources/application-druid.yml | 1 + snow-admin/src/main/resources/static/snow.png | Bin 15018 -> 31218 bytes .../src/main/resources/templates/main_v1.html | 58 ++- .../templates/system/user/profile/avatar.html | 470 +++++++++--------- .../common/SendMessageEventLister.java | 2 +- .../service/impl/FlowableServiceImpl.java | 4 + .../snow/framework/config/CrossConfig.java | 26 + .../snow/framework/config/ShiroConfig.java | 1 + 16 files changed, 425 insertions(+), 286 deletions(-) create mode 100644 snow-framework/src/main/java/com/snow/framework/config/CrossConfig.java diff --git a/README.md b/README.md index e5e8e4e..bf4d0db 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,10 @@ + + + + @@ -64,7 +68,7 @@ v1.0 2021-2-24 ding-flow首发 - 2.0 抛弃官方设计器用户组,使用ding-flow自带用户,流程角色。流程角色实现向下兼容(即流程某节点配置父角色,其父角色下所有子角色都具有流程审批权限) - 3.0 系统自带请假申请和采购单申请,采用类form表单提交,保存流程资源表。反序列化表单,实现流程中取业务数据。接口通用,一个接口按照规定格式设计流程即可。 - 4.0 全局监听器抽象设计,实现任务创建时,钉钉消息通知,待办人实时接收消息,及时处理任务。 - - 5.0 任务监听器抽象设计,满足各种节点自定义业务需求,按照各种开发即可。 + - 5.0 任务监听器抽象设计,满足各种节点自定义业务需求,按照规则开发即可。 - 6.0 系统创建用户和部门,同步到钉钉用户和部门。实现钉钉移动化办公。 - 7.0 钉钉修改用户和部门,系统异步监听数据变化,实时修改系统数据。实现钉钉和系统数据同步。 - 8.0 账单管理,导出支付宝,微信账单。一键导入系统,系统轻松管理账单数据,日常消费明了清晰。 @@ -76,15 +80,15 @@ v1.1 2021-2-26 ## 未来规划 - - 1.0 角色与钉钉打通 - - 2.0 流程表单设计 - - 3.0 钉钉工作流与系统工作流打通(让流程移动化) - - 4.0 钉钉同步数据失败后,手工重试 - - 5.0 记录消息通知轨迹 - - 6.0 钉钉流程和系统流程打通,让流程移动化 + - 1.0 流程表单设计 + - 2.0 钉钉工作流与系统工作流打通,让流程移动化 + - 3.0 钉钉同步数据失败后,手工重试 + - 4.0 记录消息通知轨迹 + - 5.0 钉钉机器人集成 ## 交流群 - - QQ群: 577813338 欢迎入群讨论,我们的口号:借助钉钉,致力于流程,让流程更简单 + - QQ群: 577813338 + - 欢迎入群讨论,我们的口号:**借助钉钉,致力于流程,让流程更简单** ## 我有话说 开源离不开您的参与、支持与鼓励。开源不易,如果您觉得项目对您有帮助,请您动动小手star一下,也是对作者的最大帮助。 diff --git a/snow-admin/src/main/java/com/snow/web/controller/common/CommonController.java b/snow-admin/src/main/java/com/snow/web/controller/common/CommonController.java index 2c57478..86b063e 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/common/CommonController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/common/CommonController.java @@ -1,14 +1,12 @@ package com.snow.web.controller.common; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.fasterxml.uuid.impl.UUIDUtil; -import com.snow.common.utils.uuid.IdUtils; -import com.snow.common.utils.uuid.UUID; +import com.snow.common.config.Global; +import com.snow.common.constant.Constants; +import com.snow.common.core.domain.AjaxResult; +import com.snow.common.utils.StringUtils; +import com.snow.common.utils.file.FileUtils; import com.snow.framework.storage.StorageService; import com.snow.system.domain.SysFile; -import org.apache.logging.log4j.core.util.UuidUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,13 +15,9 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; -import com.snow.common.config.Global; -import com.snow.common.config.ServerConfig; -import com.snow.common.constant.Constants; -import com.snow.common.core.domain.AjaxResult; -import com.snow.common.utils.StringUtils; -import com.snow.common.utils.file.FileUploadUtils; -import com.snow.common.utils.file.FileUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * 通用请求处理 @@ -35,8 +29,7 @@ public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); - @Autowired - private ServerConfig serverConfig; + @Autowired private StorageService storageService; diff --git a/snow-admin/src/main/java/com/snow/web/controller/dingtalk/DingTalkCallBackController.java b/snow-admin/src/main/java/com/snow/web/controller/dingtalk/DingTalkCallBackController.java index bf4ee3c..132e7e2 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/dingtalk/DingTalkCallBackController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/dingtalk/DingTalkCallBackController.java @@ -1,8 +1,11 @@ package com.snow.web.controller.dingtalk; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.dingtalk.oapi.lib.aes.DingTalkEncryptor; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.snow.common.constant.Constants; import com.snow.common.enums.DingTalkListenerType; import com.snow.dingtalk.common.EventNameEnum; @@ -11,12 +14,16 @@ import com.snow.dingtalk.sync.SyncSysInfoFactory; import com.snow.system.domain.DingtalkCallBack; import com.snow.system.service.impl.DingtalkCallBackServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; import java.util.List; +import java.util.Map; /** * @author qimingjin @@ -85,4 +92,75 @@ public class DingTalkCallBackController { return Constants.CALL_BACK_FAIL_RETURN; } } + + /** + * 接收钉钉dingFlow机器人消息 + * @return + */ + @PostMapping(value = "/dingFlowRobot") + public void dingFlowRobotCallback(@RequestBody(required = false) JSONObject body){ + log.info("dingFlowRobot"+body); + + //todo 校验是否是钉钉群发送过来的消息 + + } + + + /** + * 测试给钉钉群发消息 + * + * @param args + */ + public static void main(String[] args){ + + try { + //钉钉机器人地址(配置机器人的webhook) + String dingUrl = ""; + + //是否通知所有人 + boolean isAtAll = false; + //通知具体人的手机号码列表 + List mobileList = Lists.newArrayList(); + + //钉钉机器人消息内容 + String content ="TEST"+ "小哥,你好!"; + //组装请求内容 + String reqStr = buildReqStr(content, isAtAll, mobileList); + + //推送消息(http请求) + String result = HttpUtil.post(dingUrl, reqStr); + System.out.println("result == " + result); + + }catch (Exception e){ + e.printStackTrace(); + + } + + } + + /** + * 组装请求报文 + * @param content + * @return + */ + private static String buildReqStr(String content, boolean isAtAll, List mobileList) { + //消息内容 + Map contentMap = Maps.newHashMap(); + contentMap.put("content", content); + + //通知人 + Map atMap = Maps.newHashMap(); + //1.是否通知所有人 + atMap.put("isAtAll", isAtAll); + //2.通知具体人的手机号码列表 + atMap.put("atMobiles", mobileList); + + Map reqMap = Maps.newHashMap(); + reqMap.put("msgtype", "text"); + reqMap.put("text", contentMap); + reqMap.put("at", atMap); + + return JSON.toJSONString(reqMap); + } + } diff --git a/snow-admin/src/main/java/com/snow/web/controller/dingtalk/SyncInitDataController.java b/snow-admin/src/main/java/com/snow/web/controller/dingtalk/SyncInitDataController.java index 9f633f8..0c79d92 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/dingtalk/SyncInitDataController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/dingtalk/SyncInitDataController.java @@ -28,6 +28,10 @@ public class SyncInitDataController { @Autowired private SysDeptServiceImpl sysDeptService; + + /** + * 钉钉部门数据初始化到系统 + */ @GetMapping("/initDepartment") public void initDepartment(){ List dingTalkDepartmentList = departmentService.getDingTalkDepartmentList(); diff --git a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java index ec33d85..f73e788 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java @@ -68,6 +68,7 @@ public class FlowController extends BaseController { * @return */ @PostMapping("/finishTask") + @RequiresPermissions("system:flow:finishTask") @ResponseBody @RepeatSubmit public AjaxResult finishTask(CompleteTaskDTO completeTaskDTO) @@ -89,8 +90,9 @@ public class FlowController extends BaseController { return prefix+"/myTask"; } + /** - * 获取我的待办 + * 获取我的待办列表 */ @RequiresPermissions("flow:get:todoList") @PostMapping("/findTasksByUserId") @@ -101,6 +103,7 @@ public class FlowController extends BaseController { PageModel taskList = flowableTaskService.findTasksByUserId(String.valueOf(userId), taskBaseDTO); return getFlowDataTable(taskList); } + /** * 获取所有节点 * @param processInstanceId @@ -163,7 +166,7 @@ public class FlowController extends BaseController { } /** - * 我参与的任务 + * 跳转我的已办 * @return */ @RequiresPermissions("flow:process:getMyTakePartInProcess") diff --git a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowUserController.java b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowUserController.java index b55b713..fc3ceb2 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowUserController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowUserController.java @@ -52,7 +52,7 @@ public class FlowUserController extends BaseController { } /** - * 获取用户列表 + * 获取用户组列表 * @param filter */ @GetMapping(value = "/rest/getUserGroupList") diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysIndexController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysIndexController.java index 6438579..1158a20 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysIndexController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysIndexController.java @@ -109,7 +109,11 @@ public class SysIndexController extends BaseController @GetMapping("/system/main") public String main(ModelMap mmap) { + SysUser sysUser = ShiroUtils.getSysUser(); mmap.put("version", Global.getVersion()); + //流程概况 + FlowGeneralSituationVO flowGeneralSituation = flowableService.getFlowGeneralSituation(String.valueOf(sysUser.getUserId())); + mmap.put("flowGeneralSituation",flowGeneralSituation); return "main_v1"; } diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysProfileController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysProfileController.java index 43d1032..e42c35a 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysProfileController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysProfileController.java @@ -1,5 +1,7 @@ package com.snow.web.controller.system; +import com.snow.framework.storage.StorageService; +import com.snow.system.domain.SysFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +44,9 @@ public class SysProfileController extends BaseController @Autowired private SysPasswordService passwordService; + @Autowired + private StorageService storageService; + /** * 个人信息 */ @@ -154,8 +159,8 @@ public class SysProfileController extends BaseController { if (!file.isEmpty()) { - String avatar = FileUploadUtils.upload(Global.getAvatarPath(), file); - currentUser.setAvatar(avatar); + SysFile store = storageService.store(file.getInputStream(), file.getSize(), file.getContentType(), file.getOriginalFilename()); + currentUser.setAvatar(store.getUrl()); if (userService.updateUserInfo(currentUser) > 0) { ShiroUtils.setSysUser(userService.selectUserById(currentUser.getUserId())); diff --git a/snow-admin/src/main/resources/application-druid.yml b/snow-admin/src/main/resources/application-druid.yml index 33e163d..9fc696f 100644 --- a/snow-admin/src/main/resources/application-druid.yml +++ b/snow-admin/src/main/resources/application-druid.yml @@ -31,6 +31,7 @@ spring: # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false diff --git a/snow-admin/src/main/resources/static/snow.png b/snow-admin/src/main/resources/static/snow.png index e70c72c518d8ab934cc3312e044f819ce7e891ed..1f106207eb0620849718989523e8799bd84882ab 100644 GIT binary patch literal 31218 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 literal 15018 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
- 全年 -
订单
+ +
已办任务数
-

275,800

-
20% +

+
+ + 详情
- 新订单 +
- 今天 -
访客
+ +
发起流程数
-

106,120

-
44% +

+
+
- 新访客 +
- 最近一个月 -
活跃用户
+ +
任务超时数(3天)
-

80,600

-
38% +

+
+
- 12月 +
@@ -198,6 +204,16 @@ var preViewUrl=prefixFlow+'/toFinishTask?taskId='+taskId; $.modal.openTab("审批", preViewUrl); } + + function toDoMyTask() { + var preViewUrl=prefixFlow+'/toDoMyTask?'; + $.modal.openTab("我的待办任务", preViewUrl); + } + + function toMyTakePartInProcess() { + var preViewUrl=prefixFlow+'/toMyTakePartInProcess?'; + $.modal.openTab("我的已办任务", preViewUrl); + } diff --git a/snow-admin/src/main/resources/templates/system/user/profile/avatar.html b/snow-admin/src/main/resources/templates/system/user/profile/avatar.html index 8962c11..fdb7237 100644 --- a/snow-admin/src/main/resources/templates/system/user/profile/avatar.html +++ b/snow-admin/src/main/resources/templates/system/user/profile/avatar.html @@ -4,258 +4,258 @@ -
-
-
- -
-
- - - - - - - - -
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+ + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java b/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java index c3fe4b8..3cdc484 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java @@ -64,7 +64,7 @@ public class SendMessageEventLister extends AbstractEventListener { protected void taskCreated(FlowableEngineEntityEvent event) { //任务创建可发送短信,邮件通知接收人(代办人) log.info("ManagerTaskEventListener----taskCreated任务创建监听:{}",JSON.toJSONString(event)); - // sendDingTalkMessage(event); + sendDingTalkMessage(event); //todo 邮件通知 } diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java index 082c9da..b21ba5d 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java +++ b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java @@ -449,6 +449,7 @@ public class FlowableServiceImpl implements FlowableService { public ProcessInstance getProcessInstanceById(String id){ return runtimeService.createProcessInstanceQuery() .processInstanceId(id) + .includeProcessVariables() .singleResult(); } @@ -669,6 +670,8 @@ public class FlowableServiceImpl implements FlowableService { historicProcessInstanceQuery.includeProcessVariables(); return historicProcessInstanceQuery; } + + /** * 赋值ProcessInstanceVOs * @param processInstanceVOS @@ -698,6 +701,7 @@ public class FlowableServiceImpl implements FlowableService { t.setStartUserName(sysUser.getUserName()); }); } + @Override public PageModel getHistoricTaskInstance(HistoricTaskInstanceDTO historicTaskInstanceDTO) { HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery(); diff --git a/snow-framework/src/main/java/com/snow/framework/config/CrossConfig.java b/snow-framework/src/main/java/com/snow/framework/config/CrossConfig.java new file mode 100644 index 0000000..0e5b846 --- /dev/null +++ b/snow-framework/src/main/java/com/snow/framework/config/CrossConfig.java @@ -0,0 +1,26 @@ +package com.snow.framework.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @program: snow + * @description 允许跨域 + * @author: 没用的阿吉 + * @create: 2021-02-27 13:28 + **/ +@Configuration +public class CrossConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS") + .allowCredentials(true) + .maxAge(3600) + .allowedHeaders("*"); + } +} diff --git a/snow-framework/src/main/java/com/snow/framework/config/ShiroConfig.java b/snow-framework/src/main/java/com/snow/framework/config/ShiroConfig.java index ae4e324..e7e5815 100644 --- a/snow-framework/src/main/java/com/snow/framework/config/ShiroConfig.java +++ b/snow-framework/src/main/java/com/snow/framework/config/ShiroConfig.java @@ -282,6 +282,7 @@ public class ShiroConfig filterChainDefinitionMap.put("/modeler/**", "anon"); filterChainDefinitionMap.put("/captcha/captchaImage**", "anon"); filterChainDefinitionMap.put("/dingTalk/dingTalkCallBack", "anon"); + filterChainDefinitionMap.put("/dingTalk/dingFlowRobot", "anon"); // 退出 logout地址,shiro去清除session filterChainDefinitionMap.put("/logout", "logout"); // 不需要拦截的访问 From e6ee7f48c1ffd4ddaf65f3fd84cf038517209510 Mon Sep 17 00:00:00 2001 From: "459816669@qq.com" <459816669@qq.com> Date: Sat, 27 Feb 2021 13:45:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9E=E6=8E=A5=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- snow-admin/src/main/resources/application-druid.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/snow-admin/src/main/resources/application-druid.yml b/snow-admin/src/main/resources/application-druid.yml index 9fc696f..3b791b7 100644 --- a/snow-admin/src/main/resources/application-druid.yml +++ b/snow-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://rm-bp1j1554xv1qs04295o.mysql.rds.aliyuncs.com:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: cloud_root - password: Jin!152377 + url: jdbc:mysql://127.0.0.1:3306/snow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: root # 从库数据源 slave: # 从数据源开关/默认关闭