diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..8f309f336b7f35d77804a669f0c34c940c49469f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.3' + +# 如需配置变量,请在environment中进行变量配置 +services: + api: + image: linkwechat + container_name: linkwechat + environment: + - JAVA_OPTS=-Xms4096m -Xmx4096m -Duser.timezone=Asia/Shanghai + - TZ=Asia/Shanghai + - NACOS_SERVER + # 如果使用nacos,以下变量可以不进行配置 + - ES_ADDRESS + - DB_HOST + - DB_PORT + - DB_NAME + - DB_USER + - DB_PASS + - REDIS_HOST + - REDIS_PORT + ports: + - "${APP_PORT}:8090" + volumes: + - ./logs:/logs + # 上传文件地址,请根据实际${ruoyi.profile}自行修改映射 + - ./pic:/app/project/pic + - ./tmp:/tmp + restart: always \ No newline at end of file diff --git a/linkwe-admin/pom.xml b/linkwe-admin/pom.xml index b940a787b5d7967c4e690d23b90aecfbe9b84055..49a8ff57a4fe9c408ee868eb3d443624a03a2573 100644 --- a/linkwe-admin/pom.xml +++ b/linkwe-admin/pom.xml @@ -79,10 +79,15 @@ spring-cloud-starter-alibaba-nacos-config - - - - + + + + + + + javax.xml.bind + jaxb-api + @@ -111,6 +116,36 @@ ${project.artifactId} + + com.spotify + docker-maven-plugin + 1.1.1 + + ${parent.artifactId} + ${basedir}/src/main/docker + + ${parent.version} + + + + ${project.build.finalName}.jar + + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + + javax.activation + activation + 1.1.1 + + + ${project.artifactId} diff --git a/linkwe-admin/src/main/docker/Dockerfile b/linkwe-admin/src/main/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..bb49258b47e38132d8ffc711a6061e7bc7bbe784 --- /dev/null +++ b/linkwe-admin/src/main/docker/Dockerfile @@ -0,0 +1,15 @@ +FROM openjdk:8-alpine + +# 设置时区 +ADD Shanghai /usr/share/zoneinfo/Asia/ +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone + +VOLUME /tmp + +#设置字符集 +ENV LANG en_US.UTF-8 +ARG JAR_FILE +ADD $JAR_FILE app.jar + +ENTRYPOINT ["sh","-c","java -server $JAVA_OPTS -jar /app.jar"] \ No newline at end of file diff --git a/linkwe-admin/src/main/docker/Shanghai b/linkwe-admin/src/main/docker/Shanghai new file mode 100644 index 0000000000000000000000000000000000000000..d7f92e2fa5868addab98170099181375634ab1ca Binary files /dev/null and b/linkwe-admin/src/main/docker/Shanghai differ 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 new file mode 100644 index 0000000000000000000000000000000000000000..72a1733fbeef687ebebe558358281f3c976914f2 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityGroupSopController.java @@ -0,0 +1,145 @@ +package com.linkwechat.web.controller.wecom; + +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.wecom.domain.WeGroupSop; +import com.linkwechat.wecom.domain.dto.WeGroupSopDto; +import com.linkwechat.wecom.domain.vo.WeGroupSopVo; +import com.linkwechat.wecom.service.IWeGroupSopService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.BeanUtils; +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.*; + +import java.util.List; + +/** + * 社区运营 - 群sop controller + */ +@Api(description = "新客自动拉群 Controller") +@RestController +@RequestMapping(value = "/wecom/communityGroupSop") +public class WeCommunityGroupSopController extends BaseController { + + @Autowired + private IWeGroupSopService groupSopService; + + /** + * 通过过滤条件获取群sop列表 + * + * @param ruleName 规则名称 + * @param createBy 创建者 + * @param beginTime 创建区间 - 开始时间 + * @param endTime 创建区间 - 结束时间 + * @return 群sop规则列表 + */ + @ApiOperation(value = "通过过滤条件获取群sop列表", httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:communityGroupSop:list')") + @GetMapping(path = "/list") + public TableDataInfo> getSopList( + @RequestParam(value = "ruleName", required = false) String ruleName, + @RequestParam(value = "createBy", required = false) String createBy, + @RequestParam(value = "beginTime", required = false) String beginTime, + @RequestParam(value = "endTime", required = false) String endTime + ) + { + startPage(); + List groupSopVoList = groupSopService.getGroupSopList(ruleName, createBy, beginTime, endTime); + return getDataTable(groupSopVoList); + } + + /** + * 新增SOP规则 + * + * @param groupSopDto 更新数据 + * @return 结果 + */ + @ApiOperation(value = "新增SOP规则", httpMethod = "POST") + @PreAuthorize("@ss.hasPermi('wecom:communityGroupSop:add')") + @PostMapping(path = "/") + public AjaxResult addGroupSop(@Validated @RequestBody WeGroupSopDto groupSopDto) { + if (!groupSopService.isRuleNameUnique(groupSopDto.getRuleName())) { + return AjaxResult.error(HttpStatus.BAD_REQUEST, "规则名称已存在"); + } + WeGroupSop weGroupSop = new WeGroupSop(); + BeanUtils.copyProperties(groupSopDto, weGroupSop); + weGroupSop.setCreateBy(SecurityUtils.getUsername()); + // 群聊id列表 + List groupIdList = groupSopDto.getChatIdList(); + // 素材URL + List materialIdList = groupSopDto.getMaterialIdList(); + // 上传的图片的URl列表 + List picList = groupSopDto.getPicList(); + return toAjax(groupSopService.addGroupSop(weGroupSop, groupIdList, materialIdList, picList)); + } + + /** + * 通过规则id获取sop规则 + * + * @param ruleId 规则id + * @return 结果 + */ + @ApiOperation(value = "通过规则id获取sop规则详情", httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:communityGroupSop:query')") + @GetMapping(path = "/{ruleId}") + public AjaxResult getGroupSop(@PathVariable("ruleId") Long ruleId) { + WeGroupSopVo groupSopVo = groupSopService.getGroupSopById(ruleId); + if (null == groupSopVo) { + return AjaxResult.error(HttpStatus.NOT_FOUND, "该群SOP规则不存在"); + } + return AjaxResult.success(groupSopVo); + } + + /** + * 更改SOP规则 + * + * @param ruleId SOP规则 id + * @param groupSopDto 更新数据 + * @return 结果 + */ + @ApiOperation(value = "更改SOP规则", httpMethod = "PUT") + @PreAuthorize("@ss.hasPermi('wecom:communityGroupSop:edit')") + @PutMapping(path = "/{ruleId}") + public AjaxResult updateGroupSop(@PathVariable Long ruleId, @Validated @RequestBody WeGroupSopDto groupSopDto) { + // 校验是否存在 + if (null == groupSopService.getGroupSopById(ruleId)) { + return AjaxResult.error(HttpStatus.NOT_FOUND, "该群SOP规则不存在"); + } + // 校验规则名是否可用 + WeGroupSopVo original = groupSopService.getGroupSopById(ruleId); + if (!groupSopDto.getRuleName().equals(original.getRuleName()) && !groupSopService.isRuleNameUnique(groupSopDto.getRuleName())) { + return AjaxResult.error(HttpStatus.BAD_REQUEST, "规则名称已存在"); + } + WeGroupSop weGroupSop = new WeGroupSop(); + BeanUtils.copyProperties(groupSopDto, weGroupSop); + weGroupSop.setRuleId(ruleId); + weGroupSop.setUpdateBy(SecurityUtils.getUsername()); + // 群聊id列表 + List groupIdList = groupSopDto.getChatIdList(); + // 素材id列表 + List materialIdList = groupSopDto.getMaterialIdList(); + // 上传的图片的URl列表 + List picList = groupSopDto.getPicList(); + return toAjax(groupSopService.updateGroupSop(weGroupSop, groupIdList, materialIdList, picList)); + } + + /** + * 根据id列表批量删除群sop规则 + * + * @param ids 群sop规则列表 + * @return 结果 + */ + @ApiOperation(value = "根据id列表批量删除群sop规则", httpMethod = "DELETE") + @PreAuthorize("@ss.hasPermi('wecom:communityGroupSop:remove')") + @DeleteMapping(path = "/{ids}") + public AjaxResult batchDeleteSopRule(@PathVariable("ids") Long[] ids) { + return toAjax(groupSopService.batchRemoveGroupSopByIds(ids)); + } + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..6c042252677abf7c3fdca802e481fc4ab1fbc300 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityKeywordGroupController.java @@ -0,0 +1,139 @@ +package com.linkwechat.web.controller.wecom; + +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.bean.BeanUtils; +import com.linkwechat.wecom.domain.WeKeywordGroupTask; +import com.linkwechat.wecom.domain.dto.WeKeywordGroupTaskDto; +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.*; + +import java.util.List; + +/** + * 关键词拉群controller + */ +@RestController +@RequestMapping(value = "/wecom/communityKeywordGroup") +public class WeCommunityKeywordGroupController extends BaseController { + + @Autowired + private IWeCommunityKeywordToGroupService keywordToGroupService; + + @Autowired + private IWeGroupCodeService groupCodeService; + + /** + * 根据过滤条件获取关键词拉群任务列表 + * + * @param taskName 任务名称 + * @param createBy 创建人 + * @param keyword 关键词 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return 列表数据 + */ + @PreAuthorize("@ss.hasPermi('wecom:communityKeyword:list')") + @GetMapping(path = "/list") + public TableDataInfo> list( + @RequestParam(value = "taskName", required = false) String taskName, + @RequestParam(value = "createBy", required = false) String createBy, + @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); + return getDataTable(taskList); + } + + /** + * 根据id获取任务详情 + * + * @param taskId 任务id + * @return 任务详情 + */ + @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); + } + + /** + * 添加新任务 + * + * @param keywordToGroupDto 添加任务所需的数据 + * @return 结果 + */ + @PreAuthorize("@ss.hasPermi('wecom:communityKeyword:add')") + @PostMapping(path = "/") + public AjaxResult addTask(@RequestBody @Validated WeKeywordGroupTaskDto keywordToGroupDto) { + // 群活码必须存在 + if (null == groupCodeService.selectWeGroupCodeById(keywordToGroupDto.getGroupCodeId())) { + return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); + } + // 任务名称必须唯一 + if (!keywordToGroupService.taskNameIsUnique(keywordToGroupDto.getTaskName())) { + return AjaxResult.error(HttpStatus.BAD_REQUEST, "任务名称已存在"); + } + WeKeywordGroupTask task = new WeKeywordGroupTask(); + BeanUtils.copyProperties(keywordToGroupDto, task); + task.setCreateBy(SecurityUtils.getUsername()); + String[] keywords = keywordToGroupDto.getKeywords().split(","); + return toAjax(keywordToGroupService.addTask(task, keywords)); + } + + /** + * 根据id及更新数据对指定任务进行更新 + * + * @param taskId 任务id + * @param keywordToGroupDto 更新所需数据 + * @return 结果 + */ + @PreAuthorize("@ss.hasPermi('wecom:communityKeyword:edit')") + @PutMapping(path = "/{taskId}") + public AjaxResult updateTask(@PathVariable("taskId") Long taskId, @RequestBody @Validated WeKeywordGroupTaskDto keywordToGroupDto) { + // 群活码必须存在 + if (null == groupCodeService.selectWeGroupCodeById(keywordToGroupDto.getGroupCodeId())) { + return AjaxResult.error(HttpStatus.NOT_FOUND, "群活码不存在"); + } + // 若名称发生更改,则必须唯一 + String inputTaskName = keywordToGroupDto.getTaskName(); + String originalName = keywordToGroupService.getTaskById(taskId).getTaskName(); + if (!originalName.equals(inputTaskName) && !keywordToGroupService.taskNameIsUnique(inputTaskName)) { + return AjaxResult.error(HttpStatus.BAD_REQUEST, "任务名称已存在"); + } + WeKeywordGroupTask task = new WeKeywordGroupTask(); + BeanUtils.copyProperties(keywordToGroupDto, task); + task.setTaskId(taskId); + task.setUpdateBy(SecurityUtils.getUsername()); + String[] keywords = keywordToGroupDto.getKeywords().split(","); + return toAjax(keywordToGroupService.updateTask(task, keywords)); + } + + /** + * 通过id列表批量删除任务 + * + * @param ids id列表 + * @return 结果 + */ + @PreAuthorize("@ss.hasPermi('wecom:communityKeyword:remove')") + @DeleteMapping(path = "/{ids}") + public AjaxResult batchDeleteTask(@PathVariable("ids") Long[] ids) { + return toAjax(keywordToGroupService.batchRemoveTaskByIds(ids)); + } + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..b1293b6af76effa319ec6c8a8a165b22a98fdd03 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityPresTagGroupController.java @@ -0,0 +1,127 @@ +package com.linkwechat.web.controller.wecom; + + +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; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(value = "/wecom/communityPresTagGroup") +public class WeCommunityPresTagGroupController extends BaseController { + + @Autowired + private IWePresTagGroupTaskService taskService; + + @Autowired + private IWeGroupCodeService groupCodeService; + + /** + * 获取老客标签建群列表数据 + */ + @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:list')") + @GetMapping(path = "/list") + public TableDataInfo> getList( + @RequestParam(value = "taskName", required = false) String taskName, + @RequestParam(value = "sendType", required = false) Integer sendType, + @RequestParam(value = "createBy", required = false) String createBy, + @RequestParam(value = "beginTime", required = false) String beginTime, + @RequestParam(value = "endTime", required = false) String endTime) { + startPage(); + List wePresTagGroupTaskVoList = taskService.selectTaskListList(taskName, sendType, createBy, beginTime, endTime); + return getDataTable(wePresTagGroupTaskVoList); + } + + /** + * 新建老客标签建群任务 + */ + @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:add')") + @PostMapping + public AjaxResult addTask(@RequestBody @Validated WePresTagGroupTaskDto wePresTagGroupTaskDto) { + // 检测任务名是否可用 + if (!taskService.checkTaskNameUnique(wePresTagGroupTaskDto.getTaskName())) { + return AjaxResult.error("任务名已存在"); + } + if (null == groupCodeService.selectWeGroupCodeById(wePresTagGroupTaskDto.getGroupCodeId())) { + return AjaxResult.error(HttpStatus.NOT_FOUND,"群活码不存在"); + } + return toAjax(taskService.add(wePresTagGroupTaskDto)); + } + + /** + * 根据获取任务详细信息 + */ + @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); + } + + /** + * 更新任务信息 + */ + @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:edit')") + @PutMapping(path = "/{id}") + public AjaxResult updateTask(@PathVariable("id") Long id, @RequestBody @Validated WePresTagGroupTaskDto wePresTagGroupTaskDto) { + // 检测任务名是否可用 + WePresTagGroupTaskVo original = taskService.getTaskById(id); + // 判断名称是否发生变化 + boolean newName = wePresTagGroupTaskDto.getTaskName().equals(original.getTaskName()); + // 新名称不能已存在 + if (!taskService.checkTaskNameUnique(wePresTagGroupTaskDto.getTaskName()) && !newName) { + return AjaxResult.error("任务名已存在"); + } + if (null == groupCodeService.selectWeGroupCodeById(wePresTagGroupTaskDto.getGroupCodeId())) { + return AjaxResult.error(HttpStatus.NOT_FOUND,"群活码不存在"); + } + return toAjax(taskService.updateTask(id, wePresTagGroupTaskDto)); + } + + /** + * 批量删除老客标签建群任务 + */ + @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:remove')") + @DeleteMapping(path = "/{ids}") + public AjaxResult batchRemoveTask(@PathVariable("ids") Long[] ids) { + return toAjax(taskService.batchRemoveTaskByIds(ids)); + } + + /** + * 根据老客标签建群id及过滤条件,获取其统计信息 + */ + @PreAuthorize("@ss.hasPermi('wecom:communitytagGroup:query')") + @GetMapping(path = "/stat/{id}") + public TableDataInfo> getStatInfo( + @PathVariable("id") Long id, + @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); + return getDataTable(statVoList); + } + +} diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCustomerPortraitController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCustomerPortraitController.java index 6c422f5eb86f072e19098e28edbd903494ab78ed..db12525712205d4ef34246794f72fae43236c694 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCustomerPortraitController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCustomerPortraitController.java @@ -55,7 +55,7 @@ public class WeCustomerPortraitController extends BaseController { * @return */ @GetMapping(value = "/findWeCustomerInfo") - public AjaxResult findWeCustomerInfo(String externalUserid, String userid){ + public AjaxResult findWeCustomerInfo(String externalUserid, String userid) throws Exception { return AjaxResult.success( iWeCustomerService.findCustomerByOperUseridAndCustomerId(externalUserid,userid) 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 896d1bbb417eb7a8466876d59b07f473b6d27dc1..139c2dc28281ab41055085cacb45eaf333357ddb 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 @@ -1,5 +1,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.linkwechat.common.annotation.Log; import com.linkwechat.common.config.CosConfig; @@ -17,6 +19,7 @@ import com.linkwechat.wecom.domain.query.WeTaskFissionStatisticQO; import com.linkwechat.wecom.service.IWeTaskFissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -61,6 +64,12 @@ public class WeTaskFissionController extends BaseController { @GetMapping("/stat") public AjaxResult statistics(WeTaskFissionStatisticQO weTaskFissionStatisticQO) { //TODO 待完成 + //record表和complete_record表增加创建时间 + //record表增加完成时间 + //三个统计维度: + // 1. 日新增:每天裂变客户数 + // 2. 日参与:每天扫码参加活动的客户数 + // 3. 日完成:每天完成裂变任务的客户数 return null; } @@ -95,7 +104,37 @@ public class WeTaskFissionController extends BaseController { @Log(title = "任务宝", businessType = BusinessType.INSERT) @PostMapping("/add") public AjaxResult add(@RequestBody WeTaskFission weTaskFission) { - return toAjax(weTaskFissionService.insertWeTaskFission(weTaskFission)); + Long fissionTaskId = weTaskFissionService.insertWeTaskFission(weTaskFission); + if (fissionTaskId != null) { + JSONObject json = new JSONObject(); + json.put("id", fissionTaskId); + return AjaxResult.success(json.toJSONString()); + } + return AjaxResult.error(); + } + + /** + * 编辑任务宝 + */ + @ApiOperation(value = "编辑任务宝", httpMethod = "POST") + @PreAuthorize("@ss.hasPermi('wecom:fission:edit')") + @Log(title = "任务宝", businessType = BusinessType.INSERT) + @PutMapping("/edit") + public AjaxResult edit(@RequestBody WeTaskFission weTaskFission) { + if (ObjectUtils.isEmpty(weTaskFission.getId())) { + return AjaxResult.error("数据id为空"); + } + WeTaskFission fissionTask = weTaskFissionService.selectWeTaskFissionById(weTaskFission.getId()); + if (ObjectUtils.isEmpty(fissionTask)) { + return AjaxResult.error("数据不存在"); + } + CopyOptions options = CopyOptions.create(); + options.setIgnoreNullValue(true); + BeanUtil.copyProperties(weTaskFission, fissionTask, options); + Long id = weTaskFissionService.updateWeTaskFission(fissionTask); + JSONObject json = new JSONObject(); + json.put("id", id); + return AjaxResult.success(json.toJSONString()); } /** diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTicketController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTicketController.java index 4ed4425069ee2d517b2e8e629504bfa5504ecc4f..2329864cdf5fa4fc594810d62401003adb6d7ac4 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTicketController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeTicketController.java @@ -42,11 +42,11 @@ public class WeTicketController extends BaseController { @Log(title = "获取企业的jsapi_ticket", businessType = BusinessType.OTHER) @GetMapping("/getAppTicket") public AjaxResult getAppTicket(String url,String agentId) { - String ticketVaule = redisCache.getCacheObject(WeConstans.AppTicketKey); + String ticketVaule = redisCache.getCacheObject(WeConstans.AppTicketKey+"::"+agentId); if (StringUtils.isEmpty(ticketVaule)) { WeH5TicketDto ticketRes = weTicketClient.getJsapiTicket(agentId); if (ticketRes != null && StringUtils.isNotEmpty(ticketRes.getTicket())) { - redisCache.setCacheObject(WeConstans.AppTicketKey, ticketRes.getTicket(), ticketRes.getExpiresIn(), TimeUnit.SECONDS); + redisCache.setCacheObject(WeConstans.AppTicketKey+"::"+agentId, ticketRes.getTicket(), ticketRes.getExpiresIn(), TimeUnit.SECONDS); } ticketVaule = ticketRes.getTicket(); } @@ -62,11 +62,11 @@ public class WeTicketController extends BaseController { @Log(title = "获取应用的jsapi_ticket", businessType = BusinessType.OTHER) @GetMapping("/getAgentTicket") public AjaxResult getAgentTicket(String url,String agentId) { - String ticketVaule = redisCache.getCacheObject(WeConstans.AgentTicketKey); + String ticketVaule = redisCache.getCacheObject(WeConstans.AgentTicketKey+"::"+agentId); if (StringUtils.isEmpty(ticketVaule)) { WeH5TicketDto ticketRes = weTicketClient.getTicket(agentId); if (ticketRes != null && StringUtils.isNotEmpty(ticketRes.getTicket())) { - redisCache.setCacheObject(WeConstans.AgentTicketKey, ticketRes.getTicket(), ticketRes.getExpiresIn(), TimeUnit.SECONDS); + redisCache.setCacheObject(WeConstans.AgentTicketKey+"::"+agentId, ticketRes.getTicket(), ticketRes.getExpiresIn(), TimeUnit.SECONDS); } ticketVaule = ticketRes.getTicket(); } diff --git a/linkwe-admin/src/main/resources/application-druid.yml b/linkwe-admin/src/main/resources/application-druid.yml index 3d173be1e163448670129613c21752f9628bee50..72489d2ce91c71e5ea7cdd04bee9ac85fa94c2a2 100644 --- a/linkwe-admin/src/main/resources/application-druid.yml +++ b/linkwe-admin/src/main/resources/application-druid.yml @@ -1,57 +1,57 @@ # 数据源配置 spring: - datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - druid: - # 主库数据源 - master: - url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/link-wechat-prod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: ${DB_USER:root} - password: ${DB_PASS:root} - # 从库数据源 - slave: - # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: - # 初始连接数 - initialSize: 5 - # 最小连接池数量 - minIdle: 10 - # 最大连接池数量 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 300000 - # 配置一个连接在池中最大生存的时间,单位是毫秒 - maxEvictableIdleTimeMillis: 900000 - # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - webStatFilter: - enabled: true - statViewServlet: - enabled: true - # 设置白名单,不填则允许所有访问 - allow: - url-pattern: /druid/* - # 控制台管理用户名和密码 - login-username: - login-password: - filter: - stat: - enabled: true - # 慢SQL记录 - log-slow-sql: true - slow-sql-millis: 1000 - merge-sql: true - wall: - config: - multi-statement-allow: true + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:link-wechat-prod}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: ${DB_USER:root} + password: ${DB_PASS:root} + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: + login-password: + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true diff --git a/linkwe-admin/src/main/resources/application.yml b/linkwe-admin/src/main/resources/application.yml index fc0eabdb548abed90082023d4b086b50c8c9a507..f69eb0b637f5dd770b748559efebbae864f36a0e 100644 --- a/linkwe-admin/src/main/resources/application.yml +++ b/linkwe-admin/src/main/resources/application.yml @@ -20,7 +20,7 @@ ruoyi: # 开发环境配置 server: # 服务器的HTTP端口,默认为8090 - port: 8090 + port: ${APP_PORT:8090} servlet: # 应用的访问路径 context-path: / @@ -55,11 +55,11 @@ spring: active: druid # 文件上传 servlet: - multipart: - # 单个文件大小 - max-file-size: 10MB - # 设置总上传的文件大小 - max-request-size: 20MB + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB task: execution: pool: @@ -95,24 +95,24 @@ spring: # token配置 token: - # 令牌自定义标识 - header: Authorization - # 令牌密钥 - secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 30 + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 mybatis-plus: - mapper-locations: classpath*:mapper/**/*Mapper.xml - type-aliases-package: com.linkwechat.**.domain - type-handlers-package: com.linkwechat.framework.handler.GenericTypeHandler,com.linkwechat.framework.handler.StringArrayJoinTypeHandler - configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - global-config: - db-config: - logic-delete-field: delFlag - logic-delete-value: 1 - logic-not-delete-value: 0 + mapper-locations: classpath*:mapper/**/*Mapper.xml + type-aliases-package: com.linkwechat.**.domain + type-handlers-package: com.linkwechat.framework.handler.GenericTypeHandler,com.linkwechat.framework.handler.StringArrayJoinTypeHandler + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + logic-delete-field: delFlag + logic-delete-value: 1 + logic-not-delete-value: 0 ## MyBatis配置 #mybatis: @@ -173,49 +173,49 @@ wecome: serverUrl: https://qyapi.weixin.qq.com/ weComePrefix: cgi-bin noAccessTokenUrl: - - /gettoken - - /service/get_provider_token - - /wecom/chat/side/list - - /wecom/chat/item/list - - /wecom/chat/collection/addCollection - - /wecom/chat/collection/cancleCollection - - /wecom/chat/collection/list + - /gettoken + - /service/get_provider_token + - /wecom/chat/side/list + - /wecom/chat/item/list + - /wecom/chat/collection/addCollection + - /wecom/chat/collection/cancleCollection + - /wecom/chat/collection/list needContactTokenUrl: - - /externalcontact/get_follow_user_list - - /externalcontact/add_contact_way - - /externalcontact/update_contact_way - - /externalcontact/add_corp_tag - - /externalcontact/get_corp_tag_list - - /externalcontact/del_corp_tag - - /externalcontact/edit_corp_tag - - /externalcontact/list - - /externalcontact/get - - /externalcontact/batch/get_by_user - - /externalcontact/groupchat/list - - /externalcontact/groupchat/get - - /externalcontact/mark_tag - - /externalcontact/transfer - - /externalcontact/groupchat/transfer - - /externalcontact/get_unassigned_list - - /externalcontact/send_welcome_msg - - /externalcontact/unionid_to_external_userid - - /externalcontact/add_msg_template - - /externalcontact/get_group_msg_result - - /externalcontact/get_user_behavior_data - - /externalcontact/groupchat/statistic - fileUplodUrl: /media/upload,/media/uploadimg + - /externalcontact/get_follow_user_list + - /externalcontact/add_contact_way + - /externalcontact/update_contact_way + - /externalcontact/add_corp_tag + - /externalcontact/get_corp_tag_list + - /externalcontact/del_corp_tag + - /externalcontact/edit_corp_tag + - /externalcontact/list + - /externalcontact/get + - /externalcontact/batch/get_by_user + - /externalcontact/groupchat/list + - /externalcontact/groupchat/get + - /externalcontact/mark_tag + - /externalcontact/transfer + - /externalcontact/groupchat/transfer + - /externalcontact/get_unassigned_list + - /externalcontact/send_welcome_msg + - /externalcontact/unionid_to_external_userid + - /externalcontact/add_msg_template + - /externalcontact/get_group_msg_result + - /externalcontact/get_user_behavior_data + - /externalcontact/groupchat/statistic + fileUplodUrl: /media/upload,/media/uploadimg needProviderTokenUrl: - - /service/get_login_info + - /service/get_login_info needChatTokenUrl: - - /msgaudit/get_permit_user_list - - /msgaudit/check_single_agree - - /msgaudit/check_room_agree - - /msgaudit/groupchat/get + - /msgaudit/get_permit_user_list + - /msgaudit/check_single_agree + - /msgaudit/check_room_agree + - /msgaudit/groupchat/get thirdAppUrl: - - /user/getuserinfo - - /get_jsapi_ticket - - /ticket/get - - /message/send + - /user/getuserinfo + - /get_jsapi_ticket + - /ticket/get + - /message/send #企微回调通知配置 callBack: appIdOrCorpId: ww24262ce93851488f diff --git a/linkwe-admin/src/main/resources/bootstrap.properties b/linkwe-admin/src/main/resources/bootstrap.properties index 1c2bb0da552f685ac64d5be87677b573b0a0844e..39a9563d13612cc35b3b6c041fe07559f9d3c603 100644 --- a/linkwe-admin/src/main/resources/bootstrap.properties +++ b/linkwe-admin/src/main/resources/bootstrap.properties @@ -1,4 +1,4 @@ -spring.cloud.nacos.config.server-addr=${NACOS_SERVER:119.45.28.29:10848} -spring.cloud.nacos.config.namespace=627a666a-76b2-42ad-a1b0-70a12d2c73fd -spring.application.name=link-wechat -spring.cloud.nacos.config.file-extension=yaml \ No newline at end of file +#spring.cloud.nacos.config.server-addr= +#spring.cloud.nacos.config.namespace= +#spring.application.name= +#spring.cloud.nacos.config.file-extension= \ No newline at end of file diff --git a/linkwe-common/src/main/java/com/linkwechat/common/utils/DateUtils.java b/linkwe-common/src/main/java/com/linkwechat/common/utils/DateUtils.java index 9392254719b9b5e05f6202de4ef3dec770dd55c4..0a27a7b9f9ca71cdaf4d2c6ef98c36a6af81841b 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/utils/DateUtils.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/utils/DateUtils.java @@ -195,4 +195,33 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils long millionSeconds = sdf.parse(date).getTime();//毫秒 return millionSeconds; } + + + + public static int getAge(Date birthDay) throws Exception { + Calendar cal = Calendar.getInstance(); + if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 + throw new IllegalArgumentException( + "The birthDay is before Now.It's unbelievable!"); + } + int yearNow = cal.get(Calendar.YEAR); //当前年份 + int monthNow = cal.get(Calendar.MONTH); //当前月份 + int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 + cal.setTime(birthDay); + int yearBirth = cal.get(Calendar.YEAR); + int monthBirth = cal.get(Calendar.MONTH); + int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); + int age = yearNow - yearBirth; //计算整岁数 + if (monthNow <= monthBirth) { + if (monthNow == monthBirth) { + if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 + }else{ + age--;//当前月份在生日之前,年龄减一 + } } + return age; + + } + + + } diff --git a/linkwe-ui/.env.development b/linkwe-ui/.env.development index ae6e34c6c0fc98a11f9b7994c66f603da0022c1e..c8989bbedf1f89afe1e5e04e3f6ddad3e6907677 100644 --- a/linkwe-ui/.env.development +++ b/linkwe-ui/.env.development @@ -1,8 +1,8 @@ # 开发环境配置 ENV = 'development' -# 仟微管理系统/开发环境 -VUE_APP_BASE_API = 'http://146.56.222.200' +# 塬微管理系统/开发环境 +VUE_APP_BASE_API = 'http://192.168.0.52:8090' # VUE_APP_BASE_API = 'http://n3rpzt.natappfree.cc' # 开发环境IP 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 new file mode 100644 index 0000000000000000000000000000000000000000..3405176232257c4cd0f1087b41d8399d7663545b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeAppClient.java @@ -0,0 +1,37 @@ +package com.linkwechat.wecom.client; + +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; + +/** + * 应用管理相关接口 + */ +public interface WeAppClient { + + /** + * 获取企业应用列表 + * @return + */ + @Request(url = "/agent/list") + WeAppDto findAgentList(); + + /** + * 根据应用id获取应用详情 + * @param agentid + * @return + */ + @Request(url = "/agent/get") + WeAppDetailDto findAgentById(@Query("agentid") Integer agentid); + + /** + * 设置应用 + * @param weAppDetailDto + * @return + */ + @Request(url = "/agent/set") + WeResultDto updateAgentById(@DataObject WeAppDetailDto weAppDetailDto); +} 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 c19ef8504473e213bc392fd7610618a31ad56646..721adf465a9ca32ee91f41cb6b6ad9b278659661 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 @@ -1,5 +1,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 io.swagger.annotations.ApiModel; @@ -14,11 +16,13 @@ import lombok.Data; */ @ApiModel @Data +@TableName("we_community_new_group") public class WeCommunityNewGroup extends BaseEntity { /** *主键ID */ + @TableId private Long newGroupId= SnowFlakeUtil.nextId(); /** @@ -39,6 +43,12 @@ public class WeCommunityNewGroup extends BaseEntity { @ApiModelProperty("欢迎语") private String welcomeMsg; + /** + * 新增联系方式的配置id + */ + @ApiModelProperty("新增联系方式的配置id") + private String configId; + /** * 二维码链接 */ @@ -75,4 +85,10 @@ public class WeCommunityNewGroup extends BaseEntity { @ApiModelProperty("0 未删除 1 已删除") private int delFlag; + + /** + * 员工活码 + */ + private String userQrCode; + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortrait.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortrait.java index d87e26eccce4084b4264c481f0b195c89cac562c..6ef123107eb2a67556bb9f761f280206992fe756 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortrait.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortrait.java @@ -38,6 +38,8 @@ public class WeCustomerPortrait { private String remarkCorpName; //描述 private String description; + //年纪 + private int age; //客户标签 private List weTagGroupList; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSop.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSop.java new file mode 100644 index 0000000000000000000000000000000000000000..4c02b9498d0e2a97233c0432a69223fc35be6c2c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSop.java @@ -0,0 +1,51 @@ +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 lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 群SOP规则 + */ +@Data +@TableName("we_group_sop") +@EqualsAndHashCode(callSuper = true) +public class WeGroupSop extends BaseEntity { + + /** + * 主键 + */ + @TableId + private Long ruleId; + + /** + * 规则名 + */ + private String ruleName; + + /** + * 内容标题 + */ + private String title; + + /** + * 消息内容 + */ + private String content; + + /** + * 开始执行时间 + */ + @TableField(value = "start_time") + private String startExeTime; + + /** + * 结束执行时间 + */ + @TableField(value = "end_time") + private String stopExeTime; + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..da7d1fbf8f9df09c33ed356afbf9ad1e7c470c4e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopChat.java @@ -0,0 +1,25 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 群SOP和群关联对象 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("we_group_sop_chat") +public class WeGroupSopChat { + /** + * 群sop id + */ + private Long ruleId; + + /** + * 实际群聊id + */ + private String chatId; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopMaterial.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopMaterial.java new file mode 100644 index 0000000000000000000000000000000000000000..5e8cfc72f60b8f935404fe2e8eb9a3eff7dc4230 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopMaterial.java @@ -0,0 +1,26 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 群SOP图片素材 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("we_group_sop_material") +public class WeGroupSopMaterial { + + /** + * sop规则id + */ + private Long ruleId; + + /** + * 素材id + */ + private Long materialId; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopPic.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopPic.java new file mode 100644 index 0000000000000000000000000000000000000000..d8e436e50b7bacac63362953b51611a24c1fbc80 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupSopPic.java @@ -0,0 +1,22 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("we_group_sop_pic") +public class WeGroupSopPic { + /** + * sop id + */ + private Long ruleId; + + /** + * 图片url + */ + private String picUrl; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTask.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTask.java new file mode 100644 index 0000000000000000000000000000000000000000..4107b8de4217aed7366ffc5937df0c2a692b3847 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTask.java @@ -0,0 +1,38 @@ +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 lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 社区运营 - 关键词拉群任务实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("we_keyword_group") +public class WeKeywordGroupTask extends BaseEntity { + + /** + * 主键id + */ + @TableId + private Long taskId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 群活码id + */ + private Long groupCodeId; + + + /** + * 加群引导语 + */ + private String welcomeMsg; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTaskKeyword.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTaskKeyword.java new file mode 100644 index 0000000000000000000000000000000000000000..5fd6c0c71ca324b826333aebd11e10af3e68da25 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeKeywordGroupTaskKeyword.java @@ -0,0 +1,31 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.linkwechat.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 社区运营 - 关键词拉群任务关键词实体 + */ +@Data +@NoArgsConstructor +@TableName("we_keyword_group_kw") +public class WeKeywordGroupTaskKeyword { + + /** + * 关键词拉群任务id + */ + private Long taskId; + + /** + * 关键词 + */ + private String keyword; + + public WeKeywordGroupTaskKeyword(Long taskId, String keyword) { + this.taskId =taskId; + this.keyword = keyword; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..decaa6553d76d76aa091c2b4d5e30e7e4da567e5 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTask.java @@ -0,0 +1,61 @@ +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 lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("we_pres_tag_group") +public class WePresTagGroupTask extends BaseEntity { + + /** + *主键ID + */ + @TableId + private Long taskId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 加群引导语 + */ + private String welcomeMsg; + + /** + * 发送方式 0: 企业群发 1:个人群发 + */ + private Integer sendType; + + /** + * 群活码id + */ + private Long groupCodeId; + + /** + * 发送范围 0: 全部客户 1:部分客户 + */ + private Integer sendScope; + + /** + * 发送性别 0: 全部 1: 男 2: 女 3:未知 + */ + private Integer sendGender; + + /** + * 目标客户被添加起始时间 + */ + private String cusBeginTime; + + /** + * 目标客户被添加结束时间 + */ + private String cusEndTime; + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..bc5d98fa91d0979b057d982a0992da190791668f --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskScope.java @@ -0,0 +1,27 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 老客户标签建群任务使用人对象 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("we_pres_tag_group_scope") +public class WePresTagGroupTaskScope { + + /** + * 老客户标签建群任务id + */ + private Long taskId; + + /** + * 任务目标员工id + */ + private String weUserId; + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskStat.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskStat.java new file mode 100644 index 0000000000000000000000000000000000000000..c0598859670e2efc66f45c74c05eda188454c359 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskStat.java @@ -0,0 +1,36 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.linkwechat.common.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; + +/** + * 老客户标签建群客户统计 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("we_pres_tag_group_stat") +public class WePresTagGroupTaskStat extends BaseEntity { + + /** + * 老客户标签建群任务id + */ + private Long taskId; + + /** + * 客户id + */ + private String customerName; + + /** + * 是否已送达 + */ + private boolean isSent; + + /** + * 是否已经在群 + */ + private boolean isInGroup; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskTag.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskTag.java new file mode 100644 index 0000000000000000000000000000000000000000..f03926904e266e9632d61f62660f5adf9832d264 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WePresTagGroupTaskTag.java @@ -0,0 +1,27 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 老客标签建群任务标签关联对象 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("we_pres_tag_group_tag") +public class WePresTagGroupTaskTag { + + /** + * 老客建群任务id + */ + private Long taskId; + + /** + * 标签id + */ + private String tagId; + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDetailDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDetailDto.java new file mode 100644 index 0000000000000000000000000000000000000000..74cba1c617e1ec0b93df70fc002716bfa45d5c55 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDetailDto.java @@ -0,0 +1,31 @@ +package com.linkwechat.wecom.domain.dto; + + +import lombok.Data; + +/** + * 企业应用详情接口 + */ +@Data +public class WeAppDetailDto extends WeResultDto{ + //企业应用id + private Long agentid; + //企业应用名称 + private String name; + //企业应用方形头像 + private String square_logo_url; + //企业应用详情 + private String description; + //企业应用是否被停用 + private Boolean close; + //企业应用可信域名 + private String redirect_domain; + //企业应用是否打开地理位置上报 0:不上报;1:进入会话上报; + private Integer report_location_flag; + //是否上报用户进入应用事件。0:不接收;1:接收 + private Integer isreportenter; + //应用主页url + private String home_url; + //企业应用头像的mediaid,通过素材管理接口上传图片获得mediaid,上传后会自动裁剪成方形和圆形两个头像 + private String logo_mediaid; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDto.java new file mode 100644 index 0000000000000000000000000000000000000000..997539299704c531c67dd37551a1fe7ebfb2dd1e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeAppDto.java @@ -0,0 +1,25 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class WeAppDto extends WeResultDto{ + + + + private List agentlist; + + + @Data + public class Agent{ + //企业应用id + private Long agentid; + //企业应用名称 + private String name; + //企业应用方形头像url + private String square_logo_url; + } + +} 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 235e02e9d02589befe1c68bb5a7b17679a7cbefb..5d022b7339ba948c42624762da755afa01778ce1 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 @@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.linkwechat.wecom.domain.WeEmpleCodeTag; import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; - -import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @@ -17,57 +14,59 @@ import java.util.List; * @author kewen * @date 2021-02-19 */ -@ApiModel @Data public class WeCommunityNewGroupDto { + + /** + * 主键 + */ + private String newGroupId; + /** * 活动场景 */ - @ApiModelProperty("活动场景") private String activityScene; /** * 欢迎语 */ - @ApiModelProperty("欢迎语") private String welcomeMsg; @NotNull(message = "员工信息不能为空") /** 使用员工 */ @TableField(exist = false) - @ApiModelProperty("使用员工") private List weEmpleCodeUseScops; /** * 扫码标签 */ @TableField(exist = false) - @ApiModelProperty("扫码标签") private List weEmpleCodeTags; /** * 群活码ID */ - @ApiModelProperty("群活码ID") private Long groupCodeId; /** * 客户添加时无需经过确认自动成为好友:1:是;0:否 */ - @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") private Boolean isJoinConfirmFriends; + /** + * 新增联系方式的配置id + */ + private String configId; + /** * 二维码链接 */ - @ApiModelProperty("二维码链接") private String qrCode; /** * 素材的id */ - @ApiModelProperty("素材的id") private Long mediaId; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeGroupSopDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeGroupSopDto.java new file mode 100644 index 0000000000000000000000000000000000000000..ac31a2026aed61af840bbcacb49db4c597c0a946 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeGroupSopDto.java @@ -0,0 +1,58 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 社区运营 - 群SOP DTO + */ +@Data +public class WeGroupSopDto { + /** + * 规则名 + */ + @NotNull(message = "规则名不可为空") + private String ruleName; + + /** + * 群聊id列表 + */ + @NotNull(message = "未选择群聊") + private List chatIdList; + + /** + * 内容标题 + */ + @NotNull(message = "标题不可为空") + private String title; + + /** + * 消息内容 + */ + @NotNull(message = "内容不可为空") + private String content; + + /** + * 素材列表 + */ + private List materialIdList; + + /** + * 上传的图片的URL列表 + */ + private List picList; + + /** + * 开始执行时间 + */ + @NotNull(message = "开始执行时间为空") + private String startExeTime; + + /** + * 结束执行时间 + */ + @NotNull(message = "结束时间为空") + private String stopExeTime; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeKeywordGroupTaskDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeKeywordGroupTaskDto.java new file mode 100644 index 0000000000000000000000000000000000000000..88ba38e1b9857b925bc6f20b442f428d74ea7b72 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WeKeywordGroupTaskDto.java @@ -0,0 +1,36 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 社区运营 - 关键词拉群Dto + */ +@Data +public class WeKeywordGroupTaskDto { + + /** + * 任务名 + */ + @NotNull(message = "任务名不能为空") + private String taskName; + + /** + * 群活码id + */ + @NotNull(message = "群活码不能为空") + private Long groupCodeId; + + /** + * 加群引导语 + */ + @NotNull(message = "引导语不可为空") + private String welcomeMsg; + + /** + * 关键词 + */ + @NotNull(message = "关键词不可为空") + private String keywords; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePresTagGroupTaskDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePresTagGroupTaskDto.java new file mode 100644 index 0000000000000000000000000000000000000000..5cac503247a9c9f8f5c8a59406eb8359cdc70a8e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePresTagGroupTaskDto.java @@ -0,0 +1,70 @@ +package com.linkwechat.wecom.domain.dto; + + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 社群运营 老客户标签建群 + */ + +@Data +public class WePresTagGroupTaskDto { + + /** + * 任务名称 + */ + @NotNull(message = "任务名称不能为空") + private String taskName; + + /** + * 发送方式 0: 企业群发 1:个人群发 + */ + @NotNull(message = "发送方式不能为空") + private Integer sendType; + + /** + * 加群引导语 + */ + @NotNull(message = "引导语不能为空") + private String welcomeMsg; + + /** + * 群活码id + */ + @NotNull(message = "活码不能为空") + private Long groupCodeId; + + /** + * 客户标签 + */ + private List tagList; + + /** + * 选择员工 + */ + private List scopeList; + + /** + * 发送范围 0: 全部客户 1:部分客户 + */ + @NotNull(message = "发送范围不能为空") + private Integer sendScope; + + /** + * 发送性别 0: 全部 1: 男 2: 女 3:未知 + */ + private Integer sendGender; + + /** + * 目标客户被添加起始时间 + */ + private String cusBeginTime; + + /** + * 目标客户被添加结束时间 + */ + private String cusEndTime; +} 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 fd5a23d19b34c37521a7a0bcd262d5cb1fe190cc..a4d3647241ad45eb2b27858114e68e34d012fd86 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 @@ -22,7 +22,7 @@ import java.util.List; public class WeCommunityNewGroupVo { /** - *主键ID + * 主键ID */ @ApiModelProperty("主键ID") private Long newGroupId; @@ -45,6 +45,12 @@ public class WeCommunityNewGroupVo { @ApiModelProperty("欢迎语") private String welcomeMsg; + /** + * 群活码id + */ + @ApiModelProperty("群活码id") + private Long groupCodeId; + /** * 新增联系方式的配置id */ @@ -101,13 +107,22 @@ public class WeCommunityNewGroupVo { @ApiModelProperty("实际群聊") private List weGroupUserScops; - /** 创建者 */ - @ApiModelProperty(value = "创建者",hidden = 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(); + @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/WeEmplVo.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeEmplVo.java new file mode 100644 index 0000000000000000000000000000000000000000..732036647078c4d11a70b2e6a5f83210b0c4ed37 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeEmplVo.java @@ -0,0 +1,20 @@ +package com.linkwechat.wecom.domain.vo; + +import lombok.Data; + +/** + * 员工信息 + */ +@Data +public class WeEmplVo { + + /** + * 员工id + */ + private String userId; + + /** + * 员工名称 + */ + private String name; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..e86aa3448d411d79ee942c7885bb6fd65d6df3fa --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeGroupSopVo.java @@ -0,0 +1,84 @@ +package com.linkwechat.wecom.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.linkwechat.wecom.domain.WeGroup; +import com.linkwechat.wecom.domain.WeMaterial; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class WeGroupSopVo { + + /** + * id + */ + private Long ruleId; + + /** + * 规则名 + */ + private String ruleName; + + /** + * 内容标题 + */ + private String title; + + /** + * 消息内容 + */ + private String content; + + /** + * 素材列表 + */ + @TableField(exist = false) + private List materialList; + + /** + * 自上传图片列表 + */ + @TableField(exist = false) + private List picList; + + /** + * 群聊 + */ + @TableField(exist = false) + private List groupList; + + /** + * 开始执行时间 + */ + private String startExeTime; + + /** + * 结束执行时间 + */ + private String stopExeTime; + + /** + * 创建者 + */ + 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; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..6287ca1c124dd92d702b7d2dc62f1103f13f5459 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeKeywordGroupTaskVo.java @@ -0,0 +1,81 @@ +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; + +import java.util.Date; +import java.util.List; + + +/** + * 社区运营 - 关键词拉群任务VO + */ +@Data +public class WeKeywordGroupTaskVo { + + /** + * id + */ + private Long taskId; + + /** + * 任务名 + */ + private String taskName; + + /** + * 群活码id + */ + @JsonIgnore + private Long groupCodeId; + + /** + * 群活码信息 + */ + @TableField(exist = false) + private WeGroupCode groupCodeInfo; + + /** + * 关键词 + */ + @TableField(exist = false) + private List keywordList; + + /** + * 实际群聊 + */ + @TableField(exist = false) + private List groupNameList; + + /** + * 加群引导语 + */ + private String welcomeMsg; + + /** + * 创建者 + */ + 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; + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..9febc01ca4c111bae3e27c664f82916e5ff12a9b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskStatVo.java @@ -0,0 +1,26 @@ +package com.linkwechat.wecom.domain.vo; + +import lombok.Data; + + +/** + * 老客户标签建群任务客户统计Vo + */ +@Data +public class WePresTagGroupTaskStatVo { + + /** + * 客户id + */ + private String customerName; + + /** + * 是否已发送 + */ + private boolean isSent = false; + + /** + * 是否已在群 + */ + private boolean isInGroup = false; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..1c7f2fb958f539b74f34c48474f6adc033368a83 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WePresTagGroupTaskVo.java @@ -0,0 +1,110 @@ +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.WeTag; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 老客标签建群任务Vo + */ +@Data +public class WePresTagGroupTaskVo { + + /** + * 老客标签建群任务id + */ + private Long taskId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 加群引导语 + */ + private String welcomeMsg; + + /** + * 群活码id + */ + @JsonIgnore + private Long groupCodeId; + + /** + * 群活码信息 + */ + @TableField(exist = false) + private WeGroupCode groupCodeInfo; + + /** + * 发送方式 0: 企业群发 1:个人群发 + */ + private Integer sendType; + + /** + * 当前群人数 + */ + private Integer totalMember; + + /** + * 使用员工 + */ + @TableField(exist = false) + private List scopeList; + + /** + * 标签 + */ + @TableField(exist = false) + private List tagList; + + /** + * 发送范围 0: 全部客户 1:部分客户 + */ + private Integer sendScope; + + /** + * 发送性别 0: 全部 1: 男 2: 女 3:未知 + */ + private Integer sendGender; + + /** + * 目标客户被添加起始时间 + */ + private String cusBeginTime; + + /** + * 目标客户被添加结束时间 + */ + private String cusEndTime; + + /** + * 创建者 + */ + 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; +} 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 8dc46fefce7173bc242b540ed3ec4607d7de23c8..3a541819e5151fa18fa8107199d17a639034129c 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 @@ -18,14 +18,18 @@ public interface WeCommunityNewGroupMapper extends BaseMapper selectWeCommunityNewGroupList(@Param("empleCodeName") String empleCodeName, @Param("createBy") String createBy - ,@Param("beginTime") String beginTime, @Param("endTime") String endTime); + List selectWeCommunityNewGroupList(@Param("employCodeName") String employCodeName, @Param("createBy") String createBy + , @Param("beginTime") String beginTime, @Param("endTime") String endTime); /** * 获取新客自动拉群详细信息 + * * @param newGroupId 主键id * @return {@link WeCommunityNewGroupVo} 自动拉群信息 */ 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 new file mode 100644 index 0000000000000000000000000000000000000000..89d5f1e1020dd8d23a86eeb75a8f1f560d5ec01e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopChatMapper.java @@ -0,0 +1,25 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroupSopChat; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +/** + * 群sop和群聊关联对象 mapper接口 + */ +@Mapper +@Repository +public interface WeGroupSopChatMapper extends BaseMapper { + + /** + * 批量保存sop - chat 绑定 + * + * @param sopChatList 待绑定对象 + * @return 结果 + */ + int batchBindsSopChat(List sopChatList); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..f5031dad9f94e57d5c227a11c6c181882fefa74c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMapper.java @@ -0,0 +1,74 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroupSop; +import com.linkwechat.wecom.domain.vo.WeGroupSopVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 群SOP mapper接口 + */ +@Mapper +@Repository +public interface WeGroupSopMapper extends BaseMapper { + + /** + * 根据过滤条件获取群sop规则列表 + * + * @param ruleName 规则名称 + * @param createBy 创建人 + * @param beginTime 创建开始时间 + * @param endTime 创建结束时间 + * @return 结果 + */ + List getGroupSopList( + @Param("ruleName") String ruleName, + @Param("createBy") String createBy, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime + ); + + /** + * 通过id获取sop规则 + * + * @param sopId id + * @return 结果 + */ + WeGroupSopVo getGroupSopById(Long sopId); + + /** + * 批量删除群sop + * + * @param ruleIds 群sop规则id列表 + * @return 结果 + */ + int batchRemoveWeGroupSopByIds(Long[] ruleIds); + + /** + * 校验规则名是否已存在 + * + * @param ruleName 规则名 + * @return 结果 + */ + int isRuleNameUnique(String ruleName); + + /** + * 通过规则id获取其所有素材id + * + * @param ruleId sop规则id + * @return 结果 + */ + List getMaterialIdListByRuleId(Long ruleId); + + /** + * 通过规则id获取其所有群聊id + * + * @param ruleId sop规则id + * @return 结果 + */ + List getChatIdListByRuleId(Long ruleId); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMaterialMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMaterialMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..6e16975d01eb711a673f4a4aa186a0d1d6a85f62 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopMaterialMapper.java @@ -0,0 +1,23 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroupSopMaterial; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 群SOP - 素材 关联 Mapper + */ +@Mapper +@Repository +public interface WeGroupSopMaterialMapper extends BaseMapper { + + /** + * 批量保存 sop规则与素材的绑定 + * @param sopMaterialList 待绑定列表 + * @return 结果 + */ + int batchBindsSopMaterial(List sopMaterialList); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopPicMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopPicMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..930a03432849a47b35e844d890176f93c43ba530 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupSopPicMapper.java @@ -0,0 +1,25 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroupSopPic; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +/** + * 图片语sop规则绑定信息 mapper + */ +@Mapper +@Repository +public interface WeGroupSopPicMapper extends BaseMapper { + + /** + * 批量保存群SOP和图片 + * + * @param sopPicList WeGroupSopPic对象列表 + * @return 结果 + */ + int batchSopPic(List sopPicList); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskKwMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskKwMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..ebf7a8486cb0fc28ddd187e017f032fab1d6dacf --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskKwMapper.java @@ -0,0 +1,23 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeKeywordGroupTaskKeyword; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 关键词拉群 关键词mapper + */ +@Mapper +@Repository +public interface WeKeywordGroupTaskKwMapper extends BaseMapper { + + /** + * 批量绑定关键词拉群任务与关键词关联 + * @param taskKeywordList 待绑定对象 + * @return 结果 + */ + int batchBindsTaskKeyword(List taskKeywordList); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..998aa8602b13841fa7eec41543e7451a9a435631 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeKeywordGroupTaskMapper.java @@ -0,0 +1,67 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeKeywordGroupTask; +import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 关键词拉群mapper + */ +@Mapper +@Repository +public interface WeKeywordGroupTaskMapper extends BaseMapper { + /** + * 根据过滤条件获取关键词拉群任务列表 + * + * @param taskName 任务名称 + * @param createBy 创建人 + * @param keyword 关键词 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return 列表数据 + */ + List getTaskList( + @Param("taskName") String taskName, + @Param("createBy") String createBy, + @Param("keyword") String keyword, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime + ); + + /** + * 根据id获取任务性情 + * + * @param taskId 任务id + * @return 结果 + */ + WeKeywordGroupTaskVo getTaskById(Long taskId); + + /** + * 根据id列表批量删除任务 + * + * @param ids id列表 + * @return 删除行数 + */ + int batchRemoveTaskByIds(Long[] ids); + + /** + * 根据任务id获取对应所有的群聊名称 + * + * @param taskId 任务id + * @return 结果 + */ + List getGroupNameListByTaskId(Long taskId); + + /** + * 校验名称是否唯一 + * + * @param taskName 任务名 + * @return 结果 + */ + int checkNameUnique(String taskName); +} 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 f92e7fd6b0971fddef8b985a9ae557c8554226aa..099ed78a7237a010cb5f704832fa0849c00546f9 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 @@ -1,5 +1,6 @@ package com.linkwechat.wecom.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeMaterial; import org.apache.ibatis.annotations.Param; @@ -11,7 +12,7 @@ import java.util.List; * @author KEWEN * @date 2020-10-09 */ -public interface WeMaterialMapper { +public interface WeMaterialMapper extends BaseMapper { /** 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 new file mode 100644 index 0000000000000000000000000000000000000000..0b392feb5c282892c61d62935706dc2aaafeb426 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskMapper.java @@ -0,0 +1,49 @@ +package com.linkwechat.wecom.mapper; + +import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskVo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WePresTagGroupTask; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 老客户标签建群相关Mapper接口 + */ +@Repository +public interface WePresTagGroupTaskMapper extends BaseMapper { + + /** + * 获取老客户标签建群任务 + * + * @param taskId 任务id + * @return 结果 + */ + WePresTagGroupTaskVo selectTaskById(Long taskId); + + /** + * 根据条件查询老客标签建群任务 + * @param taskName 任务名称 + * @param createBy 创建人 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @param sendType 发送方式 + * @return 结果 + */ + List selectTaskList( + @Param("taskName") String taskName, + @Param("sendType") Integer sendType, + @Param("createBy") String createBy, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime + ); + + /** + * 检测任务名是否已被占用 + * @param taskName 任务名 + * @return 是否被占用 + */ + int checkTaskNameUnique(String taskName); + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..8d9165baabe81d31bd9363f09a3363a7cb880f7e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskScopeMapper.java @@ -0,0 +1,29 @@ +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 org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface WePresTagGroupTaskScopeMapper extends BaseMapper { + + /** + * 根据建群任务id获取所有使用人员信息 + * + * @param taskId 建群任务id + * @return 结果 + */ + List getScopeListByTaskId(Long taskId); + + /** + * 批量绑定任务与使用人员 + * @param taskScopeList 待绑定对象 + * @return 结果 + */ + int batchBindsTaskScopes(List taskScopeList); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..d15b16c516387da3ca0ca21552d20d57a8a6570c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskStatMapper.java @@ -0,0 +1,31 @@ +package com.linkwechat.wecom.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WePresTagGroupTaskStat; +import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface WePresTagGroupTaskStatMapper extends BaseMapper { + + /** + * 根据 老客标签建群任务id及附属相关属性条件获取任务对应的客户统计 + * @param taskId 任务id + * @param customerName 客户名称 + * @param isInGroup 是否在群 + * @param isSent 是否已发送 + * @return 客户统计列表 + */ + List getStatByTaskId( + @Param("taskId") Long taskId, + @Param("customerName") String customerName, + @Param("isSent") Integer isSent, + @Param("isInGroup") Integer isInGroup + ); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..c22d22be453533e1c78829d6c16c10b9918956c5 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WePresTagGroupTaskTagMapper.java @@ -0,0 +1,32 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WePresTagGroupTaskTag; +import com.linkwechat.wecom.domain.WeTag; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 老客户标签建群任务tag mapper接口 + */ +@Mapper +@Repository +public interface WePresTagGroupTaskTagMapper extends BaseMapper { + + /** + * 通过标签建群任务id获取该任务对应所有标签 + * + * @param taskId 建群任务id + * @return 标签Vo列表 + */ + List getTagListByTaskId(Long taskId); + + /** + * 批量绑定建群任务与标签 + * @param taskTagList 任务-标签关联对象 + * @return 结果 + */ + int batchBindsTaskTags(List taskTagList); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..21c4fbc46b8ad745aa1d946396ec5a361e67702e --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityKeywordToGroupService.java @@ -0,0 +1,66 @@ +package com.linkwechat.wecom.service; + +import com.linkwechat.wecom.domain.WeKeywordGroupTask; +import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; + +import java.util.List; + +/** + * 社区运营 - 关键词拉群任务Service + */ +public interface IWeCommunityKeywordToGroupService { + + /** + * 根据过滤条件获取关键词拉群任务列表 + * + * @param taskName 任务名称 + * @param createBy 创建人 + * @param keyword 关键词 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return 列表数据 + */ + List getTaskList(String taskName, String createBy, String keyword, String beginTime, String endTime); + + /** + * 根据id获取任务性情 + * + * @param taskId 任务id + * @return 结果 + */ + WeKeywordGroupTaskVo getTaskById(Long taskId); + + /** + * 创建新任务 + * + * @param task 待存储的对象 + * @param keywords 关键词 + * @return 结果 + */ + int addTask(WeKeywordGroupTask task, String[] keywords); + + /** + * 对指定任务进行更新 + * + * @param task 待更新对象 + * @param keywords 关键词 + * @return 结果 + */ + int updateTask(WeKeywordGroupTask task, String[] keywords); + + /** + * 根据id列表批量删除任务 + * + * @param ids id列表 + * @return 删除行数 + */ + int batchRemoveTaskByIds(Long[] ids); + + /** + * 检测任务名是否唯一 + * + * @param taskName 任务名 + * @return 结果 + */ + boolean taskNameIsUnique(String taskName); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerService.java index f80cc58a35f3928499512172aca133ee6907ac1e..a7164be33862d4ae8319d4f4b701c17cf14fae50 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerService.java @@ -118,7 +118,7 @@ public interface IWeCustomerService extends IService * @param userid * @return */ - WeCustomerPortrait findCustomerByOperUseridAndCustomerId(String externalUserid,String userid); + WeCustomerPortrait findCustomerByOperUseridAndCustomerId(String externalUserid,String userid) throws Exception; /** 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 new file mode 100644 index 0000000000000000000000000000000000000000..96e6127653fab0fe019adf9e2e27d6a7dc51e2b7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupSopService.java @@ -0,0 +1,71 @@ +package com.linkwechat.wecom.service; + +import com.linkwechat.wecom.domain.WeGroupSop; +import com.linkwechat.wecom.domain.vo.WeGroupSopVo; + +import java.util.List; + +/** + * 社区运营 群sop service接口 + */ +public interface IWeGroupSopService { + + /** + * 通过规则id获取sop规则 + * + * @param ruleId 规则id + * @return 结果 + */ + WeGroupSopVo getGroupSopById(Long ruleId); + + /** + * 通过过滤条件获取群sop列表 + * + * @param ruleName 规则名称 + * @param createBy 创建者 + * @param beginTime 创建区间 - 开始时间 + * @param endTime 创建区间 - 结束时间 + * @return 群sop规则列表 + */ + List getGroupSopList(String ruleName, String createBy, String beginTime, String endTime); + + + /** + * 新增群sop + * + * @param weGroupSop 新增所用数据 + * @param groupIdList 选中的群聊id + * @param materialIdList 素材 + * @param picList 手动上传的图片URL + * @return 结果 + */ + int addGroupSop(WeGroupSop weGroupSop, List groupIdList, List materialIdList, List picList); + + + /** + * 更新群sop + * + * @param weGroupSop 更新所用数据 + * @param groupIdList 选中的群聊id + * @param materialIdList 素材 + * @param picList 手动上传的图片URL + * @return 结果 + */ + int updateGroupSop(WeGroupSop weGroupSop, List groupIdList, List materialIdList, List picList); + + /** + * 批量删除群sop + * + * @param ids sop规则id列表 + * @return 结果 + */ + int batchRemoveGroupSopByIds(Long[] ids); + + /** + * 校验规则名是否唯一 + * + * @param ruleName 规则名 + * @return 是否唯一 + */ + boolean isRuleNameUnique(String ruleName); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..52f7ca0f1511669c3945fff676500ba742cca955 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWePresTagGroupTaskService.java @@ -0,0 +1,95 @@ +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.WePresTagGroupTaskVo; +import com.linkwechat.wecom.domain.vo.WePresTagGroupTaskStatVo; + +import java.util.List; + +/** + * 社区运营 老客户标签建群 相关逻辑 + */ +public interface IWePresTagGroupTaskService { + + /** + * 新增建群任务 + * + * @param taskDto 建群所需数据 + * @return 数据库新增行数 + */ + int add(WePresTagGroupTaskDto taskDto); + + /** + * 根据条件查询任务列表 + * + * @param taskName 任务名称 + * @param sendType 发送方式 + * @param createBy 创建人 + * @param beginTime 起始时间 + * @param endTime 结束时间 + * @return 结果 + */ + List selectTaskListList(String taskName, Integer sendType, String createBy, String beginTime, String endTime); + + /** + * 通过id获取老客标签建群任务 + * + * @param taskId 任务id + * @return 结果 + */ + WePresTagGroupTaskVo getTaskById(Long taskId); + + /** + * 批量删除老客标签建群任务 + * + * @param idList 任务id列表 + * @return 删除的行数 + */ + int batchRemoveTaskByIds(Long[] idList); + + /** + * 更新老客户标签建群任务 + * + * @param wePresTagGroupTaskDto 更新数据 + * @return 结果 + * @taskId 待更新任务id + */ + int updateTask(Long taskId, WePresTagGroupTaskDto wePresTagGroupTaskDto); + + /** + * 检测任务名是否已存在 + * + * @param taskName 任务名 + * @return 结果 + */ + boolean checkTaskNameUnique(String taskName); + + /** + * 通过老客标签建群id获取其统计信息 + * + * @param taskId 任务id + * @param customerName 客户名 + * @param isSent 是否已发送 + * @param isInGroup 是否已在群 + * @return 统计信息 + */ + List getStatByTaskId(Long taskId, String customerName, Integer isSent, Integer isInGroup); + + /** + * 通过任务id获取对应使用员工 + * + * @param taskId 任务id + * @return 结果 + */ + List getEmplListByTaskId(Long taskId); + + /** + * 通过任务id获取标签列表 + * + * @param taskId 任务id + * @return 结果 + */ + List getTagListByTaskId(Long taskId); +} 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 58b5c651ecd503f8fdadf1319e499be52570d4a9..905904bd7e6dbc629187591b17f3c3dde52ad4ad 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 @@ -35,7 +35,7 @@ public interface IWeTaskFissionService { * @param weTaskFission 任务宝 * @return 结果 */ - public int insertWeTaskFission(WeTaskFission weTaskFission); + public Long insertWeTaskFission(WeTaskFission weTaskFission); /** * 修改任务宝 @@ -43,7 +43,7 @@ public interface IWeTaskFissionService { * @param weTaskFission 任务宝 * @return 结果 */ - public int updateWeTaskFission(WeTaskFission weTaskFission); + public Long updateWeTaskFission(WeTaskFission weTaskFission); /** * 批量删除任务宝 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 new file mode 100644 index 0000000000000000000000000000000000000000..1b9ffe440b4019abcb89a1c622fd627e5492366a --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCommunityKeywordToGroupServiceImpl.java @@ -0,0 +1,157 @@ +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.wecom.domain.WeKeywordGroupTaskKeyword; +import com.linkwechat.wecom.domain.WeKeywordGroupTask; +import com.linkwechat.wecom.domain.WeGroupCode; +import com.linkwechat.wecom.domain.vo.WeKeywordGroupTaskVo; +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; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 社区运营 - 关键词拉群任务ServiceImpl + */ +@Slf4j +@Service +public class WeCommunityKeywordToGroupServiceImpl extends ServiceImpl implements IWeCommunityKeywordToGroupService { + + @Autowired + private WeKeywordGroupTaskMapper taskMapper; + + @Autowired + private WeKeywordGroupTaskKwMapper taskKwMapper; + + @Autowired + private IWeGroupCodeService groupCodeService; + + /** + * 根据过滤条件获取关键词拉群任务列表 + * + * @param taskName 任务名称 + * @param createBy 创建人 + * @param keyword 关键词 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return 列表数据 + */ + @Override + public List getTaskList(String taskName, String createBy, String keyword, String beginTime, String endTime) { + List taskVoList = taskMapper.getTaskList(taskName, createBy, keyword, beginTime, endTime); + for (WeKeywordGroupTaskVo task : taskVoList) { + // 查询关键词列表 + QueryWrapper taskKeywordQueryWrapper = new QueryWrapper<>(); + taskKeywordQueryWrapper.eq("task_id", task.getTaskId()); + List taskKeywordList = taskKwMapper.selectList(taskKeywordQueryWrapper); + task.setKeywordList(taskKeywordList); + // 通过群活码id查询对应的群 + List groupNameList = taskMapper.getGroupNameListByTaskId(task.getTaskId()); + groupNameList.removeIf(Objects::isNull); + task.setGroupNameList(groupNameList); + // 获取群活码信息 + WeGroupCode weGroupCode = groupCodeService.selectWeGroupCodeById(task.getGroupCodeId()); + task.setGroupCodeInfo(weGroupCode); + } + + return taskVoList; + } + + /** + * 根据id获取任务性情 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public WeKeywordGroupTaskVo getTaskById(Long taskId) { + WeKeywordGroupTaskVo taskVo = taskMapper.getTaskById(taskId); + // 查询关键词列表 + QueryWrapper taskKeywordQueryWrapper = new QueryWrapper<>(); + taskKeywordQueryWrapper.eq("task_id", taskId); + List keywordList = taskKwMapper.selectList(taskKeywordQueryWrapper); + taskVo.setKeywordList(keywordList); + return taskVo; + } + + /** + * 创建新任务 + * + * @param task 待存储的对象 + * @param keywords 关键词 + * @return 结果 + */ + @Override + @Transactional + public int addTask(WeKeywordGroupTask task, String[] keywords) { + if(this.save(task)) { + // 构建关键词对象并存储 + List weKeywordGroupTaskKeywordList = Arrays.stream(keywords) + .map(word -> new WeKeywordGroupTaskKeyword(task.getTaskId(), word)).collect(Collectors.toList()); + taskKwMapper.batchBindsTaskKeyword(weKeywordGroupTaskKeywordList); + return 1; + } + return 0; + } + + /** + * 对指定任务进行更新 + * + * @param task 待更新对象 + * @param keywords 关键词 + * @return 结果 + */ + @Override + @Transactional + public int updateTask(WeKeywordGroupTask task, String[] keywords) { + if(taskMapper.updateById(task) == 1) { + // 删除原有的关键词 + QueryWrapper taskKwQueryWrapper = new QueryWrapper<>(); + taskKwQueryWrapper.eq("task_id", task.getTaskId()); + taskKwMapper.delete(taskKwQueryWrapper); + // 再重新插入新的关键词 + List weKeywordGroupTaskKeywordList = Arrays.stream(keywords) + .map(word -> new WeKeywordGroupTaskKeyword(task.getTaskId(), word)).collect(Collectors.toList()); + taskKwMapper.batchBindsTaskKeyword(weKeywordGroupTaskKeywordList); + return 1; + } + return 0; + } + + /** + * 根据id列表批量删除任务 + * + * @param ids id列表 + * @return 删除行数 + */ + @Override + @Transactional + public int batchRemoveTaskByIds(Long[] ids) { + // 移除其所有关键词对象 + QueryWrapper taskKwQueryWrapper = new QueryWrapper<>(); + taskKwQueryWrapper.in("task_id", Arrays.asList(ids)); + taskKwMapper.delete(taskKwQueryWrapper); + return taskMapper.batchRemoveTaskByIds(ids); + } + + /** + * 检测任务名是否唯一 + * + * @param taskName 任务名 + * @return 结果 + */ + @Override + public boolean taskNameIsUnique(String taskName) { + return taskMapper.checkNameUnique(taskName) == 0; + } +} 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 40dd47d5abadf74159d36e1ddb48a403e58edc6a..d9330eb0dfe5db5c89d047cfe886f8e50c0f5ac5 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,6 +1,7 @@ package com.linkwechat.wecom.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.linkwechat.common.exception.wecom.WeComException; @@ -19,6 +20,7 @@ import com.linkwechat.wecom.service.IWeGroupCodeActualService; import lombok.extern.slf4j.Slf4j; 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; @@ -57,6 +59,7 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl item.setEmpleCodeId(communityNewGroup.getNewGroupId())); iWeEmpleCodeUseScopService.saveBatch(weEmpleCode.getWeEmpleCodeUseScops()); @@ -111,16 +117,19 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl 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); @@ -162,17 +171,19 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl() +// .eq(WeCommunityNewGroup::getGroupCodeId, communityNewGroupDto.getGroupCodeId())); + WeCommunityNewGroup communityNewGroup = weCommunityNewGroupMapper.selectById(communityNewGroupDto.getNewGroupId()); + if (null == communityNewGroup) { throw new WeComException("信息不存在!"); } @@ -180,12 +191,14 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - iWeEmpleCodeUseScopService.updateBatchById(weEmpleCode.getWeEmpleCodeUseScops()); + iWeEmpleCodeUseScopService.saveOrUpdateBatch(weEmpleCode.getWeEmpleCodeUseScops()); } if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) { weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); - weEmpleCodeTagService.updateBatchById(weEmpleCode.getWeEmpleCodeTags()); + weEmpleCodeTagService.saveOrUpdateBatch(weEmpleCode.getWeEmpleCodeTags()); } } 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 3168c12b145bfe4249f62b20c2d391537556a17a..b68184f1d4e4966f1f6f359f03aa99bc6e2c979b 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.utils.DateUtils; import com.linkwechat.common.utils.SecurityUtils; import com.linkwechat.common.utils.SnowFlakeUtil; import com.linkwechat.common.utils.StringUtils; @@ -627,11 +628,16 @@ public class WeCustomerServiceImpl extends ServiceImpl implements IWeGroupSopService { + + @Autowired + private WeGroupSopMapper groupSopMapper; + + @Autowired + private WeGroupSopChatMapper sopChatMapper; + + @Autowired + private WeMaterialMapper materialMapper; + + @Autowired + private WeGroupSopMaterialMapper sopMaterialMapper; + + @Autowired + private WeGroupMapper groupMapper; + + @Autowired + private WeGroupSopPicMapper sopPicMapper; + + /** + * 通过规则id获取sop规则 + * + * @param ruleId 规则id + * @return 结果 + */ + @Override + public WeGroupSopVo getGroupSopById(Long ruleId) { + WeGroupSopVo groupSopVo = groupSopMapper.getGroupSopById(ruleId); + this.setChatAndMaterial(groupSopVo); + // 设置手动上传的图片url + this.setPicList(groupSopVo); + return groupSopVo; + } + + /** + * 通过过滤条件获取群sop列表 + * + * @param ruleName 规则名称 + * @param createBy 创建者 + * @param beginTime 创建区间 - 开始时间 + * @param endTime 创建区间 - 结束时间 + * @return 群sop规则列表 + */ + @Override + public List 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); + + } + return groupSopVoList; + } + + /** + * 新增群sop + * + * @param weGroupSop 新增所用数据 + * @param groupIdList 选中的群聊id + * @param materialIdList 素材 + * @param picList 手动上传的图片URL + * @return 结果 + */ + @Override + @Transactional + public int addGroupSop(WeGroupSop weGroupSop, List groupIdList, List materialIdList, List picList) { + if (this.save(weGroupSop)) { + Long ruleId = weGroupSop.getRuleId(); + // 保存群聊及素材关联 + this.saveChatAndMaterialBinds(ruleId, groupIdList, materialIdList); + // 保存手动上传的图片素材 + List sopPicList = picList.stream().map(e -> new WeGroupSopPic(ruleId, e)).collect(Collectors.toList()); + sopPicMapper.batchSopPic(sopPicList); + return 1; + } + return 0; + } + + /** + * 更新群sop + * + * @param weGroupSop 更新所用数据 + * @param groupIdList 选中的群聊id + * @param materialIdList 素材 + * @param picList 手动上传的图片URL + * @return 结果 + */ + @Override + @Transactional + public int updateGroupSop(WeGroupSop weGroupSop, List groupIdList, List materialIdList, List picList) { + if (this.updateById(weGroupSop)) { + Long ruleId = weGroupSop.getRuleId(); + // 先删除旧数据 + this.deleteChatAndMaterialBinds(ruleId); + // 再插入新数据 + this.saveChatAndMaterialBinds(ruleId, groupIdList, materialIdList); + // 删除旧图片 + QueryWrapper queryWrapper = new QueryWrapper<>(); + sopPicMapper.delete(queryWrapper.eq("rule_id", ruleId)); + + // 保留新上传的图片 + List sopPicList = picList.stream().map(e -> new WeGroupSopPic(ruleId, e)).collect(Collectors.toList()); + sopPicMapper.batchSopPic(sopPicList); + return 1; + } + return 0; + } + + /** + * 批量删除群sop + * + * @param ids sop规则id列表 + * @return 结果 + */ + @Override + @Transactional + public int batchRemoveGroupSopByIds(Long[] ids) { + int affectedRows = groupSopMapper.deleteBatchIds(Arrays.asList(ids)); + if (affectedRows > 0) { + // 解除群聊和素材关联 + QueryWrapper sopGroupQueryWrapper = new QueryWrapper<>(); + sopGroupQueryWrapper.in("rule_id", Arrays.asList(ids)); + sopChatMapper.delete(sopGroupQueryWrapper); + QueryWrapper sopMaterialQueryWrapper = new QueryWrapper<>(); + sopMaterialQueryWrapper.in("rule_id", Arrays.asList(ids)); + sopMaterialMapper.delete(sopMaterialQueryWrapper); + + // 删除手动上传的图片 + QueryWrapper picQueryWrapper = new QueryWrapper<>(); + picQueryWrapper.in("rule_id", Arrays.asList(ids)); + sopPicMapper.delete(picQueryWrapper); + } + return affectedRows; + } + + /** + * 校验规则名是否唯一 + * + * @param ruleName 规则名 + * @return 是否唯一 + */ + @Override + public boolean isRuleNameUnique(String ruleName) { + return groupSopMapper.isRuleNameUnique(ruleName) == 0; + } + + + /** + * 根据关联条件查询该sop所关联的群聊及素材对象,并将其放入WeGroupSopVo相应属性中用于前端使用 + * + * @param groupSopVo 目标sop规则 + */ + private void setChatAndMaterial(WeGroupSopVo groupSopVo) { + Long ruleId = groupSopVo.getRuleId(); + + // 获取对应群聊信息 + QueryWrapper groupQueryWrapper = new QueryWrapper<>(); + List chatIdList = groupSopMapper.getChatIdListByRuleId(ruleId); + if (StringUtils.isNotEmpty(chatIdList)) { + groupQueryWrapper.in("chat_id", chatIdList); + List groupList = groupMapper.selectList(groupQueryWrapper); + groupSopVo.setGroupList(groupList); + } + // 获取对应素材信息 + QueryWrapper materialQueryWrapper = new QueryWrapper<>(); + List materialIdList = groupSopMapper.getMaterialIdListByRuleId(ruleId); + if (StringUtils.isNotEmpty(materialIdList)) { + materialQueryWrapper.in("id", materialIdList); + List materialList = materialMapper.selectList(materialQueryWrapper); + groupSopVo.setMaterialList(materialList); + } + } + + /** + * 保存该sop规则对应的群聊及素材关联对象 + * + * @param ruleId 规则id + * @param chatIdList 群聊id列表 + * @param materialIdList 素材id列表 + */ + private void saveChatAndMaterialBinds(Long ruleId, List chatIdList, List materialIdList) { + if (StringUtils.isNotEmpty(chatIdList)) { + List sopChatList = chatIdList + .stream() + .map(id -> new WeGroupSopChat(ruleId, id)) + .collect(Collectors.toList()); + sopChatMapper.batchBindsSopChat(sopChatList); + } + if (StringUtils.isNotEmpty(materialIdList)) { + List materialList = materialIdList + .stream() + .map(id -> new WeGroupSopMaterial(ruleId, id)) + .collect(Collectors.toList()); + sopMaterialMapper.batchBindsSopMaterial(materialList); + } + } + + /** + * 解除该sop规则对应的群聊及素材关联 + * + * @param ruleId 规则id + */ + private void deleteChatAndMaterialBinds(Long ruleId) { + QueryWrapper sopChatQueryWrapper = new QueryWrapper<>(); + sopChatQueryWrapper.eq("rule_id", ruleId); + sopChatMapper.delete(sopChatQueryWrapper); + QueryWrapper sopMaterialQueryWrapper = new QueryWrapper<>(); + sopMaterialQueryWrapper.eq("rule_id", ruleId); + sopMaterialMapper.delete(sopMaterialQueryWrapper); + } + + /** + * 为WeGroupSopVo查询手动上传的图片列表 + * + * @param sopVo 代操作对象 + */ + private void setPicList(WeGroupSopVo sopVo) { + Long ruleId = sopVo.getRuleId(); + QueryWrapper picQueryWrapper = new QueryWrapper<>(); + picQueryWrapper.eq("rule_id", ruleId); + List sopPicList = sopPicMapper.selectList(picQueryWrapper); + List picList = sopPicList.stream().map(WeGroupSopPic::getPicUrl).collect(Collectors.toList()); + sopVo.setPicList(picList); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..00f6620336eedd324e3bd6c5de024fcb9ad4db5b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePresTagGroupTaskServiceImpl.java @@ -0,0 +1,241 @@ +package com.linkwechat.wecom.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linkwechat.common.utils.SecurityUtils; +import com.linkwechat.common.utils.bean.BeanUtils; +import com.linkwechat.wecom.domain.*; +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.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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class WePresTagGroupTaskServiceImpl extends ServiceImpl implements IWePresTagGroupTaskService { + + @Autowired + private WePresTagGroupTaskMapper taskMapper; + + @Autowired + private WePresTagGroupTaskStatMapper taskStatMapper; + + @Autowired + private WePresTagGroupTaskScopeMapper taskScopeMapper; + + @Autowired + private WePresTagGroupTaskTagMapper taskTagMapper; + + /** + * 新增建群任务 + * + * @param taskDto 建群所需数据 + * @return 数据库新增行数 + */ + @Override + @Transactional(rollbackFor = RuntimeException.class) + public int add(WePresTagGroupTaskDto taskDto) { + + // 创建WeCommunityOldGroup对象进行存储 + WePresTagGroupTask task = new WePresTagGroupTask(); + + BeanUtils.copyProperties(taskDto, task); + task.setCreateBy(SecurityUtils.getUsername()); + + if (this.save(task)) { + // 保存标签对象 + List tagIdList = taskDto.getTagList(); + if (CollectionUtil.isNotEmpty(tagIdList)) { + 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()); + taskScopeMapper.batchBindsTaskScopes(wePresTagGroupTaskScopeList); + } + + return 1; + } + return 0; + } + + /** + * 根据条件查询任务列表 + * @param taskName 任务名称 + * @param sendType 发送方式 + * @param createBy 创建人 + * @param beginTime 起始时间 + * @param endTime 结束时间 + * @return 结果 + */ + @Override + public List selectTaskListList(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); + } + } + return taskVoList; + } + + /** + * 通过id获取老客标签建群任务 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public WePresTagGroupTaskVo getTaskById(Long taskId) { + return taskMapper.selectTaskById(taskId); + } + + /** + * 批量删除老客标签建群任务 + * + * @param idList 任务id列表 + * @return 删除的行数 + */ + @Override + @Transactional + public int batchRemoveTaskByIds(Long[] idList) { + List ids = Arrays.asList(idList); + + // 解除关联的标签 + QueryWrapper taskTagQueryWrapper = new QueryWrapper<>(); + taskTagQueryWrapper.in("task_id", ids); + taskTagMapper.delete(taskTagQueryWrapper); + // 解除关联的员工 + QueryWrapper taskScopeQueryWrapper = new QueryWrapper<>(); + taskScopeQueryWrapper.in("task_id", ids); + taskScopeMapper.delete(taskScopeQueryWrapper); + // 删除其用户统计 + QueryWrapper statQueryWrapper = new QueryWrapper<>(); + statQueryWrapper.in("task_id", ids); + taskStatMapper.delete(statQueryWrapper); + + // 删除task + QueryWrapper taskQueryWrapper = new QueryWrapper<>(); + taskQueryWrapper.in("task_id", ids); + return taskMapper.delete(taskQueryWrapper); + } + + /** + * 更新老客户标签建群任务 + * + * @taskId 待更新任务id + * @param wePresTagGroupTaskDto 更新数据 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = RuntimeException.class) + public int updateTask(Long taskId, WePresTagGroupTaskDto wePresTagGroupTaskDto) { + WePresTagGroupTask wePresTagGroupTask = new WePresTagGroupTask(); + BeanUtils.copyProperties(wePresTagGroupTaskDto, wePresTagGroupTask); + wePresTagGroupTask.setTaskId(taskId); + wePresTagGroupTask.setUpdateBy(SecurityUtils.getUsername()); + if (taskMapper.updateById(wePresTagGroupTask) == 1) { + // 更新标签 + // 先删除旧标签 + QueryWrapper taskTagQueryWrapper = new QueryWrapper<>(); + taskTagQueryWrapper.eq("task_id", taskId); + taskTagMapper.delete(taskTagQueryWrapper); + // 再添加新标签 + List tagIdList = wePresTagGroupTaskDto.getTagList(); + if (CollectionUtil.isNotEmpty(tagIdList)) { + List wePresTagGroupTaskTagList = tagIdList.stream().map(id -> new WePresTagGroupTaskTag(taskId, id)).collect(Collectors.toList()); + taskTagMapper.batchBindsTaskTags(wePresTagGroupTaskTagList); + } + + // 更新范围 + + // 先解除旧的员工绑定信息 + QueryWrapper taskScopeQueryWrapper = new QueryWrapper<>(); + taskScopeQueryWrapper.eq("task_id", taskId); + taskScopeMapper.delete(taskScopeQueryWrapper); + + // 再重新绑定员工信息 + List userIdList = wePresTagGroupTaskDto.getScopeList(); + if (CollectionUtil.isNotEmpty(userIdList)) { + List wePresTagGroupTaskScopeList = userIdList.stream().map(id -> new WePresTagGroupTaskScope(taskId, id)).collect(Collectors.toList()); + taskScopeMapper.batchBindsTaskScopes(wePresTagGroupTaskScopeList); + } + return 1; + } + return 0; + } + + /** + * 检测任务名是否已存在 + * + * @param taskName 任务名 + * @return 结果 + */ + @Override + public boolean checkTaskNameUnique(String taskName) { + int count = taskMapper.checkTaskNameUnique(taskName); + return count <= 0; + } + + /** + * 通过老客标签建群id获取其统计信息 + * + * @param taskId 任务id + * @param customerName 客户名 + * @param isSent 是否已发送 + * @param isInGroup 是否已在群 + * @return 统计信息 + */ + @Override + public List getStatByTaskId(Long taskId, String customerName, Integer isSent, Integer isInGroup) { + return taskStatMapper.getStatByTaskId(taskId, customerName, isSent, isInGroup); + } + + /** + * 通过任务id获取对应使用员工 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public List getEmplListByTaskId(Long taskId) { + return taskScopeMapper.getScopeListByTaskId(taskId); + } + + /** + * 通过任务id获取标签列表 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public List getTagListByTaskId(Long taskId) { + return taskTagMapper.getTagListByTaskId(taskId); + } +} 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 680ba4c242edd08e2f438c0320f1749d321c1d68..56702bab493cabfecd45523b6daa0efa09cfb44f 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 @@ -30,10 +30,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.text.ParseException; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; +import java.text.ParseException; import java.util.Date; import java.util.List; import java.util.Objects; @@ -103,7 +103,7 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { */ @Override @Transactional - public int insertWeTaskFission(WeTaskFission weTaskFission) { + public Long insertWeTaskFission(WeTaskFission weTaskFission) { weTaskFission.setCreateBy(SecurityUtils.getUsername()); weTaskFission.setCreateTime(DateUtils.getNowDate()); groupQrcodeHandler(weTaskFission); @@ -118,7 +118,7 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { } } } - return insertResult; + return weTaskFission.getId(); } /** @@ -128,10 +128,25 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { * @return 结果 */ @Override - public int updateWeTaskFission(WeTaskFission weTaskFission) { + @Transactional + public Long updateWeTaskFission(WeTaskFission weTaskFission) { weTaskFission.setUpdateTime(DateUtils.getNowDate()); weTaskFission.setUpdateBy(SecurityUtils.getUsername()); - return weTaskFissionMapper.updateWeTaskFission(weTaskFission); + groupQrcodeHandler(weTaskFission); + int updateResult = weTaskFissionMapper.updateWeTaskFission(weTaskFission); + if (updateResult > 0) { + if (CollectionUtils.isNotEmpty(weTaskFission.getTaskFissionStaffs())) { + List staffList = weTaskFissionStaffService.selectWeTaskFissionStaffByTaskId(weTaskFission.getId()); + if (CollectionUtils.isNotEmpty(staffList)) { + weTaskFissionStaffService.deleteWeTaskFissionStaffByIds(staffList.stream().map(WeTaskFissionStaff::getId).toArray(Long[]::new)); + } + weTaskFission.getTaskFissionStaffs().forEach(staff -> { + staff.setTaskFissionId(weTaskFission.getId()); + }); + weTaskFissionStaffService.insertWeTaskFissionStaffList(weTaskFission.getTaskFissionStaffs()); + } + } + return weTaskFission.getId(); } /** @@ -164,12 +179,14 @@ public class WeTaskFissionServiceImpl implements IWeTaskFissionService { String postersPath = weTaskFission.getPostersUrl(); //目标员工id String fissStaffId = weTaskFission.getFissionTargetId(); - //todo H5生成海报页面路径 + //H5生成海报页面路径 StringBuilder pageUrlBuilder = new StringBuilder(pageUrl); pageUrlBuilder.append("?") .append("fissionId=").append(id) .append("&") - .append("userId=").append(fissStaffId); + .append("userId=").append(fissStaffId) + .append("&") + .append("posterId=").append(weTaskFission.getPostersId()); LinkMessageDto linkMessageDto = new LinkMessageDto(); linkMessageDto.setPicurl(postersPath); diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml index 22c4dc9683b3fab1ffa6e39b34a9133c33f3e469..bcf7f2e27aa39bde60574df9f5025aa7b59f1198 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml @@ -18,7 +18,9 @@ qr_code, is_join_confirm_friends, media_id, - join_friend_nums + join_friend_nums, + config_id, + user_qr_code FROM we_community_new_group @@ -36,8 +38,8 @@ del_flag = 0 - - AND emple_code_name LIKE CONCAT("%",#{empleCodeName},"%") + + AND emple_code_name LIKE CONCAT("%",#{employCodeName},"%") AND date_format(create_time,'%y%m%d') >= date_format(#{beginTime},'%y%m%d') diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1630d6ffe3938c4fb3c5814b8cec176420ad304 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopChatMapper.xml @@ -0,0 +1,12 @@ + + + + + insert into we_group_sop_chat(rule_id, chat_id) values + + (#{item.ruleId},#{item.chatId}) + + + \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..d139ad5a1b9820de8d589211edf91027242366c2 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + SELECT + rule_id, + rule_name, + title, + content, + start_time, + end_time, + create_by, + create_time, + update_by, + update_time + FROM + we_group_sop + + + + + + + + + + + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMaterialMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMaterialMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..29ca84bb22cd48341e12e37f6f425f62b541ce0b --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopMaterialMapper.xml @@ -0,0 +1,12 @@ + + + + + insert into we_group_sop_material(rule_id, material_id) values + + (#{item.ruleId},#{item.materialId}) + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopPicMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopPicMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..ad82b620890d31a740d63e2e8329145ed33961e3 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupSopPicMapper.xml @@ -0,0 +1,12 @@ + + + + + insert into we_group_sop_pic(rule_id, pic_url) values + + (#{item.ruleId},#{item.picUrl}) + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskKwMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskKwMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..813ff68e59edad01807a55e2a36b565a85861ea4 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskKwMapper.xml @@ -0,0 +1,12 @@ + + + + + insert into we_keyword_group_kw(task_id, keyword) values + + (#{item.taskId},#{item.keyword}) + + + \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..ac84e36fd77f095a320548be84e63791a032f67b --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeKeywordGroupTaskMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + SELECT DISTINCT + wkg.task_id, + wkg.task_name, + wkg.group_code_id, + wkg.welcome_msg, + wkg.create_by, + wkg.create_time, + wkg.update_by, + wkg.update_time + FROM + we_keyword_group wkg + LEFT JOIN we_keyword_group_kw wkgk ON wkgk.task_id = wkg.task_id + + + + + + + + + + delete from we_keyword_group where task_id in + + #{id} + + + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea3f9a9681034c916a84ff30d8b2ad916d7560d6 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskMapper.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + SELECT + wptg.task_id, + 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.create_by, + wptg.create_time, + wptg.update_by, + wptg.update_time, + 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 + + + + + + + + + \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..8e40f049ad57e76fdcae59ee89d20631546d7a63 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskScopeMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + insert into we_pres_tag_group_scope(task_id, we_user_id) values + + (#{item.taskId},#{item.weUserId}) + + + + \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..cff6579a78b82a1f3f2ca264fd8b3388ddec9d59 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskStatMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + delete from we_pres_tag_group_stat where 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 new file mode 100644 index 0000000000000000000000000000000000000000..08508c44e32b53317dbd8d187e8ebc01bc89f727 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WePresTagGroupTaskTagMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + insert into we_pres_tag_group_tag(task_id, tag_id) values + + (#{item.taskId},#{item.tagId}) + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index e720072003f744bede60084f2429ea5a3dd76ec9..8454df901cbc3e3c88e905e30273bea780ada61a 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ 4.0.0 4.1.49.Final 2.2.5.RELEASE + 2.3.1 @@ -269,6 +270,12 @@ spring-cloud-starter-alibaba-nacos-discovery ${nacos.version} + + + javax.xml.bind + jaxb-api + ${jaxb.version} + diff --git a/sql/link-wechat.sql b/sql/link-wechat.sql index 624d7546e5153d1c56d4c40d07dc0ef727e2f700..593fe19e7a0a38e75c3b21f9a5d4b8ca6c7df79a 100644 --- a/sql/link-wechat.sql +++ b/sql/link-wechat.sql @@ -25962,3 +25962,110 @@ INSERT INTO `we_user` VALUES ('wdd', '', 'www', '1', '1', '13211113333', '', nul INSERT INTO `we_user` VALUES ('XiaoSheYu', 'http://wework.qpic.cn/bizmail/X3FxrhAuusOcZ043GdRcFeia622qBa3SZJJb4qtowKeOhmSYERDeMyQ/0', '舒俊丽', '', '2', '15956647920', '', null, '1', '', '0', null, '1', null, null, '', null, null, null, null, null, '0', '1', '0'); INSERT INTO `we_user` VALUES ('XuXueJun', 'http://wework.qpic.cn/bizmail/aUfcY5fiaq6Fwc8qgcDh0MKO443WLmULcJg2iaWWZHjZP4lRQjibxqYAg/0', '徐学军', '', '1', '18654148698', '1570728529@qq.com', null, '4294967290', '前端高级开发工程师', '0', null, '1', null, null, '', '', null, null, null, null, '0', '1', '0'); INSERT INTO `we_user` VALUES ('zhengjw10', '', '郑伟', '', '1', '13966190918', '', null, '4294967290', '', '0', null, '1', null, null, '', null, null, null, null, null, '0', '4', '0'); + + +DROP TABLE IF EXISTS `we_pres_tag_group`; +CREATE TABLE `we_pres_tag_group` ( + `task_id` bigint(20) NOT NULL COMMENT '老客户标签建群任务id', + `task_name` varchar(100) NOT NULL COMMENT '任务名称', + `send_type` tinyint(1) NULL DEFAULT 0 COMMENT '发送方式 0: 企业群发 1:个人群发', + `create_by` varchar(100) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(100) NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `group_code_id` bigint(11) NOT NULL COMMENT '群活码id', + `send_scope` tinyint(1) NOT NULL DEFAULT 0 COMMENT '发送范围 0: 全部客户 1:部分客户', + `send_gender` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT 0 COMMENT '发送性别 0: 全部 1: 男 2: 女 3:未知', + `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 '加群引导语', + 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' +) 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:已在群' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '老客标签建群客户统计表'; + +DROP TABLE IF EXISTS `we_keyword_group_kw`; +CREATE TABLE `we_keyword_group_kw` ( + `task_id` bigint(20) NOT NULL COMMENT '关键词拉群任务id', + `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` ( + `task_id` bigint(20) NOT NULL COMMENT '关键词拉群任务主键', + `task_name` varchar(100) NOT NULL COMMENT '任务名称', + `group_code_id` bigint(20) NOT NULL COMMENT '群活码id', + `welcome_msg` varchar(255) NOT NULL COMMENT '加群欢迎语', + `create_by` varchar(64) NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) NULL DEFAULT '' COMMENT '备注', + 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` ( + `rule_id` bigint(20) NOT NULL COMMENT '群SOP主键', + `rule_name` varchar(64) NOT NULL COMMENT '规则名称', + `title` varchar(64) NOT NULL COMMENT '标题', + `content` varchar(255) NOT NULL COMMENT '内容', + `start_time` datetime NOT NULL COMMENT '开始执行时间', + `end_time` datetime NOT NULL COMMENT '结束时间', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`rule_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='群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' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='SOP规则 - 群聊 关联表'; + +DROP TABLE IF EXISTS `we_group_sop_material`; +CREATE TABLE `we_group_sop_material` ( + `rule_id` bigint(20) NOT NULL COMMENT 'SOP规则id', + `material_id` bigint(20) NOT NULL COMMENT '素材id' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT = '群SOP规则 - 素材关联表'; + +DROP TABLE IF EXISTS `we_group_sop_pic`; +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规则图片';