From cd0a16f4613e77e1dc698e4c753c0f7f05bee795 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Mon, 29 Mar 2021 18:24:10 +0800 Subject: [PATCH 01/50] =?UTF-8?q?=E7=A4=BE=E7=BE=A4=E8=BF=90=E8=90=A5=20-?= =?UTF-8?q?=20H5=E7=9B=B8=E5=85=B3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 3 - .../wecom/WeCommunityH5Controller.java | 122 ++++++++ .../WeCommunityKeywordGroupController.java | 9 +- .../WeCommunityPresTagGroupController.java | 25 +- .../wecom/WeGroupCodeController.java | 82 ++--- .../src/main/resources/application.yml | 4 + .../common/enums/CommunityTaskType.java | 26 ++ .../linkwechat/common/enums/TaskSendType.java | 30 ++ .../framework/config/SecurityConfig.java | 1 + .../wecom/domain/WeGroupSopChat.java | 5 + .../wecom/domain/WePresTagGroupTask.java | 5 + .../wecom/domain/WePresTagGroupTaskScope.java | 5 + ...EmplVo.java => WeCommunityTaskEmplVo.java} | 14 +- .../wecom/domain/vo/WeGroupCodeVo.java | 23 ++ .../wecom/domain/vo/WeGroupSopVo.java | 16 +- .../wecom/domain/vo/WeKeywordGroupTaskVo.java | 5 +- .../wecom/domain/vo/WeMaterialVo.java | 74 +++++ .../domain/vo/WePresTagGroupTaskStatVo.java | 6 +- .../wecom/domain/vo/WePresTagGroupTaskVo.java | 40 ++- .../wecom/mapper/WeGroupCodeMapper.java | 28 +- .../wecom/mapper/WeGroupSopChatMapper.java | 19 ++ .../wecom/mapper/WeGroupSopMapper.java | 9 + .../mapper/WeKeywordGroupTaskMapper.java | 8 + .../wecom/mapper/WeMaterialMapper.java | 8 +- .../mapper/WePresTagGroupTaskMapper.java | 19 +- .../mapper/WePresTagGroupTaskScopeMapper.java | 14 +- .../mapper/WePresTagGroupTaskStatMapper.java | 21 +- .../mapper/WePresTagGroupTaskTagMapper.java | 9 + .../IWeCommunityKeywordToGroupService.java | 9 + .../wecom/service/IWeGroupCodeService.java | 29 +- .../wecom/service/IWeGroupSopService.java | 27 ++ .../service/IWePresTagGroupTaskService.java | 36 ++- .../WeCommunityKeywordToGroupServiceImpl.java | 92 ++++-- .../service/impl/WeGroupCodeServiceImpl.java | 11 + .../service/impl/WeGroupSopServiceImpl.java | 155 ++++++++-- .../impl/WePresTagGroupTaskServiceImpl.java | 288 +++++++++++++++--- .../mapper/wecom/WeGroupCodeMapper.xml | 5 + .../mapper/wecom/WeGroupSopChatMapper.xml | 37 ++- .../mapper/wecom/WeGroupSopMapper.xml | 21 ++ .../mapper/wecom/WeKeywordGroupTaskMapper.xml | 6 + .../mapper/wecom/WeMaterialMapper.xml | 27 ++ .../mapper/wecom/WePresTagGroupTaskMapper.xml | 28 +- .../wecom/WePresTagGroupTaskScopeMapper.xml | 23 +- .../wecom/WePresTagGroupTaskStatMapper.xml | 66 ++-- .../wecom/WePresTagGroupTaskTagMapper.xml | 15 + sql/link-wechat.sql | 22 +- 46 files changed, 1255 insertions(+), 272 deletions(-) create mode 100644 linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java create mode 100644 linkwe-common/src/main/java/com/linkwechat/common/enums/CommunityTaskType.java create mode 100644 linkwe-common/src/main/java/com/linkwechat/common/enums/TaskSendType.java rename linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/{WeEmplVo.java => WeCommunityTaskEmplVo.java} (47%) create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupCodeVo.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMaterialVo.java diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java index 7c1d3428b..acccf08bf 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java @@ -52,9 +52,6 @@ public class SysLoginController @Autowired private WeAccessTokenClient weAccessTokenClient; -// @Autowired -// private IWeGroupCodeService weGroupCodeService; - /** * 登录方法 diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java new file mode 100644 index 000000000..c00f7d074 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java @@ -0,0 +1,122 @@ +package com.linkwechat.web.controller.wecom; + +import com.linkwechat.common.core.controller.BaseController; +import com.linkwechat.common.core.domain.AjaxResult; +import com.linkwechat.common.core.domain.entity.SysUser; +import com.linkwechat.common.core.page.TableDataInfo; +import com.linkwechat.common.enums.CommunityTaskType; +import com.linkwechat.system.service.ISysUserService; +import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; +import com.linkwechat.wecom.service.IWeCommunityKeywordToGroupService; +import com.linkwechat.wecom.service.IWeGroupSopService; +import com.linkwechat.wecom.service.IWePresTagGroupTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 社区运营H5接口 + * + * @Author Hang + * @Date 2021/3/24 10:54 + */ +@RestController +@RequestMapping(value = "/wecom/community/h5") +public class WeCommunityH5Controller extends BaseController { + + @Autowired + private IWePresTagGroupTaskService tagGroupTaskService; + + @Autowired + private IWeGroupSopService sopService; + + @Autowired + private IWeCommunityKeywordToGroupService keywordToGroupService; + + @Autowired + private ISysUserService userService; + + /** + * 获取任务对应的执行人列表 + * @param taskId 任务id + * @param type 任务类型 1:标签建群任务 2:sop任务 + * @return + */ + @GetMapping("/scope/{taskId}") + public AjaxResult getTaskScopeList(@PathVariable("taskId") Long taskId, @RequestParam(value = "type") Integer type) { + if (type.equals(CommunityTaskType.TAG.getType())) { + return AjaxResult.success(tagGroupTaskService.getScopeListByTaskId(taskId)); + } else { + return AjaxResult.success(sopService.getScopeListByRuleId(taskId)); + } + } + + /** + * h5页面根据员工id获取老客标签建群和群sop任务信息 + * + * @param emplId 员工id + * @param type 数据类型,0:全部数据 1:老客标签建群数据 2:群SOP数据 + * @return + */ + @GetMapping("/{emplId}") + public AjaxResult getEmplTask(@PathVariable("emplId") String emplId, @RequestParam(value = "type") Integer type) { + AjaxResult res = AjaxResult.success(); + if (type.equals(CommunityTaskType.TAG.getType())) { + // 老客标签建群数据 + res.put("todo", tagGroupTaskService.getEmplTaskList(emplId, false)); + res.put("done", tagGroupTaskService.getEmplTaskList(emplId, true)); + } else if (type.equals(CommunityTaskType.SOP.getType())) { + // 群SOP数据 + res.put("todo", sopService.getEmplTaskList(emplId, false)); + res.put("done", sopService.getEmplTaskList(emplId, true)); + } else { + // 全部数据 + List todoList = new ArrayList(); + List doneList = new ArrayList(); + todoList.addAll(tagGroupTaskService.getEmplTaskList(emplId, false)); + todoList.addAll(sopService.getEmplTaskList(emplId, false)); + res.put("todo", todoList); + doneList.addAll(tagGroupTaskService.getEmplTaskList(emplId, true)); + doneList.addAll(sopService.getEmplTaskList(emplId, true)); + res.put("done", todoList); + } + SysUser user = userService.selectUserByUserName(emplId); + boolean isAdmin = user != null && user.isAdmin(); + res.put("isAdmin", isAdmin); + return res; + } + + /** + * 员工发送老客标签建群任务信息或者发送sop到其客户群之后,变更其任务状态 + * + * @param taskId 老客标签建群时代表任务id,sop时,代表规则id + * @param emplId 老客标签建群时代表员工id,sop时,代表群主 + * @param type 类型 0:老客标签建群 1:sop + * @return 结果 + */ + @GetMapping("/changeStatus") + public AjaxResult changeStatus(@RequestParam("taskId") Long taskId, @RequestParam("emplId") String emplId, @RequestParam("type") Integer type) { + if (type.equals(0)) { + return toAjax(tagGroupTaskService.updateEmplTaskStatus(taskId, emplId)); + } else { + return toAjax(sopService.updateChatSopStatus(taskId, emplId)); + } + + } + + + /** + * 用于支持H5页面的名称和关键字检索 + * + * @param word 过滤字符 + * @return 结果 + */ + @GetMapping(path = "/filter") + public TableDataInfo filter(@RequestParam("word") String word) { + startPage(); + List taskList = keywordToGroupService.filterByNameOrKeyword(word); + return getDataTable(taskList); + } +} diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityKeywordGroupController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityKeywordGroupController.java index 1bac77bec..6a42e9643 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityKeywordGroupController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityKeywordGroupController.java @@ -12,7 +12,6 @@ import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; import com.linkwechat.wecom.service.IWeCommunityKeywordToGroupService; import com.linkwechat.wecom.service.IWeGroupCodeService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -49,8 +48,7 @@ public class WeCommunityKeywordGroupController extends BaseController { @RequestParam(value = "keyword", required = false) String keyword, @RequestParam(value = "beginTime", required = false) String beginTime, @RequestParam(value = "endTime", required = false) String endTime - ) - { + ) { startPage(); List taskList = keywordToGroupService .getTaskList(taskName, createBy, keyword, beginTime, endTime); @@ -66,10 +64,7 @@ public class WeCommunityKeywordGroupController extends BaseController { // @PreAuthorize("@ss.hasPermi('wecom:communityKeyword:query')") @GetMapping(path = "/{taskId}") public AjaxResult getTask(@PathVariable("taskId") Long taskId) { - WeKeywordGroupTaskVo keywordsGroupVo = keywordToGroupService.getTaskById(taskId); - // 获取群活码 - keywordsGroupVo.setGroupCodeInfo(groupCodeService.selectWeGroupCodeById(keywordsGroupVo.getGroupCodeId())); - return AjaxResult.success(keywordsGroupVo); + return AjaxResult.success(keywordToGroupService.getTaskById(taskId)); } /** diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java index 30b18ba96..301186427 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java @@ -5,12 +5,9 @@ import com.linkwechat.common.constant.HttpStatus; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.AjaxResult; import com.linkwechat.common.core.page.TableDataInfo; -import com.linkwechat.wecom.domain.WeGroupCode; -import com.linkwechat.wecom.domain.WeTag; import com.linkwechat.wecom.domain.dto.WePresTagGroupTaskDto; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskVo; -import com.linkwechat.wecom.domain.vo.WeEmplVo; import com.linkwechat.wecom.service.IWePresTagGroupTaskService; import com.linkwechat.wecom.service.IWeGroupCodeService; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +39,7 @@ public class WeCommunityPresTagGroupController extends BaseController { @RequestParam(value = "beginTime", required = false) String beginTime, @RequestParam(value = "endTime", required = false) String endTime) { startPage(); - List wePresTagGroupTaskVoList = taskService.selectTaskListList(taskName, sendType, createBy, beginTime, endTime); + List wePresTagGroupTaskVoList = taskService.selectTaskList(taskName, sendType, createBy, beginTime, endTime); return getDataTable(wePresTagGroupTaskVoList); } @@ -57,7 +54,7 @@ public class WeCommunityPresTagGroupController extends BaseController { return AjaxResult.error("任务名已存在"); } if (null == groupCodeService.selectWeGroupCodeById(wePresTagGroupTaskDto.getGroupCodeId())) { - return AjaxResult.error(HttpStatus.NOT_FOUND,"群活码不存在"); + return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); } return toAjax(taskService.add(wePresTagGroupTaskDto)); } @@ -68,15 +65,7 @@ public class WeCommunityPresTagGroupController extends BaseController { // @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:query')") @GetMapping(path = "/{id}") public AjaxResult getTask(@PathVariable("id") Long id) { - WePresTagGroupTaskVo taskVo = taskService.getTaskById(id); - // 获取标签和使用人员 - List tagList = taskService.getTagListByTaskId(id); - List emplVoList = taskService.getEmplListByTaskId(id); - WeGroupCode weGroupCode = groupCodeService.selectWeGroupCodeById(taskVo.getGroupCodeId()); - taskVo.setGroupCodeInfo(weGroupCode); - taskVo.setTagList(tagList); - taskVo.setScopeList(emplVoList); - return AjaxResult.success(taskVo); + return AjaxResult.success(taskService.getTaskById(id)); } /** @@ -94,7 +83,7 @@ public class WeCommunityPresTagGroupController extends BaseController { return AjaxResult.error("任务名已存在"); } if (null == groupCodeService.selectWeGroupCodeById(wePresTagGroupTaskDto.getGroupCodeId())) { - return AjaxResult.error(HttpStatus.NOT_FOUND,"群活码不存在"); + return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); } return toAjax(taskService.updateTask(id, wePresTagGroupTaskDto)); } @@ -118,10 +107,12 @@ public class WeCommunityPresTagGroupController extends BaseController { @RequestParam(value = "customerName", required = false) String customerName, @RequestParam(value = "isInGroup", required = false) Integer isInGroup, @RequestParam(value = "isSent", required = false) Integer isSent - ) { + ) { + startPage(); - List statVoList = taskService.getStatByTaskId(id, customerName, isInGroup, isSent); + List statVoList = taskService.getStatByTaskId(id); return getDataTable(statVoList); } + } diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java index 41efe6b72..b912d9288 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java @@ -3,6 +3,7 @@ package com.linkwechat.web.controller.wecom; import cn.hutool.core.collection.CollectionUtil; import com.linkwechat.common.annotation.Log; import com.linkwechat.common.constant.HttpStatus; +import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.AjaxResult; import com.linkwechat.common.core.page.TableDataInfo; @@ -24,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -41,7 +43,7 @@ import java.util.zip.ZipOutputStream; @RequestMapping("/wecom/groupCode") public class WeGroupCodeController extends BaseController { @Autowired - private IWeGroupCodeService weGroupCodeService; + private IWeGroupCodeService groupCodeService; /** * 查询客户群活码列表 @@ -50,7 +52,7 @@ public class WeGroupCodeController extends BaseController { @GetMapping("/list") public TableDataInfo list(WeGroupCode weGroupCode) { startPage(); - List list = weGroupCodeService.selectWeGroupCodeList(weGroupCode); + List list = groupCodeService.selectWeGroupCodeList(weGroupCode); return getDataTable(list); } @@ -64,7 +66,7 @@ public class WeGroupCodeController extends BaseController { List idList = Arrays.stream(Optional.ofNullable(ids).orElse("").split(",")) .filter(StringUtils::isNotEmpty).collect(Collectors.toList()); try { - List weGroupCodeList = weGroupCodeService.selectWeGroupCodeListByIds(idList); + List weGroupCodeList = groupCodeService.selectWeGroupCodeListByIds(idList); ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); if (CollectionUtil.isNotEmpty(weGroupCodeList)) { for (WeGroupCode weGroupCode : weGroupCodeList) { @@ -96,7 +98,7 @@ public class WeGroupCodeController extends BaseController { @Log(title = "群活码下载", businessType = BusinessType.OTHER) @GetMapping("/download") public void download(String id, HttpServletRequest request, HttpServletResponse response) { - WeGroupCode weGroupCode = weGroupCodeService.selectWeGroupCodeById(Long.valueOf(id)); + WeGroupCode weGroupCode = groupCodeService.selectWeGroupCodeById(Long.valueOf(id)); try { FileUtils.downloadFile(weGroupCode.getCodeUrl(), response.getOutputStream()); } catch (IOException e) { @@ -104,30 +106,17 @@ public class WeGroupCodeController extends BaseController { } } -// /** -// * 导出客户群活码列表 -// */ -// @PreAuthorize("@ss.hasPermi('wecom:code:export')") -// @Log(title = "客户群活码", businessType = BusinessType.EXPORT) -// @GetMapping("/export") -// public AjaxResult export(WeGroupCode weGroupCode) -// { -// List list = weGroupCodeService.selectWeGroupCodeList(weGroupCode); -// ExcelUtil util = new ExcelUtil(WeGroupCode.class); -// return util.exportExcel(list, "code"); -// } - /** * 获取客户群活码详细信息 */ // @PreAuthorize("@ss.hasPermi('drainageCode:group:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { - WeGroupCode weGroupCode = weGroupCodeService.selectWeGroupCodeById(id); + WeGroupCode weGroupCode = groupCodeService.selectWeGroupCodeById(id); if (StringUtils.isNull(weGroupCode)) { return AjaxResult.error(HttpStatus.NOT_FOUND, "数据不存在"); } - List weGroupCodeActualList = weGroupCodeService.selectActualListByGroupCodeId(weGroupCode.getId()); + List weGroupCodeActualList = groupCodeService.selectActualListByGroupCodeId(weGroupCode.getId()); weGroupCode.setActualList(weGroupCodeActualList); return AjaxResult.success(weGroupCode); } @@ -140,12 +129,12 @@ public class WeGroupCodeController extends BaseController { @PostMapping public AjaxResult add(@Validated @RequestBody WeGroupCode weGroupCode) { // 唯一性检查 - if (!weGroupCodeService.checkActivityNameUnique(weGroupCode)) { + if (!groupCodeService.checkActivityNameUnique(weGroupCode)) { return AjaxResult.error("添加群活码失败,活码名称 " + weGroupCode.getActivityName() + " 已存在"); } AjaxResult ajax = AjaxResult.success(); weGroupCode.setCreateBy(SecurityUtils.getUsername()); - weGroupCodeService.insertWeGroupCode(weGroupCode); + groupCodeService.insertWeGroupCode(weGroupCode); ajax.put("id", weGroupCode.getId()); return ajax; } @@ -157,18 +146,18 @@ public class WeGroupCodeController extends BaseController { @Log(title = "客户群活码", businessType = BusinessType.UPDATE) @PutMapping(value = "/{id}") public AjaxResult edit(@PathVariable("id") Long id, @RequestBody WeGroupCode weGroupCode) { - WeGroupCode originalCode = weGroupCodeService.selectWeGroupCodeById(id); + WeGroupCode originalCode = groupCodeService.selectWeGroupCodeById(id); if (StringUtils.isNull(originalCode)) { return AjaxResult.error(HttpStatus.NOT_FOUND, "数据不存在"); } // 唯一性检查 if (!originalCode.getActivityName().equals(weGroupCode.getActivityName()) && - !weGroupCodeService.checkActivityNameUnique(weGroupCode)) { + !groupCodeService.checkActivityNameUnique(weGroupCode)) { return AjaxResult.error("修改群活码失败,活码名称 " + weGroupCode.getActivityName() + " 已存在"); } weGroupCode.setId(id); weGroupCode.setUpdateBy(SecurityUtils.getUsername()); - return toAjax(weGroupCodeService.updateWeGroupCode(weGroupCode)); + return toAjax(groupCodeService.updateWeGroupCode(weGroupCode)); } /** @@ -178,19 +167,42 @@ public class WeGroupCodeController extends BaseController { @Log(title = "客户群活码", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult batchRemove(@PathVariable Long[] ids) { - return toAjax(weGroupCodeService.deleteWeGroupCodeByIds(ids)); + return toAjax(groupCodeService.deleteWeGroupCodeByIds(ids)); } -// /** -// * 删除客户群活码 -// */ -// @PreAuthorize("@ss.hasPermi('wecom:code:remove')") -// @Log(title = "客户群活码", businessType = BusinessType.DELETE) -// @DeleteMapping("/{ids}") -// public AjaxResult remove(@PathVariable Long[] ids) -// { -// return toAjax(weGroupCodeService.deleteWeGroupCodeByIds(ids)); -// } + /** + * 从群活码获取第一个可用的实际码 + */ + @GetMapping("/getActualCode/{groupCodeId}") + public AjaxResult getActual(@PathVariable("groupCodeId") String groupCodeUuid) { + WeGroupCode groupCode = groupCodeService.getWeGroupByUuid(groupCodeUuid); + List actualCodeList = groupCodeService.selectActualListByGroupCodeId(groupCode.getId()); + WeGroupCodeActual groupCodeActual = null; + for (WeGroupCodeActual item : actualCodeList) { + // 获取第一个可用的实际码 + if (item.getStatus().intValue() == WeConstans.WE_GROUP_CODE_ENABLE) { + groupCodeActual = item; + break; + } + } + if (StringUtils.isNotNull(groupCodeActual)) { + AjaxResult ajax = AjaxResult.success(); + + HashMap data = new HashMap<>(); + data.put("activityName", groupCode.getActivityName()); + data.put("tipMsg", groupCode.getTipMsg()); + data.put("guide", groupCode.getGuide()); + data.put("actualQRCode", groupCodeActual.getActualGroupQrCode()); + data.put("isOpenTip", groupCode.getJoinGroupIsTip().toString()); + data.put("serviceQrCode", groupCode.getCustomerServerQrCode()); + data.put("groupName", groupCodeActual.getChatGroupName()); + ajax.put("data", data); + return ajax; + } else { + // 找不到可用的实际群活码也不要抛出错误,否则前端H5页面不好处理。 + return AjaxResult.success("没有可用的实际群活码!"); + } + } } diff --git a/linkwe-admin/src/main/resources/application.yml b/linkwe-admin/src/main/resources/application.yml index f69eb0b63..ce15eafd5 100644 --- a/linkwe-admin/src/main/resources/application.yml +++ b/linkwe-admin/src/main/resources/application.yml @@ -221,6 +221,10 @@ wecome: appIdOrCorpId: ww24262ce93851488f token: jtQ1aGHgSmH2UHNBIndUtUe6B6EwfR encodingAesKey: Vga4HWv7nFbRDYK8iAaQbxmkuecpo2BAfmXAyWwcXMO + # JS SDK 身份校验url + authorizeUrl: https://open.weixin.qq.com/connect/oauth2/authorize + # JS SDK身份校验成功后的redirect url + authorizeRedirectUrl: http://some_redirect_url/#/task #腾讯云对象存储 cos: secretId: AKIDQRCizIeUGl13vakkDQMH0VkjhPr1rBBv diff --git a/linkwe-common/src/main/java/com/linkwechat/common/enums/CommunityTaskType.java b/linkwe-common/src/main/java/com/linkwechat/common/enums/CommunityTaskType.java new file mode 100644 index 000000000..5a4a809c4 --- /dev/null +++ b/linkwe-common/src/main/java/com/linkwechat/common/enums/CommunityTaskType.java @@ -0,0 +1,26 @@ +package com.linkwechat.common.enums; + +import lombok.Getter; + +/** + * 社群运营H5列表页数据类型 + * @Author Hang + * @Date 2021/3/24 11:02 + */ +@Getter +public enum CommunityTaskType { + + TAG(1, "老客标签建群"), + + SOP(2, "群sop"); + + + private final String name; + + private final Integer type; + + CommunityTaskType(Integer type, String name) { + this.name = name; + this.type = type; + } +} diff --git a/linkwe-common/src/main/java/com/linkwechat/common/enums/TaskSendType.java b/linkwe-common/src/main/java/com/linkwechat/common/enums/TaskSendType.java new file mode 100644 index 000000000..f0ae06330 --- /dev/null +++ b/linkwe-common/src/main/java/com/linkwechat/common/enums/TaskSendType.java @@ -0,0 +1,30 @@ +package com.linkwechat.common.enums; + +import lombok.Getter; + +/** + * 老客标签建群任务群发类型 + * @Author Hang + * @Date 2021/3/24 9:56 + */ +@Getter +public enum TaskSendType { + /** + * 个人群发 + */ + CROP(0, "企业群发"), + + /** + * 企业群发 + */ + SINGLE(1, "个人群发"); + + private final String name; + + private final Integer type; + + TaskSendType(Integer type, String name) { + this.name = name; + this.type = type; + } +} diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index f339d9aa3..5ab79472e 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -124,6 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // .antMatchers("/common/uploadFile2Cos").anonymous() .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() + // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopChat.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopChat.java index da7d1fbf8..269a7d5d6 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopChat.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopChat.java @@ -22,4 +22,9 @@ public class WeGroupSopChat { * 实际群聊id */ private String chatId; + + /** + * 是否已完成 + */ + private boolean isDone; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java index decaa6553..307895d50 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java @@ -58,4 +58,9 @@ public class WePresTagGroupTask extends BaseEntity { */ private String cusEndTime; + /** + * 企业群发消息的id + */ + private String msgid; + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskScope.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskScope.java index bc5d98fa9..bbe3e289c 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskScope.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskScope.java @@ -24,4 +24,9 @@ public class WePresTagGroupTaskScope { */ private String weUserId; + /** + * 是否已处理 + */ + private boolean isDone; + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeEmplVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityTaskEmplVo.java similarity index 47% rename from linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeEmplVo.java rename to linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityTaskEmplVo.java index 732036647..d3477c426 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeEmplVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityTaskEmplVo.java @@ -3,10 +3,10 @@ package com.linkwechat.wecom.domain.vo; import lombok.Data; /** - * 员工信息 + * 社群运营相关任务执行人信息 */ @Data -public class WeEmplVo { +public class WeCommunityTaskEmplVo { /** * 员工id @@ -17,4 +17,14 @@ public class WeEmplVo { * 员工名称 */ private String name; + + /** + * 员工头像 + */ + private String avatar; + + /** + * 是否已完成任务 + */ + private boolean isDone; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupCodeVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupCodeVo.java new file mode 100644 index 000000000..91740e0b8 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupCodeVo.java @@ -0,0 +1,23 @@ +package com.linkwechat.wecom.domain.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 群活码简略信息 + * @Author Hang + * @Date 2021/3/26 14:21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WeGroupCodeVo { + + private Long id; + + private String uuid; + + private String codeUrl; +} \ No newline at end of file diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupSopVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupSopVo.java index e86aa3448..0b454ccbd 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupSopVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupSopVo.java @@ -2,8 +2,8 @@ package com.linkwechat.wecom.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; +import com.linkwechat.common.enums.CommunityTaskType; import com.linkwechat.wecom.domain.WeGroup; -import com.linkwechat.wecom.domain.WeMaterial; import lombok.Data; import java.util.Date; @@ -12,6 +12,12 @@ import java.util.List; @Data public class WeGroupSopVo { + /** + * 类型。该属性仅用于H5页面与老客标签建群混合列表的任务类型判断 + */ + @TableField(exist = false) + private final Integer type = CommunityTaskType.SOP.getType(); + /** * id */ @@ -36,7 +42,7 @@ public class WeGroupSopVo { * 素材列表 */ @TableField(exist = false) - private List materialList; + private List materialList; /** * 自上传图片列表 @@ -50,6 +56,12 @@ public class WeGroupSopVo { @TableField(exist = false) private List groupList; + /** + * 执行人列表 + */ + @TableField(exist = false) + private List scopeList; + /** * 开始执行时间 */ diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeKeywordGroupTaskVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeKeywordGroupTaskVo.java index 6287ca1c1..e75ac4ba1 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeKeywordGroupTaskVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeKeywordGroupTaskVo.java @@ -3,7 +3,6 @@ package com.linkwechat.wecom.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.linkwechat.wecom.domain.WeGroupCode; import com.linkwechat.wecom.domain.WeKeywordGroupTaskKeyword; import lombok.Data; @@ -37,7 +36,7 @@ public class WeKeywordGroupTaskVo { * 群活码信息 */ @TableField(exist = false) - private WeGroupCode groupCodeInfo; + private WeGroupCodeVo groupCodeInfo; /** * 关键词 @@ -46,7 +45,7 @@ public class WeKeywordGroupTaskVo { private List keywordList; /** - * 实际群聊 + * 实际群聊(仅群聊名称) */ @TableField(exist = false) private List groupNameList; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMaterialVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMaterialVo.java new file mode 100644 index 000000000..2b18bad22 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMaterialVo.java @@ -0,0 +1,74 @@ +package com.linkwechat.wecom.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 素材Vo + * + * @Author Hang + * @Date 2021/3/26 17:51 + */ +@Data +public class WeMaterialVo { + /** + * 素材类型。参考 {@link com.linkwechat.common.enums.MediaType} + */ + private Integer mediaType; + + private Long id; + + /** + * 本地资源文件地址 + */ + private String materialUrl; + + /** + * 文本内容、图片文案 + */ + private String content; + + /** + * 图片名称 + */ + private String materialName; + + /** + * 摘要 + */ + private String digest; + + /** + * 封面本地资源文件 + */ + private String coverUrl; + + /** + * 音频时长 + */ + private String audioTime; + + /** + * 创建者 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String updateTime; +} \ No newline at end of file diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskStatVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskStatVo.java index 9febc01ca..23ee6bf0e 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskStatVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskStatVo.java @@ -10,14 +10,14 @@ import lombok.Data; public class WePresTagGroupTaskStatVo { /** - * 客户id + * 客户名称 */ private String customerName; /** - * 是否已发送 + * 发送状态 */ - private boolean isSent = false; + private String status; /** * 是否已在群 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskVo.java index 1c7f2fb95..bf3b2dd52 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskVo.java @@ -4,7 +4,7 @@ package com.linkwechat.wecom.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.linkwechat.wecom.domain.WeGroupCode; +import com.linkwechat.common.enums.CommunityTaskType; import com.linkwechat.wecom.domain.WeTag; import lombok.Data; @@ -17,6 +17,12 @@ import java.util.List; @Data public class WePresTagGroupTaskVo { + /** + * 类型。该属性仅用于H5页面与SOP混合列表的任务类型判断 + */ + @TableField(exist = false) + private final Integer type = CommunityTaskType.TAG.getType(); + /** * 老客标签建群任务id */ @@ -33,16 +39,25 @@ public class WePresTagGroupTaskVo { private String welcomeMsg; /** - * 群活码id + * 群活吗id + */ + @JsonIgnore + private Long codeId; + + /** + * 群活码连接 */ @JsonIgnore - private Long groupCodeId; + private String codeUrl; /** - * 群活码信息 + * 群活码uuid */ + @JsonIgnore + private String CodeUuid; + @TableField(exist = false) - private WeGroupCode groupCodeInfo; + private WeGroupCodeVo groupCodeInfo; /** * 发送方式 0: 企业群发 1:个人群发 @@ -58,7 +73,7 @@ public class WePresTagGroupTaskVo { * 使用员工 */ @TableField(exist = false) - private List scopeList; + private List scopeList; /** * 标签 @@ -86,6 +101,11 @@ public class WePresTagGroupTaskVo { */ private String cusEndTime; + /** + * msgid + */ + private String msgid; + /** * 创建者 */ @@ -107,4 +127,12 @@ public class WePresTagGroupTaskVo { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String updateTime; + + /** + * 设置群活码信息 + */ + public void fillGroupCodeVo() { + WeGroupCodeVo groupCodeVo = new WeGroupCodeVo(this.getCodeId(), this.getCodeUuid(), this.getCodeUrl()); + this.setGroupCodeInfo(groupCodeVo); + } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java index 9a70d0ad9..46ddf921d 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java @@ -4,6 +4,8 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeGroupCode; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; /** * 客户群活码Mapper接口 @@ -11,6 +13,8 @@ import com.linkwechat.wecom.domain.WeGroupCode; * @author ruoyi * @date 2020-10-07 */ +@Mapper +@Repository public interface WeGroupCodeMapper extends BaseMapper { /** @@ -19,7 +23,7 @@ public interface WeGroupCodeMapper extends BaseMapper * @param id 客户群活码ID * @return 客户群活码 */ - public WeGroupCode selectWeGroupCodeById(Long id); + WeGroupCode selectWeGroupCodeById(Long id); /** * 查询客户群活码列表 @@ -27,14 +31,14 @@ public interface WeGroupCodeMapper extends BaseMapper * @param weGroupCode 客户群活码 * @return 客户群活码集合 */ - public List selectWeGroupCodeList(WeGroupCode weGroupCode); + List selectWeGroupCodeList(WeGroupCode weGroupCode); /** * 根据群活码id查询群活码列表 * @param ids id列表 * @return 结果 */ - public List selectWeGroupCodeListByIds(List ids); + List selectWeGroupCodeListByIds(List ids); /** * 新增客户群活码 @@ -42,7 +46,7 @@ public interface WeGroupCodeMapper extends BaseMapper * @param weGroupCode 客户群活码 * @return 结果 */ - public int insertWeGroupCode(WeGroupCode weGroupCode); + int insertWeGroupCode(WeGroupCode weGroupCode); /** * 修改客户群活码 @@ -50,7 +54,7 @@ public interface WeGroupCodeMapper extends BaseMapper * @param weGroupCode 客户群活码 * @return 结果 */ - public int updateWeGroupCode(WeGroupCode weGroupCode); + int updateWeGroupCode(WeGroupCode weGroupCode); /** * 删除客户群活码 @@ -58,7 +62,7 @@ public interface WeGroupCodeMapper extends BaseMapper * @param id 客户群活码ID * @return 结果 */ - public int deleteWeGroupCodeById(Long id); + int deleteWeGroupCodeById(Long id); /** * 批量删除客户群活码 @@ -66,12 +70,20 @@ public interface WeGroupCodeMapper extends BaseMapper * @param ids 需要删除的数据ID * @return 结果 */ - public int deleteWeGroupCodeByIds(Long[] ids); + int deleteWeGroupCodeByIds(Long[] ids); /** * 检测活码名称是否唯一 * @param activityName 活码名称 * @return 结果 */ - public int checkActivityNameUnique(String activityName); + int checkActivityNameUnique(String activityName); + + /** + * 根据 uuid获取群活码 + * + * @param uuid uuid + * @return 结果 + */ + WeGroupCode getWeGroupByUuid(String uuid); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopChatMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopChatMapper.java index 89d5f1e10..04b9629bc 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopChatMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopChatMapper.java @@ -2,7 +2,9 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeGroupSopChat; +import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -22,4 +24,21 @@ public interface WeGroupSopChatMapper extends BaseMapper { * @return 结果 */ int batchBindsSopChat(List sopChatList); + + /** + * 变更某员工sop规则发送任务的状态 + * + * @param ruleId 规则名称 + * @param emplId 员工id(即群聊群主) + * @return 结果 + */ + int updateChatSopStatus(@Param("ruleId") Long ruleId, @Param("emplId") String emplId); + + /** + * 根据SOP 规则id获取所有使用人员信息 + * + * @param ruleId sop id + * @return 结果 + */ + List getScopeListByRuleId(Long ruleId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMapper.java index f5031dad9..510c643c2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMapper.java @@ -71,4 +71,13 @@ public interface WeGroupSopMapper extends BaseMapper { * @return 结果 */ List getChatIdListByRuleId(Long ruleId); + + /** + * 根据员工id获取对应的sop任务列表 + * @param emplId 员工id + * @param isDone 已完成还是待处理 + * @return 结果 + */ + List getEmplTaskList(@Param("emplId") String emplId, @Param("isDone") boolean isDone); + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskMapper.java index fd17fc89f..d862bfc8e 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskMapper.java @@ -56,4 +56,12 @@ public interface WeKeywordGroupTaskMapper extends BaseMapper * @return 结果 */ int checkNameUnique(String taskName); + + /** + * 通过名称或者关键词进行过滤 + * + * @param word 过滤字段 + * @return 结果 + */ + List filterByNameOrKeyword(String word); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeMaterialMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeMaterialMapper.java index 099ed78a7..8d96b05d3 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeMaterialMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeMaterialMapper.java @@ -2,6 +2,7 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeMaterial; +import com.linkwechat.wecom.domain.vo.WeMaterialVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -74,5 +75,10 @@ public interface WeMaterialMapper extends BaseMapper { */ int resetCategory(@Param("categoryId") String categoryId, @Param("material") String material); - + /** + * 根据id列表获取素材Vo列表 + * @param ids 素材id列表 + * @return 结果 + */ + List findMaterialVoListByIds(Long[] ids); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java index 0b392feb5..2b66346b3 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java @@ -24,11 +24,12 @@ public interface WePresTagGroupTaskMapper extends BaseMapper /** * 根据条件查询老客标签建群任务 - * @param taskName 任务名称 - * @param createBy 创建人 + * + * @param taskName 任务名称 + * @param createBy 创建人 * @param beginTime 开始时间 - * @param endTime 结束时间 - * @param sendType 发送方式 + * @param endTime 结束时间 + * @param sendType 发送方式 * @return 结果 */ List selectTaskList( @@ -41,9 +42,19 @@ public interface WePresTagGroupTaskMapper extends BaseMapper /** * 检测任务名是否已被占用 + * * @param taskName 任务名 * @return 是否被占用 */ int checkTaskNameUnique(String taskName); + /** + * 获取某员工的任务 + * + * @param emplId 员工id + * @param isDone 已完成的还是待处理 + * @return 结果 + */ + List getTaskListByEmplId(@Param("emplId") String emplId, @Param("isDone") boolean isDone); + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskScopeMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskScopeMapper.java index 8d9165baa..e86aad6bb 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskScopeMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskScopeMapper.java @@ -2,8 +2,9 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WePresTagGroupTaskScope; -import com.linkwechat.wecom.domain.vo.WeEmplVo; +import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -18,7 +19,7 @@ public interface WePresTagGroupTaskScopeMapper extends BaseMapper getScopeListByTaskId(Long taskId); + List getScopeListByTaskId(Long taskId); /** * 批量绑定任务与使用人员 @@ -26,4 +27,13 @@ public interface WePresTagGroupTaskScopeMapper extends BaseMapper taskScopeList); + + /** + * 员工发送信息后,变更其任务状态为 "完成" + * + * @param taskId 任务id + * @param emplId 员工id + * @return 结果 + */ + int updateEmplTaskStatus(@Param("taskId") Long taskId, @Param("emplId") String emplId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskStatMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskStatMapper.java index d15b16c51..404c94a94 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskStatMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskStatMapper.java @@ -16,16 +16,17 @@ public interface WePresTagGroupTaskStatMapper extends BaseMapper getStatByTaskId( - @Param("taskId") Long taskId, - @Param("customerName") String customerName, - @Param("isSent") Integer isSent, - @Param("isInGroup") Integer isInGroup - ); + List selectStatInfoByTaskId(@Param("taskId") Long taskId); + + /** + * 通过taskId获取所有外部联系人id + * + * @param taskId 老客标签建群任务id + * @return 结果 + */ + List getAllExternalIdByTaskId(Long taskId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskTagMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskTagMapper.java index c22d22be4..baeeeb953 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskTagMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskTagMapper.java @@ -25,8 +25,17 @@ public interface WePresTagGroupTaskTagMapper extends BaseMapper taskTagList); + + /** + * 通过任务id获取所有符合该任务标签的客户的external_id + * + * @param taskId 热任务id + * @return 结果 + */ + List getExternalUserIdListByTaskId(Long taskId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityKeywordToGroupService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityKeywordToGroupService.java index 21c4fbc46..b2a19620a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityKeywordToGroupService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityKeywordToGroupService.java @@ -63,4 +63,13 @@ public interface IWeCommunityKeywordToGroupService { * @return 结果 */ boolean taskNameIsUnique(String taskName); + + + /** + * 通过名称或者关键词进行过滤 + * + * @param word 过滤字段 + * @return 结果 + */ + List filterByNameOrKeyword(String word); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeService.java index 061d2759b..439bbbda9 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeService.java @@ -20,14 +20,15 @@ public interface IWeGroupCodeService extends IService { * @param id 客户群活码ID * @return 客户群活码 */ - public WeGroupCode selectWeGroupCodeById(Long id); + WeGroupCode selectWeGroupCodeById(Long id); /** * 根据群活码id查询实际码列表 + * * @param groupCodeId 群活码id * @return 结果 */ - public List selectActualListByGroupCodeId(Long groupCodeId); + List selectActualListByGroupCodeId(Long groupCodeId); /** * 查询客户群活码列表 @@ -35,7 +36,7 @@ public interface IWeGroupCodeService extends IService { * @param weGroupCode 客户群活码 * @return 客户群活码集合 */ - public List selectWeGroupCodeList(WeGroupCode weGroupCode); + List selectWeGroupCodeList(WeGroupCode weGroupCode); /** * 根据群活码id查询群活码列表 @@ -43,7 +44,7 @@ public interface IWeGroupCodeService extends IService { * @param ids id列表 * @return 结果 */ - public List selectWeGroupCodeListByIds(List ids); + List selectWeGroupCodeListByIds(List ids); /** * 新增客户群活码 @@ -51,7 +52,7 @@ public interface IWeGroupCodeService extends IService { * @param weGroupCode 客户群活码 * @return 结果 */ - public void insertWeGroupCode(WeGroupCode weGroupCode); + void insertWeGroupCode(WeGroupCode weGroupCode); /** * 修改客户群活码 @@ -59,7 +60,7 @@ public interface IWeGroupCodeService extends IService { * @param weGroupCode 客户群活码 * @return 结果 */ - public int updateWeGroupCode(WeGroupCode weGroupCode); + int updateWeGroupCode(WeGroupCode weGroupCode); /** * 批量删除客户群活码 @@ -67,7 +68,7 @@ public interface IWeGroupCodeService extends IService { * @param ids 需要删除的客户群活码ID * @return 结果 */ - public int deleteWeGroupCodeByIds(Long[] ids); + int deleteWeGroupCodeByIds(Long[] ids); /** * 删除客户群活码信息 @@ -75,12 +76,22 @@ public interface IWeGroupCodeService extends IService { * @param id 客户群活码ID * @return 结果 */ - public int deleteWeGroupCodeById(Long id); + int deleteWeGroupCodeById(Long id); /** * 检测活码名称是否唯一 + * * @param weGroupCode 活码对象 * @return 结果 */ - public boolean checkActivityNameUnique(WeGroupCode weGroupCode); + boolean checkActivityNameUnique(WeGroupCode weGroupCode); + + /** + * 根据 uuid获取群活码 + * + * @param uuid uuid + * @return 结果 + */ + WeGroupCode getWeGroupByUuid(String uuid); + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java index 96e612765..6ce6d8036 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java @@ -1,7 +1,9 @@ package com.linkwechat.wecom.service; import com.linkwechat.wecom.domain.WeGroupSop; +import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import com.linkwechat.wecom.domain.vo.WeGroupSopVo; +import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; import java.util.List; @@ -68,4 +70,29 @@ public interface IWeGroupSopService { * @return 是否唯一 */ boolean isRuleNameUnique(String ruleName); + + /** + * 根据员工id获取对应的sop任务列表 + * @param emplId 员工id + * @param isDone 已完成还是待处理 + * @return 结果 + */ + List getEmplTaskList(String emplId, boolean isDone); + + /** + * 变更某员工sop规则发送任务的状态 + * + * @param ruleId 规则名称 + * @param emplId 群聊的群主id + * @return 结果 + */ + int updateChatSopStatus(Long ruleId, String emplId); + + /** + * 根据SOP 规则id获取所有使用人员信息 + * + * @param ruleId sop id + * @return 结果 + */ + List getScopeListByRuleId(Long ruleId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java index 52f7ca0f1..8125f0d4c 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java @@ -2,7 +2,7 @@ package com.linkwechat.wecom.service; import com.linkwechat.wecom.domain.WeTag; import com.linkwechat.wecom.domain.dto.WePresTagGroupTaskDto; -import com.linkwechat.wecom.domain.vo.WeEmplVo; +import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; @@ -31,7 +31,7 @@ public interface IWePresTagGroupTaskService { * @param endTime 结束时间 * @return 结果 */ - List selectTaskListList(String taskName, Integer sendType, String createBy, String beginTime, String endTime); + List selectTaskList(String taskName, Integer sendType, String createBy, String beginTime, String endTime); /** * 通过id获取老客标签建群任务 @@ -69,27 +69,43 @@ public interface IWePresTagGroupTaskService { /** * 通过老客标签建群id获取其统计信息 * - * @param taskId 任务id - * @param customerName 客户名 - * @param isSent 是否已发送 - * @param isInGroup 是否已在群 + * @param taskId 任务id * @return 统计信息 */ - List getStatByTaskId(Long taskId, String customerName, Integer isSent, Integer isInGroup); + List getStatByTaskId(Long taskId); + /** - * 通过任务id获取对应使用员工 + * 根据任务id获取对应员工信息列表 * * @param taskId 任务id * @return 结果 */ - List getEmplListByTaskId(Long taskId); + List getScopeListByTaskId(Long taskId); /** - * 通过任务id获取标签列表 + * 根据任务id获取对应标签信息列表 * * @param taskId 任务id * @return 结果 */ List getTagListByTaskId(Long taskId); + + /** + * 获取员工建群任务信息 + * + * @param emplId 员工id + * @param isDone 是否已处理 + * @return 结果 + */ + List getEmplTaskList(String emplId, boolean isDone); + + /** + * 员工发送信息后,变更其任务状态为 "完成" + * + * @param taskId 任务id + * @param emplId 员工id + * @return 结果 + */ + int updateEmplTaskStatus(Long taskId, String emplId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityKeywordToGroupServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityKeywordToGroupServiceImpl.java index bb9653255..3f51bf1bf 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityKeywordToGroupServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityKeywordToGroupServiceImpl.java @@ -3,14 +3,15 @@ package com.linkwechat.wecom.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.wecom.domain.WeGroupCode; import com.linkwechat.wecom.domain.WeKeywordGroupTaskKeyword; import com.linkwechat.wecom.domain.WeKeywordGroupTask; -import com.linkwechat.wecom.domain.WeGroupCode; +import com.linkwechat.wecom.domain.vo.WeGroupCodeVo; import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; +import com.linkwechat.wecom.mapper.WeGroupCodeMapper; import com.linkwechat.wecom.mapper.WeKeywordGroupTaskKwMapper; import com.linkwechat.wecom.mapper.WeKeywordGroupTaskMapper; import com.linkwechat.wecom.service.IWeCommunityKeywordToGroupService; -import com.linkwechat.wecom.service.IWeGroupCodeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,7 +36,7 @@ public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl getTaskList(String taskName, String createBy, String keyword, String beginTime, String endTime) { List taskVoList = taskMapper.getTaskList(taskName, createBy, keyword, beginTime, endTime); - for (WeKeywordGroupTaskVo task : taskVoList) { + for (WeKeywordGroupTaskVo taskVo : taskVoList) { // 查询关键词列表 - QueryWrapper taskKeywordQueryWrapper = new QueryWrapper<>(); - taskKeywordQueryWrapper.eq("task_id", task.getTaskId()); - List taskKeywordList = taskKwMapper.selectList(taskKeywordQueryWrapper); - task.setKeywordList(taskKeywordList); + List taskKeywordList = this.getTaskKeywordList(taskVo.getTaskId()); + if (StringUtils.isNotEmpty(taskKeywordList)) { + taskVo.setKeywordList(taskKeywordList); + } + // 群活码信息 + taskVo.setGroupCodeInfo(this.getGroupVoByTaskId(taskVo.getGroupCodeId())); // 通过群活码id查询对应的群 - List groupNameList = taskMapper.getGroupNameListByTaskId(task.getTaskId()); + List groupNameList = taskMapper.getGroupNameListByTaskId(taskVo.getTaskId()); groupNameList.removeIf(Objects::isNull); - task.setGroupNameList(groupNameList); - // 获取群活码信息 - WeGroupCode weGroupCode = groupCodeService.selectWeGroupCodeById(task.getGroupCodeId()); - task.setGroupCodeInfo(weGroupCode); + taskVo.setGroupNameList(groupNameList); } return taskVoList; @@ -78,10 +78,16 @@ public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl taskKeywordQueryWrapper = new QueryWrapper<>(); - taskKeywordQueryWrapper.eq("task_id", taskId); - List keywordList = taskKwMapper.selectList(taskKeywordQueryWrapper); - taskVo.setKeywordList(keywordList); + List keywordList = this.getTaskKeywordList(taskId); + if (StringUtils.isNotEmpty(keywordList)) { + taskVo.setKeywordList(keywordList); + } + // 群活码 + taskVo.setGroupCodeInfo(this.getGroupVoByTaskId(taskVo.getGroupCodeId())); + // 群聊名称列表 + List groupNameList = taskMapper.getGroupNameListByTaskId(taskVo.getTaskId()); + groupNameList.removeIf(Objects::isNull); + taskVo.setGroupNameList(groupNameList); return taskVo; } @@ -95,7 +101,7 @@ public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl taskKeywordList = Arrays .stream(keywords) @@ -119,7 +125,7 @@ public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl taskKwQueryWrapper = new QueryWrapper<>(); taskKwQueryWrapper.eq("task_id", task.getTaskId()); @@ -165,4 +171,52 @@ public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl filterByNameOrKeyword(String word) { + List taskVoList = taskMapper.filterByNameOrKeyword(word); + taskVoList.forEach(taskVo -> { + // 关键词列表 + taskVo.setKeywordList(this.getTaskKeywordList(taskVo.getTaskId())); + List groupNameList = taskMapper.getGroupNameListByTaskId(taskVo.getTaskId()); + // 群活码 + taskVo.setGroupCodeInfo(this.getGroupVoByTaskId(taskVo.getGroupCodeId())); + // 群名称列表 + groupNameList.removeIf(StringUtils::isNull); + taskVo.setGroupNameList(groupNameList); + }); + return taskVoList; + } + + /** + * 根据任务id获取关键词列表 + * + * @param taskId 任务id + */ + private List getTaskKeywordList(Long taskId) { + QueryWrapper taskKeywordQueryWrapper = new QueryWrapper<>(); + taskKeywordQueryWrapper.eq("task_id", taskId); + return taskKwMapper.selectList(taskKeywordQueryWrapper); + } + + /** + * 获取群活码简略信息 + * + * @param groupCodeId 群活码id + * @return 群活码简略信息 + */ + private WeGroupCodeVo getGroupVoByTaskId(Long groupCodeId) { + WeGroupCode groupCode = groupCodeMapper.selectWeGroupCodeById(groupCodeId); + WeGroupCodeVo groupCodeVo = new WeGroupCodeVo(); + groupCodeVo.setId(groupCode.getId()); + groupCodeVo.setCodeUrl(groupCode.getCodeUrl()); + groupCodeVo.setUuid(groupCode.getUuid()); + return groupCodeVo; + } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java index b46fcee39..fcd3210ed 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java @@ -165,4 +165,15 @@ public class WeGroupCodeServiceImpl extends ServiceImpl getGroupSopList(String ruleName, String createBy, String beginTime, String endTime) { List groupSopVoList = groupSopMapper.getGroupSopList(ruleName, createBy, beginTime, endTime); - for (WeGroupSopVo groupSopVo : groupSopVoList) { - this.setChatAndMaterial(groupSopVo); - // 设置手动上传的图片url - this.setPicList(groupSopVo); - - } + groupSopVoList.forEach(this::setChatAndMaterialAndPicList); return groupSopVoList; } @@ -95,6 +113,7 @@ public class WeGroupSopServiceImpl extends ServiceImpl groupQueryWrapper = new QueryWrapper<>(); - List chatIdList = groupSopMapper.getChatIdListByRuleId(ruleId); - if (StringUtils.isNotEmpty(chatIdList)) { - groupQueryWrapper.in("chat_id", chatIdList); - List groupList = groupMapper.selectList(groupQueryWrapper); + List groupList = this.getGroupListByRuleId(ruleId); + if (StringUtils.isNotEmpty(groupList)) { groupSopVo.setGroupList(groupList); } + // 设置执行人信息 + List scopeList = sopChatMapper.getScopeListByRuleId(ruleId); + if (StringUtils.isNotEmpty(scopeList)) { + groupSopVo.setScopeList(scopeList); + } // 获取对应素材信息 - QueryWrapper materialQueryWrapper = new QueryWrapper<>(); List materialIdList = groupSopMapper.getMaterialIdListByRuleId(ruleId); if (StringUtils.isNotEmpty(materialIdList)) { - materialQueryWrapper.in("id", materialIdList); - List materialList = materialMapper.selectList(materialQueryWrapper); + List materialList = materialMapper.findMaterialVoListByIds(materialIdList.toArray(new Long[0])); groupSopVo.setMaterialList(materialList); } + + // 设置图片列表 + QueryWrapper picQueryWrapper = new QueryWrapper<>(); + picQueryWrapper.eq("rule_id", ruleId); + List sopPicList = sopPicMapper.selectList(picQueryWrapper); + if (StringUtils.isNotEmpty(sopPicList)) { + List picUrlList = sopPicList.stream().map(WeGroupSopPic::getPicUrl).collect(Collectors.toList()); + groupSopVo.setPicList(picUrlList); + } } /** @@ -207,7 +235,7 @@ public class WeGroupSopServiceImpl extends ServiceImpl sopChatList = chatIdList .stream() - .map(id -> new WeGroupSopChat(ruleId, id)) + .map(id -> new WeGroupSopChat(ruleId, id, false)) .collect(Collectors.toList()); sopChatMapper.batchBindsSopChat(sopChatList); } @@ -235,16 +263,87 @@ public class WeGroupSopServiceImpl extends ServiceImpl getEmplTaskList(String emplId, boolean isDone) { + List sopVoList = groupSopMapper.getEmplTaskList(emplId, isDone); + sopVoList.forEach(this::setChatAndMaterialAndPicList); + return sopVoList; + } + + /** + * 变更某员工sop规则发送任务的状态 * - * @param sopVo 代操作对象 + * @param ruleId 规则名称 + * @param emplId 群聊的群主id + * @return 结果 */ - private void setPicList(WeGroupSopVo sopVo) { - Long ruleId = sopVo.getRuleId(); - QueryWrapper picQueryWrapper = new QueryWrapper<>(); - picQueryWrapper.eq("rule_id", ruleId); - List sopPicList = sopPicMapper.selectList(picQueryWrapper); - List picUrlList = sopPicList.stream().map(WeGroupSopPic::getPicUrl).collect(Collectors.toList()); - sopVo.setPicList(picUrlList); + @Override + public int updateChatSopStatus(Long ruleId, String emplId) { + return sopChatMapper.updateChatSopStatus(ruleId, emplId); + } + + /** + * 根据SOP 规则id获取所有使用人员信息 + * + * @param ruleId sop id + * @return 结果 + */ + @Override + public List getScopeListByRuleId(Long ruleId) { + return sopChatMapper.getScopeListByRuleId(ruleId); + } + + /** + * 根据规则id获取对应的群聊信息 + * + * @param ruleId 规则id + * @return 群聊信息列表 + */ + private List getGroupListByRuleId(Long ruleId) { + QueryWrapper groupQueryWrapper = new QueryWrapper<>(); + List chatIdList = groupSopMapper.getChatIdListByRuleId(ruleId); + List groupList = new ArrayList<>(); + if (StringUtils.isNotEmpty(chatIdList)) { + groupQueryWrapper.in("chat_id", chatIdList); + groupList = groupMapper.selectList(groupQueryWrapper); + } + return groupList; + } + + /** + * 消息推送(企微API 消息推送 - 发送应用消息) + */ + private void sendMessage(Long ruleId) { + // 构造请求参数 + WeMessagePushDto pushDto = new WeMessagePushDto(); + // 根据群聊获取员工(群主)列表 + List groupList = this.getGroupListByRuleId(ruleId); + String toUser = groupList.stream().map(WeGroup::getOwner).collect(Collectors.joining("|")); + pushDto.setTouser(toUser); + + // 设置agentId + WeCorpAccount validWeCorpAccount = corpAccountService.findValidWeCorpAccount(); + String agentId = validWeCorpAccount.getAgentId(); + pushDto.setAgentid(Integer.valueOf(agentId)); + + // 设置消息内容 + pushDto.setMsgtype("text"); + + TextMessageDto text = new TextMessageDto(); + String REDIRECT_URI = URLEncoder.encode(String.format("%s?corpId=%s&agentId=%s&type=%s", authorizeRedirectUrl, corpId, agentId, CommunityTaskType.SOP.getType())); + String context = String.format( + "你有一个新任务,请点击此链接查看", + authorizeUrl, corpId, REDIRECT_URI); + text.setContent(context); + pushDto.setText(text); + + // 请求消息推送接口,获取结果 [消息推送 - 发送应用消息] + messagePushClient.sendMessageToUser(pushDto, agentId); + } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java index e44283859..38813895f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java @@ -2,24 +2,36 @@ package com.linkwechat.wecom.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linkwechat.common.enums.ChatType; +import com.linkwechat.common.enums.MediaType; +import com.linkwechat.common.enums.TaskSendType; +import com.linkwechat.common.enums.CommunityTaskType; +import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.SecurityUtils; +import com.linkwechat.common.utils.StringUtils; import com.linkwechat.common.utils.bean.BeanUtils; +import com.linkwechat.wecom.client.WeCustomerMessagePushClient; +import com.linkwechat.wecom.client.WeMessagePushClient; import com.linkwechat.wecom.domain.*; +import com.linkwechat.wecom.domain.dto.WeMediaDto; +import com.linkwechat.wecom.domain.dto.WeMessagePushDto; import com.linkwechat.wecom.domain.dto.WePresTagGroupTaskDto; +import com.linkwechat.wecom.domain.dto.message.*; +import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskVo; -import com.linkwechat.wecom.domain.vo.WeEmplVo; -import com.linkwechat.wecom.mapper.WePresTagGroupTaskMapper; -import com.linkwechat.wecom.mapper.WePresTagGroupTaskScopeMapper; -import com.linkwechat.wecom.mapper.WePresTagGroupTaskStatMapper; -import com.linkwechat.wecom.mapper.WePresTagGroupTaskTagMapper; -import com.linkwechat.wecom.service.IWePresTagGroupTaskService; +import com.linkwechat.wecom.mapper.*; +import com.linkwechat.wecom.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -40,6 +52,33 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl tagIdList = taskDto.getTagList(); if (CollectionUtil.isNotEmpty(tagIdList)) { - List taskTagList = tagIdList.stream().map(id -> new WePresTagGroupTaskTag(task.getTaskId(), id)).collect(Collectors.toList()); + List taskTagList = tagIdList + .stream() + .map(id -> new WePresTagGroupTaskTag(task.getTaskId(), id)) + .collect(Collectors.toList()); taskTagMapper.batchBindsTaskTags(taskTagList); } // 保存员工信息 List emplIdList = taskDto.getScopeList(); if (CollectionUtil.isNotEmpty(emplIdList)) { - List wePresTagGroupTaskScopeList = emplIdList.stream().map(id -> new WePresTagGroupTaskScope(task.getTaskId(), id)).collect(Collectors.toList()); + List wePresTagGroupTaskScopeList = emplIdList + .stream() + .map(id -> new WePresTagGroupTaskScope(task.getTaskId(), id, false)) + .collect(Collectors.toList()); taskScopeMapper.batchBindsTaskScopes(wePresTagGroupTaskScopeList); } - return 1; + this.sendMessage(task); + + res = 1; } - return 0; + + return res; } /** - * 根据条件查询任务列表 - * @param taskName 任务名称 - * @param sendType 发送方式 - * @param createBy 创建人 + * 根据条件查询任务列表 + * + * @param taskName 任务名称 + * @param sendType 发送方式 + * @param createBy 创建人 * @param beginTime 起始时间 - * @param endTime 结束时间 + * @param endTime 结束时间 * @return 结果 */ @Override - public List selectTaskListList(String taskName, Integer sendType, String createBy, String beginTime, String endTime) { + public List selectTaskList(String taskName, Integer sendType, String createBy, String beginTime, String endTime) { // 查询任务列表 List taskVoList = taskMapper.selectTaskList(taskName, sendType, createBy, beginTime, endTime); - if(CollectionUtil.isNotEmpty(taskVoList)) { - - for (WePresTagGroupTaskVo taskVo : taskVoList) { - Long taskId = taskVo.getTaskId(); - // 根据任务id获取标签 - List TagList = taskTagMapper.getTagListByTaskId(taskId); - taskVo.setTagList(TagList); - - // 根据任务id获取该任务使用人员列表 - List emplList = taskScopeMapper.getScopeListByTaskId(taskId); - taskVo.setScopeList(emplList); - } + if (CollectionUtil.isNotEmpty(taskVoList)) { + taskVoList.forEach(this::setGroupCodeAndScopeAndTag); } return taskVoList; } @@ -113,7 +151,9 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl ids = Arrays.asList(idList); @@ -149,9 +189,9 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl userIdList = wePresTagGroupTaskDto.getScopeList(); if (CollectionUtil.isNotEmpty(userIdList)) { - List wePresTagGroupTaskScopeList = userIdList.stream().map(id -> new WePresTagGroupTaskScope(taskId, id)).collect(Collectors.toList()); + List wePresTagGroupTaskScopeList = userIdList.stream().map(id -> new WePresTagGroupTaskScope(taskId, id, false)).collect(Collectors.toList()); taskScopeMapper.batchBindsTaskScopes(wePresTagGroupTaskScopeList); } return 1; @@ -204,30 +244,53 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl getStatByTaskId(Long taskId, String customerName, Integer isSent, Integer isInGroup) { - return taskStatMapper.getStatByTaskId(taskId, customerName, isSent, isInGroup); + public List getStatByTaskId(Long taskId) { + WePresTagGroupTask task = taskMapper.selectById(taskId); + // 该任务对应的所有外部联系人id + List externalIdList = taskStatMapper.getAllExternalIdByTaskId(taskId); + List statVoList = new ArrayList<>(); + if (task.getSendType().equals(TaskSendType.CROP.getType())) { + // 企业群发。通过企微接口统计 + QueryCustomerMessageStatusResultDataObjectDto requestData = new QueryCustomerMessageStatusResultDataObjectDto(); + requestData.setMsgid(task.getMsgid()); + QueryCustomerMessageStatusResultDto resultDto = customerMessagePushClient.queryCustomerMessageStatus(requestData); + + if (StringUtils.isNotEmpty(resultDto.getDetail_list())) { + for (DetailMessageStatusResultDto detail : resultDto.getDetail_list()) { + WePresTagGroupTaskStatVo statVo = new WePresTagGroupTaskStatVo(); + WeCustomer customer = customerMapper.selectWeCustomerById(detail.getExternal_userid()); + statVo.setCustomerName(customer.getName()); + statVo.setStatus(detail.getStatus()); + statVo.setInGroup(externalIdList.contains(detail.getExternal_userid())); + statVoList.add(statVo); + } + } + + } else { + // 个人群发。通过数据库进行统计 + statVoList = taskStatMapper.selectStatInfoByTaskId(taskId); + } + return statVoList; + } /** - * 通过任务id获取对应使用员工 + * 根据任务id获取对应员工信息列表 * * @param taskId 任务id * @return 结果 */ @Override - public List getEmplListByTaskId(Long taskId) { + public List getScopeListByTaskId(Long taskId) { return taskScopeMapper.getScopeListByTaskId(taskId); } /** - * 通过任务id获取标签列表 + * 根据任务id获取对应标签信息列表 * * @param taskId 任务id * @return 结果 @@ -236,4 +299,143 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl getTagListByTaskId(Long taskId) { return taskTagMapper.getTagListByTaskId(taskId); } + + /** + * 获取员工建群任务信息 + * + * @param emplId 员工id + * @param isDone 是否已处理 + * @return 结果 + */ + @Override + public List getEmplTaskList(String emplId, boolean isDone) { + List taskVoList = taskMapper.getTaskListByEmplId(emplId, isDone); + if (StringUtils.isNotEmpty(taskVoList)) { + taskVoList.forEach(this::setGroupCodeAndScopeAndTag); + } + return taskVoList; + } + + /** + * 员工发送信息后,变更其任务状态为 "完成" + * + * @param taskId 任务id + * @param emplId 员工id + * @return 结果 + */ + @Override + public int updateEmplTaskStatus(Long taskId, String emplId) { + return taskScopeMapper.updateEmplTaskStatus(taskId, emplId); + } + + /** + * 任务群活码、员工和标签 + * + * @param taskVo 任务vo + */ + private void setGroupCodeAndScopeAndTag(WePresTagGroupTaskVo taskVo) { + // 任务群活码信息 + taskVo.fillGroupCodeVo(); + // 员工信息 + taskVo.setScopeList(this.getScopeListByTaskId(taskVo.getTaskId())); + // 客户标签 + taskVo.setTagList(this.getTagListByTaskId(taskVo.getTaskId())); + } + + /** + * 任务派发 + * + * @param task 建群任务 + */ + private void sendMessage(WePresTagGroupTask task) { + try { + + Integer sendType = task.getSendType(); + + if (sendType.equals(TaskSendType.CROP.getType())) { + // 企业群发 + this.sendCorpMessage(task); + + } else { + // 个人群发 + this.sendEmployeeMessage(task); + } + + } catch (Exception e) { + throw new WeComException(e.getMessage()); + } + } + + /** + * 企业群发 + * + * @param task 建群任务信息 + */ + private void sendCorpMessage(WePresTagGroupTask task) { + try { + + // 构建企微api参数 [客户联系 - 消息推送 - 创建企业群发] + + // 群发任务的类型、外部联系人id列表 + List externalIdList = taskTagMapper.getExternalUserIdListByTaskId(task.getTaskId()); + WeCustomerMessagePushDto queryData = new WeCustomerMessagePushDto(); + queryData.setChat_type(ChatType.SINGLE.getName()); + queryData.setExternal_userid(externalIdList); + + // 引导语 + TextMessageDto text = new TextMessageDto(); + text.setContent(task.getWelcomeMsg()); + queryData.setText(text); + + // 群活码图片(上传临时文件获取media_id) TODO 过期问题? + ImageMessageDto image = new ImageMessageDto(); + WeGroupCode groupCode = groupCodeMapper.selectWeGroupCodeById(task.getGroupCodeId()); + WeMediaDto mediaDto = materialService.uploadTemporaryMaterial(groupCode.getCodeUrl(), MediaType.IMAGE.getMediaType(), "临时文件"); + image.setMedia_id(mediaDto.getMedia_id()); + queryData.setImage(image); + + // 调用企业群发接口 + SendMessageResultDto resultDto = customerMessagePushClient.sendCustomerMessageToUser(queryData); + + // 设定该任务的msgid + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("task_id", task.getTaskId()); + updateWrapper.set("msgid", resultDto.getMsgid()); + this.update(updateWrapper); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 个人群发 + * + * @param task 建群任务信息 + */ + private void sendEmployeeMessage(WePresTagGroupTask task) { + WeMessagePushDto pushDto = new WeMessagePushDto(); + // 设置toUser参数 + List employeeList = taskScopeMapper.getScopeListByTaskId(task.getTaskId()); + String toUser = employeeList.stream().map(WeCommunityTaskEmplVo::getUserId).collect(Collectors.joining("|")); + pushDto.setTouser(toUser); + + // 获取agentId + WeCorpAccount validWeCorpAccount = corpAccountService.findValidWeCorpAccount(); + String agentId = validWeCorpAccount.getAgentId(); + pushDto.setAgentid(Integer.valueOf(agentId)); + + // 设置文本消息 + TextMessageDto text = new TextMessageDto(); + String REDIRECT_URI = URLEncoder.encode(String.format("%s?corpId=%s&agentId=%s&type=%s", authorizeRedirectUrl, corpId, agentId, CommunityTaskType.TAG.getType())); + String context = String.format( + "你有一个新任务,请点击此链接查看", + authorizeUrl, corpId, REDIRECT_URI); + text.setContent(context); + pushDto.setText(text); + + pushDto.setMsgtype("text"); + + // 请求消息推送接口,获取结果 [消息推送 - 发送应用消息] + messagePushClient.sendMessageToUser(pushDto, agentId); + } } diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml index 326dbfe5f..82ea07977 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml @@ -170,4 +170,9 @@ + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml index d1630d6ff..e973b112c 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml @@ -3,10 +3,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + - insert into we_group_sop_chat(rule_id, chat_id) values + insert into we_group_sop_chat(rule_id, chat_id, is_done) values - (#{item.ruleId},#{item.chatId}) + (#{item.ruleId},#{item.chatId}, #{item.isDone}) + + + update we_group_sop_chat wgsc + inner join we_group wg on wgsc.chat_id = wg.chat_id + set wgsc.is_done = TRUE + where wgsc.rule_id = #{ruleId} + and wg.owner = #{emplId} + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMapper.xml index d139ad5a1..5dcdc486d 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMapper.xml @@ -82,4 +82,25 @@ select count(1) from we_group_sop where rule_name = #{ruleName} + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskMapper.xml index 4a4c31e69..c1126102c 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskMapper.xml @@ -72,4 +72,10 @@ + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeMaterialMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeMaterialMapper.xml index 85004b906..67ba26153 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeMaterialMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeMaterialMapper.xml @@ -19,6 +19,22 @@ + + + + + + + + + + + + + + + + INSERT INTO we_material @@ -201,6 +217,17 @@ + + id,category_id,material_url,content,material_name,digest,cover_url,create_by,create_time,update_by,update_time,audio_time diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml index ea3f9a968..6b2c8b5b5 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml @@ -9,12 +9,15 @@ - + + + + @@ -27,28 +30,31 @@ wptg.task_name, wptg.welcome_msg, wptg.send_type, - wptg.group_code_id, wptg.send_scope, wptg.send_gender, wptg.cus_begin_time, wptg.cus_end_time, + wptg.msgid, wptg.create_by, wptg.create_time, wptg.update_by, wptg.update_time, + wgc.code_url, + wgc.uuid as code_uuid, + wgc.id as group_code_id, IFNULL((SELECT SUM( wgca.scan_code_times ) AS scan_times FROM we_group_code_actual wgca GROUP BY group_code_id HAVING group_code_id = wgc.id), 0) as total_member FROM we_pres_tag_group wptg - left join we_group_code wgc on wgc.id = wptg.group_code_id + LEFT JOIN we_group_code wgc ON wgc.id = wptg.group_code_id - + - + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskScopeMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskScopeMapper.xml index 8e40f049a..142fe30b5 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskScopeMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskScopeMapper.xml @@ -4,15 +4,19 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - + + + + + - insert into we_pres_tag_group_scope(task_id, we_user_id) values + insert into we_pres_tag_group_scope(task_id, we_user_id, is_done) values - (#{item.taskId},#{item.weUserId}) + (#{item.taskId},#{item.weUserId},#{item.isDone}) + + UPDATE we_pres_tag_group_scope + SET is_done = TRUE + WHERE + task_id = #{taskId} AND we_user_id = #{emplId} + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskStatMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskStatMapper.xml index cff6579a7..e74a1d8cf 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskStatMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskStatMapper.xml @@ -10,40 +10,46 @@ - SELECT DISTINCT - wc.`name` AS customer_name, - IFNULL( wptgs.is_sent, 0 ) AS is_sent, - IFNULL( wptgs.is_in_group, 0 ) AS is_in_group + wc.external_userid FROM - we_pres_tag_group_tag wptgt - LEFT JOIN we_flower_customer_tag_rel wfctr ON wfctr.tag_id = wptgt.tag_id - LEFT JOIN we_flower_customer_rel wfcr ON wfcr.id = wfctr.flower_customer_rel_id - LEFT JOIN we_customer wc ON wc.external_userid = wfcr.external_userid - LEFT JOIN we_pres_tag_group_stat wptgs ON wptgt.task_id = wptgs.task_id - AND wptgs.external_userid = wfcr.external_userid - WHERE - wptgt.task_id = #{taskId} - ) t + we_customer wc + LEFT JOIN we_group_member wgm ON wgm.user_id = wc.external_userid + LEFT JOIN we_group wg ON wg.chat_id = wgm.chat_id + LEFT JOIN we_group_code_actual wgca ON wgca.chat_id = wg.chat_id + LEFT JOIN we_pres_tag_group wptg ON wptg.group_code_id = wgca.group_code_id WHERE - 1 = 1 - - AND t.customer_name LIKE concat('%', #{customerName}, '%') - - - AND t.is_sent = #{isSent} - - - AND t.is_in_group = #{isInGroup} - + wptg.task_id = #{taskId} + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskTagMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskTagMapper.xml index 08508c44e..928216ae5 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskTagMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskTagMapper.xml @@ -22,6 +22,21 @@ wcog.task_id = #{taskId} + + insert into we_pres_tag_group_tag(task_id, tag_id) values diff --git a/sql/link-wechat.sql b/sql/link-wechat.sql index 58fedfe62..104e0e164 100644 --- a/sql/link-wechat.sql +++ b/sql/link-wechat.sql @@ -25985,35 +25985,29 @@ CREATE TABLE `we_pres_tag_group` ( `cus_begin_time` datetime(0) NULL DEFAULT NULL COMMENT '目标客户被添加起始时间', `cus_end_time` datetime(0) NULL DEFAULT NULL COMMENT '目标客户被添加结束时间', `welcome_msg` varchar(255) NOT NULL COMMENT '加群引导语', + `msgid` varchar(64) DEFAULT NULL COMMENT '企业群发消息的id', PRIMARY KEY (`task_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '老客户标签建群' ROW_FORMAT = Dynamic; -INSERT INTO `we_pres_tag_group` VALUES (1369113576379850754, 'test2', 0, 'admin', '2021-03-09 10:31:28', NULL, '2021-03-09 10:31:28', 1366313511814303744, 1, 0, '2021-03-10 00:00:00', '2021-03-26 00:00:00', '11111'); DROP TABLE IF EXISTS `we_pres_tag_group_scope`; CREATE TABLE `we_pres_tag_group_scope` ( `task_id` bigint(20) NOT NULL COMMENT '老客户标签建群任务id', - `we_user_id` varchar(64) NOT NULL COMMENT '员工id' + `we_user_id` varchar(64) NOT NULL COMMENT '员工id', + `is_done` smallint(1) NOT NULL DEFAULT '0' COMMENT '是否已处理' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '老客标签建群使用范围表'; -INSERT INTO `we_pres_tag_group_scope` VALUES (1369113576379850754, '45DuXiangShangQingXie'); - DROP TABLE IF EXISTS `we_pres_tag_group_tag`; CREATE TABLE `we_pres_tag_group_tag` ( `task_id` bigint(20) NOT NULL COMMENT '老客户标签建群任务id', `tag_id` varchar(64) NOT NULL COMMENT '标签id' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '老客标签建群标签关联表'; -INSERT INTO `we_pres_tag_group_tag` VALUES (1369113576379850754, 'et2H-nDQAA3BIW0d9qKA8c7gSU_gGcDg'); -INSERT INTO `we_pres_tag_group_tag` VALUES (1369113576379850754, 'et2H-nDQAAlUGX7YwAmuyygDAk72TfTg'); -INSERT INTO `we_pres_tag_group_tag` VALUES (1369113576379850754, 'et2H-nDQAAWagEOi96PHb42IgGunTRpQ'); DROP TABLE IF EXISTS `we_pres_tag_group_stat`; CREATE TABLE `we_pres_tag_group_stat` ( `task_id` bigint(20) NOT NULL COMMENT '老客标签建群任务id', - `external_userid` varchar(255) NOT NULL COMMENT '客户id', - `is_sent` tinyint(255) NOT NULL DEFAULT 1 COMMENT '是否已送达 0: 未送达 1:已送达', - `is_in_group` tinyint(255) NOT NULL COMMENT '是否已经在群 0:不在群 1:已在群' + `external_userid` varchar(255) NOT NULL COMMENT '客户id' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '老客标签建群客户统计表'; DROP TABLE IF EXISTS `we_keyword_group_kw`; @@ -26022,9 +26016,6 @@ CREATE TABLE `we_keyword_group_kw` ( `keyword` varchar(32) NOT NULL COMMENT '关键词' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '关键词拉群 关键词表'; -INSERT INTO `we_keyword_group_kw` VALUES (1369483460217491458, 'aaa'); -INSERT INTO `we_keyword_group_kw` VALUES (1369483460217491458, 'bbb'); -INSERT INTO `we_keyword_group_kw` VALUES (1369483460217491458, 'eee'); DROP TABLE IF EXISTS `we_keyword_group`; CREATE TABLE `we_keyword_group` ( @@ -26040,7 +26031,6 @@ CREATE TABLE `we_keyword_group` ( PRIMARY KEY (`task_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '关键词拉群任务表'; -INSERT INTO `we_keyword_group` VALUES (1369483460217491458, 'test22', 1366658053960765440, 'welcome', 'admin', '2021-03-10 14:12:38', 'admin', '2021-03-10 14:12:38', ''); DROP TABLE IF EXISTS `we_group_sop`; CREATE TABLE `we_group_sop` ( @@ -26061,7 +26051,8 @@ CREATE TABLE `we_group_sop` ( DROP TABLE IF EXISTS `we_group_sop_chat`; CREATE TABLE `we_group_sop_chat` ( `rule_id` bigint(20) NOT NULL COMMENT 'SOP id', - `chat_id` varchar(32) NOT NULL COMMENT '群聊id' + `chat_id` varchar(32) NOT NULL COMMENT '群聊id', + `is_done` smallint(255) NOT NULL COMMENT '规则是否已发送0:未发送 1:已发送' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='SOP规则 - 群聊 关联表'; DROP TABLE IF EXISTS `we_group_sop_material`; @@ -26075,3 +26066,4 @@ CREATE TABLE `we_group_sop_pic` ( `rule_id` bigint(20) NOT NULL COMMENT '群SOP规则ID', `pic_url` varchar(150) NOT NULL COMMENT '图片URL' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '群SOP规则图片'; + -- Gitee From 4b6476ea3c788d4de67311e240074ac2ed475976 Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Tue, 30 Mar 2021 22:21:22 +0800 Subject: [PATCH 02/50] =?UTF-8?q?:bug:=E4=BF=AE=E6=94=B9=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/framework/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 5ab79472e..4741e944f 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -124,6 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // .antMatchers("/common/uploadFile2Cos").anonymous() .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() + .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() -- Gitee From 91f76eaa2f8a938deb28aeb7ea07d46c2ec4fdee Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Tue, 30 Mar 2021 22:26:22 +0800 Subject: [PATCH 03/50] =?UTF-8?q?:bug:=E8=A1=A5=E5=85=85=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8C=BF=E5=90=8D=E8=AE=BF=E9=97=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/framework/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 4741e944f..0bf9863c7 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -125,6 +125,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() + .antMatchers("/wecom/groupCode/getActualCode/*").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() -- Gitee From 724798e4bd73006084eeab88835d98c5fbd99e04 Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Tue, 30 Mar 2021 22:35:55 +0800 Subject: [PATCH 04/50] =?UTF-8?q?:bug:=E8=A1=A5=E5=85=85=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8C=BF=E5=90=8D=E8=AE=BF=E9=97=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/framework/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 0bf9863c7..3406a562a 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -125,7 +125,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() - .antMatchers("/wecom/groupCode/getActualCode/*").anonymous() + .antMatchers("/wecom/groupCode/getActualCode/**").anonymous() + .antMatchers("/wecom/community/h5/**").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() -- Gitee From 93f886df354a3c9bb9c69e0653f0bc2a3c0bcf41 Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Tue, 30 Mar 2021 23:32:36 +0800 Subject: [PATCH 05/50] =?UTF-8?q?:bug:=E4=BF=AE=E5=A4=8DWeCustomerMapper?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linkwechat/wecom/domain/WeCustomer.java | 89 +++++++++++++------ 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomer.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomer.java index 4cd7a0f54..760efe226 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomer.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomer.java @@ -1,31 +1,26 @@ package com.linkwechat.wecom.domain; -import java.util.Date; -import java.util.List; - import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.linkwechat.common.annotation.Excel; -import com.linkwechat.common.annotation.Excels; import com.linkwechat.common.core.domain.BaseEntity; -import com.linkwechat.common.utils.SnowFlakeUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import javax.validation.constraints.NotBlank; +import java.util.Date; +import java.util.List; /** * 企业微信客户对象 we_customer - * + * * @author ruoyi * @date 2020-09-13 */ @@ -35,72 +30,99 @@ import javax.validation.constraints.NotBlank; @AllArgsConstructor @NoArgsConstructor @TableName("we_customer") -public class WeCustomer extends BaseEntity -{ +public class WeCustomer extends BaseEntity { private static final long serialVersionUID = 1L; - /** 外部联系人的userid */ + /** + * 外部联系人的userid + */ @TableId @NotBlank(message = "外部联系人的id不可为空") @ApiModelProperty("外部联系人的userid") private String externalUserid; - /** 外部联系人名称 */ + /** + * 外部联系人名称 + */ @Excel(name = "客户") @ApiModelProperty("外部联系人名称") private String name; - /** 外部联系人头像 */ + /** + * 外部联系人头像 + */ @ApiModelProperty("外部联系人头像") private String avatar; - /** 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户 */ + /** + * 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户 + */ @ApiModelProperty("外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户") @Excel(name = "客户类型", readConverterExp = "1=微信,2=企业微信") private Integer type; - /** 外部联系人性别 0-未知 1-男性 2-女性 */ + /** + * 外部联系人性别 0-未知 1-男性 2-女性 + */ @ApiModelProperty("外部联系人性别 0-未知 1-男性 2-女性") @Excel(name = "性别", readConverterExp = "0=未知,1=男性,2=女性") private Integer gender; - /** 外部联系人在微信开放平台的唯一身份标识,通过此字段企业可将外部联系人与公众号/小程序用户关联起来。 */ + /** + * 外部联系人在微信开放平台的唯一身份标识,通过此字段企业可将外部联系人与公众号/小程序用户关联起来。 + */ @ApiModelProperty("外部联系人在微信开放平台的唯一身份标识,通过此字段企业可将外部联系人与公众号/小程序用户关联起来") private String unionid; - /** 生日 */ + /** + * 生日 + */ @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("生日") private Date birthday; - /** 客户企业简称 */ + /** + * 客户企业简称 + */ @ApiModelProperty("客户企业简称") @Excel(name = "公司名称") private String corpName; - /** 客户企业全称 */ + /** + * 客户企业全称 + */ @ApiModelProperty("客户企业全称") private String corpFullName; - /** 职位 */ + /** + * 职位 + */ @ApiModelProperty("职位") - private String position; + private String position; - /** 是否开启会话存档 0:关闭 1:开启 */ + /** + * 是否开启会话存档 0:关闭 1:开启 + */ @ApiModelProperty("是否开启会话存档 0:关闭 1:开启") private Integer isOpenChat; - /** 添加人员 */ + /** + * 添加人员 + */ @TableField(exist = false) private List weFlowerCustomerRels; - /** 添加人id */ + /** + * 添加人id + */ @TableField(exist = false) private String userIds; - /** 标签 */ + /** + * 标签 + */ @TableField(exist = false) private String tagIds; @@ -108,7 +130,9 @@ public class WeCustomer extends BaseEntity @JSONField(defaultValue = "0") private Integer status; - /** 部门 */ + /** + * 部门 + */ @TableField(exist = false) private String departmentIds; @@ -125,4 +149,17 @@ public class WeCustomer extends BaseEntity private String userId; + /** + * 创建者 + */ + @ApiModelProperty(hidden = true) + @TableField(exist = false) + private String createBy; + + /** + * 更新者 + */ + @ApiModelProperty(hidden = true) + @TableField(exist = false) + private String updateBy; } -- Gitee From b69f8f57b3b053a506a92c82b035c4df16631d4a Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Wed, 31 Mar 2021 00:00:26 +0800 Subject: [PATCH 06/50] =?UTF-8?q?:bug:=E4=BF=AE=E5=A4=8D=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 6172620e3..216aeaa0d 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -203,7 +203,7 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { .append("&") .append("fissionId=").append(id) .append("&") - .append("userId=").append(fissStaffId) + .append("fissionTargetId=").append(fissStaffId) .append("&") .append("posterId=").append(weTaskFission.getPostersId()); -- Gitee From c3892f9acf68f5d9b5ac5875db24058ef2042088 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Wed, 31 Mar 2021 17:53:21 +0800 Subject: [PATCH 07/50] =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=97=B6agentId=E4=B8=8D=E5=AD=98=E5=9C=A8=E5=88=99=E6=98=BE?= =?UTF-8?q?=E5=BC=8F=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E3=80=81=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=BB=BA=E7=BE=A4=E7=9B=AE=E6=A0=87=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=B6=E9=97=B4=E6=94=B9=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E4=B8=8D=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linkwe-admin/pom.xml | 8 +-- .../wecom/WeTaskFissionController.java | 4 +- .../framework/config/SecurityConfig.java | 2 +- .../wecom/domain/WePresTagGroupTask.java | 5 +- .../mapper/WePresTagGroupTaskMapper.java | 13 +++++ .../service/impl/WeGroupSopServiceImpl.java | 6 ++- .../impl/WePresTagGroupTaskServiceImpl.java | 8 ++- .../mapper/wecom/WePresTagGroupTaskMapper.xml | 49 +++++++++++++++++++ 8 files changed, 84 insertions(+), 11 deletions(-) diff --git a/linkwe-admin/pom.xml b/linkwe-admin/pom.xml index 49a8ff57a..b27c52d79 100644 --- a/linkwe-admin/pom.xml +++ b/linkwe-admin/pom.xml @@ -74,10 +74,10 @@ 5.6.24 - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - + + + + diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java index 08ffd6ae0..fb7d99293 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java @@ -3,7 +3,7 @@ package com.linkwechat.web.controller.wecom; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.alibaba.fastjson.JSONObject; -import com.alibaba.nacos.common.utils.CollectionUtils; +//import com.alibaba.nacos.common.utils.CollectionUtils; import com.google.common.collect.Lists; import com.linkwechat.common.annotation.Log; import com.linkwechat.common.config.CosConfig; @@ -268,7 +268,7 @@ public class WeTaskFissionController extends BaseController { List list = Lists.newArrayList(); if (weTaskFission != null) { List customers = weTaskFissionService.getCustomerListById(null, String.valueOf(id)); - if (CollectionUtils.isNotEmpty(customers)) { + if (StringUtils.isNotEmpty(customers)) { customers.stream().filter(Objects::nonNull).forEach(customer -> { WeTaskFissionTotalProgressVO vo = new WeTaskFissionTotalProgressVO(); vo.setCustomer(customer); diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 3406a562a..b420a1d19 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -124,7 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // .antMatchers("/common/uploadFile2Cos").anonymous() .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() - .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() + // 获取实际群活码和社群运营H5页面不需要登录 .antMatchers("/wecom/groupCode/getActualCode/**").anonymous() .antMatchers("/wecom/community/h5/**").anonymous() diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java index 307895d50..f72d4b1f7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java @@ -4,6 +4,7 @@ package com.linkwechat.wecom.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.linkwechat.common.core.domain.BaseEntity; +import com.linkwechat.common.utils.SnowFlakeUtil; import lombok.Data; import lombok.EqualsAndHashCode; @@ -12,11 +13,13 @@ import lombok.EqualsAndHashCode; @TableName("we_pres_tag_group") public class WePresTagGroupTask extends BaseEntity { + private static final long serialVersionUID = 1L; + /** *主键ID */ @TableId - private Long taskId; + private Long taskId = SnowFlakeUtil.nextId();; /** * 任务名称 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java index 2b66346b3..6ffd57b59 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java @@ -14,6 +14,19 @@ import java.util.List; @Repository public interface WePresTagGroupTaskMapper extends BaseMapper { + /** + * 添加新任务 + * @param task 老客标签建群任务 + * @return 结果 + */ + int insertTask(WePresTagGroupTask task); + + /** + * 更新任务 + * @param task 建群任务信息 + * @return 结果 + */ + int updateTask(WePresTagGroupTask task); /** * 获取老客户标签建群任务 * diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java index 3e5cfc625..8f105c97d 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java @@ -3,6 +3,7 @@ package com.linkwechat.wecom.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.linkwechat.common.enums.CommunityTaskType; +import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.StringUtils; import com.linkwechat.wecom.client.WeMessagePushClient; import com.linkwechat.wecom.domain.*; @@ -326,9 +327,12 @@ public class WeGroupSopServiceImpl extends ServiceImpl 0) { // 保存标签对象 List tagIdList = taskDto.getTagList(); if (CollectionUtil.isNotEmpty(tagIdList)) { @@ -200,7 +201,7 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl 0) { // 更新标签 // 先删除旧标签 QueryWrapper taskTagQueryWrapper = new QueryWrapper<>(); @@ -422,6 +423,9 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl + + INSERT INTO we_pres_tag_group + + task_id, + task_name, + send_type, + group_code_id, + welcome_msg, + send_scope, + send_gender, + cus_begin_time, + cus_end_time, + msgid, + create_time, + create_by, + + + #{taskId}, + #{taskName}, + #{sendType}, + #{groupCodeId}, + #{welcomeMsg}, + #{sendScope}, + #{sendGender}, + #{cusBeginTime}, + #{cusEndTime}, + #{msgid}, + #{createTime}, + #{createBy}, + + + + + UPDATE we_pres_tag_group + + task_name = #{taskName}, + send_type = #{sendType}, + group_code_id = #{groupCodeId}, + welcome_msg = #{welcomeMsg}, + send_scope = #{sendScope}, + send_gender = #{sendGender}, + cus_begin_time = #{cusBeginTime}, + cus_end_time = #{cusEndTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + WHERE task_id = #{taskId} + + \ No newline at end of file -- Gitee From 1df0b848d9a35390bdce10105d261f31a6e7f916 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Wed, 31 Mar 2021 17:54:53 +0800 Subject: [PATCH 08/50] =?UTF-8?q?=E7=A4=BE=E7=BE=A4=E8=BF=90=E8=90=A5=20-?= =?UTF-8?q?=20=E7=BE=A4SOP=20-=20=E7=A9=BA=E7=B4=A0=E6=9D=90insert=20SQL?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linkwe-admin/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/linkwe-admin/pom.xml b/linkwe-admin/pom.xml index b27c52d79..49a8ff57a 100644 --- a/linkwe-admin/pom.xml +++ b/linkwe-admin/pom.xml @@ -74,10 +74,10 @@ 5.6.24 - - - - + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + -- Gitee From 3672b44295e6e0ba3f225ed253db3e5972719d01 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Wed, 31 Mar 2021 18:06:43 +0800 Subject: [PATCH 09/50] =?UTF-8?q?=E9=89=B4=E6=9D=83=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/framework/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index b420a1d19..1c646db44 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -124,6 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // .antMatchers("/common/uploadFile2Cos").anonymous() .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() + .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() // 获取实际群活码和社群运营H5页面不需要登录 .antMatchers("/wecom/groupCode/getActualCode/**").anonymous() .antMatchers("/wecom/community/h5/**").anonymous() -- Gitee From cd861e659f97caa7808fd9c4053b0038aeb80b67 Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Wed, 31 Mar 2021 20:45:42 +0800 Subject: [PATCH 10/50] =?UTF-8?q?:loud=5Fsound:=E5=A2=9E=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/wecom/WeUserController.java | 95 +++++++++---------- 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java index 543e526d9..3ed00440e 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java @@ -7,16 +7,12 @@ import com.linkwechat.common.core.domain.AjaxResult; import com.linkwechat.common.core.page.TableDataInfo; import com.linkwechat.common.enums.BusinessType; import com.linkwechat.wecom.domain.WeUser; -import com.linkwechat.wecom.domain.vo.WeAllocateCustomersVo; -import com.linkwechat.wecom.domain.vo.WeAllocateGroupsVo; -import com.linkwechat.wecom.domain.vo.WeLeaveUserInfoAllocateVo; -import com.linkwechat.wecom.domain.vo.WeLeaveUserVo; -import com.linkwechat.wecom.service.IWeCustomerService; +import com.linkwechat.wecom.domain.vo.*; import com.linkwechat.wecom.service.IWeUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,13 +21,14 @@ import java.util.List; /** * 通讯录相关客户Controller - * + * * @author ruoyi * @date 2020-08-31 */ @RestController @RequestMapping("/wecom/user") @Api("通讯录人员接口") +@Slf4j public class WeUserController extends BaseController { @Autowired @@ -44,23 +41,19 @@ public class WeUserController extends BaseController { // @PreAuthorize("@ss.hasPermi('contacts:organization:query')") @GetMapping("/list") @ApiOperation("获取通讯录人员列表") - public TableDataInfo list(WeUser weUser) - { + public TableDataInfo list(WeUser weUser) { startPage(); - List list = weUserService.selectWeUserList(weUser); return getDataTable(list); } - /** * 获取通讯录相关客户详细信息 */ // @PreAuthorize("@ss.hasPermi('contacts:organization:view')") @GetMapping(value = "/{userId}") - public AjaxResult getInfo(@PathVariable("userId") String userId) - { + public AjaxResult getInfo(@PathVariable("userId") String userId) { return AjaxResult.success(weUserService.selectWeUserById(userId)); } @@ -71,8 +64,7 @@ public class WeUserController extends BaseController { @Log(title = "通讯录相关客户", businessType = BusinessType.INSERT) @PostMapping @ApiOperation("新增通讯录客户") - public AjaxResult add(@Validated @RequestBody WeUser weUser) - { + public AjaxResult add(@Validated @RequestBody WeUser weUser) { weUserService.insertWeUser(weUser); return AjaxResult.success(); } @@ -84,8 +76,7 @@ public class WeUserController extends BaseController { @Log(title = "更新通讯录客户", businessType = BusinessType.UPDATE) @PutMapping @ApiOperation("更新通讯录客户") - public AjaxResult edit(@RequestBody WeUser weUser) - { + public AjaxResult edit(@RequestBody WeUser weUser) { weUserService.updateWeUser(weUser); return AjaxResult.success(); } @@ -93,6 +84,7 @@ public class WeUserController extends BaseController { /** * 启用或者禁止 + * * @param weUser * @return */ @@ -100,7 +92,7 @@ public class WeUserController extends BaseController { @Log(title = "启用禁用用户", businessType = BusinessType.UPDATE) @PutMapping("/startOrStop") @ApiOperation("是否启用(1表示启用成员,0表示禁用成员)") - public AjaxResult startOrStop(@RequestBody WeUser weUser){ + public AjaxResult startOrStop(@RequestBody WeUser weUser) { weUserService.startOrStop(weUser); @@ -110,73 +102,78 @@ public class WeUserController extends BaseController { /** * 离职已分配 + * * @param weLeaveUserVo * @return */ // @PreAuthorize("@ss.hasPermi('customerManage:dimission:filter')") - @GetMapping({"/leaveUserAllocateList"}) - public TableDataInfo leaveUserAllocateList(WeLeaveUserVo weLeaveUserVo) { - startPage(); - weLeaveUserVo.setIsActivate(WeConstans.WE_USER_IS_LEAVE); - weLeaveUserVo.setIsAllocate(WeConstans.LEAVE_ALLOCATE_STATE); - List list = this.weUserService.leaveAllocateUserList(weLeaveUserVo); - return getDataTable(list); - } + @GetMapping({"/leaveUserAllocateList"}) + public TableDataInfo leaveUserAllocateList(WeLeaveUserVo weLeaveUserVo) { + startPage(); + weLeaveUserVo.setIsActivate(WeConstans.WE_USER_IS_LEAVE); + weLeaveUserVo.setIsAllocate(WeConstans.LEAVE_ALLOCATE_STATE); + List list = this.weUserService.leaveAllocateUserList(weLeaveUserVo); + return getDataTable(list); + } /** * 离职未分配 + * * @param weLeaveUserVo * @return */ // @PreAuthorize("@ss.hasPermi('customerManage:dimission:query')") - @GetMapping({"/leaveUserNoAllocateList"}) - public TableDataInfo leaveUserNoAllocateList(WeLeaveUserVo weLeaveUserVo) { + @GetMapping({"/leaveUserNoAllocateList"}) + public TableDataInfo leaveUserNoAllocateList(WeLeaveUserVo weLeaveUserVo) { startPage(); weLeaveUserVo.setIsActivate(WeConstans.WE_USER_IS_LEAVE); weLeaveUserVo.setIsAllocate(WeConstans.LEAVE_NO_ALLOCATE_STATE); List list = weUserService.leaveNoAllocateUserList(weLeaveUserVo); return getDataTable(list); - } + } /** * 离职分配 + * * @param weLeaveUserInfoAllocateVo * @return */ // @PreAuthorize("@ss.hasPermi('customerManage:dimission:allocate')") - @PutMapping({"/allocateLeaveUserAboutData"}) - public AjaxResult allocateLeaveUserAboutData(@RequestBody WeLeaveUserInfoAllocateVo weLeaveUserInfoAllocateVo) { + @PutMapping({"/allocateLeaveUserAboutData"}) + public AjaxResult allocateLeaveUserAboutData(@RequestBody WeLeaveUserInfoAllocateVo weLeaveUserInfoAllocateVo) { - weUserService.allocateLeaveUserAboutData(weLeaveUserInfoAllocateVo); + weUserService.allocateLeaveUserAboutData(weLeaveUserInfoAllocateVo); - return AjaxResult.success("离职分配成功"); + return AjaxResult.success("离职分配成功"); } /** - * 同步成员 + * 同步成员 + * * @return */ // @PreAuthorize("@ss.hasPermi('contacts:organization:sync')") @GetMapping({"/synchWeUser"}) - public AjaxResult synchWeUser(){ + public AjaxResult synchWeUser() { weUserService.synchWeUser(); - return AjaxResult.success(WeConstans.SYNCH_TIP); + return AjaxResult.success(WeConstans.SYNCH_TIP); } /** * 删除用户 + * * @return */ // @PreAuthorize("@ss.hasPermi('contacts:organization:removeMember')") @DeleteMapping({"/{ids}"}) - public AjaxResult deleteUser(@PathVariable String[] ids){ + public AjaxResult deleteUser(@PathVariable String[] ids) { weUserService.deleteUser(ids); @@ -188,27 +185,28 @@ public class WeUserController extends BaseController { /** * 获取历史分配记录的成员 + * * @param weAllocateCustomersVo * @return */ // @PreAuthorize("@ss.hasPermi('wecom:user:getAllocateCustomers')") @GetMapping({"/getAllocateCustomers"}) - public TableDataInfo getAllocateCustomers(WeAllocateCustomersVo weAllocateCustomersVo){ + public TableDataInfo getAllocateCustomers(WeAllocateCustomersVo weAllocateCustomersVo) { startPage(); List list = weUserService.getAllocateCustomers(weAllocateCustomersVo); return getDataTable(list); } - /** * 获取历史分配记录的群 + * * @param weAllocateGroupsVo * @return */ // @PreAuthorize("@ss.hasPermi('wecom:user:getAllocateGroups')") @GetMapping({"/getAllocateGroups"}) - public TableDataInfo getAllocateGroups(WeAllocateGroupsVo weAllocateGroupsVo){ + public TableDataInfo getAllocateGroups(WeAllocateGroupsVo weAllocateGroupsVo) { startPage(); List list = weUserService.getAllocateGroups(weAllocateGroupsVo); return getDataTable(list); @@ -217,20 +215,15 @@ public class WeUserController extends BaseController { /** * 内部应用获取用户userId + * * @param code * @return */ @GetMapping("/getUserInfo") - public AjaxResult getUserInfo(String code,String agentId) - { - - return AjaxResult.success( - weUserService.getUserInfo(code,agentId) - ); + public AjaxResult getUserInfo(String code, String agentId) { + log.info("[getUserInfo] code={}, agentId={}", code, agentId); + WeUserInfoVo userInfo = weUserService.getUserInfo(code, agentId); + log.info("[getUserInfp] userInfo={}", userInfo); + return AjaxResult.success(userInfo); } - - - - - } -- Gitee From efd77407996fa1d65302d20d962d38494a94381d Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Wed, 31 Mar 2021 21:01:03 +0800 Subject: [PATCH 11/50] =?UTF-8?q?:mute:=E7=A7=BB=E9=99=A4=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/linkwechat/web/controller/wecom/WeUserController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java index 3ed00440e..1d34cd2bf 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeUserController.java @@ -221,9 +221,7 @@ public class WeUserController extends BaseController { */ @GetMapping("/getUserInfo") public AjaxResult getUserInfo(String code, String agentId) { - log.info("[getUserInfo] code={}, agentId={}", code, agentId); WeUserInfoVo userInfo = weUserService.getUserInfo(code, agentId); - log.info("[getUserInfp] userInfo={}", userInfo); return AjaxResult.success(userInfo); } } -- Gitee From 53158addf42ae8d51816fd6d74b665d7d82bb1a9 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Thu, 1 Apr 2021 11:23:23 +0800 Subject: [PATCH 12/50] =?UTF-8?q?=E4=BC=81=E5=BE=AE=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E9=87=8D=E5=AE=9A=E5=90=91URL=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linkwe-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-admin/src/main/resources/application.yml b/linkwe-admin/src/main/resources/application.yml index ce15eafd5..6628a9758 100644 --- a/linkwe-admin/src/main/resources/application.yml +++ b/linkwe-admin/src/main/resources/application.yml @@ -224,7 +224,7 @@ wecome: # JS SDK 身份校验url authorizeUrl: https://open.weixin.qq.com/connect/oauth2/authorize # JS SDK身份校验成功后的redirect url - authorizeRedirectUrl: http://some_redirect_url/#/task + authorizeRedirectUrl: http://linkwechat.cn/mobile/#/task #腾讯云对象存储 cos: secretId: AKIDQRCizIeUGl13vakkDQMH0VkjhPr1rBBv -- Gitee From 0cc17d7e907c4c38acc8e6a1e50b62d6767494a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E5=BA=93=E6=B5=AA=E5=AD=90?= <1539136324@qq.com> Date: Thu, 1 Apr 2021 11:32:45 +0800 Subject: [PATCH 13/50] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BE=A4=E5=8F=91?= =?UTF-8?q?=E7=9B=B8=E5=85=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/wecom/WeMaterialController.java | 9 ++++++--- .../framework/config/SecurityConfig.java | 4 ++-- .../wecom/domain/dto/TemporaryMaterialDto.java | 15 +++++++++++++++ .../impl/WeCustomerMessagePushServiceImpl.java | 15 +++++++++++---- .../impl/WeCustomerMessageServiceImpl.java | 3 ++- 5 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/TemporaryMaterialDto.java diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeMaterialController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeMaterialController.java index 85bfdf2e3..443666a0b 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeMaterialController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeMaterialController.java @@ -8,6 +8,7 @@ import com.linkwechat.common.enums.BusinessType; import com.linkwechat.common.enums.MediaType; import com.linkwechat.wecom.domain.WeMaterial; import com.linkwechat.wecom.domain.dto.ResetCategoryDto; +import com.linkwechat.wecom.domain.dto.TemporaryMaterialDto; import com.linkwechat.wecom.domain.dto.WeMediaDto; import com.linkwechat.wecom.domain.vo.WeMaterialFileVO; import com.linkwechat.wecom.service.IWeMaterialService; @@ -135,10 +136,12 @@ public class WeMaterialController extends BaseController { //@PreAuthorize("@ss.hasPermi('wechat:material:temporaryMaterialMediaId')") @Log(title = "获取素材media_id", businessType = BusinessType.OTHER) - @GetMapping("/temporaryMaterialMediaId") + @PostMapping("/temporaryMaterialMediaId") @ApiOperation("获取素材media_id") - public AjaxResult temporaryMaterialMediaId(@RequestParam(value = "url") String url, @RequestParam(value = "type") String type,@RequestParam(value = "name") String name){ - WeMediaDto weMediaDto = materialService.uploadTemporaryMaterial(url, type,name); + public AjaxResult temporaryMaterialMediaId(@RequestBody TemporaryMaterialDto temporaryMaterialDto){ + WeMediaDto weMediaDto = materialService.uploadTemporaryMaterial(temporaryMaterialDto.getUrl(), + temporaryMaterialDto.getType() + ,temporaryMaterialDto.getName()); return AjaxResult.success(weMediaDto); } diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 1c646db44..e87c32966 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -121,8 +121,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/wecom/ticket/**").anonymous() .antMatchers("/wecom/user/getUserInfo").anonymous() - // .antMatchers("/common/uploadFile2Cos").anonymous() - .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() + // .antMatchers("/common/uploadFile2Cos").anonymous() +// .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() // 获取实际群活码和社群运营H5页面不需要登录 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/TemporaryMaterialDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/TemporaryMaterialDto.java new file mode 100644 index 000000000..7ad14ab7d --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/TemporaryMaterialDto.java @@ -0,0 +1,15 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +/** + * @description: 群发参数相关 + * @author: HaoN + * @create: 2021-03-31 17:20 + **/ +@Data +public class TemporaryMaterialDto { + private String url; + private String type; + private String name; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java index 8d5c31c38..6436142b0 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java @@ -1,6 +1,7 @@ package com.linkwechat.wecom.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; @@ -70,14 +71,20 @@ public class WeCustomerMessagePushServiceImpl implements IWeCustomerMessagePushS private WeCustomerMessageTimeTaskMapper customerMessageTimeTaskMapper; @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void addWeCustomerMessagePush(CustomerMessagePushDto customerMessagePushDto) throws JsonProcessingException, ParseException { - if ((null != customerMessagePushDto.getSettingTime() && !"".equals(customerMessagePushDto.getSettingTime())) - && DateUtils.diffTime(new Date(), DateUtil.parse(customerMessagePushDto.getSettingTime(), "yyyy-MM-dd HH:mm:ss")) > 0) { - throw new WeComException("发送时间不能小于当前时间"); +// if ((null != customerMessagePushDto.getSettingTime() && !"".equals(customerMessagePushDto.getSettingTime())) +// && DateUtils.diffTime(new Date(), DateUtil.parse(customerMessagePushDto.getSettingTime(), "yyyy-MM-dd HH:mm")) > 0) { +// throw new WeComException("发送时间不能小于当前时间"); +// } + + + if(StrUtil.isBlank(customerMessagePushDto.getSettingTime())){ + throw new WeComException("发送时间不能为空"); } + List customers = Lists.newArrayList(); List groups = new ArrayList<>(); // 0 发给客户 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessageServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessageServiceImpl.java index d0f047a4e..81aa74771 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessageServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessageServiceImpl.java @@ -148,7 +148,8 @@ public class WeCustomerMessageServiceImpl extends ServiceImpl Date: Thu, 1 Apr 2021 12:04:11 +0800 Subject: [PATCH 14/50] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E8=A2=AB=E9=87=8D=E5=A4=8D=E6=89=93=E6=A0=87=E7=AD=BE=E7=9A=84?= =?UTF-8?q?BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linkwechat/wecom/domain/vo/WeMakeCustomerTag.java | 6 ++++++ .../wecom/service/impl/WeCustomerServiceImpl.java | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMakeCustomerTag.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMakeCustomerTag.java index 0f91e02c8..ec0d01017 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMakeCustomerTag.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeMakeCustomerTag.java @@ -1,7 +1,10 @@ package com.linkwechat.wecom.domain.vo; import com.linkwechat.wecom.domain.WeTag; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @@ -11,6 +14,9 @@ import java.util.List; * @create: 2020-10-24 20:09 **/ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class WeMakeCustomerTag { private String externalUserid; private List addTag; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java index e4b0a2b0b..7bbaaaf74 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java @@ -347,14 +347,23 @@ public class WeCustomerServiceImpl extends ServiceImpl tagRels = new ArrayList<>(); List cutomerTagEdits = new ArrayList<>(); + flowerCustomerRels.stream().forEach(customer -> { CutomerTagEdit cutomerTagEdit = CutomerTagEdit.builder() .userid(customer.getUserId()) .external_userid(customer.getExternalUserid()) .build(); + List tags = new ArrayList<>(); addTags.stream().forEach(tag -> { tags.add(tag.getTagId()); -- Gitee From 620cdb25e97d58cacc861dccf18737fa31575d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E5=BA=93=E6=B5=AA=E5=AD=90?= <1539136324@qq.com> Date: Thu, 1 Apr 2021 14:14:45 +0800 Subject: [PATCH 15/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E5=AD=98=E6=A1=A3=E6=9F=A5=E8=AF=A2=E7=9B=B8=E5=85=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/ConversationArchiveQuery.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java index af9e1d6c7..ce93b2219 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java @@ -10,26 +10,26 @@ import lombok.Data; @Data public class ConversationArchiveQuery extends BaseEntity { /** 发送人Id */ - private String fromId; + private String fromId=""; /** 成员名称 */ - private String userName; + private String userName=""; /** 接收人Id */ - private String receiveId; + private String receiveId=""; /** 客户姓名 */ - private String customerName; + private String customerName=""; /** 群聊Id */ - private String roomId; + private String roomId=""; /** 类型 */ - private String msgType; + private String msgType=""; /** 关键词 **/ - private String keyWord; + private String keyWord=""; /** 消息动作 */ - private String action; + private String action=""; } -- Gitee From c3b0d208db73ea98bdbda0bd407a20c37a308395 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Thu, 1 Apr 2021 17:34:05 +0800 Subject: [PATCH 16/50] =?UTF-8?q?=E7=A4=BE=E7=BE=A4=E8=BF=90=E8=90=A5-?= =?UTF-8?q?=E4=BC=81=E5=BE=AE=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/WeCommunityGroupSopController.java | 7 +++- .../wecom/WeCommunityH5Controller.java | 2 +- .../WeCommunityPresTagGroupController.java | 23 ++++++++++- .../src/main/resources/application.yml | 2 +- .../wecom/domain/WePresTagGroupTask.java | 2 +- .../wecom/service/IWeGroupSopService.java | 7 ++++ .../service/IWePresTagGroupTaskService.java | 18 +++++--- .../service/impl/WeGroupSopServiceImpl.java | 27 +++++++----- .../impl/WePresTagGroupTaskServiceImpl.java | 41 ++++++++----------- 9 files changed, 82 insertions(+), 47 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityGroupSopController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityGroupSopController.java index fd01bd277..8b87b5727 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityGroupSopController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityGroupSopController.java @@ -76,7 +76,12 @@ public class WeCommunityGroupSopController extends BaseController { List materialIdList = groupSopDto.getMaterialIdList(); // 上传的图片的URl列表 List picList = groupSopDto.getPicList(); - return toAjax(groupSopService.addGroupSop(weGroupSop, groupIdList, materialIdList, picList)); + int affectedRows = groupSopService.addGroupSop(weGroupSop, groupIdList, materialIdList, picList); + if (affectedRows > 0) { + // 添加成功后进行异步消息推送 + groupSopService.sendMessage(groupIdList); + } + return toAjax(affectedRows); } /** diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java index c00f7d074..8f0967343 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityH5Controller.java @@ -80,7 +80,7 @@ public class WeCommunityH5Controller extends BaseController { res.put("todo", todoList); doneList.addAll(tagGroupTaskService.getEmplTaskList(emplId, true)); doneList.addAll(sopService.getEmplTaskList(emplId, true)); - res.put("done", todoList); + res.put("done", doneList); } SysUser user = userService.selectUserByUserName(emplId); boolean isAdmin = user != null && user.isAdmin(); diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java index 301186427..6ab2df6c6 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java @@ -5,6 +5,10 @@ import com.linkwechat.common.constant.HttpStatus; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.AjaxResult; import com.linkwechat.common.core.page.TableDataInfo; +import com.linkwechat.common.utils.SecurityUtils; +import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.common.utils.bean.BeanUtils; +import com.linkwechat.wecom.domain.WePresTagGroupTask; import com.linkwechat.wecom.domain.dto.WePresTagGroupTaskDto; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskVo; @@ -56,7 +60,18 @@ public class WeCommunityPresTagGroupController extends BaseController { if (null == groupCodeService.selectWeGroupCodeById(wePresTagGroupTaskDto.getGroupCodeId())) { return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); } - return toAjax(taskService.add(wePresTagGroupTaskDto)); + // 创建新任务并保存 + WePresTagGroupTask task = new WePresTagGroupTask(); + BeanUtils.copyProperties(wePresTagGroupTaskDto, task); + task.setCreateBy(SecurityUtils.getUsername()); + List tagList = wePresTagGroupTaskDto.getTagList(); + List scopeList = wePresTagGroupTaskDto.getScopeList(); + int affectedRows = taskService.add(task, tagList, scopeList); + if (affectedRows > 0) { + // 若保存成功,则进行异步消息推送 + taskService.sendMessage(task); + } + return toAjax(affectedRows); } /** @@ -65,7 +80,11 @@ public class WeCommunityPresTagGroupController extends BaseController { // @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:query')") @GetMapping(path = "/{id}") public AjaxResult getTask(@PathVariable("id") Long id) { - return AjaxResult.success(taskService.getTaskById(id)); + WePresTagGroupTaskVo taskVo = taskService.getTaskById(id); + if (StringUtils.isNull(taskVo)) { + return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); + } + return AjaxResult.success(); } /** diff --git a/linkwe-admin/src/main/resources/application.yml b/linkwe-admin/src/main/resources/application.yml index 6628a9758..680d8fe98 100644 --- a/linkwe-admin/src/main/resources/application.yml +++ b/linkwe-admin/src/main/resources/application.yml @@ -224,7 +224,7 @@ wecome: # JS SDK 身份校验url authorizeUrl: https://open.weixin.qq.com/connect/oauth2/authorize # JS SDK身份校验成功后的redirect url - authorizeRedirectUrl: http://linkwechat.cn/mobile/#/task + authorizeRedirectUrl: http://www.linkwechat.cn/mobile/#/task #腾讯云对象存储 cos: secretId: AKIDQRCizIeUGl13vakkDQMH0VkjhPr1rBBv diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java index f72d4b1f7..0e2c5d328 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java @@ -19,7 +19,7 @@ public class WePresTagGroupTask extends BaseEntity { *主键ID */ @TableId - private Long taskId = SnowFlakeUtil.nextId();; + private Long taskId = SnowFlakeUtil.nextId(); /** * 任务名称 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java index 6ce6d8036..8fedc64e2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java @@ -1,5 +1,6 @@ package com.linkwechat.wecom.service; +import com.linkwechat.wecom.domain.WeGroup; import com.linkwechat.wecom.domain.WeGroupSop; import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; import com.linkwechat.wecom.domain.vo.WeGroupSopVo; @@ -95,4 +96,10 @@ public interface IWeGroupSopService { * @return 结果 */ List getScopeListByRuleId(Long ruleId); + + /** + * 向指定的群聊进行sop企微消息推送 + * @param groupIdList 群聊id列表 + */ + void sendMessage(List groupIdList); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java index 8125f0d4c..44b814a5d 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java @@ -1,5 +1,6 @@ package com.linkwechat.wecom.service; +import com.linkwechat.wecom.domain.WePresTagGroupTask; import com.linkwechat.wecom.domain.WeTag; import com.linkwechat.wecom.domain.dto.WePresTagGroupTaskDto; import com.linkwechat.wecom.domain.vo.WeCommunityTaskEmplVo; @@ -14,12 +15,13 @@ import java.util.List; public interface IWePresTagGroupTaskService { /** - * 新增建群任务 - * - * @param taskDto 建群所需数据 - * @return 数据库新增行数 + * 添加新标签建群任务 + * @param task 建群任务本体信息 + * @param tagIdList 标签列表 + * @param emplIdList 员工列表 + * @return 结果 */ - int add(WePresTagGroupTaskDto taskDto); + int add(WePresTagGroupTask task, List tagIdList, List emplIdList); /** * 根据条件查询任务列表 @@ -108,4 +110,10 @@ public interface IWePresTagGroupTaskService { * @return 结果 */ int updateEmplTaskStatus(Long taskId, String emplId); + + /** + * 根据标签建群任务信息发送消息 + * @param task 标签建群任务 + */ + void sendMessage(WePresTagGroupTask task); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java index 8f105c97d..459b0abbf 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupSopServiceImpl.java @@ -18,6 +18,7 @@ import com.linkwechat.wecom.service.IWeGroupSopService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,15 +56,12 @@ public class WeGroupSopServiceImpl extends ServiceImpl groupIdList) { + // 构造请求参数 WeMessagePushDto pushDto = new WeMessagePushDto(); - // 根据群聊获取员工(群主)列表 - List groupList = this.getGroupListByRuleId(ruleId); + // 查询群聊列表,获取群主列表 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("chat_id", groupIdList); + List groupList = groupMapper.selectList(queryWrapper); String toUser = groupList.stream().map(WeGroup::getOwner).collect(Collectors.joining("|")); pushDto.setTouser(toUser); // 获取agentId WeCorpAccount validWeCorpAccount = corpAccountService.findValidWeCorpAccount(); String agentId = validWeCorpAccount.getAgentId(); + String corpId = validWeCorpAccount.getCorpId(); if (StringUtils.isEmpty(agentId)) { throw new WeComException("当前agentId不可用或不存在"); } @@ -341,7 +346,7 @@ public class WeGroupSopServiceImpl extends ServiceImpl请点击此链接查看", + "你有新的SOP待发送,请点击此链接查看", authorizeUrl, corpId, REDIRECT_URI); text.setContent(context); pushDto.setText(text); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java index 00993746a..1aa85ba42 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java @@ -27,6 +27,7 @@ import com.linkwechat.wecom.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -76,28 +77,18 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl tagIdList, List emplIdList) { if (taskMapper.insertTask(task) > 0) { // 保存标签对象 - List tagIdList = taskDto.getTagList(); if (CollectionUtil.isNotEmpty(tagIdList)) { List taskTagList = tagIdList .stream() @@ -107,7 +98,6 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl emplIdList = taskDto.getScopeList(); if (CollectionUtil.isNotEmpty(emplIdList)) { List wePresTagGroupTaskScopeList = emplIdList .stream() @@ -115,13 +105,9 @@ public class WePresTagGroupTaskServiceImpl extends ServiceImpl Date: Sat, 3 Apr 2021 12:45:43 +0800 Subject: [PATCH 17/50] =?UTF-8?q?api=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/WeChatContactMappingController.java | 9 ++++++-- .../WeConversationArchiveController.java | 14 ++++++++--- .../core/domain/ConversationArchiveQuery.java | 13 ++++++++++- .../wecom/domain/WeChatContactMapping.java | 18 +++++++++++++-- .../com/linkwechat/wecom/domain/WeUser.java | 23 +++++++++++++++++++ 5 files changed, 69 insertions(+), 8 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java index f802b3824..24166dfb7 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java @@ -10,6 +10,8 @@ import com.linkwechat.common.utils.poi.ExcelUtil; import com.linkwechat.wecom.domain.WeChatContactMapping; import com.linkwechat.wecom.domain.WeCustomer; import com.linkwechat.wecom.service.IWeChatContactMappingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -29,6 +31,7 @@ import java.util.List; * @author ruoyi * @date 2020-12-27 */ +@Api("聊天关系映射Controller") @RestController @RequestMapping("/chat/mapping") public class WeChatContactMappingController extends BaseController @@ -40,8 +43,9 @@ public class WeChatContactMappingController extends BaseController * 查询聊天关系映射列表 */ // @PreAuthorize("@ss.hasPermi('chat:mapping:list')") + @ApiOperation(value = "查询聊天关系映射列表",httpMethod = "GET") @GetMapping("/list") - public TableDataInfo list(WeChatContactMapping weChatContactMapping) + public TableDataInfo> list(WeChatContactMapping weChatContactMapping) { startPage(); List list = weChatContactMappingService.selectWeChatContactMappingList(weChatContactMapping); @@ -52,8 +56,9 @@ public class WeChatContactMappingController extends BaseController * 按客户查询关系映射列表 */ // @PreAuthorize("@ss.hasPermi('chat:mapping:listByCustomer')") + @ApiOperation(value = "按客户查询关系映射列表",httpMethod = "GET") @GetMapping("/listByCustomer") - public TableDataInfo listByCustomer() + public TableDataInfo> listByCustomer() { startPage(); PageInfo weCustomerPageInfo = weChatContactMappingService.listByCustomer(); diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeConversationArchiveController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeConversationArchiveController.java index 21a1610ec..fa47b970d 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeConversationArchiveController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeConversationArchiveController.java @@ -1,9 +1,13 @@ package com.linkwechat.web.controller.wecom; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.ConversationArchiveQuery; import com.linkwechat.common.core.page.TableDataInfo; import com.linkwechat.wecom.service.IWeConversationArchiveService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -16,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController; * @description 会话存档controller * @date 2020/12/19 13:51 **/ +@Api("会话存档controller") @Slf4j @RestController @RequestMapping("/wecom/finance") @@ -32,8 +37,9 @@ public class WeConversationArchiveController extends BaseController { * @return */ // @PreAuthorize("@ss.hasPermi('conversationArchive:chatContact:list')") + @ApiOperation(value = "获取单聊会话数据接口",httpMethod = "GET") @GetMapping("/getChatContactList") - public TableDataInfo getChatContactList(ConversationArchiveQuery query) { + public TableDataInfo> getChatContactList(ConversationArchiveQuery query) { return getDataTable(weConversationArchiveService.getChatContactList(query)); } @@ -47,8 +53,9 @@ public class WeConversationArchiveController extends BaseController { * @return */ // @PreAuthorize("@ss.hasPermi('conversationArchive:chatRoomContact:list')") + @ApiOperation(value = "获取群聊会话数据接口",httpMethod = "GET") @GetMapping("/getChatRoomContactList") - public TableDataInfo getChatRoomContactList(ConversationArchiveQuery query) { + public TableDataInfo> getChatRoomContactList(ConversationArchiveQuery query) { return getDataTable(weConversationArchiveService.getChatRoomContactList(query)); } @@ -60,8 +67,9 @@ public class WeConversationArchiveController extends BaseController { * @return */ // @PreAuthorize("@ss.hasPermi('conversationArchive:chatAllContact:list')") + @ApiOperation(value = "获取全局会话数据接口",httpMethod = "GET") @GetMapping("/getChatAllList") - public TableDataInfo getChatAllList(ConversationArchiveQuery query) { + public TableDataInfo> getChatAllList(ConversationArchiveQuery query) { return getDataTable(weConversationArchiveService.getChatAllList(query)); } diff --git a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java index ce93b2219..d2b51eebc 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/ConversationArchiveQuery.java @@ -1,5 +1,7 @@ package com.linkwechat.common.core.domain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -7,29 +9,38 @@ import lombok.Data; * @description 会话存档接口入参实体 * @date 2020/12/29 14:23 **/ +@ApiModel @Data public class ConversationArchiveQuery extends BaseEntity { /** 发送人Id */ + @ApiModelProperty("发送人Id") private String fromId=""; /** 成员名称 */ + @ApiModelProperty("成员名称") private String userName=""; /** 接收人Id */ + @ApiModelProperty("接收人Id") private String receiveId=""; /** 客户姓名 */ + @ApiModelProperty("客户姓名") private String customerName=""; /** 群聊Id */ + @ApiModelProperty("群聊Id") private String roomId=""; - /** 类型 */ + /** 消息类型(同企微api文档消息类型) */ + @ApiModelProperty("消息类型(同企微api文档消息类型)") private String msgType=""; /** 关键词 **/ + @ApiModelProperty("关键词") private String keyWord=""; /** 消息动作 */ + @ApiModelProperty("消息动作") private String action=""; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeChatContactMapping.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeChatContactMapping.java index 1d5c0e6f5..d6088806c 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeChatContactMapping.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeChatContactMapping.java @@ -3,6 +3,8 @@ package com.linkwechat.wecom.domain; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import com.linkwechat.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,6 +14,7 @@ import lombok.Data; * @author ruoyi * @date 2020-12-27 */ +@ApiModel @Data public class WeChatContactMapping { private static final long serialVersionUID = 1L; @@ -24,66 +27,77 @@ public class WeChatContactMapping { /** * 发送人id */ + @ApiModelProperty("发送人id") @Excel(name = "发送人id") private String fromId; /** * 接收人id */ + @ApiModelProperty("接收人id") @Excel(name = "接收人id") private String receiveId; /** * 群聊id */ + @ApiModelProperty("群聊id") @Excel(name = "群聊id") private String roomId; /** * 是否为客户 0-成员 1-客户 2-机器人 */ + @ApiModelProperty("是否为客户 0-成员 1-客户 2-机器人") @Excel(name = "是否为客户 0-成员 1-客户 2-机器人") private Integer isCustom; /** * 是否为客户 0-内部 1-外部 2-群聊 */ + @ApiModelProperty("是否为客户 0-内部 1-外部 2-群聊") @TableField(exist = false) private Integer searchType; /** - * 内部接收人信息 + * 内部发送人信息 */ + @ApiModelProperty("内部发送人信息") @TableField(exist = false) private WeUser fromWeUser; /** - * 外部接收人信息 + * 外部发送人信息 */ + @ApiModelProperty("外部发送人信息") @TableField(exist = false) private WeCustomer fromWeCustomer; /** * 内部接收人信息 */ + @ApiModelProperty("内部接收人信息") @TableField(exist = false) private WeUser receiveWeUser; /** * 外部接收人信息 */ + @ApiModelProperty("外部接收人信息") @TableField(exist = false) private WeCustomer receiveWeCustomer; /** * 群信息 */ + @ApiModelProperty("群信息") @TableField(exist = false) private WeGroup roomInfo; /** * 最后一条聊天数据 */ + @ApiModelProperty("最后一条聊天数据") @TableField(exist = false) private JSONObject finalChatContext; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java index 13dd7649e..879c0da73 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java @@ -28,6 +28,7 @@ import java.util.Date; * @author ruoyi * @date 2020-08-31 */ +@ApiModel @Data @TableName("we_user") @Builder @@ -39,79 +40,101 @@ public class WeUser /** 用户头像 */ + @ApiModelProperty("用户头像") @TableField(value = "head_image_url") private String avatarMediaid; /** 用户名称 */ + @ApiModelProperty("用户名称") @NotBlank(message = "姓名不可为空") @TableField(value = "user_name") private String name; /** 用户昵称 */ + @ApiModelProperty("用户昵称") private String alias; /** 账号 */ + @ApiModelProperty("账号") @NotBlank(message = "账号不可为空") @TableId private String userId; /** 性别。1表示男性,2表示女性 */ + @ApiModelProperty("性别。1表示男性,2表示女性") private Integer gender; /** 手机号 */ + @ApiModelProperty("手机号") @NotBlank(message = "手机号不可为空") private String mobile; /** 邮箱 */ + @ApiModelProperty("邮箱") private String email; /** 个人微信号 */ + @ApiModelProperty("个人微信号") private String wxAccount; /** 用户所属部门,使用逗号隔开,字符串格式存储 */ + @ApiModelProperty("用户所属部门") private String[] department; /** 职务 */ + @ApiModelProperty("职务") private String position; /** 1表示为上级,0表示普通成员(非上级)。 */ + @ApiModelProperty("1表示为上级,0表示普通成员(非上级)") private String[] isLeaderInDept; /** 入职时间 */ + @ApiModelProperty("入职时间") @JsonFormat(pattern = "yyyy-MM-dd") private Date joinTime; /** 是否启用(1表示启用成员,0表示禁用成员) */ + @ApiModelProperty("是否启用(1表示启用成员,0表示禁用成员)") private Integer enable; /** 身份证号 */ + @ApiModelProperty("身份证号") private String idCard; /** QQ号 */ + @ApiModelProperty("QQ号") private String qqAccount; /** 座机 */ + @ApiModelProperty("座机") private String telephone; /** 地址 */ + @ApiModelProperty("地址") private String address; /** 生日 */ @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("生日") private Date birthday; /** 是否激活(1:是;2:否)该字段主要表示当前信息是否同步微信 */ /** 激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业,6=删除 */ + @ApiModelProperty("激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业,6=删除") private Integer isActivate; /** 离职是否分配(1:已分配;0:未分配;) */ + @ApiModelProperty("离职是否分配(1:已分配;0:未分配;)") private Integer isAllocate; /** 离职时间 */ + @ApiModelProperty("离职时间") private Date dimissionTime; + @ApiModelProperty("备注") private String remark; @TableField(exist = false) -- Gitee From 63234d605f48b35c7926d2107ac1157da47dd9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Tue, 6 Apr 2021 13:29:26 +0800 Subject: [PATCH 18/50] =?UTF-8?q?:adhesive=5Fbandage:=E4=BF=AE=E6=94=B9ext?= =?UTF-8?q?ernal=5Fuserid=E4=B8=BAunionId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/WeTaskFissionController.java | 6 +++--- .../domain/dto/WeTaskFissionPosterDTO.java | 2 +- .../service/impl/WeTaskFissionServiceImpl.java | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java index fb7d99293..cef8aa588 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java @@ -245,12 +245,12 @@ public class WeTaskFissionController extends BaseController { @ApiOperation(value = "获取客户邀请列表和任务进度", httpMethod = "GET") // @PreAuthorize("@ss.hasPermi('wecom:fission:getCustomerProgress')") @Log(title = "获取客户邀请列表和任务进度", businessType = BusinessType.OTHER) - @GetMapping("/{id}/progress/{eid}") + @GetMapping("/{id}/progress/{unionId}") public AjaxResult getCustomerProgress(@ApiParam("任务id") @PathVariable("id") Long id - , @PathVariable("eid") @ApiParam("客户id") String eid) { + , @PathVariable("unionId") @ApiParam("客户id") String unionId) { WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(id); if (weTaskFission != null) { - return AjaxResult.success(weTaskFissionService.getCustomerTaskProgress(weTaskFission, eid)); + return AjaxResult.success(weTaskFissionService.getCustomerTaskProgress(weTaskFission, unionId)); } else { throw new WeComException("任务不存在"); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeTaskFissionPosterDTO.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeTaskFissionPosterDTO.java index 832ec1d1b..f09ae3661 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeTaskFissionPosterDTO.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeTaskFissionPosterDTO.java @@ -13,7 +13,7 @@ import lombok.Data; @Data public class WeTaskFissionPosterDTO { @ApiModelProperty("客户id") - private String eid; + private String unionId; @ApiModelProperty("任务id") private Long taskFissionId; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 216aeaa0d..c0e9fc88a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -247,10 +247,10 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { @Transactional public String fissionPosterGenerate(WeTaskFissionPosterDTO weTaskFissionPosterDTO) { WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper() - .eq(WeCustomer::getExternalUserid, weTaskFissionPosterDTO.getEid())); + .eq(WeCustomer::getUnionid, weTaskFissionPosterDTO.getUnionId())); if (weCustomer != null) { //任务表添加当前客户任务 - WeTaskFissionRecord record = getTaskFissionRecordId(weTaskFissionPosterDTO.getTaskFissionId(), weCustomer.getExternalUserid(), weCustomer.getName()); + WeTaskFissionRecord record = getTaskFissionRecordId(weTaskFissionPosterDTO.getTaskFissionId(), weCustomer.getUnionid(), weCustomer.getName()); String posterUrl = record.getPoster(); if (StringUtils.isBlank(posterUrl)) { String qrcode = getPosterQRCode(weTaskFissionPosterDTO.getFissionTargetId(), record, weCustomer); @@ -292,20 +292,20 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { } @Override - public List getCustomerListById(String eid, String fissionId) { + public List getCustomerListById(String unionId, String fissionId) { WeTaskFissionRecord weTaskFissionRecord; - if (StringUtils.isEmpty(eid)) { + if (StringUtils.isEmpty(unionId)) { List weTaskFissionRecords = weTaskFissionRecordService .list(new LambdaQueryWrapper().eq(WeTaskFissionRecord::getTaskFissionId, fissionId)); return Optional.ofNullable(weTaskFissionRecords).orElseGet(ArrayList::new).stream() .map(record -> weCustomerService.selectWeCustomerById(record.getCustomerId())) .filter(Objects::nonNull).collect(Collectors.toList()); } else { - WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getExternalUserid, eid)); - String externalUseriId = Optional.ofNullable(weCustomer).map(WeCustomer::getExternalUserid) + WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getUnionid, unionId)); + String uid = Optional.ofNullable(weCustomer).map(WeCustomer::getUnionid) .orElseThrow(() -> new WeComException("用户信息不存在")); weTaskFissionRecord = weTaskFissionRecordService - .selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), externalUseriId); + .selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), uid); Optional.ofNullable(weTaskFissionRecord).map(WeTaskFissionRecord::getId) .orElseThrow(() -> new WeComException("任务记录信息不存在")); List list = weFlowerCustomerRelService.list(new LambdaQueryWrapper() @@ -351,10 +351,10 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { } @Override - public WeTaskFissionProgressVO getCustomerTaskProgress(WeTaskFission taskFission, String eid) { + public WeTaskFissionProgressVO getCustomerTaskProgress(WeTaskFission taskFission, String unionId) { long complete = 0L; long total = taskFission.getFissNum(); - List list = getCustomerListById(eid, String.valueOf(taskFission.getId())); + List list = getCustomerListById(unionId, String.valueOf(taskFission.getId())); if (CollectionUtils.isNotEmpty(list)) { complete = list.size(); } else { -- Gitee From b53ed35ba31764f71716e5028021771a683bb8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Wed, 7 Apr 2021 14:05:38 +0800 Subject: [PATCH 19/50] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=8A=E6=8B=A6=E6=88=AA=E5=99=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/weixin/WxAuthController.java | 48 +++++++++ .../common/constant/WeConstans.java | 11 +++ .../framework/config/SecurityConfig.java | 3 +- .../wecom/client/WeAccessTokenClient.java | 6 +- .../linkwechat/wecom/client/WeAppClient.java | 3 + .../wecom/client/WeCropTagClient.java | 3 + .../wecom/client/WeCustomerClient.java | 7 +- .../wecom/client/WeCustomerGroupClient.java | 3 + .../client/WeCustomerMessagePushClient.java | 7 +- .../wecom/client/WeDepartMentClient.java | 3 + .../wecom/client/WeExternalContactClient.java | 3 + .../wecom/client/WeMediaClient.java | 3 + .../wecom/client/WeMessagePushClient.java | 3 + .../wecom/client/WeMsgAuditClient.java | 3 + .../wecom/client/WeTicketClient.java | 3 + .../linkwechat/wecom/client/WeUserClient.java | 7 +- .../domain/weixin/dto/WxAuthUserInfoDto.java | 42 ++++++++ .../domain/weixin/dto/WxBaseResultDto.java | 14 +++ .../wecom/domain/weixin/dto/WxTokenDto.java | 30 ++++++ .../interceptor/WeAccessTokenInterceptor.java | 11 --- .../WeiXinAccessTokenInterceptor.java | 90 +++++++++++++++++ .../interceptor/WeiXinAuthInterceptor.java | 99 +++++++++++++++++++ .../wecom/service/IWxAuthService.java | 15 +++ .../service/impl/IWxAuthServiceImpl.java | 57 +++++++++++ .../wecom/wxclient/WxAuthClient.java | 63 ++++++++++++ .../wecom/wxclient/WxCommonClient.java | 36 +++++++ 26 files changed, 546 insertions(+), 27 deletions(-) create mode 100644 linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxBaseResultDto.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxTokenDto.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAccessTokenInterceptor.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWxAuthService.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/IWxAuthServiceImpl.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java create mode 100644 linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxCommonClient.java diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java new file mode 100644 index 000000000..3bf92279b --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java @@ -0,0 +1,48 @@ +package com.linkwechat.web.controller.weixin; + +import com.linkwechat.common.core.domain.AjaxResult; +import com.linkwechat.web.controller.common.CommonController; +import com.linkwechat.wecom.domain.weixin.dto.WxAuthUserInfoDto; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.service.IWxAuthService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author danmo + * @description 微信授权controller + * @date 2021/4/5 18:37 + **/ +@Api("微信授权controller") +@Slf4j +@RestController +@RequestMapping("/weixin/auth") +public class WxAuthController extends CommonController { + + @Autowired + private IWxAuthService wxAuthService; + + /** + * 通过code获取网页授权token + */ + @ApiOperation(value = "通过code获取网页授权token",httpMethod = "GET") + @GetMapping("/getToken") + public AjaxResult getToken(@ApiParam(value = "URL上的code参数",required = true) String code, @ApiParam(value = "用户的唯一标识",required = true) String openId) { + return AjaxResult.success(wxAuthService.getToken(code,openId)); + } + + /** + * 拉取用户信息(需scope为 snsapi_userinfo) + */ + @ApiOperation(value = "拉取用户信息(需scope为 snsapi_userinfo)",httpMethod = "GET") + @GetMapping("/getUserInfo") + public AjaxResult getUserInfo(@ApiParam(value = "用户的唯一标识",required = true) String openId, @ApiParam(value = "语言版本",required = true) String lang) { + return AjaxResult.success(wxAuthService.getUserInfo(openId,lang)); + } +} diff --git a/linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java b/linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java index 9ab793bf7..d51c77cfc 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java @@ -13,6 +13,17 @@ import java.util.Map; **/ public class WeConstans { + /** + * 微信授权token + */ + public static final String WX_AUTH_ACCESS_TOKEN = "wx_auth_access_token"; + public static final String WX_AUTH_REFRESH_ACCESS_TOKEN = "wx_auth_refresh_access_token"; + + /** + * 微信通用token + */ + public static final String WX_ACCESS_TOKEN = "wx_access_token"; + /** * 企业微信相关token */ diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index e87c32966..067f1d21f 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -128,7 +128,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // 获取实际群活码和社群运营H5页面不需要登录 .antMatchers("/wecom/groupCode/getActualCode/**").anonymous() .antMatchers("/wecom/community/h5/**").anonymous() - + //微信授权接口 + .antMatchers("/weixin/auth/**").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java index 2a3e6ec37..a563ffb14 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java @@ -1,20 +1,20 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.Body; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeAccessTokenDtoDto; import com.linkwechat.wecom.domain.dto.WeLoginUserInfoDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 获取企业微信Token相关 * @author: HaoN * @create: 2020-08-26 14:33 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeAccessTokenClient { - - - /** * 获取token(常用token,联系人token) * @param corpId 企业id diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java index 340517623..a7a40ead2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java @@ -1,15 +1,18 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeAppDetailDto; import com.linkwechat.wecom.domain.dto.WeAppDto; import com.linkwechat.wecom.domain.dto.WeResultDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * 应用管理相关接口 */ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeAppClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java index 78805e84f..05700efb0 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java @@ -1,16 +1,19 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.Body; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeResultDto; import com.linkwechat.wecom.domain.dto.tag.*; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 企业微信标签相关 * @author: HaoN * @create: 2020-10-17 11:00 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCropTagClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java index c18256ec2..e4219c329 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java @@ -1,13 +1,11 @@ package com.linkwechat.wecom.client; -import com.dtflys.forest.annotation.DataObject; -import com.dtflys.forest.annotation.JSONBody; -import com.dtflys.forest.annotation.Query; -import com.dtflys.forest.annotation.Request; +import com.dtflys.forest.annotation.*; import com.linkwechat.wecom.domain.dto.*; import com.linkwechat.wecom.domain.dto.customer.*; import com.linkwechat.wecom.domain.query.GroupChatStatisticQuery; import com.linkwechat.wecom.domain.query.UserBehaviorDataQuery; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; import java.util.Map; @@ -17,6 +15,7 @@ import java.util.Map; * @author: HaoN * @create: 2020-09-15 14:15 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java index 9adaa5455..963165aa7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java @@ -1,16 +1,19 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.customer.CustomerGroupDetail; import com.linkwechat.wecom.domain.dto.customer.CustomerGroupList; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 客户群 * @author: HaoN * @create: 2020-10-20 21:50 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerGroupClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java index 84408de31..9564f798f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java @@ -1,19 +1,18 @@ package com.linkwechat.wecom.client; -import com.dtflys.forest.annotation.Body; -import com.dtflys.forest.annotation.DataObject; -import com.dtflys.forest.annotation.Query; -import com.dtflys.forest.annotation.Request; +import com.dtflys.forest.annotation.*; import com.linkwechat.wecom.domain.dto.message.QueryCustomerMessageStatusResultDataObjectDto; import com.linkwechat.wecom.domain.dto.message.QueryCustomerMessageStatusResultDto; import com.linkwechat.wecom.domain.dto.message.SendMessageResultDto; import com.linkwechat.wecom.domain.dto.message.WeCustomerMessagePushDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 群发消息 * @author: KeWen * @create: 2020-10-25 21:34 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerMessagePushClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java index cf0525723..c5da01919 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java @@ -1,16 +1,19 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeDepartMentDto; import com.linkwechat.wecom.domain.dto.WeResultDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 企业微信部门相关客户端 * @author: HaoN * @create: 2020-08-27 16:40 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeDepartMentClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java index e0354cfcf..45b66b010 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java @@ -1,15 +1,18 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeExternalContactDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 员工对外联系方式 * @author: HaoN * @create: 2020-10-13 10:39 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeExternalContactClient { @Request(url = "/externalcontact/add_contact_way", diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java index c52817499..8cafe75a2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java @@ -1,9 +1,11 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataFile; import com.dtflys.forest.annotation.Post; import com.dtflys.forest.annotation.Query; import com.linkwechat.wecom.domain.dto.WeMediaDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; import org.springframework.web.multipart.MultipartFile; import java.io.File; @@ -15,6 +17,7 @@ import java.io.InputStream; * @Description: * @Date: create in 2020/9/24 0024 0:14 */ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMediaClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java index 56a606498..16ee17ed8 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java @@ -1,11 +1,13 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.Header; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.WeMessagePushDto; import com.linkwechat.wecom.domain.dto.WeMessagePushGroupDto; import com.linkwechat.wecom.domain.dto.WeMessagePushResultDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 消息推送 @@ -13,6 +15,7 @@ import com.linkwechat.wecom.domain.dto.WeMessagePushResultDto; * @create: 2020-10-17 22:41 **/ @SuppressWarnings("all") +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMessagePushClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java index 01914abb4..6300c6355 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java @@ -1,16 +1,19 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.DataObject; import com.dtflys.forest.annotation.DataVariable; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.dto.msgaudit.WeMsgAuditDto; import com.linkwechat.wecom.domain.vo.WeMsgAuditVo; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @author danmo * @description 会话存档接口 * @date 2020/12/2 16:45 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMsgAuditClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java index 6ecfe4d38..2bd9346da 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java @@ -1,14 +1,17 @@ package com.linkwechat.wecom.client; +import com.dtflys.forest.annotation.BaseRequest; import com.dtflys.forest.annotation.Header; import com.dtflys.forest.annotation.Request; import com.linkwechat.wecom.domain.WeH5TicketDto; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @author danmo * @description h5获取签名 * @date 2021/1/6 11:51 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeTicketClient { /** * 获取去企业jsapi_ticket diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java index b998633f0..1881de06f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java @@ -1,16 +1,15 @@ package com.linkwechat.wecom.client; -import com.dtflys.forest.annotation.DataObject; -import com.dtflys.forest.annotation.Header; -import com.dtflys.forest.annotation.Query; -import com.dtflys.forest.annotation.Request; +import com.dtflys.forest.annotation.*; import com.linkwechat.wecom.domain.dto.*; +import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * @description: 企业微信通讯录成员 * @author: HaoN * @create: 2020-08-27 16:42 **/ +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeUserClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java new file mode 100644 index 000000000..0fdd8b1b7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java @@ -0,0 +1,42 @@ +package com.linkwechat.wecom.domain.weixin.dto; + +import com.alibaba.fastjson.JSONArray; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author danmo + * @description 授权用户信息 + * @date 2021/4/5 16:12 + **/ +@ApiModel +@Data +public class WxAuthUserInfoDto extends WxBaseResultDto{ + @ApiModelProperty("用户的唯一标识") + private String openId; + + @ApiModelProperty("用户昵称") + private String nickName; + + @ApiModelProperty("用户的性别,值为1时是男性,值为2时是女性,值为0时是未知") + private String sex; + + @ApiModelProperty("用户个人资料填写的省份") + private String province; + + @ApiModelProperty("普通用户个人资料填写的城市") + private String city; + + @ApiModelProperty("国家,如中国为CN") + private String country; + + @ApiModelProperty("用户头像") + private String headImgUrl; + + @ApiModelProperty("用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)") + private JSONArray privilege; + + @ApiModelProperty("只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。") + private String unionId; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxBaseResultDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxBaseResultDto.java new file mode 100644 index 000000000..c36c2d19c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxBaseResultDto.java @@ -0,0 +1,14 @@ +package com.linkwechat.wecom.domain.weixin.dto; + +import lombok.Data; + +/** + * @author danmo + * @description + * @date 2021/4/5 15:59 + **/ +@Data +public class WxBaseResultDto { + private Integer errcode; + private String errmsg; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxTokenDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxTokenDto.java new file mode 100644 index 000000000..872439508 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxTokenDto.java @@ -0,0 +1,30 @@ +package com.linkwechat.wecom.domain.weixin.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author danmo + * @description + * @date 2021/4/5 16:01 + **/ +@ApiModel +@Data +public class WxTokenDto extends WxBaseResultDto { + + @ApiModelProperty("网页授权接口调用凭证token") + private String accessToken; + + @ApiModelProperty("超时时间,单位(秒)") + private Integer expiresIn; + + @ApiModelProperty("用户刷新access_token") + private String refreshToken; + + @ApiModelProperty("用户唯一标识") + private String openId; + + @ApiModelProperty("用户授权的作用域,使用逗号(,)分隔") + private String scope; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeAccessTokenInterceptor.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeAccessTokenInterceptor.java index a75e15fe0..8afe85a24 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeAccessTokenInterceptor.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeAccessTokenInterceptor.java @@ -40,12 +40,6 @@ public class WeAccessTokenInterceptor implements Interceptor{ */ @Override public boolean beforeExecute(ForestRequest request) { - - - - - - String uri=request.getUrl().replace("http://",""); log.info(">>>>>>>>>>>>>>>>>>>>>>>>uri:{}",uri); //request.setContentType("application/json"); @@ -53,9 +47,6 @@ public class WeAccessTokenInterceptor implements Interceptor{ request.setDataType(ForestDataType.JSON); request.setContentType("application/json"); } - - - // 添加请求参数access_token if(!Arrays.asList(weComeConfig.getNoAccessTokenUrl()).contains(uri)){ String token=""; @@ -77,8 +68,6 @@ public class WeAccessTokenInterceptor implements Interceptor{ request.addQuery("access_token",token); } - - //添加服务器统一请求地址 request.setUrl(weComeConfig.getServerUrl()+weComeConfig.getWeComePrefix()+uri); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAccessTokenInterceptor.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAccessTokenInterceptor.java new file mode 100644 index 000000000..c5cb8cfd0 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAccessTokenInterceptor.java @@ -0,0 +1,90 @@ +package com.linkwechat.wecom.interceptor; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.dtflys.forest.exceptions.ForestRuntimeException; +import com.dtflys.forest.http.ForestRequest; +import com.dtflys.forest.http.ForestResponse; +import com.dtflys.forest.interceptor.Interceptor; +import com.dtflys.forest.utils.ForestDataType; +import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.wecom.domain.weixin.dto.WxBaseResultDto; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.wxclient.WxCommonClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * @author danmo + * @description 微信请求拦截器 + * @date 2021/4/5 15:17 + **/ +@Slf4j +@Component +public class WeiXinAccessTokenInterceptor implements Interceptor { + //暂时写到配置文件,之后写入数据库 + @Value("${weixin.appid}") + private String appId; + @Value("${weixin.secret}") + private String secret; + private final String grantType = "client_credential"; + + @Autowired + private WxCommonClient wxCommonClient; + + @Autowired + private RedisCache redisCache; + + @Override + public boolean beforeExecute(ForestRequest request){ + request.setDataType(ForestDataType.JSON); + String accessToken = findAccessToken(); + request.addQuery("access_token",accessToken); + return true; + } + + + private String findAccessToken(){ + //获取用户token + String accessToken =redisCache.getCacheObject(WeConstans.WX_ACCESS_TOKEN); + if (StringUtils.isEmpty(accessToken)){ + //当用户token失效,重新获取token + WxTokenDto wxTokenDto = wxCommonClient.getToken(grantType, appId, secret); + if(wxTokenDto != null && StringUtils.isNotEmpty(wxTokenDto.getAccessToken())){ + redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN, wxTokenDto.getAccessToken(), wxTokenDto.getExpiresIn(), TimeUnit.SECONDS); + accessToken = wxTokenDto.getAccessToken(); + } + } + return accessToken; + } + + + /** + * 请求发送失败时被调用 + * @param e + * @param request + * @param response + */ + @Override + public void onError(ForestRuntimeException e, ForestRequest request, ForestResponse response) { + log.info("url:{},------params:{},----------result:"+request.getUrl(), + JSONObject.toJSONString(request.getArguments()), + response.getContent()); + throw new ForestRuntimeException(response.getContent()); + } + + @Override + public void onSuccess(Object data, ForestRequest request, ForestResponse response) { + log.info("url:【{}】,result:【{}】",request.getUrl(),response.getContent()); + WxBaseResultDto wxBaseResultDto = JSONUtil.toBean(response.getContent(), WxBaseResultDto.class); + if(null != wxBaseResultDto.getErrcode() && !wxBaseResultDto.getErrcode().equals(WeConstans.WE_SUCCESS_CODE)){ + throw new ForestRuntimeException(response.getContent()); + } + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java new file mode 100644 index 000000000..d373f71d1 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java @@ -0,0 +1,99 @@ +package com.linkwechat.wecom.interceptor; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.dtflys.forest.exceptions.ForestRuntimeException; +import com.dtflys.forest.http.ForestRequest; +import com.dtflys.forest.http.ForestResponse; +import com.dtflys.forest.interceptor.Interceptor; +import com.dtflys.forest.utils.ForestDataType; +import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.common.exception.wecom.WeComException; +import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.domain.weixin.dto.WxBaseResultDto; +import com.linkwechat.wecom.wxclient.WxAuthClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * @author danmo + * @description 微信授权拦截器 + * @date 2021/4/5 15:28 + **/ + +@Slf4j +@Component +public class WeiXinAuthInterceptor implements Interceptor { + //暂时写到配置文件,之后写入数据库 + @Value("${weixin.appid}") + private String appId; + @Value("${weixin.secret}") + private String secret; + private final String grantType = "refresh_token"; + + @Autowired + private WxAuthClient wxAuthClient; + + @Autowired + private RedisCache redisCache; + + @Override + public boolean beforeExecute(ForestRequest request){ + Object openId =request.getQuery("openid"); + request.setDataType(ForestDataType.JSON); + if (openId != null){ + request.addQuery("access_token",findAccessToken(openId.toString())); + } + return true; + } + + + private String findAccessToken(String openId){ + //获取用户token + String accessToken =redisCache.getCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId); + if (StringUtils.isEmpty(accessToken)){ + //当用户token失效,则获取refreshToken + String refreshToken = redisCache.getCacheObject(WeConstans.WX_AUTH_REFRESH_ACCESS_TOKEN + ":" + openId); + if(StringUtils.isEmpty(refreshToken)){ + throw new WeComException(1001,"token失效,请重新授权"); + }else { + WxTokenDto wxTokenDto = wxAuthClient.refreshToken(appId, secret, grantType, refreshToken); + if(wxTokenDto != null && StringUtils.isNotEmpty(wxTokenDto.getAccessToken())){ + redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId, wxTokenDto.getAccessToken(), wxTokenDto.getExpiresIn(), TimeUnit.SECONDS); + accessToken = wxTokenDto.getAccessToken(); + } + } + } + return accessToken; + } + + + /** + * 请求发送失败时被调用 + * @param e + * @param request + * @param response + */ + @Override + public void onError(ForestRuntimeException e, ForestRequest request, ForestResponse response) { + log.info("url:{},------params:{},----------result:"+request.getUrl(), + JSONObject.toJSONString(request.getArguments()), + response.getContent()); + throw new ForestRuntimeException(response.getContent()); + } + + @Override + public void onSuccess(Object data, ForestRequest request, ForestResponse response) { + log.info("url:【{}】,result:【{}】",request.getUrl(),response.getContent()); + WxBaseResultDto wxBaseResultDto = JSONUtil.toBean(response.getContent(), WxBaseResultDto.class); + if(null != wxBaseResultDto.getErrcode() && !wxBaseResultDto.getErrcode().equals(WeConstans.WE_SUCCESS_CODE)){ + throw new ForestRuntimeException(response.getContent()); + } + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWxAuthService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWxAuthService.java new file mode 100644 index 000000000..c5654ce26 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWxAuthService.java @@ -0,0 +1,15 @@ +package com.linkwechat.wecom.service; + +import com.linkwechat.wecom.domain.weixin.dto.WxAuthUserInfoDto; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; + +/** + * @author danmo + * @description + * @date 2021/4/5 22:45 + **/ +public interface IWxAuthService { + WxTokenDto getToken(String code,String openId); + + WxAuthUserInfoDto getUserInfo(String openId, String lang); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/IWxAuthServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/IWxAuthServiceImpl.java new file mode 100644 index 000000000..cf9e91449 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/IWxAuthServiceImpl.java @@ -0,0 +1,57 @@ +package com.linkwechat.wecom.service.impl; + +import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.wecom.domain.weixin.dto.WxAuthUserInfoDto; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.service.IWxAuthService; +import com.linkwechat.wecom.wxclient.WxAuthClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +/** + * @author danmo + * @description + * @date 2021/4/5 22:45 + **/ +@Slf4j +@Service +public class IWxAuthServiceImpl implements IWxAuthService { + @Autowired + private WxAuthClient wxAuthClient; + @Autowired + private RedisCache redisCache; + + @Value("${weixin.appid}") + private String appId; + @Value("${weixin.secret}") + private String secret; + private final String grantType = "authorization_code"; + + @Override + public WxTokenDto getToken(String code,String openId) { + WxTokenDto authToken; + if (StringUtils.isNotEmpty(openId)){ + authToken =redisCache.getCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId); + }else { + authToken = wxAuthClient.getAuthToken(appId, secret, code, grantType); + if(authToken != null && StringUtils.isNotEmpty(authToken.getAccessToken())){ + redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ authToken.getOpenId(), + authToken, authToken.getExpiresIn(), TimeUnit.SECONDS); + redisCache.setCacheObject(WeConstans.WX_AUTH_REFRESH_ACCESS_TOKEN+":"+ authToken.getOpenId(), + authToken.getRefreshToken(), 30, TimeUnit.DAYS); + } + } + return authToken; + } + + @Override + public WxAuthUserInfoDto getUserInfo(String openId, String lang) { + return wxAuthClient.getUserInfo(openId, lang); + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java new file mode 100644 index 000000000..c2c27cca6 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java @@ -0,0 +1,63 @@ +package com.linkwechat.wecom.wxclient; + +import com.dtflys.forest.annotation.BaseRequest; +import com.dtflys.forest.annotation.Query; +import com.dtflys.forest.annotation.Request; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.domain.weixin.dto.WxAuthUserInfoDto; +import com.linkwechat.wecom.interceptor.WeiXinAuthInterceptor; + +/** + * @author danmo + * @description + * @date 2021/4/5 15:47 + **/ +@BaseRequest(baseURL = "https://api.weixin.qq.com/sns",contentType = "application/json" + ,interceptor = WeiXinAuthInterceptor.class) +public interface WxAuthClient { + /** + * 获取微信授权token + * + * @param appId 公众号的唯一标识 + * @param secret 密钥 + * @param code 302重定向code + * @param grantType 填写为authorization_code + * @return + */ + @Request(url = "/oauth2/access_token", type = "GET") + WxTokenDto getAuthToken(@Query("appid") String appId, @Query("secret") String secret, + @Query("code") String code, @Query("grant_type") String grantType); + + /** + * 刷新access_token + * + * + * @param id + * @param appId 公众号的唯一标识 + * @param grantType 填写为refresh_token + * @param refreshToken 填写通过access_token获取到的refresh_token参数 + * @return + */ + @Request(url = "/oauth2/refresh_token", type = "GET") + WxTokenDto refreshToken(String id, @Query("appid") String appId, @Query("grant_type") String grantType, + @Query("refresh_token") String refreshToken); + + /** + * 检验授权凭证(access_token)是否有效 + * @param openId 用户的唯一标识 + * @return + */ + @Request(url = "/auth", type = "GET") + WxTokenDto auth(@Query("openid") String openId); + + + /** + * 拉取用户信息(需scope为 snsapi_userinfo) + * @param openId 用户的唯一标识 + * @param lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 + * @return + */ + @Request(url = "/userinfo", type = "GET") + WxAuthUserInfoDto getUserInfo(@Query("openid") String openId, @Query("lang") String lang); + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxCommonClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxCommonClient.java new file mode 100644 index 000000000..9ab4e95c7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxCommonClient.java @@ -0,0 +1,36 @@ +package com.linkwechat.wecom.wxclient; + +import com.dtflys.forest.annotation.BaseRequest; +import com.dtflys.forest.annotation.Query; +import com.dtflys.forest.annotation.Request; +import com.linkwechat.wecom.domain.weixin.dto.WxTokenDto; +import com.linkwechat.wecom.interceptor.WeiXinAccessTokenInterceptor; + +/** + * @author danmo + * @description + * @date 2021/4/5 17:11 + **/ +@BaseRequest(baseURL = "https://api.weixin.qq.com/cgi-bin",contentType = "application/json") +public interface WxCommonClient { + /** + * 获取微信token + * + * @param grantType 填写为client_credential + * @param appId 公众号的唯一标识 + * @param secret 密钥 + * @return + */ + @Request(url = "/token", type = "GET") + WxTokenDto getToken(@Query("grant_type") String grantType, @Query("appid") String appId, @Query("secret") String secret); + + /** + * + * @param type + * @return + */ + @Request(url = "/ticket/getticket", type = "GET", interceptor = WeiXinAccessTokenInterceptor.class) + WxTokenDto getTicket(@Query("type") String type); + + +} -- Gitee From cc393073e55295e6d2274c1731128989c9474440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Wed, 7 Apr 2021 14:07:41 +0800 Subject: [PATCH 20/50] fix --- .../com/linkwechat/web/controller/weixin/WxAuthController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java index 3bf92279b..560bc67d1 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/weixin/WxAuthController.java @@ -33,7 +33,7 @@ public class WxAuthController extends CommonController { */ @ApiOperation(value = "通过code获取网页授权token",httpMethod = "GET") @GetMapping("/getToken") - public AjaxResult getToken(@ApiParam(value = "URL上的code参数",required = true) String code, @ApiParam(value = "用户的唯一标识",required = true) String openId) { + public AjaxResult getToken(@ApiParam(value = "URL上的code参数",required = true) String code, @ApiParam(value = "用户的唯一标识",required = false) String openId) { return AjaxResult.success(wxAuthService.getToken(code,openId)); } -- Gitee From 0d5443b105ff7283d073615e5921b19083456302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Wed, 7 Apr 2021 14:40:53 +0800 Subject: [PATCH 21/50] fix --- .../src/main/java/com/linkwechat/LinkWeChatApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java b/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java index 721558f78..760220aea 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java +++ b/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java @@ -16,7 +16,7 @@ import org.springframework.scheduling.annotation.EnableAsync; */ @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, PageHelperAutoConfiguration.class}) @MapperScan("com.linkwechat.*.mapper") -@ForestScan(basePackages = "com.linkwechat.wecom.client") +@ForestScan(basePackages = {"com.linkwechat.wecom.client","com.linkwechat.wecom.wxclient"}) @EnableAsync @EnableDiscoveryClient public class LinkWeChatApplication { -- Gitee From ab70f46f13252301f1b90ebf98df2d0ab89cffc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Thu, 8 Apr 2021 09:36:37 +0800 Subject: [PATCH 22/50] feat: --- .../linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java index 0fdd8b1b7..f7fe166fa 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/weixin/dto/WxAuthUserInfoDto.java @@ -20,7 +20,7 @@ public class WxAuthUserInfoDto extends WxBaseResultDto{ private String nickName; @ApiModelProperty("用户的性别,值为1时是男性,值为2时是女性,值为0时是未知") - private String sex; + private Integer sex; @ApiModelProperty("用户个人资料填写的省份") private String province; -- Gitee From bda45668c6e9e4e684b8166d0116743ba88d0757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E5=BA=93=E6=B5=AA=E5=AD=90?= <1539136324@qq.com> Date: Thu, 8 Apr 2021 11:55:02 +0800 Subject: [PATCH 23/50] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E6=8E=88=E6=9D=83=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java index acccf08bf..dc519c303 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java @@ -149,11 +149,24 @@ public class SysLoginController String token = loginService.noPwdLogin(loginInfo.getUser_info().getUserid()); ajax.put(Constants.TOKEN, token); - } - return ajax; + } + + + /** + * 租户登录 + * @param corpId + * @param corpSecret + * @return + */ + @GetMapping("/tenantLogin") + public AjaxResult tenantLogin(String corpId,String corpSecret){ + AjaxResult ajax = AjaxResult.success(); + + + return ajax; } } -- Gitee From aec1f1cff813305b67f0c0777b2024a9e500207d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Thu, 8 Apr 2021 22:15:42 +0800 Subject: [PATCH 24/50] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/wecom/domain/WeTaskFission.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeTaskFission.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeTaskFission.java index 2a16d87a4..46b38e35e 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeTaskFission.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeTaskFission.java @@ -59,16 +59,16 @@ public class WeTaskFission extends BaseEntity { /** * 活动开始时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "活动开始时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "活动开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "活动开始时间") private Date startTime; /** * 活动结束时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "活动结束时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "活动结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "活动结束时间") private Date overTime; -- Gitee From 2490d2943ad5722e95e69854000843546eba084a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Thu, 8 Apr 2021 22:34:05 +0800 Subject: [PATCH 25/50] fix --- .../web/controller/wecom/WeTaskFissionController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java index cef8aa588..09269e941 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java @@ -2,6 +2,7 @@ package com.linkwechat.web.controller.wecom; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; //import com.alibaba.nacos.common.utils.CollectionUtils; import com.google.common.collect.Lists; @@ -151,6 +152,12 @@ public class WeTaskFissionController extends BaseController { CopyOptions options = CopyOptions.create(); options.setIgnoreNullValue(true); BeanUtil.copyProperties(weTaskFission, fissionTask, options); + if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionStaffs())){ + fissionTask.setTaskFissionStaffs(weTaskFission.getTaskFissionStaffs()); + } + if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionWeGroups())){ + fissionTask.setTaskFissionWeGroups(weTaskFission.getTaskFissionWeGroups()); + } Long id = weTaskFissionService.updateWeTaskFission(fissionTask); JSONObject json = new JSONObject(); json.put("id", id); -- Gitee From aa79f21fca06ff09df836443c8770ba1aabbe817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Thu, 8 Apr 2021 22:41:15 +0800 Subject: [PATCH 26/50] fix --- .../wecom/service/impl/WeTaskFissionStaffServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionStaffServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionStaffServiceImpl.java index 3e85cca2a..ddd694ab1 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionStaffServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionStaffServiceImpl.java @@ -54,7 +54,7 @@ public class WeTaskFissionStaffServiceImpl implements IWeTaskFissionStaffService @Override public int insertWeTaskFissionStaffList(List weTaskFissionStaffs) { - return 0; + return weTaskFissionStaffMapper.insertWeTaskFissionStaffList(weTaskFissionStaffs); } /** -- Gitee From abdbc660cdc94136187cc184109d0ff0ecbf7e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Fri, 9 Apr 2021 10:34:44 +0800 Subject: [PATCH 27/50] fix --- .../impl/WeCustomerMessagePushServiceImpl.java | 12 ++++++------ .../wecom/service/impl/WeTaskFissionServiceImpl.java | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java index 6436142b0..49d2de8b5 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerMessagePushServiceImpl.java @@ -74,15 +74,15 @@ public class WeCustomerMessagePushServiceImpl implements IWeCustomerMessagePushS @Transactional(rollbackFor = Exception.class) public void addWeCustomerMessagePush(CustomerMessagePushDto customerMessagePushDto) throws JsonProcessingException, ParseException { -// if ((null != customerMessagePushDto.getSettingTime() && !"".equals(customerMessagePushDto.getSettingTime())) -// && DateUtils.diffTime(new Date(), DateUtil.parse(customerMessagePushDto.getSettingTime(), "yyyy-MM-dd HH:mm")) > 0) { -// throw new WeComException("发送时间不能小于当前时间"); -// } + if ((null != customerMessagePushDto.getSettingTime() && !"".equals(customerMessagePushDto.getSettingTime())) + && DateUtils.diffTime(new Date(), DateUtil.parse(customerMessagePushDto.getSettingTime(), "yyyy-MM-dd HH:mm")) > 0) { + throw new WeComException("发送时间不能小于当前时间"); + } - if(StrUtil.isBlank(customerMessagePushDto.getSettingTime())){ + /*if(StrUtil.isBlank(customerMessagePushDto.getSettingTime())){ throw new WeComException("发送时间不能为空"); - } + }*/ List customers = Lists.newArrayList(); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index c0e9fc88a..2afc11170 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -153,6 +153,7 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { int updateResult = weTaskFissionMapper.updateWeTaskFission(weTaskFission); if (updateResult > 0) { if (CollectionUtils.isNotEmpty(weTaskFission.getTaskFissionStaffs())) { + log.info("发起成员信息:【{}】",JSONObject.toJSONString(weTaskFission.getTaskFissionStaffs())); List staffList = weTaskFissionStaffService.selectWeTaskFissionStaffByTaskId(weTaskFission.getId()); if (CollectionUtils.isNotEmpty(staffList)) { weTaskFissionStaffService.deleteWeTaskFissionStaffByIds(staffList.stream().map(WeTaskFissionStaff::getId).toArray(Long[]::new)); -- Gitee From 4a34182bbd0d634915349e5fbec9b2c1f45c0979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sat, 10 Apr 2021 00:22:21 +0800 Subject: [PATCH 28/50] fix --- .../wecom/interceptor/WeiXinAuthInterceptor.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java index d373f71d1..2dd462fc8 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java @@ -56,21 +56,20 @@ public class WeiXinAuthInterceptor implements Interceptor { private String findAccessToken(String openId){ //获取用户token - String accessToken =redisCache.getCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId); - if (StringUtils.isEmpty(accessToken)){ + WxTokenDto wxTokenDto = redisCache.getCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN + ":" + openId); + if (wxTokenDto == null){ //当用户token失效,则获取refreshToken String refreshToken = redisCache.getCacheObject(WeConstans.WX_AUTH_REFRESH_ACCESS_TOKEN + ":" + openId); if(StringUtils.isEmpty(refreshToken)){ throw new WeComException(1001,"token失效,请重新授权"); }else { - WxTokenDto wxTokenDto = wxAuthClient.refreshToken(appId, secret, grantType, refreshToken); + wxTokenDto = wxAuthClient.refreshToken(appId, secret, grantType, refreshToken); if(wxTokenDto != null && StringUtils.isNotEmpty(wxTokenDto.getAccessToken())){ - redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId, wxTokenDto.getAccessToken(), wxTokenDto.getExpiresIn(), TimeUnit.SECONDS); - accessToken = wxTokenDto.getAccessToken(); + redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId, wxTokenDto, wxTokenDto.getExpiresIn(), TimeUnit.SECONDS); } } } - return accessToken; + return wxTokenDto.getAccessToken(); } -- Gitee From beb1c07e1670d2eb08ae7a5f0a0449a4b75a5ef1 Mon Sep 17 00:00:00 2001 From: leejoker <1056650571@qq.com> Date: Sat, 10 Apr 2021 22:20:51 +0800 Subject: [PATCH 29/50] =?UTF-8?q?=E6=B7=BB=E5=8A=A0h5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=BF=BD=E7=95=A5=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/WeTaskFissionRewardController.java | 6 +++--- .../linkwechat/framework/config/SecurityConfig.java | 2 +- .../service/impl/WeTaskFissionRewardServiceImpl.java | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionRewardController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionRewardController.java index f08cdb386..e31c4179d 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionRewardController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionRewardController.java @@ -106,9 +106,9 @@ public class WeTaskFissionRewardController extends BaseController { */ @ApiOperation(value = "根据微信用户id和任务id获取任务裂变奖励详细信息",httpMethod = "GET") // @PreAuthorize("@ss.hasPermi('wecom:getRewardByFissionId:query')") - @GetMapping(value = "/getRewardByFissionId/{fissionId}/{eid}") + @GetMapping(value = "/getRewardByFissionId/{fissionId}/{unionId}") public AjaxResult getRewardByFissionId(@ApiParam("任务id") @PathVariable("fissionId") String fissionId - , @PathVariable("eid") @ApiParam("客户id") String eid) { - return AjaxResult.success(weTaskFissionRewardService.getRewardByFissionId(fissionId,eid)); + , @PathVariable("unionId") @ApiParam("客户id") String unionId) { + return AjaxResult.success(weTaskFissionRewardService.getRewardByFissionId(fissionId,unionId)); } } diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 067f1d21f..6c770408b 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -124,7 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // .antMatchers("/common/uploadFile2Cos").anonymous() // .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() .antMatchers("/wecom/portrait/**").anonymous() - .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*").anonymous() + .antMatchers("/wecom/fission/poster", "/wecom/fission/*/progress/*", "/wecom/reward/getRewardByFissionId/**").anonymous() // 获取实际群活码和社群运营H5页面不需要登录 .antMatchers("/wecom/groupCode/getActualCode/**").anonymous() .antMatchers("/wecom/community/h5/**").anonymous() diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java index 19f55f9e7..152d02b14 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java @@ -106,13 +106,13 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi } @Override - public WeTaskFissionRewardVo getRewardByFissionId(String fissionId, String eid) { + public WeTaskFissionRewardVo getRewardByFissionId(String fissionId, String unionId) { WeTaskFissionRewardVo weTaskFissionRewardVo = new WeTaskFissionRewardVo(); - WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getExternalUserid, eid)); - String externalUseriId = Optional.ofNullable(weCustomer).map(WeCustomer::getExternalUserid) + WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getUnionid, unionId)); + String customerUnionId = Optional.ofNullable(weCustomer).map(WeCustomer::getUnionid) .orElseThrow(() -> new WeComException("用户信息不存在")); - WeTaskFissionRecord record = weTaskFissionRecordService.selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), externalUseriId); + WeTaskFissionRecord record = weTaskFissionRecordService.selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), customerUnionId); Date completeTime = Optional.ofNullable(record).map(WeTaskFissionRecord::getCompleteTime) .orElseThrow(() -> new WeComException("任务信息不存在")); @@ -126,7 +126,7 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi if (completeTime != null) { WeTaskFissionReward fissionReward = weTaskFissionRewardMapper.selectOne(new LambdaQueryWrapper() .eq(WeTaskFissionReward::getTaskFissionId, fissionId) - .eq(WeTaskFissionReward::getRewardUserId, externalUseriId)); + .eq(WeTaskFissionReward::getRewardUserId, customerUnionId)); weTaskFissionRewardVo.setWeTaskFissionReward(fissionReward); //发放兑奖码之后,置为已使用 Optional.ofNullable(fissionReward).ifPresent(reward -> weTaskFissionRewardMapper.update(reward, new LambdaUpdateWrapper() -- Gitee From a1b18ada1774da746704d936d0f68f66bf2aad92 Mon Sep 17 00:00:00 2001 From: "1539136324@qq.com" Date: Sat, 10 Apr 2021 23:58:46 +0800 Subject: [PATCH 30/50] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/wecom/WeAppController.java | 42 +++++++++++++++++++ .../com/linkwechat/wecom/domain/WeApp.java | 35 ++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeAppController.java diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeAppController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeAppController.java new file mode 100644 index 000000000..d106661f7 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeAppController.java @@ -0,0 +1,42 @@ +package com.linkwechat.web.controller.wecom; + +import com.linkwechat.common.core.controller.BaseController; +import com.linkwechat.common.core.domain.AjaxResult; +import com.linkwechat.wecom.domain.WeApp; +import com.linkwechat.wecom.service.IWeAppService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/wecom/weapp") +public class WeAppController extends BaseController { + + @Autowired + IWeAppService iWeAppService; + + + @GetMapping("/list") + public AjaxResult list() { + return AjaxResult.success( + iWeAppService.list() + ); + } + + + + @PutMapping("/updateWeApp") + public AjaxResult updateWeApp(@RequestBody WeApp weApp){ + + iWeAppService.updateById(weApp); + + return AjaxResult.success(); + } + + + + + + + + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeApp.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeApp.java index 2e477f9d6..8f34ed28e 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeApp.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeApp.java @@ -1,5 +1,6 @@ package com.linkwechat.wecom.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.linkwechat.common.utils.SnowFlakeUtil; import lombok.AllArgsConstructor; @@ -29,11 +30,40 @@ public class WeApp { /**应用id**/ private String agentId; + /**应用名称**/ + private String agentName; + /**应用密钥**/ private String agentSecret; + /**应用描述**/ + private String description; + + /**应用图标**/ + private String squareLogoUrl; + + /**企业应用是否被停用(1:是;0:否)**/ + private Integer close; + + + /**企业应用可信域名**/ + private String redirectDomain; + + + /**企业应用是否打开地理位置上报 0:不上报;1:进入会话上报;**/ + private Integer reportLocationFlag; + + + /**是否上报用户进入应用事件。0:不接收;1:接收**/ + private Integer isreportenter; + + + /**应用主页url**/ + private String homeUrl; + + /**应用类型(1:自建应用;)**/ private Integer appType; @@ -52,6 +82,11 @@ public class WeApp { private String status; + /**企业应用头像的mediaid,通过素材管理接口上传图片获得mediaid,上传后会自动裁剪成方形和圆形两个头像**/ + @TableField(exist = false) + private String logoMediaid; + + -- Gitee From bfc312cac8c5e594abfe9752550a4fa2ef5110f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sun, 11 Apr 2021 21:39:21 +0800 Subject: [PATCH 31/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/service/impl/WeTaskFissionRewardServiceImpl.java | 6 ++++-- .../wecom/service/impl/WeTaskFissionServiceImpl.java | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java index 152d02b14..76de7b113 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java @@ -113,8 +113,10 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi .orElseThrow(() -> new WeComException("用户信息不存在")); WeTaskFissionRecord record = weTaskFissionRecordService.selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), customerUnionId); - Date completeTime = Optional.ofNullable(record).map(WeTaskFissionRecord::getCompleteTime) - .orElseThrow(() -> new WeComException("任务信息不存在")); + if (record == null){ + throw new WeComException("任务信息不存在"); + } + Date completeTime = record.getCompleteTime(); WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); Optional.ofNullable(weTaskFission).ifPresent(fission -> { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 2afc11170..99a731e58 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -431,7 +431,8 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { WeTaskFissionRecord record = WeTaskFissionRecord.builder() .taskFissionId(taskFissionId) .customerId(customerId) - .customerName(customerName).build(); + .customerName(customerName) + .createTime(new Date()).build(); List searchExists = weTaskFissionRecordService.selectWeTaskFissionRecordList(record); WeTaskFissionRecord recordInfo; if (CollectionUtils.isNotEmpty(searchExists)) { -- Gitee From 38c7eabef039998af88d440b92ae3cda1aa724d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sun, 11 Apr 2021 22:35:48 +0800 Subject: [PATCH 32/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/wecom/WeTaskFissionController.java | 4 ++-- .../wecom/interceptor/WeiXinAuthInterceptor.java | 2 +- .../impl/WeTaskFissionRewardServiceImpl.java | 13 ++++++------- .../service/impl/WeTaskFissionServiceImpl.java | 14 +++++++------- .../linkwechat/wecom/wxclient/WxAuthClient.java | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java index 09269e941..150cfad47 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java @@ -152,10 +152,10 @@ public class WeTaskFissionController extends BaseController { CopyOptions options = CopyOptions.create(); options.setIgnoreNullValue(true); BeanUtil.copyProperties(weTaskFission, fissionTask, options); - if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionStaffs())){ + if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionStaffs())) { fissionTask.setTaskFissionStaffs(weTaskFission.getTaskFissionStaffs()); } - if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionWeGroups())){ + if (CollectionUtil.isNotEmpty(weTaskFission.getTaskFissionWeGroups())) { fissionTask.setTaskFissionWeGroups(weTaskFission.getTaskFissionWeGroups()); } Long id = weTaskFissionService.updateWeTaskFission(fissionTask); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java index 2dd462fc8..b1e79bfeb 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/interceptor/WeiXinAuthInterceptor.java @@ -63,7 +63,7 @@ public class WeiXinAuthInterceptor implements Interceptor { if(StringUtils.isEmpty(refreshToken)){ throw new WeComException(1001,"token失效,请重新授权"); }else { - wxTokenDto = wxAuthClient.refreshToken(appId, secret, grantType, refreshToken); + wxTokenDto = wxAuthClient.refreshToken(appId, grantType, refreshToken); if(wxTokenDto != null && StringUtils.isNotEmpty(wxTokenDto.getAccessToken())){ redisCache.setCacheObject(WeConstans.WX_AUTH_ACCESS_TOKEN+":"+ openId, wxTokenDto, wxTokenDto.getExpiresIn(), TimeUnit.SECONDS); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java index 76de7b113..8ee9cf95c 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java @@ -118,14 +118,13 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi } Date completeTime = record.getCompleteTime(); - WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); - Optional.ofNullable(weTaskFission).ifPresent(fission -> { - weTaskFissionRewardVo.setRewardRule(fission.getRewardRule()); - weTaskFissionRewardVo.setRewardImageUrl(fission.getRewardImageUrl()); - weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); - }); - if (completeTime != null) { + WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); + Optional.ofNullable(weTaskFission).ifPresent(fission -> { + weTaskFissionRewardVo.setRewardRule(fission.getRewardRule()); + weTaskFissionRewardVo.setRewardImageUrl(fission.getRewardImageUrl()); + weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); + }); WeTaskFissionReward fissionReward = weTaskFissionRewardMapper.selectOne(new LambdaQueryWrapper() .eq(WeTaskFissionReward::getTaskFissionId, fissionId) .eq(WeTaskFissionReward::getRewardUserId, customerUnionId)); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 99a731e58..912b669e2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -302,18 +302,18 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { .map(record -> weCustomerService.selectWeCustomerById(record.getCustomerId())) .filter(Objects::nonNull).collect(Collectors.toList()); } else { - WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getUnionid, unionId)); - String uid = Optional.ofNullable(weCustomer).map(WeCustomer::getUnionid) - .orElseThrow(() -> new WeComException("用户信息不存在")); weTaskFissionRecord = weTaskFissionRecordService - .selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), uid); - Optional.ofNullable(weTaskFissionRecord).map(WeTaskFissionRecord::getId) - .orElseThrow(() -> new WeComException("任务记录信息不存在")); + .selectWeTaskFissionRecordByIdAndCustomerId(Long.valueOf(fissionId), unionId); + Optional.ofNullable(weTaskFissionRecord).orElseThrow(() -> new WeComException("任务记录信息不存在")); List list = weFlowerCustomerRelService.list(new LambdaQueryWrapper() .eq(WeFlowerCustomerRel::getState, WeConstans.FISSION_PREFIX + weTaskFissionRecord.getId())); List eidList = Optional.ofNullable(list).orElseGet(ArrayList::new).stream() .map(WeFlowerCustomerRel::getExternalUserid).collect(Collectors.toList()); - return weCustomerService.listByIds(eidList); + if (CollectionUtil.isNotEmpty(eidList)){ + return weCustomerService.listByIds(eidList); + }else { + return null; + } } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java index c2c27cca6..6fc74aed7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/wxclient/WxAuthClient.java @@ -39,7 +39,7 @@ public interface WxAuthClient { * @return */ @Request(url = "/oauth2/refresh_token", type = "GET") - WxTokenDto refreshToken(String id, @Query("appid") String appId, @Query("grant_type") String grantType, + WxTokenDto refreshToken(@Query("appid") String appId, @Query("grant_type") String grantType, @Query("refresh_token") String refreshToken); /** -- Gitee From 74de632866b43be2dc26f19b2d4fac0f739a3a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sun, 11 Apr 2021 22:43:02 +0800 Subject: [PATCH 33/50] fix --- .../wecom/service/impl/WeTaskFissionRewardServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java index 8ee9cf95c..ffc213249 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java @@ -117,13 +117,14 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi throw new WeComException("任务信息不存在"); } Date completeTime = record.getCompleteTime(); - + WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); + Optional.ofNullable(weTaskFission).ifPresent(fission -> { + weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); + }); if (completeTime != null) { - WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); Optional.ofNullable(weTaskFission).ifPresent(fission -> { weTaskFissionRewardVo.setRewardRule(fission.getRewardRule()); weTaskFissionRewardVo.setRewardImageUrl(fission.getRewardImageUrl()); - weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); }); WeTaskFissionReward fissionReward = weTaskFissionRewardMapper.selectOne(new LambdaQueryWrapper() .eq(WeTaskFissionReward::getTaskFissionId, fissionId) -- Gitee From 252aa157182aa85eb5a68e3d52cd604ebe1270f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sun, 11 Apr 2021 22:43:54 +0800 Subject: [PATCH 34/50] fix --- .../wecom/service/impl/WeTaskFissionRewardServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java index ffc213249..b12b5822b 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionRewardServiceImpl.java @@ -119,11 +119,11 @@ public class WeTaskFissionRewardServiceImpl implements IWeTaskFissionRewardServi Date completeTime = record.getCompleteTime(); WeTaskFission weTaskFission = weTaskFissionService.selectWeTaskFissionById(Long.valueOf(fissionId)); Optional.ofNullable(weTaskFission).ifPresent(fission -> { - weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); + weTaskFissionRewardVo.setRewardRule(fission.getRewardRule()); }); if (completeTime != null) { Optional.ofNullable(weTaskFission).ifPresent(fission -> { - weTaskFissionRewardVo.setRewardRule(fission.getRewardRule()); + weTaskFissionRewardVo.setRewardUrl(fission.getRewardUrl()); weTaskFissionRewardVo.setRewardImageUrl(fission.getRewardImageUrl()); }); WeTaskFissionReward fissionReward = weTaskFissionRewardMapper.selectOne(new LambdaQueryWrapper() -- Gitee From f4abcf1f2fc0831dd6ed036f7d7402d27f2f4aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sun, 11 Apr 2021 23:45:46 +0800 Subject: [PATCH 35/50] fix --- .../customer/WeCallBackAddExternalContactImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java index a9d0828e8..b7a13039a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java @@ -65,6 +65,7 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { //裂变任务处理 private void taskFissionRecordHandle(String state, String wecomCode, String userId, String externalUserId) { + log.info("裂变任务处理 >>>>>>>>>>start"); //查询裂变客户任务记录 String fissionRecordId = state.substring(WeConstans.FISSION_PREFIX.length()); WeTaskFissionRecord weTaskFissionRecord = weTaskFissionRecordService.selectWeTaskFissionRecordById(Long.valueOf(fissionRecordId)); @@ -75,17 +76,18 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { Long fissNum = weTaskFissionRecord.getFissNum() + 1; weTaskFissionRecord.setFissNum(fissNum); - + log.info("查询裂变任务详情 >>>>>>>>>>{}",JSONObject.toJSONString(weTaskFissionRecord)); if (weTaskFission != null){ //发送欢迎语 - String welcomeMsg = weTaskFission.getWelcomeMsg(); - WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = JSONObject.parseObject(welcomeMsg, WeWelcomeMsg.WeWelcomeMsgBuilder.class); - weWelcomeMsgBuilder.welcome_code(wecomCode); + WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = WeWelcomeMsg.builder().welcome_code(weTaskFission.getWelcomeMsg()); + weWelcomeMsgBuilder.text(WeWelcomeMsg.Text.builder() + .content(weTaskFission.getWelcomeMsg()).build()); weCustomerService.sendWelcomeMsg(weWelcomeMsgBuilder.build()); } //裂变数量完成任务处理,消费兑换码 if (fissNum >= weTaskFission.getFissNum()){ + log.info("裂变数量完成任务处理,消费兑换码 >>>>>>>>>>{}",fissNum); weTaskFissionRecord.setCompleteTime(new Date()); WeTaskFissionReward reward = new WeTaskFissionReward(); reward.setTaskFissionId(weTaskFissionRecord.getTaskFissionId()); @@ -96,8 +98,9 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { fissionReward.setRewardUserId(weTaskFissionRecord.getCustomerId()); weTaskFissionRewardService.updateWeTaskFissionReward(fissionReward); } - + log.info("裂变任务处理变更 >>>>>>>>>>{}",JSONObject.toJSONString(weTaskFissionRecord)); weTaskFissionRecordService.updateWeTaskFissionRecord(weTaskFissionRecord); + log.info("裂变任务处理 >>>>>>>>>>end"); } } -- Gitee From 768579c97ba5de3be454e6eee525817157a67c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Mon, 12 Apr 2021 00:01:14 +0800 Subject: [PATCH 36/50] fix --- .../customer/WeCallBackAddExternalContactImpl.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java index b7a13039a..7ad3246b6 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java @@ -48,10 +48,14 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { private IWeTaskFissionRewardService weTaskFissionRewardService; @Autowired private IWeTaskFissionService weTaskFissionService; + @Autowired + private ThreadLocal weCustomerThreadLocal = new ThreadLocal<>(); @Override public void eventHandle(WxCpXmlMessageVO message) { if (message.getExternalUserId() != null) { + WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getExternalUserid, message.getExternalUserId())); + weCustomerThreadLocal.set(weCustomer); weCustomerService.getCustomersInfoAndSynchWeCustomer(message.getExternalUserId()); } if (message.getState() != null && message.getWelcomeCode() != null) { @@ -73,13 +77,15 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { //查询裂变任务详情 WeTaskFission weTaskFission = weTaskFissionService .selectWeTaskFissionById(weTaskFissionRecord.getTaskFissionId()); - - Long fissNum = weTaskFissionRecord.getFissNum() + 1; - weTaskFissionRecord.setFissNum(fissNum); + Long fissNum = weTaskFissionRecord.getFissNum(); + if (weCustomerThreadLocal.get() != null){ + fissNum++; + weTaskFissionRecord.setFissNum(fissNum); + } log.info("查询裂变任务详情 >>>>>>>>>>{}",JSONObject.toJSONString(weTaskFissionRecord)); if (weTaskFission != null){ //发送欢迎语 - WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = WeWelcomeMsg.builder().welcome_code(weTaskFission.getWelcomeMsg()); + WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = WeWelcomeMsg.builder().welcome_code(wecomCode); weWelcomeMsgBuilder.text(WeWelcomeMsg.Text.builder() .content(weTaskFission.getWelcomeMsg()).build()); weCustomerService.sendWelcomeMsg(weWelcomeMsgBuilder.build()); -- Gitee From b4d3fe9e98ed041b63a9cac236b9a849d06b56a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Mon, 12 Apr 2021 00:26:28 +0800 Subject: [PATCH 37/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/wecom/WeTaskFissionController.java | 2 +- .../customer/WeCallBackAddExternalContactImpl.java | 11 ++++++----- .../wecom/service/impl/WeCustomerServiceImpl.java | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java index 150cfad47..403f4b3ce 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTaskFissionController.java @@ -229,7 +229,7 @@ public class WeTaskFissionController extends BaseController { public AjaxResult upload(@RequestParam(value = "file") MultipartFile file) throws IOException { String url = FileUploadUtils.upload2Cos(file, cosConfig); JSONObject json = new JSONObject(); - json.put("rewardImageUrl", url); + json.put("rewardImageUrl", cosConfig.getImgUrlPrefix()+url); return AjaxResult.success(json); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java index 7ad3246b6..1cd8fb1f2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java @@ -48,14 +48,15 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { private IWeTaskFissionRewardService weTaskFissionRewardService; @Autowired private IWeTaskFissionService weTaskFissionService; - @Autowired - private ThreadLocal weCustomerThreadLocal = new ThreadLocal<>(); + private ThreadLocal weFlowerCustomerRelThreadLocal = new ThreadLocal<>(); @Override public void eventHandle(WxCpXmlMessageVO message) { if (message.getExternalUserId() != null) { - WeCustomer weCustomer = weCustomerService.getOne(new LambdaQueryWrapper().eq(WeCustomer::getExternalUserid, message.getExternalUserId())); - weCustomerThreadLocal.set(weCustomer); + WeFlowerCustomerRel weFlowerCustomerRel = weFlowerCustomerRelService.getOne(new LambdaQueryWrapper() + .eq(WeFlowerCustomerRel::getExternalUserid, message.getExternalUserId()) + .eq(WeFlowerCustomerRel::getUserId,message.getUserId())); + weFlowerCustomerRelThreadLocal.set(weFlowerCustomerRel); weCustomerService.getCustomersInfoAndSynchWeCustomer(message.getExternalUserId()); } if (message.getState() != null && message.getWelcomeCode() != null) { @@ -78,7 +79,7 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { WeTaskFission weTaskFission = weTaskFissionService .selectWeTaskFissionById(weTaskFissionRecord.getTaskFissionId()); Long fissNum = weTaskFissionRecord.getFissNum(); - if (weCustomerThreadLocal.get() != null){ + if (weFlowerCustomerRelThreadLocal.get() == null){ fissNum++; weTaskFissionRecord.setFissNum(fissNum); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java index 7bbaaaf74..6541b08df 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerServiceImpl.java @@ -482,6 +482,8 @@ public class WeCustomerServiceImpl extends ServiceImpl Date: Mon, 12 Apr 2021 11:36:36 +0800 Subject: [PATCH 38/50] =?UTF-8?q?=E6=B4=BB=E7=A0=81=E6=AC=A2=E8=BF=8E?= =?UTF-8?q?=E8=AF=AD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/linkwechat/wecom/domain/dto/WeWelcomeMsg.java | 4 ++++ .../impl/customer/WeCallBackAddExternalContactImpl.java | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeWelcomeMsg.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeWelcomeMsg.java index b8163a981..f4c2f1d53 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeWelcomeMsg.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeWelcomeMsg.java @@ -3,6 +3,8 @@ package com.linkwechat.wecom.domain.dto; import lombok.Builder; import lombok.Data; +import java.util.List; + /** * @author admin * @date 2020-11-18 @@ -12,6 +14,8 @@ import lombok.Data; public class WeWelcomeMsg { private String welcome_code; + private List attachments; + private Text text; private Image image; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java index 1cd8fb1f2..dd67694b2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java @@ -157,8 +157,13 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { WeMediaDto weMediaDto = weMaterialService .uploadTemporaryMaterial(messageMap.getMaterialUrl(), MediaType.IMAGE.getMediaType(),messageMap.getMaterialName()); Optional.ofNullable(weMediaDto).ifPresent(media -> { - weWelcomeMsgBuilder.image(WeWelcomeMsg.Image.builder().media_id(media.getMedia_id()) + List attachments = new ArrayList(); + JSONObject json = new JSONObject(); + json.put("msgtype",weMediaDto.getType()); + json.put(weMediaDto.getType(),WeWelcomeMsg.Image.builder().media_id(media.getMedia_id()) .pic_url(media.getUrl()).build()); + attachments.add(json); + weWelcomeMsgBuilder.attachments(attachments); }); } weCustomerService.sendWelcomeMsg(weWelcomeMsgBuilder.build()); -- Gitee From 0ca300f2e22d16e29b5e0f211f09505369a2725c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Mon, 12 Apr 2021 15:28:02 +0800 Subject: [PATCH 39/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9D=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quartz/task/TaskFissionStatusTask.java | 25 +++++++++++++++++++ .../wecom/mapper/WeTaskFissionMapper.java | 6 +++++ .../wecom/service/IWeTaskFissionService.java | 6 +++++ .../impl/WeTaskFissionServiceImpl.java | 9 +++++++ .../mapper/wecom/WeTaskFissionMapper.xml | 15 +++++++++++ 5 files changed, 61 insertions(+) create mode 100644 linkwe-quartz/src/main/java/com/linkwechat/quartz/task/TaskFissionStatusTask.java diff --git a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/TaskFissionStatusTask.java b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/TaskFissionStatusTask.java new file mode 100644 index 000000000..42f41623d --- /dev/null +++ b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/TaskFissionStatusTask.java @@ -0,0 +1,25 @@ +package com.linkwechat.quartz.task; + +import com.linkwechat.wecom.service.IWeTaskFissionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author danmo + * @description 任务状态处理 + * @date 2021/4/12 14:39 + **/ +@Slf4j +@Component("TaskFissionStatusTask") +public class TaskFissionStatusTask { + @Autowired + private IWeTaskFissionService weTaskFissionService; + + + public void taskFissionExpiredStatusHandle() { + log.info("任务宝过期时间处理--------------------------start"); + weTaskFissionService.updateExpiredWeTaskFission(); + log.info("任务宝过期时间处理--------------------------end"); + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTaskFissionMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTaskFissionMapper.java index 5727810cd..96face221 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTaskFissionMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTaskFissionMapper.java @@ -58,4 +58,10 @@ public interface WeTaskFissionMapper { * @return 结果 */ public int deleteWeTaskFissionByIds(Long[] ids); + + /** + * 更新过期任务 + * @return + */ + public void updateExpiredWeTaskFission(); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTaskFissionService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTaskFissionService.java index b28469317..eae968362 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTaskFissionService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTaskFissionService.java @@ -94,4 +94,10 @@ public interface IWeTaskFissionService { WeTaskFissionStatisticVO taskFissionStatistic(Long taskFissionId, Date startTime, Date endTime); WeTaskFissionProgressVO getCustomerTaskProgress(WeTaskFission taskFission, String eid); + + /** + * 更新过期任务 + * @return + */ + public void updateExpiredWeTaskFission(); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 912b669e2..6679e7ae3 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -364,6 +364,15 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { return WeTaskFissionProgressVO.builder().total(total).completed(complete).customers(list).build(); } + /** + * 更新过期任务 + * @return + */ + @Override + public void updateExpiredWeTaskFission() { + weTaskFissionMapper.updateExpiredWeTaskFission(); + } + /*************************************** private functions **************************************/ private String getPosterQRCode(String fissionTargetId, WeTaskFissionRecord record, WeCustomer weCustomer) { diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml index 05c38ed05..5d78e8b42 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml @@ -156,4 +156,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + \ No newline at end of file -- Gitee From 6b0b9ba91c839309585b6c403748403f5dd9b74a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Mon, 12 Apr 2021 15:28:21 +0800 Subject: [PATCH 40/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9D=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/wecom/WeTaskFissionMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml index 5d78e8b42..cf32ad0d2 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeTaskFissionMapper.xml @@ -156,7 +156,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + \ No newline at end of file -- Gitee From 88d9e5be5fc714533f47eb97760cec369c6900f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Mon, 12 Apr 2021 15:40:55 +0800 Subject: [PATCH 41/50] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9D=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/service/impl/WeTaskFissionServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 6679e7ae3..7513298ad 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -200,8 +200,6 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { //H5生成海报页面路径 StringBuilder pageUrlBuilder = new StringBuilder(pageUrl); pageUrlBuilder.append("?") - .append("agentId=").append("1000010") - .append("&") .append("fissionId=").append(id) .append("&") .append("fissionTargetId=").append(fissStaffId) @@ -215,6 +213,9 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { linkMessageDto.setUrl(pageUrlBuilder.toString()); CustomerMessagePushDto customerMessagePushDto = new CustomerMessagePushDto(); + if (weTaskFission.getStartTime() != null){ + customerMessagePushDto.setSettingTime(DateUtils.dateTime(weTaskFission.getStartTime())); + } customerMessagePushDto.setLinkMessage(linkMessageDto); customerMessagePushDto.setPushType("0"); customerMessagePushDto.setPushRange("1"); -- Gitee From 2d388f2f8671446d027bb97198548d1721834339 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Thu, 15 Apr 2021 11:31:16 +0800 Subject: [PATCH 42/50] =?UTF-8?q?=E6=96=B0=E5=AE=A2=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=8B=89=E7=BE=A4=E3=80=81=E5=91=98=E5=B7=A5=E6=B4=BB=E7=A0=81?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=E3=80=81?= =?UTF-8?q?=E7=BE=A4=E6=B4=BB=E7=A0=81=E5=8F=8A=E5=91=98=E5=B7=A5=E6=B4=BB?= =?UTF-8?q?=E7=A0=81=E6=89=AB=E7=A0=81=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/WeCommunityNewGroupController.java | 168 ++++---- .../wecom/WeEmpleCodeController.java | 2 +- .../wecom/client/WeAccessTokenClient.java | 2 +- .../linkwechat/wecom/client/WeAppClient.java | 2 +- .../wecom/client/WeCropTagClient.java | 2 +- .../wecom/client/WeCustomerClient.java | 2 +- .../wecom/client/WeCustomerGroupClient.java | 2 +- .../client/WeCustomerMessagePushClient.java | 2 +- .../wecom/client/WeDepartMentClient.java | 2 +- .../wecom/client/WeExternalContactClient.java | 2 +- .../wecom/client/WeMediaClient.java | 2 +- .../wecom/client/WeMessagePushClient.java | 2 +- .../wecom/client/WeMsgAuditClient.java | 2 +- .../wecom/client/WeTicketClient.java | 2 +- .../linkwechat/wecom/client/WeUserClient.java | 2 +- .../wecom/domain/WeCommunityNewGroup.java | 59 +-- .../linkwechat/wecom/domain/WeEmpleCode.java | 22 +- .../wecom/domain/WeEmpleCodeTag.java | 5 +- .../wecom/domain/WeEmpleCodeUseScop.java | 2 +- .../domain/dto/WeCommunityNewGroupDto.java | 47 +-- .../domain/vo/WeCommunityNewGroupVo.java | 95 ++--- .../wecom/domain/vo/WxCpXmlMessageVO.java | 16 + .../WeEventChangeExternalContactImpl.java | 18 - .../WeCallBackAddExternalContactImpl.java | 54 ++- .../WeCallBackAddHalfExternalContactImpl.java | 2 +- .../WeCallBackUpdateGroupImpl.java | 10 + .../mapper/WeCommunityNewGroupMapper.java | 21 +- .../wecom/mapper/WeEmpleCodeMapper.java | 19 +- .../wecom/mapper/WeEmpleCodeTagMapper.java | 4 +- .../mapper/WeEmpleCodeUseScopMapper.java | 20 +- .../wecom/mapper/WeGroupCodeActualMapper.java | 27 +- .../wecom/mapper/WeGroupCodeMapper.java | 15 + .../linkwechat/wecom/mapper/WeTagMapper.java | 2 + .../linkwechat/wecom/mapper/WeUserMapper.java | 2 + .../service/IWeCommunityNewGroupService.java | 32 +- .../wecom/service/IWeEmpleCodeService.java | 23 +- .../service/IWeGroupCodeActualService.java | 6 + .../impl/WeCommunityNewGroupServiceImpl.java | 360 ++++++++++-------- .../service/impl/WeEmpleCodeServiceImpl.java | 45 ++- .../impl/WeEmpleCodeUseScopServiceImpl.java | 2 +- .../impl/WeGroupCodeActualServiceImpl.java | 10 + .../service/impl/WeGroupCodeServiceImpl.java | 7 - .../wecom/WeCommunityNewGroupMapper.xml | 46 +-- .../mapper/wecom/WeEmpleCodeMapper.xml | 82 +++- .../mapper/wecom/WeEmpleCodeUseScopMapper.xml | 16 +- .../mapper/wecom/WeGroupCodeActualMapper.xml | 6 + .../mapper/wecom/WeGroupCodeMapper.xml | 23 ++ sql/link-wechat.sql | 121 +----- 48 files changed, 752 insertions(+), 663 deletions(-) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java index a33dd50c4..9653871b4 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java @@ -2,6 +2,7 @@ package com.linkwechat.web.controller.wecom; import cn.hutool.core.collection.CollectionUtil; import com.linkwechat.common.annotation.Log; +import com.linkwechat.common.constant.HttpStatus; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.AjaxResult; import com.linkwechat.common.core.page.TableDataInfo; @@ -9,17 +10,16 @@ import com.linkwechat.common.enums.BusinessType; import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.StringUtils; import com.linkwechat.common.utils.file.FileUtils; -import com.linkwechat.wecom.domain.WeCommunityNewGroup; import com.linkwechat.wecom.domain.WeEmpleCode; import com.linkwechat.wecom.domain.dto.WeCommunityNewGroupDto; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; import com.linkwechat.wecom.service.IWeCommunityNewGroupService; +import com.linkwechat.wecom.service.IWeEmpleCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,7 +31,6 @@ import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -49,56 +48,8 @@ public class WeCommunityNewGroupController extends BaseController { @Autowired private IWeCommunityNewGroupService weCommunityNewGroupService; - /** - * 查询新客自动拉群列表 - */ - @ApiOperation(value = "查询新客自动拉群列表", httpMethod = "GET") - // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:list')") - @GetMapping("/list") - public TableDataInfo> list(@RequestParam(value = "empleCodeName", required = false) String empleCodeName - , @RequestParam(value = "createBy", required = false) String createBy - , @RequestParam(value = "beginTime", required = false) String beginTime - , @RequestParam(value = "endTime", required = false) String endTime) { - startPage(); - List communityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupList(empleCodeName, createBy, beginTime, endTime); - return getDataTable(communityNewGroupVos); - } - - /** - * 获取新客自动拉群详细信息 - */ - @ApiOperation(value = "获取新客自动拉群详细信息", httpMethod = "GET") - // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:query')") - @GetMapping(value = "/{newGroupId}") - public AjaxResult getInfo(@PathVariable("newGroupId") @ApiParam("主键ID") String newGroupId) { - return AjaxResult.success(weCommunityNewGroupService.selectWeCommunityNewGroupById(new Long(newGroupId))); - } - - /** - * 修改新客自动拉群 - */ - @ApiOperation(value = "修改新客自动拉群", httpMethod = "PUT") - // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:edit')") - @Log(title = "新客自动拉群", businessType = BusinessType.UPDATE) - @PutMapping("/update") - public AjaxResult edit(@RequestBody @Validated WeCommunityNewGroupDto communityNewGroupDto) { - weCommunityNewGroupService.updateWeCommunityNewGroup(communityNewGroupDto); - - return AjaxResult.success(); - } - - /** - * 删除新客自动拉群 - */ - @ApiOperation(value = "删除新客自动拉群", httpMethod = "DELETE") - // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:remove')") - @Log(title = "新客自动拉群", businessType = BusinessType.DELETE) - @DeleteMapping("/delete/{ids}") - public AjaxResult remove(@PathVariable String ids) { - List idList = Arrays.stream(StringUtils.split(ids, ",")).collect(Collectors.toList()); - return toAjax(weCommunityNewGroupService.batchRemoveWeCommunityNewGroupIds(idList)); - } - + @Autowired + private IWeEmpleCodeService weEmpleCodeService; /** * 新增新客自动拉群 @@ -106,11 +57,10 @@ public class WeCommunityNewGroupController extends BaseController { @ApiOperation(value = "新增新客自动拉群", httpMethod = "POST") // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:add')") @Log(title = "新客自动拉群", businessType = BusinessType.INSERT) - @PostMapping("/add") + @PostMapping("/") public AjaxResult add(@RequestBody @Validated WeCommunityNewGroupDto communityNewGroupDto) { try { - weCommunityNewGroupService.add(communityNewGroupDto); - return AjaxResult.success(); + return toAjax(weCommunityNewGroupService.add(communityNewGroupDto)); } catch (Exception e) { e.printStackTrace(); if (e instanceof WeComException) { @@ -119,9 +69,31 @@ public class WeCommunityNewGroupController extends BaseController { return AjaxResult.error("请求接口异常!"); } } - } + /** + * 单个下载 + * + * @param id 待下载员工活码 + * @param request 请求 + * @param response 响应 + */ + @ApiOperation(value = "员工活码下载", httpMethod = "GET") + // @PreAuthorize("@ss.hasPermi('wecom:code:download')") + @Log(title = "员工活码下载", businessType = BusinessType.OTHER) + @GetMapping("/download") + public void download(String id, HttpServletRequest request, HttpServletResponse response) { + Optional communityNewGroupVo = weCommunityNewGroupService.selectWeCommunityNewGroupById(Long.valueOf(id)); + communityNewGroupVo.ifPresent(e -> { + try { + WeEmpleCode empleCode = weEmpleCodeService.selectWeEmpleCodeById(e.getEmplCodeId()); + FileUtils.downloadFile(empleCode.getQrCode(), response.getOutputStream()); + } catch (IOException exc) { + exc.printStackTrace(); + } + }); + return; + } /** * 员工活码批量下载 @@ -129,30 +101,27 @@ public class WeCommunityNewGroupController extends BaseController { * @param ids 新客自动拉群ids * @param request 请求 * @param response 输出 - * @throws Exception */ @ApiOperation(value = "员工活码批量下载", httpMethod = "GET") // @PreAuthorize("@ss.hasPermi('wecom:code:downloadBatch')") @Log(title = "员工活码批量下载", businessType = BusinessType.OTHER) @GetMapping("/downloadBatch") - public void downloadBatch(String ids, HttpServletRequest request, HttpServletResponse response) { - List idList = Arrays.stream(Optional.ofNullable(ids).orElse("").split(",")) - .filter(StringUtils::isNotEmpty).collect(Collectors.toList()); + public void downloadBatch(Long[] ids, HttpServletRequest request, HttpServletResponse response) { try { - - List weCommunityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupByIds(idList); - + List weCommunityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupByIds(Arrays.asList(ids)); //zip输出流 ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); if (CollectionUtil.isNotEmpty(weCommunityNewGroupVos)) { for (WeCommunityNewGroupVo communityNewGroupVo : weCommunityNewGroupVos) { - String qrCode = communityNewGroupVo.getQrCode(); + // 获取改新客拉群对应员工活码的二维码 + WeEmpleCode empleCode = weEmpleCodeService.selectWeEmpleCodeById(communityNewGroupVo.getEmplCodeId()); + String qrCode = empleCode.getQrCode(); if (StringUtils.isEmpty(qrCode)) { continue; } URL url = new URL(qrCode); - //每个二维码名称 - String fileName = communityNewGroupVo.getEmpleCodeName() + communityNewGroupVo.getActivityScene() + ".jpg"; + // 二维码名称使用场景 + String fileName = empleCode.getScenario() + ".png"; zos.putNextEntry(new ZipEntry(fileName)); InputStream fis = url.openConnection().getInputStream(); byte[] buffer = new byte[1024]; @@ -168,27 +137,60 @@ public class WeCommunityNewGroupController extends BaseController { zos.close(); } catch (IOException e) { e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); } } - @ApiOperation(value = "员工活码下载", httpMethod = "GET") - // @PreAuthorize("@ss.hasPermi('wecom:code:download')") - @Log(title = "员工活码下载", businessType = BusinessType.OTHER) - @GetMapping("/download") - public void download(String id, HttpServletRequest request, HttpServletResponse response) { - WeCommunityNewGroupVo communityNewGroupVo = weCommunityNewGroupService.selectWeCommunityNewGroupById(Long.valueOf(id)); - if (StringUtils.isEmpty(communityNewGroupVo.getQrCode())) { - return; - } else { - try { - FileUtils.downloadFile(communityNewGroupVo.getQrCode(), response.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } + /** + * 查询新客自动拉群列表 + */ + @ApiOperation(value = "查询新客自动拉群列表", httpMethod = "GET") + // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:list')") + @GetMapping("/list") + public TableDataInfo> list( + @RequestParam(value = "emplCodeName", required = false) String emplCodeName, + @RequestParam(value = "createBy", required = false) String createBy, + @RequestParam(value = "beginTime", required = false) String beginTime, + @RequestParam(value = "endTime", required = false) String endTime) { + startPage(); + List communityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupList(emplCodeName, createBy, beginTime, endTime); + return getDataTable(communityNewGroupVos); + } + + /** + * 获取新客自动拉群详细信息 + */ + @ApiOperation(value = "获取新客自动拉群详细信息", httpMethod = "GET") + // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") @ApiParam("主键ID") String id) { + Optional communityNewGroupVo = weCommunityNewGroupService.selectWeCommunityNewGroupById(Long.valueOf(id)); + if (communityNewGroupVo.isPresent()) { + return AjaxResult.success(communityNewGroupVo); } + return AjaxResult.error(HttpStatus.NOT_FOUND, "新客拉群信息不存在"); + } + + /** + * 修改新客自动拉群 + */ + @ApiOperation(value = "修改新客自动拉群", httpMethod = "PUT") + // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:edit')") + @Log(title = "新客自动拉群", businessType = BusinessType.UPDATE) + @PutMapping("/{id}") + public AjaxResult edit(@PathVariable("id") String id, @RequestBody @Validated WeCommunityNewGroupDto communityNewGroupDto) { + return toAjax(weCommunityNewGroupService.updateWeCommunityNewGroup(Long.valueOf(id), communityNewGroupDto)); } + /** + * 删除新客自动拉群 + */ + @ApiOperation(value = "删除新客自动拉群", httpMethod = "DELETE") + // @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:remove')") + @Log(title = "新客自动拉群", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(weCommunityNewGroupService.batchRemoveWeCommunityNewGroupByIds(Arrays.asList(ids))); + } } + diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeEmpleCodeController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeEmpleCodeController.java index 49f79ecb1..1b0461a98 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeEmpleCodeController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeEmpleCodeController.java @@ -169,7 +169,7 @@ public class WeEmpleCodeController extends BaseController { } URL url = new URL(qrCode); //每个二维码名称 - String fileName = weEmpleCode.getUseUserName()+"-"+weEmpleCode.getActivityScene()+".jpg"; + String fileName = weEmpleCode.getUseUserName()+"-"+weEmpleCode.getScenario()+".jpg"; zos.putNextEntry(new ZipEntry(fileName)); InputStream fis = url.openConnection().getInputStream(); byte[] buffer = new byte[1024]; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java index a563ffb14..01b452d65 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-26 14:33 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest public interface WeAccessTokenClient { /** * 获取token(常用token,联系人token) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java index a7a40ead2..09c25fce7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * 应用管理相关接口 */ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeAppClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java index 05700efb0..cd8faee82 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-17 11:00 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCropTagClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java index e4219c329..f5b78f8fc 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java @@ -15,7 +15,7 @@ import java.util.Map; * @author: HaoN * @create: 2020-09-15 14:15 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java index 963165aa7..ab0b81957 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-20 21:50 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerGroupClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java index 9564f798f..519aefdc8 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: KeWen * @create: 2020-10-25 21:34 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerMessagePushClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java index c5da01919..82b756770 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-27 16:40 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeDepartMentClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java index 45b66b010..996d94e6f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-13 10:39 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeExternalContactClient { @Request(url = "/externalcontact/add_contact_way", diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java index 8cafe75a2..9e7000a97 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java @@ -17,7 +17,7 @@ import java.io.InputStream; * @Description: * @Date: create in 2020/9/24 0024 0:14 */ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMediaClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java index 16ee17ed8..f6b41ddf6 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java @@ -15,7 +15,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @create: 2020-10-17 22:41 **/ @SuppressWarnings("all") -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMessagePushClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java index 6300c6355..0bedd6a20 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @description 会话存档接口 * @date 2020/12/2 16:45 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMsgAuditClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java index 2bd9346da..9b84513e3 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java @@ -11,7 +11,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @description h5获取签名 * @date 2021/1/6 11:51 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeTicketClient { /** * 获取去企业jsapi_ticket diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java index 1881de06f..c932643dc 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java @@ -9,7 +9,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-27 16:42 **/ -@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeUserClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCommunityNewGroup.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCommunityNewGroup.java index 721adf465..6288e1303 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCommunityNewGroup.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCommunityNewGroup.java @@ -23,72 +23,25 @@ public class WeCommunityNewGroup extends BaseEntity { *主键ID */ @TableId - private Long newGroupId= SnowFlakeUtil.nextId(); + private Long id = SnowFlakeUtil.nextId(); /** * 员工活码名称 */ - @ApiModelProperty("员工活码名称") - private String empleCodeName; + private String emplCodeName; /** - * 活动场景 + * 群活码id */ - @ApiModelProperty("活动场景") - private String activityScene; - - /** - * 欢迎语 - */ - @ApiModelProperty("欢迎语") - private String welcomeMsg; - - /** - * 新增联系方式的配置id - */ - @ApiModelProperty("新增联系方式的配置id") - private String configId; - - /** - * 二维码链接 - */ - @ApiModelProperty("二维码链接") - private String qrCode; - - /** - * 客户添加时无需经过确认自动成为好友:1:是;0:否 - */ - @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") - private Boolean isJoinConfirmFriends; - - /** - * 添加好友数 - */ - @ApiModelProperty("添加好友数") - private Integer joinFriendNums; - - /** - * 群活码ID - */ - @ApiModelProperty("群活码ID") private Long groupCodeId; /** - * 素材的id + * 员工活码id */ - @ApiModelProperty("素材的id") - private Long mediaId; + private Long emplCodeId; /** * 0 未删除 1 已删除 */ - @ApiModelProperty("0 未删除 1 已删除") - private int delFlag; - - - /** - * 员工活码 - */ - private String userQrCode; - + private int delFlag = 0; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCode.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCode.java index 340caef7c..4f74efecd 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCode.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCode.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; import lombok.Data; +import lombok.EqualsAndHashCode; import javax.validation.constraints.NotEmpty; import java.util.List; @@ -17,6 +18,7 @@ import java.util.List; * @date 2020-10-04 */ @Data +@EqualsAndHashCode(callSuper = true) @TableName("we_emple_code") public class WeEmpleCode extends BaseEntity { private static final long serialVersionUID = 1L; @@ -34,12 +36,12 @@ public class WeEmpleCode extends BaseEntity { /** * 客户添加时无需经过确认自动成为好友:1:是;0:否 */ - private Boolean isJoinConfirmFriends; + private Boolean skipVerify; /** - * 活动场景 + * 活动场景,和 联系我 接口需要的 scene 不是一回事 */ - private String activityScene; + private String scenario; /** * 欢迎语 @@ -54,10 +56,10 @@ public class WeEmpleCode extends BaseEntity { /** * 0:正常;1:删除; */ - private Integer delFlag = new Integer(0); + private Integer delFlag = 0; - @NotEmpty(message = "员工信息不能为空") /** 使用员工 */ + @NotEmpty(message = "员工信息不能为空") @TableField(exist = false) private List weEmpleCodeUseScops; @@ -84,6 +86,16 @@ public class WeEmpleCode extends BaseEntity { */ private String qrCode; + /** + * 企业自定义的state参数,用于区分客户具体是通过哪个「联系我」添加 + */ + private String state; + + /** + * 扫码次数 + */ + private Integer scanTimes = 0; + /** * 使用员工姓名 */ diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java index 2d2e22c9b..cdb7e05ec 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java @@ -1,9 +1,7 @@ package com.linkwechat.wecom.domain; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -16,7 +14,6 @@ import lombok.Data; * @author ruoyi * @date 2020-10-04 */ -@ApiModel @Data @TableName("we_emple_code_tag") public class WeEmpleCodeTag @@ -37,7 +34,7 @@ public class WeEmpleCodeTag /** 0:正常;2:删除; */ @ApiModelProperty("0:正常;2:删除") - private Integer delFlag=new Integer(0); + private Integer delFlag = 0; /** 标签名 */ @ApiModelProperty("标签名") diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java index 7a16f622c..948c13b4c 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java @@ -43,7 +43,7 @@ public class WeEmpleCodeUseScop /** 0:正常;2:删除; */ @ApiModelProperty("0:正常;2:删除") - private Integer delFlag=new Integer(0); + private Integer delFlag = 0; /** 活码使用人员名称 */ @ApiModelProperty("活码使用人员名称") diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeCommunityNewGroupDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeCommunityNewGroupDto.java index 5d022b733..b789f9e02 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeCommunityNewGroupDto.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeCommunityNewGroupDto.java @@ -1,9 +1,5 @@ package com.linkwechat.wecom.domain.dto; -import com.baomidou.mybatisplus.annotation.TableField; -import com.linkwechat.wecom.domain.WeEmpleCodeTag; -import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; -import io.swagger.annotations.ApiModel; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; @@ -17,56 +13,39 @@ import java.util.List; @Data public class WeCommunityNewGroupDto { - /** - * 主键 + * 活码名称 */ - private String newGroupId; + @NotNull(message = "活码名不能为空") + private String codeName; /** - * 活动场景 + * 指定的员工(id) */ - private String activityScene; + @NotNull(message = "使用员工不能为空") + private List emplList; /** * 欢迎语 */ + @NotNull(message = "欢迎语不能为空") private String welcomeMsg; - @NotNull(message = "员工信息不能为空") - /** 使用员工 */ - @TableField(exist = false) - private List weEmpleCodeUseScops; - - /** - * 扫码标签 - */ - @TableField(exist = false) - private List weEmpleCodeTags; - /** * 群活码ID */ + @NotNull(message = "群活码不能为空") private Long groupCodeId; /** - * 客户添加时无需经过确认自动成为好友:1:是;0:否 - */ - private Boolean isJoinConfirmFriends; - - /** - * 新增联系方式的配置id - */ - private String configId; - - /** - * 二维码链接 + * 标签id列表 */ - private String qrCode; + @NotNull(message = "标签不能为空") + private List tagList; /** - * 素材的id + * 是否跳过验证自动加好友 */ - private Long mediaId; + private Boolean skipVerify = true; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityNewGroupVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityNewGroupVo.java index a4d364724..4efc1e2ca 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityNewGroupVo.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeCommunityNewGroupVo.java @@ -2,15 +2,11 @@ package com.linkwechat.wecom.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; -import com.linkwechat.wecom.domain.WeEmpleCodeTag; -import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; -import com.linkwechat.wecom.domain.WeGroupCodeActual; -import com.linkwechat.wecom.domain.WeMaterial; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.linkwechat.wecom.domain.*; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.validation.constraints.NotEmpty; import java.util.Date; import java.util.List; @@ -21,108 +17,75 @@ import java.util.List; @Data public class WeCommunityNewGroupVo { - /** - * 主键ID - */ - @ApiModelProperty("主键ID") - private Long newGroupId; - - /** - * 员工活码名称 - */ - @ApiModelProperty("员工活码名称") - private String empleCodeName; + private Long id; /** - * 活动场景 + * 活码名称 */ - @ApiModelProperty("活动场景") - private String activityScene; + private String codeName; - /** - * 欢迎语 - */ - @ApiModelProperty("欢迎语") - private String welcomeMsg; - - /** - * 群活码id - */ - @ApiModelProperty("群活码id") + @JsonIgnore private Long groupCodeId; + @JsonIgnore + private Long emplCodeId; + /** - * 新增联系方式的配置id + * 员工活码URL */ - @ApiModelProperty("新增联系方式的配置id") - private String configId; + private String emplCodeUrl; /** - * 二维码链接 + * 欢迎语(即员工活码设定的欢迎语) */ - @ApiModelProperty("二维码链接") - private String qrCode; + @TableField(exist = false) + private String welcomeMsg; /** - * 客户添加时无需经过确认自动成为好友:1:是;0:否 + * 群活码信息 */ - @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") - private Boolean isJoinConfirmFriends; + @TableField(exist = false) + private WeGroupCodeVo groupCodeInfo; /** - * 添加好友数 + * 员工信息 */ - @ApiModelProperty("添加好友数") - private Integer joinFriendNums; - - @NotEmpty(message = "员工信息不能为空") - /** 使用员工 */ @TableField(exist = false) - @ApiModelProperty("使用员工") - private List weEmpleCodeUseScops; + private List emplList; /** - * 扫码标签 + * 对应群聊信息 */ @TableField(exist = false) - @ApiModelProperty("扫码标签") - private List weEmpleCodeTags; + private List groupList; /** - * 素材 + * 客户标签列表 */ - @ApiModelProperty("素材") @TableField(exist = false) - private WeMaterial weMaterial; + private List tagList; /** - * 素材的id + * 当前添加的好友数 */ - @ApiModelProperty("素材的id") - private Long mediaId; + @TableField(exist = false) + private Integer cusNumber = 0; /** - * 实际群聊 + * 是否跳过验证 */ - @ApiModelProperty("实际群聊") - private List weGroupUserScops; + @TableField(exist = false) + private Boolean skipVerify = true; /** * 创建者 */ - @ApiModelProperty(value = "创建者", hidden = true) private String createBy; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "创建时间", hidden = true) private Date createTime = new Date(); - /** - * 个人码 - */ - private String userQrCode; - } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WxCpXmlMessageVO.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WxCpXmlMessageVO.java index 337683294..db86b4ec6 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WxCpXmlMessageVO.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WxCpXmlMessageVO.java @@ -41,6 +41,22 @@ public class WxCpXmlMessageVO extends WxCpXmlMessage { @XStreamConverter(value = XStreamCDataConverter.class) private String tagId; + @XStreamAlias("UpdateDetail") + @XStreamConverter(value = XStreamCDataConverter.class) + private String updateDetail; + + @XStreamAlias("JoinScene") + @XStreamConverter(value = XStreamCDataConverter.class) + private String joinScene; + + @XStreamAlias("QuitScene") + @XStreamConverter(value = XStreamCDataConverter.class) + private String quitScene; + + @XStreamAlias("MemChangeCnt") + @XStreamConverter(value = XStreamCDataConverter.class) + private String memberChangeCnt; + @Data public static class BatchJob implements Serializable { private static final long serialVersionUID = -3418685294606228837L; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/WeEventChangeExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/WeEventChangeExternalContactImpl.java index 156ccb1c5..5a25d9fe7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/WeEventChangeExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/WeEventChangeExternalContactImpl.java @@ -1,30 +1,12 @@ package com.linkwechat.wecom.factory.impl; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.linkwechat.common.constant.WeConstans; -import com.linkwechat.common.enums.MediaType; -import com.linkwechat.common.enums.MessageType; -import com.linkwechat.common.utils.StringUtils; -import com.linkwechat.common.utils.Threads; -import com.linkwechat.wecom.client.WeMessagePushClient; -import com.linkwechat.wecom.domain.*; -import com.linkwechat.wecom.domain.dto.WeEmpleCodeDto; -import com.linkwechat.wecom.domain.dto.WeMediaDto; -import com.linkwechat.wecom.domain.dto.WeMessagePushDto; -import com.linkwechat.wecom.domain.dto.WeWelcomeMsg; -import com.linkwechat.wecom.domain.dto.message.TextMessageDto; import com.linkwechat.wecom.domain.vo.WxCpXmlMessageVO; import com.linkwechat.wecom.factory.WeCallBackEventFactory; import com.linkwechat.wecom.factory.WeStrategyBeanFactory; -import com.linkwechat.wecom.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.*; -import java.util.stream.Collectors; - /** * @author danmo * @description 外部联系人回调事件处理 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java index dd67694b2..448e3da11 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddExternalContactImpl.java @@ -16,7 +16,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -48,6 +47,11 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { private IWeTaskFissionRewardService weTaskFissionRewardService; @Autowired private IWeTaskFissionService weTaskFissionService; + @Autowired + private IWeCommunityNewGroupService weCommunityNewGroupService; + @Autowired + private IWeGroupCodeService weGroupCodeService; + private ThreadLocal weFlowerCustomerRelThreadLocal = new ThreadLocal<>(); @Override @@ -121,12 +125,19 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { */ private void empleCodeHandle(String state, String wecomCode, String userId, String externalUserId) { try { + log.debug("递增扫码次数>>>>>>>>>>>>>>>"); + // 增加扫码次数 + weEmpleCodeService.updateScanTimesByState(state); log.info("执行发送欢迎语>>>>>>>>>>>>>>>"); WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = WeWelcomeMsg.builder().welcome_code(wecomCode); - WeEmpleCodeDto messageMap = weEmpleCodeService.selectWelcomeMsgByActivityScene(state, userId); + // 获取员工活码相关信息 + WeEmpleCodeDto messageMap = weEmpleCodeService.selectWelcomeMsgByState(state); if (messageMap != null) { String empleCodeId = messageMap.getEmpleCodeId(); - //查询活码对应标签 + + // 查询对应员工活码 + + // 查询活码对应标签 List tagList = weEmpleCodeTagService.list(new LambdaQueryWrapper() .eq(WeEmpleCodeTag::getEmpleCodeId, empleCodeId)); //查询外部联系人与通讯录关系数据 @@ -148,23 +159,26 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { weFlowerCustomerTagRelService.saveOrUpdateBatch(weFlowerCustomerTagRels); }); log.debug(">>>>>>>>>欢迎语查询结果:{}", JSONObject.toJSONString(messageMap)); + // 发送欢迎语 if (messageMap != null) { + if (StringUtils.isNotEmpty(messageMap.getWelcomeMsg())) { weWelcomeMsgBuilder.text(WeWelcomeMsg.Text.builder() .content(messageMap.getWelcomeMsg()).build()); } + + // 构造WeMediaDto。要么是普通情况创建的员工活码,使用创建时指定的素材,要么是新客拉群信创建的员工活码,使用对应群活码图片作为素材 if (StringUtils.isNotEmpty(messageMap.getCategoryId())) { - WeMediaDto weMediaDto = weMaterialService - .uploadTemporaryMaterial(messageMap.getMaterialUrl(), MediaType.IMAGE.getMediaType(),messageMap.getMaterialName()); - Optional.ofNullable(weMediaDto).ifPresent(media -> { - List attachments = new ArrayList(); - JSONObject json = new JSONObject(); - json.put("msgtype",weMediaDto.getType()); - json.put(weMediaDto.getType(),WeWelcomeMsg.Image.builder().media_id(media.getMedia_id()) - .pic_url(media.getUrl()).build()); - attachments.add(json); - weWelcomeMsgBuilder.attachments(attachments); - }); + WeMediaDto weMediaDto = weMaterialService.uploadTemporaryMaterial(messageMap.getMaterialUrl(), MediaType.IMAGE.getMediaType(),messageMap.getMaterialName()); + bindAttachments(weWelcomeMsgBuilder, weMediaDto); + } + + WeCommunityNewGroup communityNewGroup = weCommunityNewGroupService.getOne(new LambdaQueryWrapper() + .eq(WeCommunityNewGroup::getEmplCodeId, Long.valueOf(empleCodeId))); + if (StringUtils.isNotNull(communityNewGroup)) { + WeGroupCode weGroupCode = weGroupCodeService.selectWeGroupCodeById(communityNewGroup.getGroupCodeId()); + WeMediaDto weMediaDto = weMaterialService.uploadTemporaryMaterial(weGroupCode.getCodeUrl(), MediaType.IMAGE.getMediaType(), weGroupCode.getActivityName()); + bindAttachments(weWelcomeMsgBuilder, weMediaDto); } weCustomerService.sendWelcomeMsg(weWelcomeMsgBuilder.build()); } @@ -175,6 +189,18 @@ public class WeCallBackAddExternalContactImpl extends WeEventStrategy { } } + private void bindAttachments(WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder, WeMediaDto weMediaDto) { + Optional.ofNullable(weMediaDto).ifPresent(media -> { + List attachments = new ArrayList(); + JSONObject json = new JSONObject(); + json.put("msgtype",weMediaDto.getType()); + json.put(weMediaDto.getType(),WeWelcomeMsg.Image.builder().media_id(media.getMedia_id()) + .pic_url(media.getUrl()).build()); + attachments.add(json); + weWelcomeMsgBuilder.attachments(attachments); + }); + } + private boolean isFission(String str) { if (str.indexOf(WeConstans.FISSION_PREFIX) != -1){ return true; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddHalfExternalContactImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddHalfExternalContactImpl.java index 4f0c4dd1c..9a93a748a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddHalfExternalContactImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customer/WeCallBackAddHalfExternalContactImpl.java @@ -54,7 +54,7 @@ public class WeCallBackAddHalfExternalContactImpl extends WeEventStrategy { if (message.getState() != null && message.getWelcomeCode() != null) { log.info("执行发送欢迎语>>>>>>>>>>>>>>>"); WeWelcomeMsg.WeWelcomeMsgBuilder weWelcomeMsgBuilder = WeWelcomeMsg.builder().welcome_code(message.getWelcomeCode()); - WeEmpleCodeDto messageMap = weEmpleCodeService.selectWelcomeMsgByActivityScene(message.getState(),message.getUserId()); + WeEmpleCodeDto messageMap = weEmpleCodeService.selectWelcomeMsgByScenario(message.getState(),message.getUserId()); String empleCodeId = messageMap.getEmpleCodeId(); //查询活码对应标签 List tagList = weEmpleCodeTagService.list(new LambdaQueryWrapper() diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customergroup/WeCallBackUpdateGroupImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customergroup/WeCallBackUpdateGroupImpl.java index c8458067d..8ff8d2195 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customergroup/WeCallBackUpdateGroupImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/factory/impl/customergroup/WeCallBackUpdateGroupImpl.java @@ -1,7 +1,9 @@ package com.linkwechat.wecom.factory.impl.customergroup; +import com.linkwechat.common.enums.CallbackEventUpdateDetail; import com.linkwechat.wecom.domain.vo.WxCpXmlMessageVO; import com.linkwechat.wecom.factory.WeEventStrategy; +import com.linkwechat.wecom.service.IWeGroupCodeActualService; import com.linkwechat.wecom.service.IWeGroupService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -18,10 +20,18 @@ public class WeCallBackUpdateGroupImpl extends WeEventStrategy { @Autowired private IWeGroupService weGroupService; + @Autowired + private IWeGroupCodeActualService groupCodeActualService; + @Override public void eventHandle(WxCpXmlMessageVO message) { try { weGroupService.updateWeGroup(message.getChatId()); + String updateDetail = message.getUpdateDetail(); + if (updateDetail.equals(CallbackEventUpdateDetail.ADD_MEMBER.getType())) { + // 添加成员,该群的实际群活码扫码次数需要加1 + groupCodeActualService.updateScanTimesByChatId(message.getChatId()); + } } catch (Exception e) { e.printStackTrace(); log.error("update>>>>>>>>>param:{},ex:{}",message.getChatId(),e); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCommunityNewGroupMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCommunityNewGroupMapper.java index 3a541819e..0918ebb00 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCommunityNewGroupMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCommunityNewGroupMapper.java @@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeCommunityNewGroup; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; /** * 社群运营 新客自动拉群 mapper接口 @@ -13,27 +15,28 @@ import java.util.List; * @author kewen * @date 2021-02-19 */ +@Repository public interface WeCommunityNewGroupMapper extends BaseMapper { /** * 查询新客自动拉群列表 * - * @param employCodeName 员工名称 - * @param createBy 创建人 - * @param beginTime 开始时间 - * @param endTime 结束时间 + * @param emplCodeName 员工名称 + * @param createBy 创建人 + * @param beginTime 开始时间 + * @param endTime 结束时间 * @return {WeCommunityNewGroupVo}s 列表 */ - List selectWeCommunityNewGroupList(@Param("employCodeName") String employCodeName, @Param("createBy") String createBy + List selectWeCommunityNewGroupList(@Param("emplCodeName") String emplCodeName, @Param("createBy") String createBy , @Param("beginTime") String beginTime, @Param("endTime") String endTime); /** * 获取新客自动拉群详细信息 * - * @param newGroupId 主键id + * @param id 主键id * @return {@link WeCommunityNewGroupVo} 自动拉群信息 */ - WeCommunityNewGroupVo selectWeCommunityNewGroupById(@Param("newGroupId") Long newGroupId); + Optional selectWeCommunityNewGroupById(@Param("id") Long id); /** * 删除新客自动拉群 @@ -41,7 +44,7 @@ public interface WeCommunityNewGroupMapper extends BaseMapper idList); + int batchRemoveWeCommunityNewGroupByIds(@Param("ids") List idList); /** * 通过id查询新客自动拉群信息列表 @@ -49,6 +52,6 @@ public interface WeCommunityNewGroupMapper extends BaseMapper selectWeCommunityNewGroupByIds(@Param("ids") List ids); + List selectWeCommunityNewGroupByIds(@Param("ids") List ids); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeMapper.java index 092dcbf52..f9c517db9 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeEmpleCode; import com.linkwechat.wecom.domain.dto.WeEmpleCodeDto; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; @@ -13,6 +14,7 @@ import java.util.List; * @author ruoyi * @date 2020-10-04 */ +@Repository public interface WeEmpleCodeMapper extends BaseMapper { /** @@ -81,10 +83,17 @@ public interface WeEmpleCodeMapper extends BaseMapper /** * 通过活动场景获取客户欢迎语 - * @param activityScene 活动场景 + * @param scenario 活动场景 * @return */ - public WeEmpleCodeDto selectWelcomeMsgByActivityScene(@Param("activityScene") String activityScene, @Param("userId") String userId); + public WeEmpleCodeDto selectWelcomeMsgByScenario(@Param("scenario") String scenario, @Param("userId") String userId); + + /** + * 通过state定位员工活码 + * @param state state + * @return 员工活码 + */ + WeEmpleCodeDto selectWelcomeMsgByState(@Param("state") String state); /** * 通过成员id 获取去成员活码 @@ -92,4 +101,10 @@ public interface WeEmpleCodeMapper extends BaseMapper * @return */ WeEmpleCode getQrcodeByUserId(String userId); + + /** + * 递增扫码次数 + * @param state state + */ + void updateScanTimesByState(String state); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeTagMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeTagMapper.java index 07d2637c3..b2bfa99b4 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeTagMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeTagMapper.java @@ -5,6 +5,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeEmpleCodeTag; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; /** * 员工活码标签Mapper接口 @@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param; * @author ruoyi * @date 2020-10-04 */ +@Repository public interface WeEmpleCodeTagMapper extends BaseMapper { /** @@ -81,7 +83,7 @@ public interface WeEmpleCodeTagMapper extends BaseMapper /** * 批量逻辑删除 - * @param ids + * @param ids 员工活码id列表 * @return */ public int batchRemoveWeEmpleCodeTagIds(@Param("ids") List ids); diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeUseScopMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeUseScopMapper.java index 7cb34889f..47587d12f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeUseScopMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeEmpleCodeUseScopMapper.java @@ -3,6 +3,7 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; @@ -12,6 +13,7 @@ import java.util.List; * @author ruoyi * @date 2020-10-04 */ +@Repository public interface WeEmpleCodeUseScopMapper extends BaseMapper { /** @@ -20,7 +22,7 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param id 员工活码使用人ID * @return 员工活码使用人 */ - public WeEmpleCodeUseScop selectWeEmpleCodeUseScopById(Long id); + WeEmpleCodeUseScop selectWeEmpleCodeUseScopById(Long id); /** * 查询员工活码使用人列表 @@ -28,7 +30,7 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param empleCodeId 员工活码id * @return 员工活码使用人集合 */ - public List selectWeEmpleCodeUseScopListById(@Param("empleCodeId") Long empleCodeId); + List selectWeEmpleCodeUseScopListById(@Param("empleCodeId") Long empleCodeId); /** * 查询员工活码使用人列表(批量) @@ -43,7 +45,7 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param weEmpleCodeUseScop 员工活码使用人 * @return 结果 */ - public int insertWeEmpleCodeUseScop(WeEmpleCodeUseScop weEmpleCodeUseScop); + int insertWeEmpleCodeUseScop(WeEmpleCodeUseScop weEmpleCodeUseScop); /** * 修改员工活码使用人 @@ -51,7 +53,7 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param weEmpleCodeUseScop 员工活码使用人 * @return 结果 */ - public int updateWeEmpleCodeUseScop(WeEmpleCodeUseScop weEmpleCodeUseScop); + int updateWeEmpleCodeUseScop(WeEmpleCodeUseScop weEmpleCodeUseScop); /** * 删除员工活码使用人 @@ -59,7 +61,7 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param id 员工活码使用人ID * @return 结果 */ - public int deleteWeEmpleCodeUseScopById(Long id); + int deleteWeEmpleCodeUseScopById(Long id); /** * 批量删除员工活码使用人 @@ -67,22 +69,22 @@ public interface WeEmpleCodeUseScopMapper extends BaseMapper * @param ids 需要删除的数据ID * @return 结果 */ - public int deleteWeEmpleCodeUseScopByIds(Long[] ids); + int deleteWeEmpleCodeUseScopByIds(Long[] ids); /** * 批量保存 * @param weEmpleCodeUseScops * @return */ - public int batchInsetWeEmpleCodeUseScop(@Param("weEmpleCodeUseScops") List weEmpleCodeUseScops); + int batchInsetWeEmpleCodeUseScop(@Param("weEmpleCodeUseScops") List weEmpleCodeUseScops); /** * 批量物理删除 - * @param ids + * @param ids 员工活码id列表 * @return */ - public int batchRemoveWeEmpleCodeUseScopIds(List ids); + int batchRemoveWeEmpleCodeUseScopIds(List ids); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeActualMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeActualMapper.java index 5be00c8e7..6dd9a16b8 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeActualMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeActualMapper.java @@ -3,6 +3,7 @@ package com.linkwechat.wecom.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroup; import com.linkwechat.wecom.domain.WeGroupCodeActual; /** @@ -18,14 +19,14 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param id 实际群码ID * @return 实际群码 */ - public WeGroupCodeActual selectWeGroupCodeActualById(Long id); + WeGroupCodeActual selectWeGroupCodeActualById(Long id); /** * 根据群聊id获取群实际码 * @param chatId 群聊id * @return 结果 */ - public WeGroupCodeActual selectWeGroupCodeActualByChatId(String chatId); + WeGroupCodeActual selectWeGroupCodeActualByChatId(String chatId); /** * 查询实际群码列表 @@ -33,7 +34,7 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param weGroupCodeActual 实际群码 * @return 实际群码集合 */ - public List selectWeGroupCodeActualList(WeGroupCodeActual weGroupCodeActual); + List selectWeGroupCodeActualList(WeGroupCodeActual weGroupCodeActual); /** * 新增实际群码 @@ -41,7 +42,7 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param weGroupCodeActual 实际群码 * @return 结果 */ - public int insertWeGroupCodeActual(WeGroupCodeActual weGroupCodeActual); + int insertWeGroupCodeActual(WeGroupCodeActual weGroupCodeActual); /** * 修改实际群码 @@ -49,7 +50,7 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param weGroupCodeActual 实际群码 * @return 结果 */ - public int updateWeGroupCodeActual(WeGroupCodeActual weGroupCodeActual); + int updateWeGroupCodeActual(WeGroupCodeActual weGroupCodeActual); /** * 删除实际群码 @@ -57,7 +58,7 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param id 实际群码ID * @return 结果 */ - public int deleteWeGroupCodeActualById(Long id); + int deleteWeGroupCodeActualById(Long id); /** * 批量删除实际群码 @@ -65,7 +66,7 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param ids 需要删除的数据ID * @return 结果 */ - public int deleteWeGroupCodeActualByIds(Long[] ids); + int deleteWeGroupCodeActualByIds(Long[] ids); /** * 通过群活码id查询实际码列表 @@ -73,19 +74,25 @@ public interface WeGroupCodeActualMapper extends BaseMapper { * @param groupCodeId 群活码id * @return 结果 */ - public List selectActualListByGroupCodeId(Long groupCodeId); + List selectActualListByGroupCodeId(Long groupCodeId); /** * 通过群活码id删除实际码 * @param groupCodeIds 群活码id列表 * @return 结果 */ - public int deleteActualListByGroupCodeIds(Long[] groupCodeIds); + int deleteActualListByGroupCodeIds(Long[] groupCodeIds); /** * 检测chatId是否唯一 * @param chatId 群聊id * @return 结果 */ - public int checkChatIdUnique(String chatId); + int checkChatIdUnique(String chatId); + + /** + * 通过群id递增其实际群活码扫码次数 + * @param chatId + */ + void updateScanTimesByChatId(String chatId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java index 46ddf921d..864d34ed3 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupCodeMapper.java @@ -3,6 +3,7 @@ package com.linkwechat.wecom.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroup; import com.linkwechat.wecom.domain.WeGroupCode; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @@ -86,4 +87,18 @@ public interface WeGroupCodeMapper extends BaseMapper * @return 结果 */ WeGroupCode getWeGroupByUuid(String uuid); + + /** + * 根据群活码id获取对应所有群聊信息 + * @param groupCodeId 群活码id + * @return 结果 + */ + List selectWeGroupListByGroupCodeId(Long groupCodeId); + + /** + * 获取群活码的总扫码次数 + * @param groupCodeId 群活码id + * @return 总扫码次数 + */ + int selectScanTimesByGroupCodeId(Long groupCodeId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagMapper.java index 1e7a4d9f0..4a265828a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagMapper.java @@ -5,6 +5,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeTag; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; /** * 企业微信标签Mapper接口 @@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param; * @author ruoyi * @date 2020-09-07 */ +@Repository public interface WeTagMapper extends BaseMapper { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java index d4fa04d8f..5ff24a153 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java @@ -7,6 +7,7 @@ import com.linkwechat.wecom.domain.vo.WeAllocateCustomersVo; import com.linkwechat.wecom.domain.vo.WeAllocateGroupsVo; import com.linkwechat.wecom.domain.vo.WeLeaveUserVo; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; @@ -16,6 +17,7 @@ import java.util.List; * @author ruoyi * @date 2020-08-31 */ +@Repository public interface WeUserMapper extends BaseMapper { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java index cffe13910..a44ce8b15 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java @@ -6,6 +6,7 @@ import com.linkwechat.wecom.domain.dto.WeCommunityNewGroupDto; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; import java.util.List; +import java.util.Optional; /** * 社群运营 新客自动拉群 @@ -26,25 +27,26 @@ public interface IWeCommunityNewGroupService extends IService selectWeCommunityNewGroupList(String empleCodeName, String createBy, String beginTime, String endTime); + List selectWeCommunityNewGroupList(String emplCodeName, String createBy, String beginTime, String endTime); /** * 获取新客自动拉群详细信息 * - * @param newGroupId 主键id + * @param id 主键id * @return {@link WeCommunityNewGroupVo} 自动拉群信息 */ - WeCommunityNewGroupVo selectWeCommunityNewGroupById(Long newGroupId); + Optional selectWeCommunityNewGroupById(Long id); /** * 修改新客自动拉群 * + * @param id 新客拉群id * @param communityNewGroupDto 信息 * @return 结果 */ - int updateWeCommunityNewGroup(WeCommunityNewGroupDto communityNewGroupDto); + int updateWeCommunityNewGroup(Long id, WeCommunityNewGroupDto communityNewGroupDto); /** * 删除新客自动拉群 @@ -52,15 +54,15 @@ public interface IWeCommunityNewGroupService extends IService idList); - - /** - * 通过id查询新客自动拉群信息 - * - * @param id id - * @return {@link WeCommunityNewGroup} 新客自动拉群信息 - */ - WeCommunityNewGroupVo selectWeCommunityNewGroupById(long id); + int batchRemoveWeCommunityNewGroupByIds(List idList); +// +// /** +// * 通过id查询新客自动拉群信息 +// * +// * @param id id +// * @return {@link WeCommunityNewGroup} 新客自动拉群信息 +// */ +// WeCommunityNewGroupVo selectWeCommunityNewGroupById(long id); /** * 通过id查询新客自动拉群信息列表 @@ -68,6 +70,6 @@ public interface IWeCommunityNewGroupService extends IService selectWeCommunityNewGroupByIds(List ids); + List selectWeCommunityNewGroupByIds(List ids); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeEmpleCodeService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeEmpleCodeService.java index 7bbe85296..3ade394fa 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeEmpleCodeService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeEmpleCodeService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 员工活码Service接口 - * + * * @author ruoyi * @date 2020-10-04 */ @@ -41,7 +41,7 @@ public interface IWeEmpleCodeService extends IService /** * 新增员工活码 - * + * * @param weEmpleCode 员工活码 * @return 结果 */ @@ -49,7 +49,7 @@ public interface IWeEmpleCodeService extends IService /** * 修改员工活码 - * + * * @param weEmpleCode 员工活码 * @return 结果 */ @@ -83,11 +83,18 @@ public interface IWeEmpleCodeService extends IService /** * 通过活动场景获取客户欢迎语 - * @param activityScene 活动场景 + * @param scenario 活动场景 * @param userId 成员id * @return */ - public WeEmpleCodeDto selectWelcomeMsgByActivityScene(String activityScene, String userId); + public WeEmpleCodeDto selectWelcomeMsgByScenario(String scenario, String userId); + + /** + * 通过state定位员工活码 + * @param state state + * @return 员工活码 + */ + WeEmpleCodeDto selectWelcomeMsgByState(String state); /** * 批量新增员工活码 @@ -116,4 +123,10 @@ public interface IWeEmpleCodeService extends IService * @return */ WeEmpleCode getQrcodeByUserId(String userId); + + /** + * 递增扫码次数 + * @param state state + */ + void updateScanTimesByState(String state); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeActualService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeActualService.java index ff60eeb1f..a3060e2ca 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeActualService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupCodeActualService.java @@ -75,4 +75,10 @@ public interface IWeGroupCodeActualService extends IService * @return 结果 */ public boolean checkChatIdUnique(WeGroupCodeActual weGroupCodeActual); + + /** + * 通过群id递增其实际群活码扫码次数 + * @param chatId + */ + void updateScanTimesByChatId(String chatId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityNewGroupServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityNewGroupServiceImpl.java index d9330eb0d..9d5e75757 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityNewGroupServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityNewGroupServiceImpl.java @@ -1,29 +1,26 @@ package com.linkwechat.wecom.service.impl; -import cn.hutool.core.collection.CollectionUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.google.common.collect.Lists; +import com.linkwechat.common.enums.WeEmpleCodeType; import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.SecurityUtils; -import com.linkwechat.wecom.client.WeExternalContactClient; +import com.linkwechat.common.utils.StringUtils; import com.linkwechat.wecom.domain.*; import com.linkwechat.wecom.domain.dto.WeCommunityNewGroupDto; import com.linkwechat.wecom.domain.dto.WeExternalContactDto; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; -import com.linkwechat.wecom.mapper.WeCommunityNewGroupMapper; -import com.linkwechat.wecom.mapper.WeGroupCodeMapper; +import com.linkwechat.wecom.domain.vo.WeGroupCodeVo; +import com.linkwechat.wecom.mapper.*; import com.linkwechat.wecom.service.IWeCommunityNewGroupService; -import com.linkwechat.wecom.service.IWeEmpleCodeTagService; -import com.linkwechat.wecom.service.IWeEmpleCodeUseScopService; -import com.linkwechat.wecom.service.IWeGroupCodeActualService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -37,27 +34,36 @@ import java.util.stream.Collectors; public class WeCommunityNewGroupServiceImpl extends ServiceImpl implements IWeCommunityNewGroupService { @Autowired - private WeGroupCodeMapper weGroupCodeMapper; + private WeEmpleCodeServiceImpl weEmpleCodeService; @Autowired - private WeEmpleCodeServiceImpl weEmpleCodeService; + private WeGroupCodeMapper weGroupCodeMapper; @Autowired private WeCommunityNewGroupMapper weCommunityNewGroupMapper; @Autowired - private IWeEmpleCodeTagService weEmpleCodeTagService; + private WeEmpleCodeTagMapper empleCodeTagMapper; + @Autowired + private WeEmpleCodeUseScopMapper empleCodeUseScopMapper; @Autowired - private IWeEmpleCodeUseScopService iWeEmpleCodeUseScopService; + private WeTagMapper weTagMapper; @Autowired - private WeExternalContactClient weExternalContactClient; + private WeEmpleCodeMapper weEmpleCodeMapper; @Autowired - private IWeGroupCodeActualService weGroupCodeActualService; + private WeUserMapper weUserMapper; + + /** + * 添加新客自动拉群信息 + * + * @param communityNewGroupDto 信息 + * @return 结果 + */ @Override @Transactional(rollbackFor = Exception.class) public int add(WeCommunityNewGroupDto communityNewGroupDto) { @@ -67,175 +73,223 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - iWeEmpleCodeUseScopService.saveBatch(weEmpleCode.getWeEmpleCodeUseScops()); - } - if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) { - weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - weEmpleCodeTagService.saveBatch(weEmpleCode.getWeEmpleCodeTags()); - } + WeExternalContactDto weExternalContactDto = weEmpleCodeService.getQrCode(weContactWay); + weEmpleCode.setConfigId(weExternalContactDto.getConfig_id()); + weEmpleCode.setQrCode(weExternalContactDto.getQr_code()); + + // 保存员工活码信息 + if (weEmpleCodeMapper.insertWeEmpleCode(weEmpleCode) > 0) { + // 批量保存员工活码标签 + empleCodeTagMapper.batchInsetWeEmpleCodeTag(weEmpleCode.getWeEmpleCodeTags()); + // 批量保存活码使用员工 + empleCodeUseScopMapper.batchInsetWeEmpleCodeUseScop(weEmpleCode.getWeEmpleCodeUseScops()); + + // 保存新客自动拉群信息 + WeCommunityNewGroup communityNewGroup = new WeCommunityNewGroup(); + communityNewGroup.setGroupCodeId(weGroupCode.getId()); + communityNewGroup.setEmplCodeName(communityNewGroupDto.getCodeName()); + communityNewGroup.setCreateBy(SecurityUtils.getUsername()); + communityNewGroup.setEmplCodeId(weEmpleCode.getId()); + + return weCommunityNewGroupMapper.insert(communityNewGroup); } - return 1; + return 0; } - private WeEmpleCode getWeEmpleCode(WeCommunityNewGroupDto communityNewGroupDto) { - WeEmpleCode weEmpleCode = new WeEmpleCode(); - weEmpleCode.setCodeType(2); - weEmpleCode.setActivityScene(communityNewGroupDto.getActivityScene()); - weEmpleCode.setIsJoinConfirmFriends(communityNewGroupDto.getIsJoinConfirmFriends()); - weEmpleCode.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); - weEmpleCode.setWeEmpleCodeUseScops(communityNewGroupDto.getWeEmpleCodeUseScops()); - weEmpleCode.setWeEmpleCodeTags(communityNewGroupDto.getWeEmpleCodeTags()); - weEmpleCode.setQrCode(communityNewGroupDto.getQrCode()); - weEmpleCode.setMediaId(communityNewGroupDto.getMediaId()); - weEmpleCode.setConfigId(communityNewGroupDto.getConfigId()); - return weEmpleCode; - } + /** + * 查询新客自动拉群列表 + * + * @param emplCodeName 员工活码名称 + * @param createBy 创建者 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return {@link WeCommunityNewGroupVo}s + */ @Override - public List selectWeCommunityNewGroupList(String empleCodeName, String createBy, String beginTime, String endTime) { - List weCommunityNewGroupVos = weCommunityNewGroupMapper.selectWeCommunityNewGroupList(empleCodeName, createBy, beginTime, endTime); - - if (CollectionUtil.isNotEmpty(weCommunityNewGroupVos)) { - List newGroupIdList = weCommunityNewGroupVos.stream().map(WeCommunityNewGroupVo::getNewGroupId).collect(Collectors.toList()); - List useScopList = iWeEmpleCodeUseScopService.selectWeEmpleCodeUseScopListByIds(newGroupIdList); - List tagList = weEmpleCodeTagService.selectWeEmpleCodeTagListByIds(newGroupIdList); - - weCommunityNewGroupVos.forEach(newGroup -> { - List weGroupCodeActuals = getWeGroupCodeActuals(newGroup); - newGroup.setWeGroupUserScops(weGroupCodeActuals); - //活码使用人对象 - List weEmpleCodeUseScopList = useScopList.stream() - .filter(useScop -> useScop.getEmpleCodeId().equals(newGroup.getNewGroupId())).collect(Collectors.toList()); - newGroup.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); - //员工活码标签对象 - newGroup.setWeEmpleCodeTags(tagList.stream() - .filter(tag -> tag.getEmpleCodeId().equals(newGroup.getNewGroupId())).collect(Collectors.toList())); - }); + public List selectWeCommunityNewGroupList(String emplCodeName, String createBy, String beginTime, String endTime) { + List communityNewGroupVos = weCommunityNewGroupMapper.selectWeCommunityNewGroupList(emplCodeName, createBy, beginTime, endTime); + if (StringUtils.isNotEmpty(communityNewGroupVos)) { + communityNewGroupVos.forEach(this::getCompleteEmplCodeInfo); } - return weCommunityNewGroupVos; + return communityNewGroupVos; } + /** + * 获取新客自动拉群详细信息 + * + * @param id 主键id + * @return {@link WeCommunityNewGroupVo} 自动拉群信息 + */ @Override - public WeCommunityNewGroupVo selectWeCommunityNewGroupById(Long newGroupId) { - WeCommunityNewGroupVo weCommunityNewGroupVo = weCommunityNewGroupMapper.selectWeCommunityNewGroupById(newGroupId); - if (null != weCommunityNewGroupVo) { - List weGroupCodeActuals = getWeGroupCodeActuals(weCommunityNewGroupVo); - weCommunityNewGroupVo.setWeGroupUserScops(weGroupCodeActuals); - List useScopList = iWeEmpleCodeUseScopService.selectWeEmpleCodeUseScopListByIds(Lists.newArrayList(weCommunityNewGroupVo.getNewGroupId())); - List tagList = weEmpleCodeTagService.selectWeEmpleCodeTagListByIds(Lists.newArrayList(weCommunityNewGroupVo.getNewGroupId())); - //活码使用人对象 - List weEmpleCodeUseScopList = useScopList.stream() - .filter(useScop -> useScop.getEmpleCodeId().equals(weCommunityNewGroupVo.getNewGroupId())).collect(Collectors.toList()); - weCommunityNewGroupVo.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); - //员工活码标签对象 - weCommunityNewGroupVo.setWeEmpleCodeTags(tagList.stream() - .filter(tag -> tag.getEmpleCodeId().equals(weCommunityNewGroupVo.getNewGroupId())).collect(Collectors.toList())); - } - return weCommunityNewGroupVo; + public Optional selectWeCommunityNewGroupById(Long id) { + Optional vo = weCommunityNewGroupMapper.selectWeCommunityNewGroupById(id); + vo.ifPresent(this::getCompleteEmplCodeInfo); + return vo; } - private List getWeGroupCodeActuals(WeCommunityNewGroupVo weCommunityNewGroupVo) { - WeGroupCodeActual weGroupCodeActual = new WeGroupCodeActual(); - weGroupCodeActual.setGroupCodeId(weCommunityNewGroupVo.getNewGroupId()); - return weGroupCodeActualService.selectWeGroupCodeActualList(weGroupCodeActual); - } - - @Override + /** + * 修改新客自动拉群。主要是对员工活码进行更新。需要先调用企微接口更新对应config_id的"联系我"配置 + * + * @param id 新客拉群id + * @param communityNewGroupDto 信息 + * @return 结果 + */ @Transactional(rollbackFor = Exception.class) - public int updateWeCommunityNewGroup(WeCommunityNewGroupDto communityNewGroupDto) { - - //检查群活码是否存在 + @Override + public int updateWeCommunityNewGroup(Long id, WeCommunityNewGroupDto communityNewGroupDto) { + // 检查新客拉群信息是否存在 + WeCommunityNewGroup communityNewGroup = weCommunityNewGroupMapper.selectById(id); + if (StringUtils.isNull(communityNewGroup)) { + throw new WeComException("新客拉群信息不存在!"); + } + // 检查群活码是否存在 WeGroupCode weGroupCode = weGroupCodeMapper.selectWeGroupCodeById(communityNewGroupDto.getGroupCodeId()); if (null == weGroupCode) { throw new WeComException("群活码不存在!"); } - //查询新客自动拉群信息 -// WeCommunityNewGroup communityNewGroup = weCommunityNewGroupMapper.selectOne(new LambdaQueryWrapper() -// .eq(WeCommunityNewGroup::getGroupCodeId, communityNewGroupDto.getGroupCodeId())); - WeCommunityNewGroup communityNewGroup = weCommunityNewGroupMapper.selectById(communityNewGroupDto.getNewGroupId()); - if (null == communityNewGroup) { - throw new WeComException("信息不存在!"); - } - - //更新员工活码信息 - WeEmpleCode weEmpleCode = getWeEmpleCode(communityNewGroupDto); - - WeExternalContactDto.WeContactWay weContactWay = weEmpleCodeService.getWeContactWay(weEmpleCode); + communityNewGroup.setGroupCodeId(communityNewGroupDto.getGroupCodeId()); try { - WeExternalContactDto weExternalContactDto = weExternalContactClient.updateContactWay(weContactWay); - System.out.println(weExternalContactDto.getQr_code()); - + // 更新员工活码以及其对应的 "联系我" 配置 + WeEmpleCode weEmplCode = weEmpleCodeMapper.selectWeEmpleCodeById(communityNewGroup.getEmplCodeId()); + // 更改员工活码的扫码标签、使用员工 + getScopsAndTags(weEmplCode, communityNewGroupDto); + // 更新使用场景、欢迎语、是否验证 + weEmplCode.setScenario(communityNewGroupDto.getCodeName()); + weEmplCode.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); + weEmplCode.setSkipVerify(communityNewGroupDto.getSkipVerify()); + weEmpleCodeService.updateWeEmpleCode(weEmplCode); } catch (Exception e) { - e.printStackTrace(); - } - communityNewGroup.setEmpleCodeName(communityNewGroupDto.getActivityScene()); - communityNewGroup.setDelFlag(0); - communityNewGroup.setCreateTime(new Date()); - communityNewGroup.setCreateBy(SecurityUtils.getUsername()); - communityNewGroup.setActivityScene(communityNewGroupDto.getActivityScene()); - communityNewGroup.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); - communityNewGroup.setIsJoinConfirmFriends(communityNewGroupDto.getIsJoinConfirmFriends()); - communityNewGroup.setMediaId(communityNewGroupDto.getMediaId()); - communityNewGroup.setGroupCodeId(communityNewGroupDto.getGroupCodeId()); - communityNewGroup.setQrCode(communityNewGroupDto.getQrCode()); - //更新新客自动拉群信息 - if (this.updateById(communityNewGroup)) { - if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeUseScops())) { - weEmpleCode.getWeEmpleCodeUseScops().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - iWeEmpleCodeUseScopService.saveOrUpdateBatch(weEmpleCode.getWeEmpleCodeUseScops()); - } - if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) { - weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - weEmpleCodeTagService.saveOrUpdateBatch(weEmpleCode.getWeEmpleCodeTags()); - } + throw new WeComException("员工活码更新失败"); } - - return 1; + communityNewGroup.setEmplCodeName(communityNewGroupDto.getCodeName()); + communityNewGroup.setUpdateBy(SecurityUtils.getUsername()); + return weCommunityNewGroupMapper.updateById(communityNewGroup); } + /** + * 批量删除新客自动拉群。不需要删除该拉群的员工活码信息 + * + * @param idList 新客拉群id列表 + * @return 标签对象列表 + */ @Override - public int batchRemoveWeCommunityNewGroupIds(List idList) { - return weCommunityNewGroupMapper.batchRemoveWeCommunityNewGroupIds(idList); + @Transactional + public int batchRemoveWeCommunityNewGroupByIds(List idList) { + // 删除新客拉群信息 + return weCommunityNewGroupMapper.batchRemoveWeCommunityNewGroupByIds(idList); } + /** + * 通过id查询新客自动拉群信息列表 + * + * @param ids id列表 + * @return {@link WeCommunityNewGroup} 新客自动拉群信息 + */ @Override - public WeCommunityNewGroupVo selectWeCommunityNewGroupById(long id) { - return weCommunityNewGroupMapper.selectWeCommunityNewGroupById(id); + public List selectWeCommunityNewGroupByIds(List ids) { + return weCommunityNewGroupMapper.selectWeCommunityNewGroupByIds(ids); } - @Override - public List selectWeCommunityNewGroupByIds(List ids) { - return weCommunityNewGroupMapper.selectWeCommunityNewGroupByIds(ids); + /** + * 创建员工活码 + * + * @param communityNewGroupDto 数据 + * @return 员工活码 + */ + private WeEmpleCode getWeEmpleCode(WeCommunityNewGroupDto communityNewGroupDto) { + + WeEmpleCode weEmpleCode = new WeEmpleCode(); + + // 获取员工和扫码标签 + getScopsAndTags(weEmpleCode, communityNewGroupDto); + + // 固定为多人类型 + weEmpleCode.setCodeType(WeEmpleCodeType.MULTI.getType()); + + weEmpleCode.setSkipVerify(communityNewGroupDto.getSkipVerify()); + // 欢迎语 + weEmpleCode.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); + // state,用于区分客户具体是通过哪个「联系我」添加,最大30个字符。使用id作为值即可,使用uuid则会超长。 + weEmpleCode.setState(weEmpleCode.getId().toString()); + + // 活动场景,使用键入的活码名称 + weEmpleCode.setScenario(communityNewGroupDto.getCodeName()); + + // 通用属性设置 + weEmpleCode.setCreateBy(SecurityUtils.getUsername()); + + return weEmpleCode; + } + + private void getScopsAndTags(WeEmpleCode weEmpleCode, WeCommunityNewGroupDto communityNewGroupDto) { + // 获取活码员工列表 TODO user_id是对应business_id? + QueryWrapper userQueryWrapper = new QueryWrapper<>(); + userQueryWrapper.in("user_id", communityNewGroupDto.getEmplList()); + List weUserList = weUserMapper.selectList(userQueryWrapper); + List weEmpleCodeUseScopList = weUserList.stream().map(e -> { + WeEmpleCodeUseScop scop = new WeEmpleCodeUseScop(); + scop.setEmpleCodeId(weEmpleCode.getId()); + scop.setBusinessId(e.getUserId()); + scop.setBusinessIdType(2); + scop.setBusinessName(e.getName()); + return scop; + }).collect(Collectors.toList()); + weEmpleCode.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); + + // 获取活码标签 + List tagIdList = communityNewGroupDto.getTagList(); + QueryWrapper tagQueryWrapper = new QueryWrapper<>(); + tagQueryWrapper.in("tag_id", tagIdList); + List weTagList = weTagMapper.selectList(tagQueryWrapper); + List weEmpleCodeTagList = weTagList.stream().map(e -> { + WeEmpleCodeTag tag = new WeEmpleCodeTag(); + tag.setEmpleCodeId(weEmpleCode.getId()); + tag.setTagId(e.getTagId()); + tag.setTagName(e.getName()); + return tag; + }).collect(Collectors.toList()); + weEmpleCode.setWeEmpleCodeTags(weEmpleCodeTagList); + } + + /** + * 获取完整的新客自动拉群相关信息 + * + * @param vo 新客自动拉群 + */ + private void getCompleteEmplCodeInfo(WeCommunityNewGroupVo vo) { + // 获取群活码信息 + WeGroupCode weGroupCode = weGroupCodeMapper.selectWeGroupCodeById(vo.getGroupCodeId()); + WeGroupCodeVo weGroupCodeVo = new WeGroupCodeVo(); + BeanUtils.copyProperties(weGroupCode, weGroupCodeVo); + vo.setGroupCodeInfo(weGroupCodeVo); + + // 获取员工列表信息 + List empleCodeUseScopList = empleCodeUseScopMapper.selectWeEmpleCodeUseScopListById(vo.getEmplCodeId()); + vo.setEmplList(empleCodeUseScopList); + + // 获取员工活码信息 + WeEmpleCode empleCode = weEmpleCodeMapper.selectWeEmpleCodeById(vo.getEmplCodeId()); + vo.setEmplCodeUrl(empleCode.getQrCode()); + vo.setWelcomeMsg(empleCode.getWelcomeMsg()); + + // 获取相关群聊信息 + List groupList = weGroupCodeMapper.selectWeGroupListByGroupCodeId(vo.getGroupCodeId()); + vo.setGroupList(groupList); + + // 获取标签信息 + List tagList = empleCodeTagMapper.selectWeEmpleCodeTagListById(vo.getEmplCodeId()); + vo.setTagList(tagList); + + vo.setSkipVerify(empleCode.getSkipVerify()); } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java index ce146e59d..ff4601d81 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java @@ -2,9 +2,11 @@ package com.linkwechat.wecom.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.SecurityUtils; import com.linkwechat.common.utils.SnowFlakeUtil; import com.linkwechat.common.utils.StringUtils; @@ -16,6 +18,8 @@ import com.linkwechat.wecom.domain.WeMaterial; import com.linkwechat.wecom.domain.dto.WeEmpleCodeDto; import com.linkwechat.wecom.domain.dto.WeExternalContactDto; import com.linkwechat.wecom.mapper.WeEmpleCodeMapper; +import com.linkwechat.wecom.mapper.WeEmpleCodeTagMapper; +import com.linkwechat.wecom.mapper.WeEmpleCodeUseScopMapper; import com.linkwechat.wecom.service.IWeEmpleCodeService; import com.linkwechat.wecom.service.IWeEmpleCodeTagService; import com.linkwechat.wecom.service.IWeEmpleCodeUseScopService; @@ -56,6 +60,12 @@ public class WeEmpleCodeServiceImpl extends ServiceImpl weEmpleCodeUseScopList = new ArrayList<>(); weEmpleCodeUseScopList.add(useScops); weEmpleCode.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); @@ -347,8 +370,8 @@ public class WeEmpleCodeServiceImpl extends ServiceImpl @@ -368,4 +391,14 @@ public class WeEmpleCodeServiceImpl extends ServiceImpl + + + + + + + + + - SELECT new_group_id, - emple_code_name, + SELECT id, + empl_code_name, + empl_code_id, group_code_id, create_by, create_time, update_by, update_time, - del_flag, - activity_scene, - welcome_msg, - qr_code, - is_join_confirm_friends, - media_id, - join_friend_nums, - config_id, - user_qr_code + del_flag FROM we_community_new_group - + + update we_community_new_group set del_flag = 1 - where new_group_id in + where id in #{id} - del_flag = 0 - - AND emple_code_name LIKE CONCAT("%",#{employCodeName},"%") + + AND empl_code_name LIKE CONCAT("%",#{emplCodeName},"%") AND date_format(create_time,'%y%m%d') >= date_format(#{beginTime},'%y%m%d') @@ -54,18 +56,18 @@ - - new_group_id =#{newGroupId} + del_flag = 0 AND id = #{id} - - new_group_id in + del_flag = 0 + AND id in #{id} diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeMapper.xml index 924b292f1..2d87ee440 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeMapper.xml @@ -7,8 +7,8 @@ - - + + @@ -16,6 +16,8 @@ + + @@ -28,21 +30,23 @@ - select id, code_type, is_join_confirm_friends, activity_scene, welcome_msg, create_by, create_time, del_flag, config_id,qr_code from we_emple_code + select id, code_type, skip_verify, scenario, welcome_msg, create_by, create_time, del_flag, config_id,qr_code, state, scan_times from we_emple_code select wec.id, wec.code_type, - wec.is_join_confirm_friends, - wec.activity_scene, + wec.skip_verify, + wec.scenario, wec.welcome_msg, wec.create_by, wec.create_time, wec.del_flag, wec.config_id, - wec.qr_code + wec.state, + wec.qr_code, + wec.scan_times from we_emple_code wec left join we_emple_code_use_scop wecus on wec.id = wecus.emple_code_id and wecus.business_id_type = 2 @@ -54,14 +58,16 @@ wecode.id, wecode.code_type, wecode.media_id, - wecode.is_join_confirm_friends, - wecode.activity_scene, + wecode.skip_verify, + wecode.scenario, wecode.welcome_msg, wecode.create_by, wecode.create_time, wecode.del_flag, wecode.config_id, wecode.qr_code, + wecode.state, + wecode.scan_times, wecusn.business_id, wecusn.business_name, wecusn.mobile, @@ -88,9 +94,9 @@ select wecode.id as emple_code_id, @@ -217,8 +229,8 @@ wm .id = wecode.media_id where wecode.del_flag = 0 - - and wecode.activity_scene = #{activityScene} + + and wecode.scenario = #{scenario} and wecus.business_id = #{userId} @@ -226,6 +238,30 @@ + + + + + + update we_emple_code + set scan_times = scan_times + 1 + where state = #{state} + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeUseScopMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeUseScopMapper.xml index 53d2826c8..1c15d02f4 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeUseScopMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeEmpleCodeUseScopMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -44,12 +44,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + insert into we_emple_code_use_scop @@ -84,17 +84,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from we_emple_code_use_scop where id in + delete from we_emple_code_use_scop where id in #{id} - insert into we_emple_code_use_scop (id,emple_code_id,business_id,business_name,del_flag) + insert into we_emple_code_use_scop (id,emple_code_id,business_id,business_name, business_id_type, del_flag) values - (#{scop.id},#{scop.empleCodeId},#{scop.businessId},#{scop.businessName},#{scop.delFlag}) + (#{scop.id},#{scop.empleCodeId},#{scop.businessId},#{scop.businessName},#{scop.businessIdType},#{scop.delFlag}) @@ -102,10 +102,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update we_emple_code_use_scop set del_flag = 2 where emple_code_id in - #{id} - + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeActualMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeActualMapper.xml index 54eb11b64..52f547c59 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeActualMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeActualMapper.xml @@ -108,6 +108,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + update we_group_code_actual + set scan_code_times = scan_code_times + 1 + where chat_id = #{chatId} + + delete from we_group_code_actual where id = #{id} diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml index 82ea07977..eaa3a17e5 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupCodeMapper.xml @@ -93,6 +93,29 @@ where w.id = #{id} + + + + diff --git a/sql/link-wechat.sql b/sql/link-wechat.sql index 104e0e164..c99a14485 100644 --- a/sql/link-wechat.sql +++ b/sql/link-wechat.sql @@ -20138,18 +20138,17 @@ INSERT INTO `we_chat_side` VALUES ('6', '5', '海报类型', '10', '0', null, nu -- ---------------------------- DROP TABLE IF EXISTS `we_community_new_group`; CREATE TABLE `we_community_new_group` ( - `new_group_id` bigint(64) NOT NULL COMMENT '主键ID', - `emple_code_id` bigint(64) DEFAULT NULL COMMENT '员工活码ID', - `emple_code_name` varchar(100) DEFAULT NULL COMMENT '员工活码名称', - `group_code_id` bigint(64) DEFAULT NULL COMMENT '群活码ID', - `create_by` varchar(64) DEFAULT NULL, - `create_time` datetime DEFAULT NULL, - `update_by` varchar(64) DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `del_flag` int(1) DEFAULT '0', - PRIMARY KEY (`new_group_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='新客自动拉群'; - + `id` bigint(64) NOT NULL COMMENT '主键ID', + `empl_code_name` varchar(100) NOT NULL COMMENT '员工活码名称', + `group_code_id` bigint(64) NOT NULL COMMENT '群活码ID', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '修改人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `del_flag` int(1) DEFAULT '0' COMMENT '0:正常;1:删除;', + `empl_code_id` bigint(20) NOT NULL COMMENT '员工活码id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='新客自动拉群' -- ---------------------------- -- Records of we_community_new_group -- ---------------------------- @@ -24154,8 +24153,8 @@ DROP TABLE IF EXISTS `we_emple_code`; CREATE TABLE `we_emple_code` ( `id` bigint(20) NOT NULL, `code_type` tinyint(4) DEFAULT NULL COMMENT '活码类型:1:批量;2:单人;3:多人;', - `is_join_confirm_friends` tinyint(4) DEFAULT NULL COMMENT '客户添加时无需经过确认自动成为好友:1:是;0:否', - `activity_scene` varchar(300) DEFAULT NULL COMMENT '活动场景', + `skip_verify` tinyint(4) DEFAULT NULL COMMENT '客户添加时无需经过确认自动成为好友:1:是;0:否', + `scenario` varchar(300) DEFAULT NULL COMMENT '活动场景', `welcome_msg` varchar(60) DEFAULT NULL COMMENT '欢迎语', `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -24163,35 +24162,16 @@ CREATE TABLE `we_emple_code` ( `config_id` varchar(50) DEFAULT NULL COMMENT '新增联系方式的配置id', `qr_code` varchar(100) DEFAULT NULL COMMENT '二维码链接', `media_id` bigint(20) DEFAULT NULL COMMENT '素材id', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='员工活码表'; + `state` varchar(30) DEFAULT NULL COMMENT '用于区分客户具体是通过哪个「联系我」添加。不能超过30个字符。', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `scan_times` int(11) NOT NULL DEFAULT '0' COMMENT '该员工活码的扫码次数', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='员工活码表' -- ---------------------------- -- Records of we_emple_code -- ---------------------------- -INSERT INTO `we_emple_code` VALUES ('1326456976804286464', '1', '1', '测试场景', '欢迎加我微信', 'admin', '2020-11-11 17:29:22', '1', null, null, null); -INSERT INTO `we_emple_code` VALUES ('1333283446512029696', '1', '1', '测试', '反反复复', 'admin', '2020-11-30 13:35:20', '1', '8a1a02dd48af74abddd9742d5656ea93', 'https://wework.qpic.cn/wwpic/797066_R18FRn2jR_m9MVp_1606714519/0', '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1333284454675910656', '2', '1', '测试多人', '反反复复', 'admin', '2020-11-30 13:39:20', '1', '09c1e17569cc83ba162472382ba9a021', 'https://wework.qpic.cn/wwpic/178524_-bVn8D-OQeOyBEZ_1606714760/0', '1333281312584372224'); -INSERT INTO `we_emple_code` VALUES ('1333307181688295424', '1', '1', '测试个人', '测试个人', 'admin', '2020-11-30 15:09:38', '1', '4a1fc5b877c54c87b70dc1987782ec97', 'https://wework.qpic.cn/wwpic/747967_JN7jXRYPRBOAV8Q_1606720178/0', '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1333307316556140544', '2', '1', '测试多人', '测试多人', 'admin', '2020-11-30 15:10:11', '0', 'd431a637de3d6095f0fb6396ee1ee253', 'https://wework.qpic.cn/wwpic/870989_UfArHAvSS7uY8DQ_1606720210/0', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1333321986788691968', '1', '1', '测试测试它', '欢迎光临', 'admin', '2020-11-30 16:08:28', '0', '9e3bb2d4291e5d5bb4bd9b9af51b02ae', 'https://wework.qpic.cn/wwpic/401133_9kFd-DQNRYmXCUH_1608889743/0', '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1334748765000699904', '1', '0', '胜多负少', null, 'admin', '2020-12-04 14:37:59', '1', null, null, '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1335099526549213184', '1', '0', '是的', '是公司', 'admin', '2020-12-05 13:51:47', '1', null, null, '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1339470240295292928', '1', '1', '码云入群', '欢迎关注Linkwechat!', 'admin', '2020-12-17 15:19:26', '1', null, '', null); -INSERT INTO `we_emple_code` VALUES ('1339471190355480576', '1', '1', '码云加群', '欢迎关注linkwechat!', 'admin', '2020-12-17 15:23:13', '0', '6913293c8c88460e56140bb8ddfb6050', 'https://wework.qpic.cn/wwpic/932103_itm3jjENRkunPBW_1608189792/0', null); -INSERT INTO `we_emple_code` VALUES ('1347751705542004736', '1', '1', '111111111111111111111111111111', '分发给他', 'admin', '2021-01-09 11:47:01', '1', null, '', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1347753507050098688', '1', '1', '1111', '111111', 'admin', '2021-01-09 11:54:11', '0', '2b647fade018081066130c6237b32276', 'https://wework.qpic.cn/wwpic/187770_HU8zxBf_SmKMjxM_1610164451/0', null); -INSERT INTO `we_emple_code` VALUES ('1349722261107642368', '2', '0', null, '测试111', 'admin', '2021-01-14 22:17:18', '1', null, '', '1333022014193143808'); -INSERT INTO `we_emple_code` VALUES ('1349723537274966016', '1', '1', '1', '1', 'admin', '2021-01-14 22:22:23', '0', null, '', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1349724997391880192', '2', '0', '2', '2', 'admin', '2021-01-14 22:28:11', '0', '5abadc11db2ac9b77d994ec017c02045', 'https://wework.qpic.cn/wwpic/950045_zoFB4ywsSqW6Edk_1610634490/0', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1349727145127186432', '1', '0', '', null, 'admin', '2021-01-14 22:36:43', '0', '5acecef11e4a8063161dcc2d9130a8aa', 'https://wework.qpic.cn/wwpic/97022_AlqMayNvRAiw8rY_1610635003/0', null); -INSERT INTO `we_emple_code` VALUES ('1360045616641740800', '1', '0', '放一放', '有', 'admin', '2021-02-12 09:58:38', '0', 'bd265217030555e5ca40793ca0eac8c1', 'https://wework.qpic.cn/wwpic/531532_bvW-Rck7R9GC3ef_1613095118/0', null); -INSERT INTO `we_emple_code` VALUES ('1361961254406721536', '2', '1', 'dsd', '11112344', 'admin', '2021-02-17 16:50:42', '1', 'c54f7acd3328b576cdc80288cb596c60', 'https://wework.qpic.cn/wwpic/158551_VEogRv4LQue6pDr_1613551842/0', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1362021107510677504', '2', '1', '测试多人哇哇哇1', '测试欢迎多人码123456', 'admin', '2021-02-17 20:48:32', '0', 'a08161c55d9d1d3dc90fc34fc098739e', 'https://wework.qpic.cn/wwpic/171788_-UrrOgN7RpGoEHQ_1613566112/0', '1354320802832584704'); -INSERT INTO `we_emple_code` VALUES ('1362033099269083136', '2', '1', 'vvcv', 'fddfdsfs', 'admin', '2021-02-17 21:36:11', '0', null, '', '1344530706545643520'); -INSERT INTO `we_emple_code` VALUES ('1363428436030394368', '2', '1', 'ghgh', 'hgfhgf ', 'admin', '2021-02-21 18:00:45', '1', 'f3cdf40e93cc70421a005526a41c141c', 'https://wework.qpic.cn/wwpic/270235_BJtY49LbRiS5xUw_1613901645/0', '1354320802832584704'); -INSERT INTO `we_emple_code` VALUES ('1363782299438682112', '1', '1', '123', null, 'WeCome', '2021-02-22 17:26:53', '0', 'e4eb857397abe66002237f8b081170ab', 'https://wework.qpic.cn/wwpic/123516_CYrFq5IIQWCoPc7_1613986013/0', null); -INSERT INTO `we_emple_code` VALUES ('1363782417915187200', '1', '0', '123', null, 'WeCome', '2021-02-22 17:27:21', '0', '705d08cd059c5efd1c826a70e764157a', 'https://wework.qpic.cn/wwpic/190726_9ygIGgUaQmyIBjJ_1613986041/0', null); -- ---------------------------- -- Table structure for we_emple_code_tag @@ -24209,30 +24189,6 @@ CREATE TABLE `we_emple_code_tag` ( -- ---------------------------- -- Records of we_emple_code_tag -- ---------------------------- -INSERT INTO `we_emple_code_tag` VALUES ('1326456976808480769', 'nDQAACFz3gFh1wZ5cSqQhApwUyA', null, '1326456976804286464', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333283446516224000', 'et2H-nDQAACFz3gFh1wZ5cSqQhApwUyA', '企业QQ', '1333283446512029696', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333284454675910657', 'et2H-nDQAATH8oY7ppNrVgpMJeEnXj3w', '企业用户', '1333284454675910656', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333284454675910658', 'et2H-nDQAAsQsbOPfpKVNf_vc9Zwl8ww', 'ss', '1333284454675910656', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333307181692489728', 'et2H-nDQAAsQsbOPfpKVNf_vc9Zwl8ww', 'ss', '1333307181688295424', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333307316556140545', 'et2H-nDQAACFz3gFh1wZ5cSqQhApwUyA', '企业QQ', '1333307316556140544', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333307316556140546', 'et2H-nDQAAd7YUGnw71_iXjD-HaruyFg', '123', '1333307316556140544', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333307316556140547', 'et2H-nDQAAOh5qBB5mEP1Z0asFCI99HQ', '111', '1333307316556140544', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1333321986822246400', 'et2H-nDQAACFz3gFh1wZ5cSqQhApwUyA', '企业QQ', '1333321986788691968', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1347751705550393344', 'et2H-nDQAAibBWd1hLQ6JCEO2WuT5CJA', '牛逼', '1347751705542004736', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1347751705550393345', 'et2H-nDQAAXTX83q-6b-03YsLqJVC6yQ', '大客户A', '1347751705542004736', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1349727145127186433', 'et2H-nDQAAxl2C49iD32IfbAbzB6iPsQ', '2', '1349727145127186432', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1349727145127186434', 'et2H-nDQAALEcWxXVtJGnXX1hE1LfVwg', '客户234', '1349727145127186432', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1349727145127186435', 'et2H-nDQAAN04RIxYu38nOJEYy7QxLxQ', '哈', '1349727145127186432', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1349727145127186436', 'et2H-nDQAAu6X6vK7HwdAQLLfYEJ3Aww', '很熟悉', '1349727145127186432', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1361961254406721537', 'et2H-nDQAA3BIW0d9qKA8c7gSU_gGcDg', '高手', '1361961254406721536', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1361961254406721538', 'et2H-nDQAAaL59T3-GwGomqgEOX-osNg', '二', '1361961254406721536', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1361961254406721539', 'et2H-nDQAAfeEOwoIplFcAJyhutaJCVg', 'test', '1361961254406721536', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1362021107510677505', 'et2H-nDQAAWagEOi96PHb42IgGunTRpQ', '高手', '1362021107510677504', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1363428436030394369', 'et2H-nDQAA2fcc9i41FzYxxjKqOe-tKA', 'IT', '1363428436030394368', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1363428436030394370', 'et2H-nDQAAG-XqO7bljOH-02zVxhTW9w', '456', '1363428436030394368', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1363428436030394371', 'et2H-nDQAAKPXWgYdjpva4N40lgZm4yw', '4564564564', '1363428436030394368', '0'); -INSERT INTO `we_emple_code_tag` VALUES ('1363428436030394372', 'et2H-nDQAAOZNSSbFT5fGHbbXiN0rGhA', '456456456', '1363428436030394368', '0'); - -- ---------------------------- -- Table structure for we_emple_code_use_scop -- ---------------------------- @@ -24251,45 +24207,6 @@ CREATE TABLE `we_emple_code_use_scop` ( -- ---------------------------- -- Records of we_emple_code_use_scop -- ---------------------------- -INSERT INTO `we_emple_code_use_scop` VALUES ('1326456976808480768', '1326456976804286464', '2', null, '18158873850', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333283446520418304', '1333283446512029696', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333284454675910659', '1333284454675910656', '2', '徐学军', 'XuXueJun', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333284454675910660', '1333284454675910656', '2', '孙喜旺', 'administrator', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333284454675910661', '1333284454675910656', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333307181692489729', '1333307181688295424', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333307316556140548', '1333307316556140544', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333307316556140549', '1333307316556140544', '2', '孙喜旺', 'administrator', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333307316556140550', '1333307316556140544', '2', '徐学军', 'XuXueJun', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1333321986822246401', '1333321986788691968', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1339470240299487232', '1339470240295292928', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1339471190355480577', '1339471190355480576', '2', '江冬勤', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1347751705550393346', '1347751705542004736', '2', '郑伟', 'zhengjw10', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1347753507054292992', '1347753507050098688', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261107642369', '1349722261107642368', '2', 'JDQ', '15665400628', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261107642370', '1349722261107642368', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261107642371', '1349722261107642368', '2', '董春林', 'DongChunLin', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261107642372', '1349722261107642368', '2', '郑伟', 'zhengjw10', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261107642373', '1349722261107642368', '2', '齐叶青', 'ZheMi', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349722261111836672', '1349722261107642368', '2', '孙喜旺', 'DanMo', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349723537274966017', '1349723537274966016', '2', '郑伟', 'zhengjw10', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349724997391880193', '1349724997391880192', '2', '董健', 'DongDongQiang', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1349727145127186437', '1349727145127186432', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1360045616645935104', '1360045616641740800', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1361961254406721540', '1361961254406721536', '2', '董春林', 'DongChunLin', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1361961254406721541', '1361961254406721536', '2', '董健', 'DongDongQiang', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1361961254406721542', '1361961254406721536', '2', '黄梦怡', 'Meng', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1361961254406721543', '1361961254406721536', '2', '舒俊丽', 'XiaoSheYu', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362021107510677506', '1362021107510677504', '2', '柯文', 'KeWen', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362021107510677507', '1362021107510677504', '2', '徐学军', 'XuXueJun', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362033099269083137', '1362033099269083136', '2', '徐学军', 'XuXueJun', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362033099269083138', '1362033099269083136', '2', '郑伟', 'zhengjw10', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362033099269083139', '1362033099269083136', '2', '阿三', 'asan', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362033099269083140', '1362033099269083136', '2', 'aaaaa', 'aaaa', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1362033099269083141', '1362033099269083136', '2', 'www', 'wdd', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1363428436030394373', '1363428436030394368', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1363428436030394374', '1363428436030394368', '2', '董春林', 'DongChunLin', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1363782299438682113', '1363782299438682112', '2', '舒俊丽', 'XiaoSheYu', '0', null); -INSERT INTO `we_emple_code_use_scop` VALUES ('1363782417915187201', '1363782417915187200', '2', '徐学军', '45DuXiangShangQingXie', '0', null); -- ---------------------------- -- Table structure for we_flower_customer_rel -- Gitee From eb4ba38377d0acbe1f57cff77657244631037403 Mon Sep 17 00:00:00 2001 From: YaoYuHang Date: Thu, 15 Apr 2021 11:33:52 +0800 Subject: [PATCH 43/50] =?UTF-8?q?=E6=96=B0=E5=AE=A2=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=8B=89=E7=BE=A4=E3=80=81=E5=91=98=E5=B7=A5=E6=B4=BB=E7=A0=81?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=E3=80=81?= =?UTF-8?q?=E7=BE=A4=E6=B4=BB=E7=A0=81=E5=8F=8A=E5=91=98=E5=B7=A5=E6=B4=BB?= =?UTF-8?q?=E7=A0=81=E6=89=AB=E7=A0=81=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/CallbackEventUpdateDetail.java | 27 +++++++++++++++++ .../common/enums/WeEmpleCodeType.java | 29 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 linkwe-common/src/main/java/com/linkwechat/common/enums/CallbackEventUpdateDetail.java create mode 100644 linkwe-common/src/main/java/com/linkwechat/common/enums/WeEmpleCodeType.java diff --git a/linkwe-common/src/main/java/com/linkwechat/common/enums/CallbackEventUpdateDetail.java b/linkwe-common/src/main/java/com/linkwechat/common/enums/CallbackEventUpdateDetail.java new file mode 100644 index 000000000..e1eedafe0 --- /dev/null +++ b/linkwe-common/src/main/java/com/linkwechat/common/enums/CallbackEventUpdateDetail.java @@ -0,0 +1,27 @@ +package com.linkwechat.common.enums; + +import lombok.Getter; + +/** + * 客户群变更时间的回调参数 UpdateDetail + * 变更详情。目前有以下几种: + * add_member : 成员入群 + * del_member : 成员退群 + * change_owner : 群主变更 + * change_name : 群名变更 + * change_notice : 群公告变更 + */ +@Getter +public enum CallbackEventUpdateDetail { + ADD_MEMBER("add_member"), + DEL_MEMBER("del_member"), + CHANGE_OWNER("change_owner"), + CHANGE_NAME("change_name"), + CHANGE_NOTICE("change_notice"); + + private final String type; + + CallbackEventUpdateDetail(String type) { + this.type = type; + } +} diff --git a/linkwe-common/src/main/java/com/linkwechat/common/enums/WeEmpleCodeType.java b/linkwe-common/src/main/java/com/linkwechat/common/enums/WeEmpleCodeType.java new file mode 100644 index 000000000..979f3b5ae --- /dev/null +++ b/linkwe-common/src/main/java/com/linkwechat/common/enums/WeEmpleCodeType.java @@ -0,0 +1,29 @@ +package com.linkwechat.common.enums; + + +/** + * 群活码运用场景: 单人、多人、批量 + */ +public enum WeEmpleCodeType { + + // 员工活码类型:1:单人;2:多人;3:批量; + SINGLE(1, "单人"), + MULTI(2, "多人"), + BATCH(3, "批量"); + + private final Integer type; + private final String info; + + WeEmpleCodeType(Integer type, String info) { + this.type = type; + this.info = info; + } + + public Integer getType() { + return type; + } + + public String getInfo() { + return info; + } +} -- Gitee From 1bfad9e749021b110c286c747bc64fa6a056a645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Fri, 16 Apr 2021 17:03:30 +0800 Subject: [PATCH 44/50] =?UTF-8?q?:hammer:=20=E4=BD=BF=E7=94=A8mvnw?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=9E=84=E5=BB=BA=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mvn/wrapper/MavenWrapperDownloader.java | 117 +++++++++ .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 2 + mvnw | 310 +++++++++++++++++++++++ mvnw.cmd | 182 +++++++++++++ 5 files changed, 611 insertions(+) create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..b901097f2 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..841206814 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=http://10.252.96.249:8081/repository/maven-public//org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=http://10.252.96.249:8081/repository/maven-public//io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/mvnw b/mvnw new file mode 100644 index 000000000..41c0f0c23 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 000000000..86115719e --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% -- Gitee From d140e64412ec5cdafeeeadcb44e7551563596e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Fri, 16 Apr 2021 18:20:39 +0800 Subject: [PATCH 45/50] =?UTF-8?q?:bug:=20=E4=BF=AE=E6=94=B9docker=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linkwe-admin/src/main/docker/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/linkwe-admin/src/main/docker/Dockerfile b/linkwe-admin/src/main/docker/Dockerfile index bb49258b4..edfe17e61 100644 --- a/linkwe-admin/src/main/docker/Dockerfile +++ b/linkwe-admin/src/main/docker/Dockerfile @@ -1,5 +1,7 @@ FROM openjdk:8-alpine +RUN set -xe && apk --no-cache add ttf-dejavu fontconfig + # 设置时区 ADD Shanghai /usr/share/zoneinfo/Asia/ RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ -- Gitee From 37f5da7738b4cce16429d46d8f1b95de52351b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Fri, 16 Apr 2021 18:21:01 +0800 Subject: [PATCH 46/50] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8Ddocker-compose.?= =?UTF-8?q?yml=E7=AB=AF=E5=8F=A3=E5=8F=B7=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8f309f336..b9477a38b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: - REDIS_HOST - REDIS_PORT ports: - - "${APP_PORT}:8090" + - 8090 volumes: - ./logs:/logs # 上传文件地址,请根据实际${ruoyi.profile}自行修改映射 -- Gitee From 57864fe22f6f65e6b07ecdfb50b8295ccaaf01fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Fri, 16 Apr 2021 18:21:23 +0800 Subject: [PATCH 47/50] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8Dpom.xml?= =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8454df901..636b97a18 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 若依管理系统 - 2.3.7.RELEASE + 2.3.7.RELEASE 3.1.0 UTF-8 UTF-8 @@ -59,7 +59,7 @@ org.springframework.boot spring-boot-dependencies - ${springboot.vaerion} + ${springboot.version} pom import -- Gitee From 7226e124d334cb0df25cf1315a3272ff5329f36c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82?= <1056650571@qq.com> Date: Fri, 16 Apr 2021 19:06:42 +0800 Subject: [PATCH 48/50] =?UTF-8?q?:hammer:=20=E5=A2=9E=E5=8A=A0docker?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_docker.sh | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 build_docker.sh diff --git a/build_docker.sh b/build_docker.sh new file mode 100644 index 000000000..a6dcf8c3b --- /dev/null +++ b/build_docker.sh @@ -0,0 +1,28 @@ +#!/bin/bash +######################################################## +############### LinkWeChat Docker 部署脚本 ############## +######################################################## +LOG=$1 +PROJ_HOME=$PWD +echo "$PROJ_HOME" +CLEAN_BUILD="clean" +BUILD_CODE="install" +BUILD_DOCKER="docker:build" + +showLog(){ + if [ "$1" == '--log' -o "$1" == '-l' ]; then + $PROJ_HOME/mvnw "$2" + else + $PROJ_HOME/mvnw "$2" > /dev/null + fi +} + +cd "$PROJ_HOME" +echo '开始从代码构建LinkWeChat' +showLog "$LOG" "$CLEAN_BUILD" +showLog "$LOG" "$BUILD_CODE" +echo '构建完成' +cd "$PROJ_HOME"/linkwe-admin +echo '开始构建Docker镜像' +showLog "$LOG" "$BUILD_DOCKER" +echo 'Docker镜像构建完成' \ No newline at end of file -- Gitee From ca87d4a3594ff2828cf9a974d2b0cf755b8a4f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Fri, 16 Apr 2021 21:25:43 +0800 Subject: [PATCH 49/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=AE=9D=E5=8F=91=E9=80=81=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wecom/service/impl/WeTaskFissionServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java index 7513298ad..2e5357feb 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTaskFissionServiceImpl.java @@ -1,6 +1,7 @@ package com.linkwechat.wecom.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; @@ -214,7 +215,7 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { CustomerMessagePushDto customerMessagePushDto = new CustomerMessagePushDto(); if (weTaskFission.getStartTime() != null){ - customerMessagePushDto.setSettingTime(DateUtils.dateTime(weTaskFission.getStartTime())); + customerMessagePushDto.setSettingTime(DateUtil.formatDateTime(weTaskFission.getStartTime())); } customerMessagePushDto.setLinkMessage(linkMessageDto); customerMessagePushDto.setPushType("0"); -- Gitee From 7f4af205c382cda7a7be42eb8f3c8a54a98636f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=96=9C=E6=97=BA?= Date: Sat, 17 Apr 2021 01:38:51 +0800 Subject: [PATCH 50/50] fix --- .../java/com/linkwechat/wecom/client/WeAccessTokenClient.java | 2 +- .../src/main/java/com/linkwechat/wecom/client/WeAppClient.java | 2 +- .../main/java/com/linkwechat/wecom/client/WeCropTagClient.java | 2 +- .../main/java/com/linkwechat/wecom/client/WeCustomerClient.java | 2 +- .../java/com/linkwechat/wecom/client/WeCustomerGroupClient.java | 2 +- .../linkwechat/wecom/client/WeCustomerMessagePushClient.java | 2 +- .../java/com/linkwechat/wecom/client/WeDepartMentClient.java | 2 +- .../com/linkwechat/wecom/client/WeExternalContactClient.java | 2 +- .../main/java/com/linkwechat/wecom/client/WeMediaClient.java | 2 +- .../java/com/linkwechat/wecom/client/WeMessagePushClient.java | 2 +- .../main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java | 2 +- .../main/java/com/linkwechat/wecom/client/WeTicketClient.java | 2 +- .../src/main/java/com/linkwechat/wecom/client/WeUserClient.java | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java index 01b452d65..a563ffb14 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAccessTokenClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-26 14:33 **/ -@BaseRequest +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeAccessTokenClient { /** * 获取token(常用token,联系人token) diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java index 09c25fce7..a7a40ead2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; /** * 应用管理相关接口 */ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeAppClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java index cd8faee82..05700efb0 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCropTagClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-17 11:00 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCropTagClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java index f5b78f8fc..e4219c329 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java @@ -15,7 +15,7 @@ import java.util.Map; * @author: HaoN * @create: 2020-09-15 14:15 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java index ab0b81957..963165aa7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerGroupClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-20 21:50 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerGroupClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java index 519aefdc8..9564f798f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerMessagePushClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: KeWen * @create: 2020-10-25 21:34 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeCustomerMessagePushClient { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java index 82b756770..c5da01919 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeDepartMentClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-27 16:40 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeDepartMentClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java index 996d94e6f..45b66b010 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeExternalContactClient.java @@ -12,7 +12,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-10-13 10:39 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeExternalContactClient { @Request(url = "/externalcontact/add_contact_way", diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java index 9e7000a97..8cafe75a2 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMediaClient.java @@ -17,7 +17,7 @@ import java.io.InputStream; * @Description: * @Date: create in 2020/9/24 0024 0:14 */ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMediaClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java index f6b41ddf6..16ee17ed8 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMessagePushClient.java @@ -15,7 +15,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @create: 2020-10-17 22:41 **/ @SuppressWarnings("all") -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMessagePushClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java index 0bedd6a20..6300c6355 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeMsgAuditClient.java @@ -13,7 +13,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @description 会话存档接口 * @date 2020/12/2 16:45 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeMsgAuditClient { /** diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java index 9b84513e3..2bd9346da 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeTicketClient.java @@ -11,7 +11,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @description h5获取签名 * @date 2021/1/6 11:51 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeTicketClient { /** * 获取去企业jsapi_ticket diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java index c932643dc..1881de06f 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeUserClient.java @@ -9,7 +9,7 @@ import com.linkwechat.wecom.interceptor.WeAccessTokenInterceptor; * @author: HaoN * @create: 2020-08-27 16:42 **/ -//@BaseRequest(interceptor = WeAccessTokenInterceptor.class) +@BaseRequest(interceptor = WeAccessTokenInterceptor.class) public interface WeUserClient { /** -- Gitee