From 010677be7ce51fcc431c81db781212859d52cb06 Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Fri, 22 Dec 2023 15:03:18 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=A8=E9=87=8F?= =?UTF-8?q?=E5=8F=91=E9=80=81=E8=AF=9D=E6=9C=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/req/WxUserScriptReq.java | 1 - .../controller/WxUserScriptLogController.java | 89 ++++++++++++++++++- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java index 5df5be5..c085c7d 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java @@ -20,7 +20,6 @@ public class WxUserScriptReq { /** * 话术接收用户id */ - @NotNull(message = "用户列表不能为空") List userIdList; /** diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java index 133e6a5..22b3f25 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java @@ -3,7 +3,9 @@ package com.flossom.system.controller; import javax.servlet.http.HttpServletResponse; import com.flossom.common.core.domain.R; +import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.domain.entity.WxUserScriptLog; +import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.domain.req.WxUserScriptReq; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.utils.StringUtils; @@ -14,12 +16,14 @@ import com.flossom.common.core.web.page.TableDataInfo; import com.flossom.common.log.annotation.Log; import com.flossom.common.log.enums.BusinessType; import com.flossom.common.security.annotation.RequiresPermissions; +import com.flossom.system.service.IWxUserMemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import com.flossom.system.service.IWxUserScriptLogService; import java.util.List; +import java.util.stream.Collectors; /** * 发送话术记录Controller @@ -34,6 +38,9 @@ public class WxUserScriptLogController extends BaseController { @Autowired private IWxUserScriptLogService wxUserScriptLogService; + @Autowired + private IWxUserMemberService wxUserMemberService; + /** * 查询发送话术记录列表 */ @@ -101,8 +108,11 @@ public class WxUserScriptLogController extends BaseController { * * @return */ - @PostMapping("/sendScript") - public R sendScript(@RequestBody @Validated WxUserScriptReq wxUserScriptReq) { + @PostMapping("/batchSendScript") + public R batchSendScript(@RequestBody @Validated WxUserScriptReq wxUserScriptReq) { + if (wxUserScriptReq.getUserIdList() == null || wxUserScriptReq.getUserIdList().size() == 0) { + return R.fail("请选择话术接收人"); + } if (wxUserScriptReq.getIsCustom() == 0) { // 模板话术 if (wxUserScriptReq.getScriptTemplateId() == null || wxUserScriptReq.getScriptTemplateId() == 0) { @@ -110,10 +120,10 @@ public class WxUserScriptLogController extends BaseController { } } else if (wxUserScriptReq.getIsCustom() == 1) { // 自定义话术 - if(StringUtils.isBlank(wxUserScriptReq.getTitile())){ + if (StringUtils.isBlank(wxUserScriptReq.getTitile())) { return R.fail("请输入话术标题"); } - if(StringUtils.isBlank(wxUserScriptReq.getContent())){ + if (StringUtils.isBlank(wxUserScriptReq.getContent())) { return R.fail("请输入话术内容"); } // 跳转类型 @@ -161,4 +171,75 @@ public class WxUserScriptLogController extends BaseController { return R.ok(); } + /** + * 发送话术 + * + * @return + */ + @PostMapping("/allSendScript") + public R allSendScript(@RequestBody @Validated WxUserScriptReq wxUserScriptReq, WxUserMemberVm wxUserMemberVm) { + if (wxUserScriptReq.getIsCustom() == 0) { + // 模板话术 + if (wxUserScriptReq.getScriptTemplateId() == null || wxUserScriptReq.getScriptTemplateId() == 0) { + return R.fail("请选择话术模板"); + } + } else if (wxUserScriptReq.getIsCustom() == 1) { + // 自定义话术 + if (StringUtils.isBlank(wxUserScriptReq.getTitile())) { + return R.fail("请输入话术标题"); + } + if (StringUtils.isBlank(wxUserScriptReq.getContent())) { + return R.fail("请输入话术内容"); + } + // 跳转类型 + if (wxUserScriptReq.getType() == 1) { + // 1跳转内部链接 + if (StringUtils.isBlank(wxUserScriptReq.getLink())) { + return R.fail("请输入内部链接"); + } + if (StringUtils.isBlank(wxUserScriptReq.getLinkParams())) { + return R.fail("请输入跳转参数"); + } + } + if (wxUserScriptReq.getType() == 3) { + // 03跳转外部链接 + if (StringUtils.isBlank(wxUserScriptReq.getLink())) { + return R.fail("请输入外部链接地址"); + } + } + if (wxUserScriptReq.getType() == 4) { + // 4跳转小程序 + if (StringUtils.isBlank(wxUserScriptReq.getRedirectAppid())) { + return R.fail("请输入小程序appid"); + } + if (StringUtils.isBlank(wxUserScriptReq.getRedirectUrl())) { + return R.fail("请输入小程序页面地址"); + } + } + if (wxUserScriptReq.getType() == 5) { + // 5导向视频号 + if (StringUtils.isBlank(wxUserScriptReq.getVideoNo())) { + return R.fail("请输入视频号id"); + } + if (StringUtils.isBlank(wxUserScriptReq.getFeedId())) { + return R.fail("请输入视频号feedid"); + } + } + if (wxUserScriptReq.getType() == 6) { + // 6导向视频号直播间 + if (StringUtils.isBlank(wxUserScriptReq.getVideoNo())) { + return R.fail("请输入视频号id"); + } + } + } + + List list = wxUserMemberService.selectWxUserMemberList(wxUserMemberVm); + if (list != null && list.size() > 0) { + List collect = list.stream().map(wxUserMember -> wxUserMember.getId()).collect(Collectors.toList()); + wxUserScriptReq.setUserIdList(collect); + wxUserScriptLogService.sendScript(wxUserScriptReq); + } + return R.ok(); + } + } From c81e29d69796a6195dfba8496393859a8c858e2b Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Fri, 22 Dec 2023 15:18:38 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=92=8C=E5=85=A8?= =?UTF-8?q?=E9=87=8F=E6=B7=BB=E5=8A=A0=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxUserRemarkController.java | 25 +++++++++++++++++++ .../service/impl/WxUserRemarkServiceImpl.java | 8 ------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java index ae0efeb..44a1589 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java @@ -2,11 +2,14 @@ package com.flossom.system.controller; import java.util.List; import java.io.IOException; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import com.flossom.common.core.domain.R; +import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.domain.entity.WxUserRemark; import com.flossom.common.core.domain.req.WxUserIntegralVm; +import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.domain.req.WxUserRemarkReq; import com.flossom.common.core.enums.IntegralChangeTypeEnum; import com.flossom.common.core.exception.ServiceException; @@ -17,6 +20,7 @@ import com.flossom.common.core.web.page.TableDataInfo; import com.flossom.common.log.annotation.Log; import com.flossom.common.log.enums.BusinessType; import com.flossom.common.security.annotation.RequiresPermissions; +import com.flossom.system.service.IWxUserMemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,6 +38,9 @@ public class WxUserRemarkController extends BaseController { @Autowired private IWxUserRemarkService wxUserRemarkService; + @Autowired + private IWxUserMemberService wxUserMemberService; + /** * 查询微信用户备注列列表 */ @@ -101,7 +108,25 @@ public class WxUserRemarkController extends BaseController { */ @PostMapping("/batchAddRemark") public R batchAddRemark(@RequestBody @Validated WxUserRemarkReq wxUserRemarkReq) { + if(wxUserRemarkReq.getUserIdList() == null || wxUserRemarkReq.getUserIdList().size() == 0) { + return R.fail("请选择用户"); + } + wxUserRemarkService.batchAddRemark(wxUserRemarkReq); + return R.ok(); + } + + /** + * 全量 添加备注 + */ + @PostMapping("/allAddRemark") + public R allAddRemark(@RequestBody @Validated WxUserRemarkReq wxUserRemarkReq, WxUserMemberVm wxUserMemberVm) { wxUserRemarkService.batchAddRemark(wxUserRemarkReq); + List list = wxUserMemberService.selectWxUserMemberList(wxUserMemberVm); + if (list != null && list.size() > 0) { + List collect = list.stream().map(wxUserMember -> wxUserMember.getId()).collect(Collectors.toList()); + wxUserRemarkReq.setUserIdList(collect); + wxUserRemarkService.batchAddRemark(wxUserRemarkReq); + } return R.ok(); } } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserRemarkServiceImpl.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserRemarkServiceImpl.java index bf847cb..1b3d61a 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserRemarkServiceImpl.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserRemarkServiceImpl.java @@ -99,14 +99,6 @@ public class WxUserRemarkServiceImpl implements IWxUserRemarkService { @Override public void batchAddRemark(WxUserRemarkReq wxUserRemarkReq) { - if (wxUserRemarkReq.getUserIdList() == null || wxUserRemarkReq.getUserIdList().size() == 0) { - List userIdList = wxUserMemberMapper.selectWxUserMemberIdList(); - if (userIdList != null && userIdList.size() > 0) { - List collect = userIdList.stream().map(Integer::longValue).collect(Collectors.toList()); - wxUserRemarkReq.setUserIdList(collect); - } - } - if (wxUserRemarkReq.getUserIdList() != null && wxUserRemarkReq.getUserIdList().size() > 0) { WxUserRemark wxUserRemark = new WxUserRemark(); for (Long userId : wxUserRemarkReq.getUserIdList()) { From 6b9333533a57a8ce31b9f2e7f7b7786d719ff905 Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Sat, 23 Dec 2023 14:37:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/AllChangIntegralOperateReq.java | 32 + .../controller/UserMemberController.java | 2 - .../controller/WxUserMemberController.java | 17 +- .../controller/WxUserRemarkController.java | 9 +- .../service/impl/WxUserMemberServiceImpl.java | 18 +- flossom-ui/src/api/system/member.js | 127 +++ flossom-ui/src/views/system/member/index.vue | 778 ++++++++++++++---- 7 files changed, 819 insertions(+), 164 deletions(-) create mode 100644 flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllChangIntegralOperateReq.java diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllChangIntegralOperateReq.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllChangIntegralOperateReq.java new file mode 100644 index 0000000..0231d4e --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllChangIntegralOperateReq.java @@ -0,0 +1,32 @@ +package com.flossom.common.core.domain.req; + +public class AllChangIntegralOperateReq { + + private WxUserIntegralVm wxUserIntegralVm; + + private WxUserMemberVm wxUserMemberVm; + + public AllChangIntegralOperateReq() { + } + + public AllChangIntegralOperateReq(WxUserIntegralVm wxUserIntegralVm, WxUserMemberVm wxUserMemberVm) { + this.wxUserIntegralVm = wxUserIntegralVm; + this.wxUserMemberVm = wxUserMemberVm; + } + + public WxUserIntegralVm getWxUserIntegralVm() { + return wxUserIntegralVm; + } + + public void setWxUserIntegralVm(WxUserIntegralVm wxUserIntegralVm) { + this.wxUserIntegralVm = wxUserIntegralVm; + } + + public WxUserMemberVm getWxUserMemberVm() { + return wxUserMemberVm; + } + + public void setWxUserMemberVm(WxUserMemberVm wxUserMemberVm) { + this.wxUserMemberVm = wxUserMemberVm; + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java index 69ffcfe..ad54728 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java @@ -75,8 +75,6 @@ public class UserMemberController extends BaseController { throw new ServiceException("上传头像失败"); } userMemberUpdateVo.setHeadimg(result.getData().getUrl()); - } else { - userMemberUpdateVo.setHeadimg(null); } return R.ok(wxUserMemberService.updateUser(userMemberUpdateVo)); } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java index 64c543a..51961e0 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java @@ -4,6 +4,7 @@ import javax.servlet.http.HttpServletResponse; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.req.AllChangIntegralOperateReq; import com.flossom.common.core.domain.req.WxUserIntegralVm; import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.enums.IntegralChangeTypeEnum; @@ -111,7 +112,7 @@ public class WxUserMemberController extends BaseController { */ @PostMapping("/batchAddMiniProgramTag") public R batchAddMiniProgramTag(@RequestParam("tagIdList") List tagIdList, - @RequestParam(value = "userIdList") List userIdList) { + @RequestParam("userIdList") List userIdList) { if (tagIdList == null || tagIdList.size() == 0) { logger.error("参数有误"); throw new ServiceException("参数有误"); @@ -124,7 +125,7 @@ public class WxUserMemberController extends BaseController { * 全量添加小程序标签 */ @PostMapping("/allAddMiniProgramTag") - public R allAddMiniProgramTag(@RequestParam("tagIdList") List tagIdList, WxUserMemberVm wxUserMemberVm) { + public R allAddMiniProgramTag(@RequestParam("tagIdList") List tagIdList, @RequestBody WxUserMemberVm wxUserMemberVm) { if (tagIdList == null || tagIdList.size() == 0) { logger.error("参数有误"); throw new ServiceException("参数有误"); @@ -156,7 +157,7 @@ public class WxUserMemberController extends BaseController { * 全量 删除小程序标签 */ @PostMapping("/allDelMiniProgramTag") - public R allDelMiniProgramTag(@RequestParam("tagIdList") List tagIdList, WxUserMemberVm wxUserMemberVm) { + public R allDelMiniProgramTag(@RequestParam("tagIdList") List tagIdList, @RequestBody WxUserMemberVm wxUserMemberVm) { if (tagIdList == null || tagIdList.size() == 0) { logger.error("参数有误"); throw new ServiceException("参数有误"); @@ -173,7 +174,7 @@ public class WxUserMemberController extends BaseController { * 批量 操作积分 */ @PostMapping("/batchChangIntegral") - public R batchChangIntegral(@Validated WxUserIntegralVm wxUserIntegralVm, @RequestParam(value = "userIdList") List userIdList) { + public R batchChangIntegral(@Validated @RequestBody WxUserIntegralVm wxUserIntegralVm, @RequestParam(value = "userIdList") List userIdList) { if (userIdList == null || userIdList.size() == 0 || !IntegralChangeTypeEnum.isIntegralChangType(wxUserIntegralVm.getSource())) { logger.error("积分操作类型选择有误"); @@ -187,15 +188,15 @@ public class WxUserMemberController extends BaseController { * 全量 操作积分 */ @PostMapping("/allChangIntegral") - public R allChangIntegral(@Validated WxUserIntegralVm wxUserIntegralVm, WxUserMemberVm wxUserMemberVm) { - if (IntegralChangeTypeEnum.isIntegralChangType(wxUserIntegralVm.getSource())) { + public R allChangIntegral(@Validated @RequestBody AllChangIntegralOperateReq operateReq) { + if (!IntegralChangeTypeEnum.isIntegralChangType(operateReq.getWxUserIntegralVm().getSource())) { logger.error("积分操作类型选择有误"); throw new ServiceException("积分操作类型选择有误"); } - List list = wxUserMemberService.selectWxUserMemberList(wxUserMemberVm); + List list = wxUserMemberService.selectWxUserMemberList(operateReq.getWxUserMemberVm()); if (list != null && list.size() > 0) { List collect = list.stream().map(wxUserMember -> wxUserMember.getId()).collect(Collectors.toList()); - wxUserMemberService.batchChangIntegral(wxUserIntegralVm, collect); + wxUserMemberService.batchChangIntegral(operateReq.getWxUserIntegralVm(), collect); } return R.ok(); } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java index 44a1589..638ee6b 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserRemarkController.java @@ -13,6 +13,7 @@ import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.domain.req.WxUserRemarkReq; import com.flossom.common.core.enums.IntegralChangeTypeEnum; import com.flossom.common.core.exception.ServiceException; +import com.flossom.common.core.utils.StringUtils; import com.flossom.common.core.utils.poi.ExcelUtil; import com.flossom.common.core.web.controller.BaseController; import com.flossom.common.core.web.domain.AjaxResult; @@ -119,8 +120,12 @@ public class WxUserRemarkController extends BaseController { * 全量 添加备注 */ @PostMapping("/allAddRemark") - public R allAddRemark(@RequestBody @Validated WxUserRemarkReq wxUserRemarkReq, WxUserMemberVm wxUserMemberVm) { - wxUserRemarkService.batchAddRemark(wxUserRemarkReq); + public R allAddRemark(@RequestParam("content") String content, @RequestBody WxUserMemberVm wxUserMemberVm) { + if(StringUtils.isBlank(content)) { + throw new ServiceException("请输入备注内容"); + } + WxUserRemarkReq wxUserRemarkReq = new WxUserRemarkReq(); + wxUserRemarkReq.setContent(content); List list = wxUserMemberService.selectWxUserMemberList(wxUserMemberVm); if (list != null && list.size() > 0) { List collect = list.stream().map(wxUserMember -> wxUserMember.getId()).collect(Collectors.toList()); diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java index 599dd22..d5e0913 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java @@ -172,13 +172,11 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { List needAddIdList = new ArrayList<>(); // 1、查询该标签下,有那些用户关联 List existedUserList = wxUserTagMapper.selectWxUserTagByTagId(tagId, TagTypeStatus.MINI_PROGRAM.getCode()); - if (existedUserList != null && existedUserList.size() > 0) { - Iterator iterator = userIdList.iterator(); - while (iterator.hasNext()) { - Integer element = iterator.next(); - if (!existedUserList.contains(element)) { - needAddIdList.add(element); - } + Iterator iterator = userIdList.iterator(); + while (iterator.hasNext()) { + Integer element = iterator.next(); + if (!existedUserList.contains(element)) { + needAddIdList.add(element); } } @@ -237,10 +235,10 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { if (wxUserIntegralVm.getSource().equals(IntegralChangeTypeEnum.INCREASE.getCode())) { changeUserMember.setCredit(wxUserMember.getCredit() + wxUserIntegralVm.getFloatScore().intValue()); } else if (wxUserIntegralVm.getSource().equals(IntegralChangeTypeEnum.REDUCE.getCode())) { - if (wxUserMember.getCredit() < Integer.valueOf(wxUserIntegralVm.getSource())) { - changeUserMember.setCredit(0); - } else { + if (wxUserMember.getCredit() >= wxUserIntegralVm.getFloatScore().intValue()) { changeUserMember.setCredit(wxUserMember.getCredit() - wxUserIntegralVm.getFloatScore().intValue()); + } else { + changeUserMember.setCredit(0); } } changeUserMember.setId(wxUserMember.getId()); diff --git a/flossom-ui/src/api/system/member.js b/flossom-ui/src/api/system/member.js index d1d8236..410eafb 100644 --- a/flossom-ui/src/api/system/member.js +++ b/flossom-ui/src/api/system/member.js @@ -50,6 +50,17 @@ export function selectUserCount() { }) } + +export function getMiniProgramTagsTree() { + return request({ + url: '/system/tagInfo/tagTree', + method: 'get', + params:{ + type: 1 + } + }) +} + export function getMiniProgramTags() { return request({ url: '/system/tagInfo/getMiniProgramTags', @@ -64,6 +75,7 @@ export function getWecomTags() { }) } +// 获取购买渠道 export function getPurchaseChannel() { return request({ url: '/system/channelInfo/getPurchaseChannel', @@ -71,6 +83,7 @@ export function getPurchaseChannel() { }) } +// 获取省市区 export function getRegionByPid(pid) { return request({ url: '/system/region/getRegionByPid', @@ -80,3 +93,117 @@ export function getRegionByPid(pid) { } }) } + +// 批量添加小程序标签 +export function batchAddMiniProgramTag(tagIdList, userIdList) { + return request({ + url: '/system/member/batchAddMiniProgramTag?tagIdList=' + tagIdList + '&userIdList=' + userIdList, + method: 'post', + // params: { + // "tagIdList": tagIdList, + // "userIdList": userIdList + // }, + header: { + 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' + } + }) +} + +// 全量添加小程序标签 +export function allAddMiniProgramTag(tagIdList, data) { + return request({ + url: '/system/member/allAddMiniProgramTag?tagIdList=' + tagIdList, + method: 'post', + // params: { + // tagIdList: tagIdList + // }, + data: data + }) +} + +// 批量删除小程序标签 +export function batchDelMiniProgramTag(tagIdList, userIdList) { + return request({ + url: '/system/member/batchDelMiniProgramTag?tagIdList=' + tagIdList + '&userIdList=' + userIdList, + method: 'post', + // params: { + // tagIdList: tagIdList, + // userIdList: userIdList + // } + }) +} + +// 全量删除小程序标签 +export function allDelMiniProgramTag(tagIdList, data) { + return request({ + url: '/system/member/allDelMiniProgramTag?tagIdList=' + tagIdList, + method: 'post', + // params: { + // tagIdList: tagIdList, + // }, + data: data + }) +} + +// 批量操作积分 +export function batchChangIntegral(userIdList, data) { + return request({ + url: '/system/member/batchChangIntegral?userIdList=' + userIdList, + method: 'post', + // params: { + // userIdList: userIdList + // }, + data: data + }) +} + +// 全量 操作积分 +export function allChangIntegral(data, user) { + return request({ + url: '/system/member/allChangIntegral', + method: 'post', + data: { + wxUserIntegralVm: data, + wxUserMemberVm: user + }, + }) +} + +// 批量发送话术 +export function batchSendScript(data) { + return request({ + url: '/system/userScriptLog/batchSendScript', + method: 'post', + data: data + }) +} + +// 全量发送话术 +export function allSendScript(data) { + return request({ + url: '/system/userScriptLog/allSendScript', + method: 'post', + data: data + }) +} + +// 批量添加备注 +export function batchAddRemark(data) { + return request({ + url: '/system/wxUserRemark/batchAddRemark', + method: 'post', + data: data + }) +} + +// 全量添加备注 +export function allAddRemark(content, user) { + return request({ + url: '/system/wxUserRemark/allAddRemark?content=' + content, + method: 'post', + data: user + }) +} + + + diff --git a/flossom-ui/src/views/system/member/index.vue b/flossom-ui/src/views/system/member/index.vue index 5168c19..279edb9 100644 --- a/flossom-ui/src/views/system/member/index.vue +++ b/flossom-ui/src/views/system/member/index.vue @@ -1,9 +1,9 @@ @@ -357,28 +549,27 @@ import { getWecomTags, getPurchaseChannel, getRegionByPid, + batchAddMiniProgramTag, + allAddMiniProgramTag, + batchDelMiniProgramTag, + allDelMiniProgramTag, + batchChangIntegral, + allChangIntegral, + batchSendScript, + allSendScript, + batchAddRemark, + allAddRemark, + getMiniProgramTagsTree, } from "@/api/system/member"; +import Treeselect from "@riophae/vue-treeselect"; +import {tagTreeSelect} from "@/api/system/wechatTab"; +import "@riophae/vue-treeselect/dist/vue-treeselect.css"; export default { name: "Member", + components: {Treeselect}, data() { return { - devicesTags: [{ - value: '仪器标签1', - label: '仪器标签1' - }, { - value: '仪器标签2', - label: '仪器标签2' - }, { - value: '仪器标签3', - label: '仪器标签3' - }], - miniProgramTags: [], - wecomTags: [], - purchaseChannels: null, - provinceList: null, - cityList: null, - areaList: null, // 遮罩层 loading: true, // 选中数组 @@ -399,11 +590,64 @@ export default { open: false, // 日期范围 dateRange: [], + // 表头统计 count: { userNum: 0, userRegisterNum: 0, userDeviceNum: 0 }, + // 查询条件,小程序二级标签 + miniProgramTags: [], + // 小程序标签树 + miniProgramTagTree: [], + // 查询条件,企微二级标签 + wecomTags: [], + // 查询条件:购买渠道 + purchaseChannels: null, + // 查询条件:省市区 + provinceList: null, + cityList: null, + areaList: null, + // 批量操作下拉项选择 + batchOperateValue: null, + // 批量操作:小程序标签 + batchMiniProgramVisible: false, + chatTagOptions: [], + tagIdArray: [], + // 批量操作:积分 + batchIntegralVisible: false, + integralForm: { + source: null, + floatScore: null, + remarkContent: "后台操作" + }, + // 批量操作:备注 + batchScriptVisible: false, + remarkForm: { + content: null, + userIdList: null, + }, + // 批量操作:发送话术 + batchRemarkVisible: null, + scriptForm: { + isCustom: null, + scriptTemplateId: null, + scriptName: null, + titile: null, + content: null, + tagType: null, + type: null, + link: null, + linkParams: null, + redirectAppid: null, + redirectUrl: null, + videoNo: null, + feedId: null, + tagNames: null, + tagIds: null, + // 当类型为模板发送时,选择了二级话术标题后,显示内容用,不传后端保存 + scriptContent: null, + }, // 查询参数 queryParams: { pageNum: 1, @@ -440,15 +684,14 @@ export default { status: null, // createTime: [], devicesTags: [], //仪器绑定标签 - wecomTags:[], // 企微标签 + wecomTags: [], // 企微标签 miniProgramTags: [], // 小程序标签 purchaseChannels: [], // 购买渠道 }, // 表单参数 form: {}, // 表单校验 - rules: { - } + rules: {} }; }, created() { @@ -460,6 +703,8 @@ export default { this.getTags(); // 获取省 this.getProvinceList(); + // 获取标签树 + this.getDeptTree(); }, methods: { /** 查询用户列表 */ @@ -491,6 +736,10 @@ export default { getPurchaseChannel().then(Response => { this.purchaseChannels = Response.data }) + // 小程序标签树 + getMiniProgramTagsTree().then(Response => { + this.miniProgramTagTree = Response.data + }) }, // 获取省市区 getProvinceList() { @@ -517,6 +766,40 @@ export default { this.open = false; this.reset(); }, + // 关闭添加小程序标签窗口 + cancelMiniProgramDialog(isclose) { + this.title = null; + this.tagIdArray = []; + if (isclose) { + this.batchMiniProgramVisible = false; + } + }, + cancelIntegralDialog(isclose) { + this.integralForm.source = null; + this.integralForm.floatScore = null; + this.integralForm.remarkContent = "后台操作"; + if (isclose) { + this.batchIntegralVisible = false; + } + }, + cancelRemarkDialog(isclose) { + this.remarkForm.content = null; + if (isclose) { + this.batchRemarkVisible = false; + } + }, + cancelscriptDialog(isclose) { + this.scriptForm = null; + if (isclose) { + this.batchScriptVisible = false; + } + }, + /** 查询部门下拉树结构 */ + getDeptTree() { + tagTreeSelect({type: 1}).then(response => { + this.chatTagOptions = response.data; + }); + }, // 表单重置 reset() { this.form = { @@ -564,10 +847,141 @@ export default { this.resetForm("queryForm"); this.handleQuery(); }, + /** 批量操作按钮,显示批量操作弹窗 */ + batchOperate() { + if (this.batchOperateValue == null) { + this.$message({ + message: '请选择要批量操作类型', + type: 'warning' + }) + return + } else { + /* 批量操作 小程序标签 */ + if (this.batchOperateValue == 1 || this.batchOperateValue == 2) { + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + if (this.batchOperateValue == 1) { + console.log("批量添加小程序标签"); + this.title = "添加小程序标签"; + } + if (this.batchOperateValue == 2) { + console.log("批量删除小程序标签"); + this.title = "删除小程序标签"; + } + this.batchMiniProgramVisible = true; + } + if (this.batchOperateValue == 3 || this.batchOperateValue == 4) { + if (this.batchOperateValue == 3) { + console.log("全量添加小程序标签"); + this.title = "添加小程序标签"; + } + if (this.batchOperateValue == 4) { + console.log("全量删除小程序标签"); + this.title = "添加小程序标签"; + } + this.batchMiniProgramVisible = true; + } + + /* 批量操作:加减分 */ + if (this.batchOperateValue == 5) { + console.log("批量加减积分"); + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + this.batchIntegralVisible = true; + } + if (this.batchOperateValue == 6) { + console.log("全量加减积分"); + this.batchIntegralVisible = true; + } + + /* 批量操作:发送话术 */ + if (this.batchOperateValue == 7) { + console.log("批量发送话术"); + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + this.batchScriptVisible = true; + } + if (this.batchOperateValue == 8) { + console.log("全量发送话术"); + this.batchScriptVisible = true; + } + + /* 批量操作: 备注 */ + if (this.batchOperateValue == 9) { + console.log("批量备注"); + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + this.batchRemarkVisible = true; + } + if (this.batchOperateValue == 10) { + console.log("全量备注"); + this.batchRemarkVisible = true; + } + + /* 批量操作:注销账号 */ + if (this.batchOperateValue == 11) { + console.log("注销账号"); + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + this.$confirm("确定将选择的数据注销?
请谨慎操作,一旦成功将无法撤销。", '注销账号', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + dangerouslyUseHTMLString: true + }).then(() => { + delMember(this.ids).then(Response => { + this.$modal.msgSuccess("批量删除会员成功"); + this.cancelIntegralDialog(true); + }) + }).catch(() => { + }); + } + + /* 批量操作:导出数据 */ + if (this.batchOperateValue == 12) { + console.log("导出数据"); + if (this.ids.length == 0) { + this.$message({ + message: '请选择要操作的数据', + type: 'warning' + }) + return + } + } + if (this.batchOperateValue == 13) { + console.log("导出全量数据"); + } + } + }, // 多选框选中数据 handleSelectionChange(selection) { this.ids = selection.map(item => item.id) - this.single = selection.length!==1 + this.single = selection.length !== 1 this.multiple = !selection.length }, /** 新增按钮操作 */ @@ -605,16 +1019,95 @@ export default { } } }); + }, + /* 批量操作提交按钮 */ + submitBatchOperate() { + // 批量添加小程序标签 + if (this.batchOperateValue == 1) { + batchAddMiniProgramTag(this.tagIdArray, this.ids).then(Response => { + this.$modal.msgSuccess("批量添加小程序标签成功"); + this.cancelMiniProgramDialog(true); + }) + } + // 批量删除小程序标签 + if (this.batchOperateValue == 2) { + batchDelMiniProgramTag(this.tagIdArray, this.ids).then(Response => { + this.$modal.msgSuccess("批量添加小程序标签成功"); + this.cancelMiniProgramDialog(true); + }) + } + // 全量添加小程序标签 + if (this.batchOperateValue == 3) { + allAddMiniProgramTag(this.tagIdArray, this.queryParams).then(Response => { + this.$modal.msgSuccess("全量添加小程序标签成功"); + this.cancelMiniProgramDialog(true); + }) + } + // 全量删除小程序标签 + if (this.batchOperateValue == 4) { + allDelMiniProgramTag(this.tagIdArray, this.queryParams).then(Response => { + this.$modal.msgSuccess("全量删除小程序标签成功"); + this.cancelMiniProgramDialog(true); + }) + } + + // 批量操作积分 + if (this.batchOperateValue == 5) { + batchChangIntegral(this.ids, this.integralForm).then(Response => { + this.$modal.msgSuccess("批量操作积分成功"); + this.cancelIntegralDialog(true); + }) + } + // 全量操作积分 + if (this.batchOperateValue == 6) { + allChangIntegral(this.integralForm, this.queryParams).then(Response => { + this.$modal.msgSuccess("批量操作积分成功"); + this.cancelIntegralDialog(true); + }) + } + + /* 批量操作:发送话术 */ + if (this.batchOperateValue == 7) { + alert("批量发送话术"); + alert(this.scriptForm.isCustom); + alert(this.ids); + } + if (this.batchOperateValue == 8) { + alert("全量发送话术"); + alert(this.scriptForm.isCustom); + alert(this.queryParams.nickname); + } + + // 批量操作备注 + if (this.batchOperateValue == 9) { + console.log("批量备注"); + this.remarkForm.userIdList = this.ids; + batchAddRemark(this.remarkForm).then(Response => { + this.$modal.msgSuccess("批量备注成功"); + this.cancelRemarkDialog(true); + }) + } + // 全量操作备注 + if (this.batchOperateValue == 10) { + console.log("全量备注"); + allAddRemark(this.remarkForm.content, this.queryParams).then(Response => { + this.$modal.msgSuccess("批量备注成功"); + this.cancelRemarkDialog(true); + }) + } + + }, /** 删除按钮操作 */ handleDelete(row) { const ids = row.id || this.ids; - this.$modal.confirm('是否确认删除用户编号为"' + ids + '"的数据项?').then(function() { + this.$modal.confirm('是否确认删除用户编号为"' + ids + '"的数据项?').then(function () { return delMember(ids); }).then(() => { this.getList(); this.$modal.msgSuccess("删除成功"); - }).catch(() => {}); + }).catch(() => { + }); }, /** 导出按钮操作 */ handleExport() { @@ -623,5 +1116,6 @@ export default { }, `member_${new Date().getTime()}.xlsx`) } } -}; +} +; From a4688c106abdf8d2cdc8e9aac6622deec3e5faa9 Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Sat, 23 Dec 2023 17:06:42 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/entity/WxScriptTemplate.java | 10 ++ .../domain/req/AllSendScriptOperateReq.java | 31 ++++++ .../core/domain/req/WxUserScriptReq.java | 14 ++- .../common/core/domain/vo/TreeSelect.java | 21 ++++ .../WxScriptTemplateController.java | 10 +- .../controller/WxUserScriptLogController.java | 6 +- .../service/IWxScriptTemplateService.java | 3 + .../impl/WxScriptTemplateServiceImpl.java | 102 ++++++++++++++---- .../impl/WxUserScriptLogServiceImpl.java | 8 +- flossom-ui/src/api/system/member.js | 15 ++- flossom-ui/src/views/system/member/index.vue | 94 +++++++++++++--- 11 files changed, 262 insertions(+), 52 deletions(-) create mode 100644 flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllSendScriptOperateReq.java diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxScriptTemplate.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxScriptTemplate.java index c9d2639..4cdc504 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxScriptTemplate.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxScriptTemplate.java @@ -89,6 +89,8 @@ public class WxScriptTemplate extends BaseEntity /** 子话术 */ private List children = new ArrayList(); + private List scriptTemplateChildren = new ArrayList<>(); + private List tagIdArray = new ArrayList(); @@ -259,6 +261,14 @@ public class WxScriptTemplate extends BaseEntity this.tagIdArray = tagIdArray; } + public List getScriptTemplateChildren() { + return scriptTemplateChildren; + } + + public void setScriptTemplateChildren(List scriptTemplateChildren) { + this.scriptTemplateChildren = scriptTemplateChildren; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllSendScriptOperateReq.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllSendScriptOperateReq.java new file mode 100644 index 0000000..f6f82c4 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/AllSendScriptOperateReq.java @@ -0,0 +1,31 @@ +package com.flossom.common.core.domain.req; + +public class AllSendScriptOperateReq { + + private WxUserScriptReq wxUserScriptReq; + private WxUserMemberVm wxUserMemberVm; + + public AllSendScriptOperateReq() { + } + + public AllSendScriptOperateReq(WxUserScriptReq wxUserScriptReq, WxUserMemberVm wxUserMemberVm) { + this.wxUserScriptReq = wxUserScriptReq; + this.wxUserMemberVm = wxUserMemberVm; + } + + public WxUserScriptReq getWxUserScriptReq() { + return wxUserScriptReq; + } + + public void setWxUserScriptReq(WxUserScriptReq wxUserScriptReq) { + this.wxUserScriptReq = wxUserScriptReq; + } + + public WxUserMemberVm getWxUserMemberVm() { + return wxUserMemberVm; + } + + public void setWxUserMemberVm(WxUserMemberVm wxUserMemberVm) { + this.wxUserMemberVm = wxUserMemberVm; + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java index c085c7d..c776723 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserScriptReq.java @@ -57,8 +57,6 @@ public class WxUserScriptReq { /** * 跳转类型:0无跳转、1跳转内部链接、3跳转外部链接、4跳转小程序、5导向视频号、6导向视频号直播间 */ - @NotNull(message = "请选择跳转类型") - @Range(min = 0, max = 6) private Integer type; /** @@ -94,12 +92,12 @@ public class WxUserScriptReq { /** * 标签名字(xxx,xxx,xxx) */ - private String tagNames; + private List tagNames; /** * 标签ID(xxxx,xxxx,xxx) */ - private String tagIds; + private List tagIds; public List getUserIdList() { @@ -214,19 +212,19 @@ public class WxUserScriptReq { this.feedId = feedId; } - public String getTagNames() { + public List getTagNames() { return tagNames; } - public void setTagNames(String tagNames) { + public void setTagNames(List tagNames) { this.tagNames = tagNames; } - public String getTagIds() { + public List getTagIds() { return tagIds; } - public void setTagIds(String tagIds) { + public void setTagIds(List tagIds) { this.tagIds = tagIds; } diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/vo/TreeSelect.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/vo/TreeSelect.java index b7f6bd8..13e367a 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/vo/TreeSelect.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/vo/TreeSelect.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.flossom.common.core.domain.entity.SysDept; import com.flossom.common.core.domain.entity.SysMenu; import com.flossom.common.core.domain.entity.SysTag; +import com.flossom.common.core.domain.entity.WxScriptTemplate; import java.io.Serializable; import java.util.List; @@ -27,6 +28,11 @@ public class TreeSelect implements Serializable { */ private String label; + /** + * 内容 + */ + private String content; + /** * 子节点 */ @@ -55,6 +61,13 @@ public class TreeSelect implements Serializable { this.children = sysTag.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); } + public TreeSelect(WxScriptTemplate wxScriptTemplate) { + this.id = wxScriptTemplate.getId(); + this.label = wxScriptTemplate.getTitile(); + this.content = wxScriptTemplate.getContent(); + this.children = wxScriptTemplate.getScriptTemplateChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + public Long getId() { return id; } @@ -78,4 +91,12 @@ public class TreeSelect implements Serializable { public void setChildren(List children) { this.children = children; } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxScriptTemplateController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxScriptTemplateController.java index 233d525..e9afb26 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxScriptTemplateController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxScriptTemplateController.java @@ -4,7 +4,6 @@ import java.util.List; import java.io.IOException; import javax.servlet.http.HttpServletResponse; -import com.flossom.common.core.domain.entity.SysTag; import com.flossom.common.core.domain.entity.WxScriptTemplate; import com.flossom.common.core.utils.StringUtils; import com.flossom.common.core.utils.poi.ExcelUtil; @@ -122,4 +121,13 @@ public class WxScriptTemplateController extends BaseController // tags.removeIf(d -> d.getId().intValue() == id || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), id + "")); // return success(tags); // } + + + /** + * 获取标签树列表 + */ + @GetMapping("/scriptTree") + public AjaxResult scriptTree(WxScriptTemplate wxScriptTemplate) { + return success(wxScriptTemplateService.scriptTree(wxScriptTemplate)); + } } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java index 22b3f25..9f02ded 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserScriptLogController.java @@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.domain.entity.WxUserScriptLog; +import com.flossom.common.core.domain.req.AllSendScriptOperateReq; import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.domain.req.WxUserScriptReq; import com.flossom.common.core.exception.ServiceException; @@ -177,7 +178,10 @@ public class WxUserScriptLogController extends BaseController { * @return */ @PostMapping("/allSendScript") - public R allSendScript(@RequestBody @Validated WxUserScriptReq wxUserScriptReq, WxUserMemberVm wxUserMemberVm) { + public R allSendScript(@RequestBody @Validated AllSendScriptOperateReq allSendScriptOperateReq) { + WxUserScriptReq wxUserScriptReq = allSendScriptOperateReq.getWxUserScriptReq(); + WxUserMemberVm wxUserMemberVm = allSendScriptOperateReq.getWxUserMemberVm(); + if (wxUserScriptReq.getIsCustom() == 0) { // 模板话术 if (wxUserScriptReq.getScriptTemplateId() == null || wxUserScriptReq.getScriptTemplateId() == 0) { diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxScriptTemplateService.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxScriptTemplateService.java index 325174d..1e3f43e 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxScriptTemplateService.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxScriptTemplateService.java @@ -3,6 +3,7 @@ package com.flossom.system.service; import java.util.List; import com.flossom.common.core.domain.entity.WxScriptTemplate; +import com.flossom.common.core.domain.vo.TreeSelect; /** * 话术模板Service接口 @@ -67,4 +68,6 @@ public interface IWxScriptTemplateService * @return 结果 */ public boolean hasChildByScriptId(Long id); + + public List scriptTree(WxScriptTemplate wxScriptTemplate); } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxScriptTemplateServiceImpl.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxScriptTemplateServiceImpl.java index edeb44f..eb0e345 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxScriptTemplateServiceImpl.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxScriptTemplateServiceImpl.java @@ -1,5 +1,7 @@ package com.flossom.system.service.impl; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -7,10 +9,12 @@ import java.util.stream.Collectors; import com.flossom.common.core.domain.entity.SysTag; import com.flossom.common.core.domain.entity.WxScriptTag; import com.flossom.common.core.domain.entity.WxScriptTemplate; +import com.flossom.common.core.domain.vo.TreeSelect; import com.flossom.common.core.mapper.SysTagMapper; import com.flossom.common.core.mapper.WxScriptTagMapper; import com.flossom.common.core.mapper.WxScriptTemplateMapper; import com.flossom.common.core.utils.DateUtils; +import com.flossom.common.core.utils.SpringUtils; import com.flossom.common.core.utils.StringUtils; import com.flossom.common.security.utils.SecurityUtils; import org.apache.commons.compress.utils.Lists; @@ -26,14 +30,14 @@ import org.springframework.util.CollectionUtils; * @date 2023-12-18 */ @Service -public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService -{ +public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService { @Autowired private WxScriptTemplateMapper wxScriptTemplateMapper; @Autowired private WxScriptTagMapper wxScriptTagMapper; @Autowired private SysTagMapper sysTagMapper; + /** * 查询话术模板 * @@ -41,8 +45,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 话术模板 */ @Override - public WxScriptTemplate selectWxScriptTemplateById(Long id) - { + public WxScriptTemplate selectWxScriptTemplateById(Long id) { return wxScriptTemplateMapper.selectWxScriptTemplateById(id); } @@ -53,8 +56,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 话术模板 */ @Override - public List selectWxScriptTemplateList(WxScriptTemplate wxScriptTemplate) - { + public List selectWxScriptTemplateList(WxScriptTemplate wxScriptTemplate) { return wxScriptTemplateMapper.selectWxScriptTemplateList(wxScriptTemplate); } @@ -65,15 +67,14 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 结果 */ @Override - public int insertWxScriptTemplate(WxScriptTemplate wxScriptTemplate) - { + public int insertWxScriptTemplate(WxScriptTemplate wxScriptTemplate) { wxScriptTemplate.setCreateTime(DateUtils.getNowDate()); wxScriptTemplate.setCreateBy(SecurityUtils.getLoginUser().getUsername()); List sysTags = Lists.newArrayList(); // 处理标签在字段的展示 List tagIds = wxScriptTemplate.getTagIdArray(); - if(!CollectionUtils.isEmpty(tagIds)) { - for (long tagId:tagIds) { + if (!CollectionUtils.isEmpty(tagIds)) { + for (long tagId : tagIds) { SysTag sysTag = sysTagMapper.selectDeptById(tagId); if (Objects.nonNull(sysTag)) { sysTags.add(sysTag); @@ -90,7 +91,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService int i = wxScriptTemplateMapper.insertWxScriptTemplate(wxScriptTemplate); - for(SysTag tag : sysTags) { + for (SysTag tag : sysTags) { // 增加关联关系 WxScriptTag scriptTag = new WxScriptTag(); scriptTag.setScriptId(wxScriptTemplate.getId()); @@ -110,8 +111,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 结果 */ @Override - public int updateWxScriptTemplate(WxScriptTemplate wxScriptTemplate) - { + public int updateWxScriptTemplate(WxScriptTemplate wxScriptTemplate) { wxScriptTemplate.setUpdateTime(DateUtils.getNowDate()); wxScriptTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUsername()); wxScriptTemplate.setTagIds(""); @@ -119,8 +119,8 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService List sysTags = Lists.newArrayList(); // 处理标签在字段的展示 List tagIds = wxScriptTemplate.getTagIdArray(); - if(!CollectionUtils.isEmpty(tagIds)) { - for (long tagId:tagIds) { + if (!CollectionUtils.isEmpty(tagIds)) { + for (long tagId : tagIds) { SysTag sysTag = sysTagMapper.selectDeptById(tagId); if (Objects.nonNull(sysTag)) { sysTags.add(sysTag); @@ -138,7 +138,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService // 先删除原本的关系 wxScriptTagMapper.deleteWxScriptByScriptId(wxScriptTemplate.getId()); - for(SysTag tag : sysTags) { + for (SysTag tag : sysTags) { // 增加关联关系 WxScriptTag scriptTag = new WxScriptTag(); scriptTag.setScriptId(wxScriptTemplate.getId()); @@ -158,8 +158,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 结果 */ @Override - public int deleteWxScriptTemplateByIds(Long[] ids) - { + public int deleteWxScriptTemplateByIds(Long[] ids) { return wxScriptTemplateMapper.deleteWxScriptTemplateByIds(ids); } @@ -170,8 +169,7 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService * @return 结果 */ @Override - public int deleteWxScriptTemplateById(Long id) - { + public int deleteWxScriptTemplateById(Long id) { // 先删除原本的关系 int i = wxScriptTagMapper.deleteWxScriptByScriptId(id); return wxScriptTemplateMapper.deleteWxScriptTemplateById(id); @@ -182,4 +180,68 @@ public class WxScriptTemplateServiceImpl implements IWxScriptTemplateService int result = wxScriptTemplateMapper.hasChildByScriptId(id); return result > 0; } + + @Override + public List scriptTree(WxScriptTemplate wxScriptTemplate) { + List wxScriptTemplateList = this.selectWxScriptTemplateList(wxScriptTemplate); + return buildTree(wxScriptTemplateList); + } + + public List buildTree(List wxScriptTemplateList) { + List deptTrees = buildDeptTree(wxScriptTemplateList); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public List buildDeptTree(List wxScriptTemplateList) { + List returnList = new ArrayList<>(); + List tempList = wxScriptTemplateList.stream().map(WxScriptTemplate::getId).collect(Collectors.toList()); + for (WxScriptTemplate wxScriptTemplate : wxScriptTemplateList) { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(wxScriptTemplate.getParentId())) { + recursionFn(wxScriptTemplateList, wxScriptTemplate); + returnList.add(wxScriptTemplate); + } + } + if (returnList.isEmpty()) { + returnList = wxScriptTemplateList; + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, WxScriptTemplate t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setScriptTemplateChildren(childList); + for (WxScriptTemplate tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, WxScriptTemplate t) { + List tlist = new ArrayList<>(); + Iterator it = list.iterator(); + while (it.hasNext()) { + WxScriptTemplate n = (WxScriptTemplate) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, WxScriptTemplate t) { + return getChildList(list, t).size() > 0 ? true : false; + } + } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserScriptLogServiceImpl.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserScriptLogServiceImpl.java index c7f99d0..b2620fb 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserScriptLogServiceImpl.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserScriptLogServiceImpl.java @@ -111,6 +111,9 @@ public class WxUserScriptLogServiceImpl implements IWxUserScriptLogService { for (Long wxUserId : userIdList) { WxUserScriptLog wxUserScriptLog = new WxUserScriptLog(); BeanUtils.copyProperties(wxUserScriptReq, wxUserScriptLog); + if (wxUserScriptReq.getTagIds() != null && wxUserScriptReq.getTagIds().size() > 0) { + wxUserScriptLog.setTagIds(wxUserScriptReq.getTagIds().stream().collect(Collectors.joining(","))); + } wxUserScriptLog.setWxUserId(wxUserId); wxUserScriptLog.setCreateBy(SecurityUtils.getUsername()); wxUserScriptLog.setCreateTime(DateUtils.getNowDate()); @@ -131,9 +134,8 @@ public class WxUserScriptLogServiceImpl implements IWxUserScriptLogService { } if (wxUserScriptReq.getIsCustom() == 1) { // 自定义话术 - if (StringUtils.isNotBlank(wxUserScriptReq.getTagIds())) { - List list = Arrays.asList(wxUserScriptReq.getTagIds().split(",")); - List tagList = list.stream().map(Integer::parseInt).collect(Collectors.toList()); + if (wxUserScriptReq.getTagIds() != null && wxUserScriptReq.getTagIds().size() > 0) { + List tagList = wxUserScriptReq.getTagIds().stream().map(Integer::parseInt).collect(Collectors.toList()); List collect = userIdList.stream().map(Long::intValue).collect(Collectors.toList()); wxUserMemberService.batchAddMiniProgramTag(tagList, collect); } diff --git a/flossom-ui/src/api/system/member.js b/flossom-ui/src/api/system/member.js index 410eafb..4034525 100644 --- a/flossom-ui/src/api/system/member.js +++ b/flossom-ui/src/api/system/member.js @@ -179,11 +179,14 @@ export function batchSendScript(data) { } // 全量发送话术 -export function allSendScript(data) { +export function allSendScript(data, user) { return request({ url: '/system/userScriptLog/allSendScript', method: 'post', - data: data + data: { + wxUserScriptReq: data, + wxUserMemberVm: user + }, }) } @@ -205,5 +208,11 @@ export function allAddRemark(content, user) { }) } - +export function scriptTreeSelect(query) { + return request({ + url: '/system/scriptTemplate/scriptTree', + method: 'get', + params: query + }) +} diff --git a/flossom-ui/src/views/system/member/index.vue b/flossom-ui/src/views/system/member/index.vue index 279edb9..57b18d4 100644 --- a/flossom-ui/src/views/system/member/index.vue +++ b/flossom-ui/src/views/system/member/index.vue @@ -442,7 +442,7 @@ - + @@ -451,12 +451,14 @@ - - - + + + - + @@ -476,7 +478,7 @@ - @@ -530,7 +532,7 @@ @@ -560,6 +562,7 @@ import { batchAddRemark, allAddRemark, getMiniProgramTagsTree, + scriptTreeSelect, } from "@/api/system/member"; import Treeselect from "@riophae/vue-treeselect"; import {tagTreeSelect} from "@/api/system/wechatTab"; @@ -613,6 +616,7 @@ export default { // 批量操作:小程序标签 batchMiniProgramVisible: false, chatTagOptions: [], + scriptOptions: [], tagIdArray: [], // 批量操作:积分 batchIntegralVisible: false, @@ -630,6 +634,7 @@ export default { // 批量操作:发送话术 batchRemarkVisible: null, scriptForm: { + userIdList: null, isCustom: null, scriptTemplateId: null, scriptName: null, @@ -643,8 +648,8 @@ export default { redirectUrl: null, videoNo: null, feedId: null, - tagNames: null, - tagIds: null, + tagNames: [], + tagIds: [], // 当类型为模板发送时,选择了二级话术标题后,显示内容用,不传后端保存 scriptContent: null, }, @@ -705,6 +710,7 @@ export default { this.getProvinceList(); // 获取标签树 this.getDeptTree(); + this.getScriptTree(); }, methods: { /** 查询用户列表 */ @@ -789,7 +795,24 @@ export default { } }, cancelscriptDialog(isclose) { - this.scriptForm = null; + this.scriptForm.isCustom = null, + this.scriptForm.scriptName = null; + this.scriptForm.titile = null; + this.scriptForm.content = null; + this.scriptForm.tagType = null; + this.scriptForm.type = null; + this.scriptForm.link = null; + this.scriptForm.linkParams = null; + this.scriptForm.redirectAppid = null; + this.scriptForm.redirectUrl = null; + this.scriptForm.videoNo = null; + this.scriptForm.feedId = null; + this.scriptForm.tagNames = null; + this.scriptForm.tagIds = null; + this.scriptForm.scriptContent = null; + this.tagIdArray = []; + this.scriptForm.scriptTemplateId = null; + this.scriptForm.scriptContent = null; if (isclose) { this.batchScriptVisible = false; } @@ -800,6 +823,40 @@ export default { this.chatTagOptions = response.data; }); }, + /** 查询话术下拉树结构 */ + getScriptTree() { + scriptTreeSelect().then(response => { + this.scriptOptions = response.data; + }); + }, + clearScript() { + // 话术模板 + if (this.scriptForm.isCustom == 0) { + this.scriptForm.scriptName = null; + this.scriptForm.titile = null; + this.scriptForm.content = null; + this.scriptForm.tagType = null; + this.scriptForm.type = null; + this.scriptForm.link = null; + this.scriptForm.linkParams = null; + this.scriptForm.redirectAppid = null; + this.scriptForm.redirectUrl = null; + this.scriptForm.videoNo = null; + this.scriptForm.feedId = null; + this.scriptForm.tagNames = null; + this.scriptForm.tagIds = null; + this.scriptForm.scriptContent = null; + this.tagIdArray = []; + } + // 自定义发送 + if (this.scriptForm.isCustom == 1) { + this.scriptForm.scriptTemplateId = null; + this.scriptForm.scriptContent = null; + } + }, + selectTree(raw, instanceId) { + this.scriptForm.scriptContent = raw.content; + }, // 表单重置 reset() { this.form = { @@ -1068,14 +1125,19 @@ export default { /* 批量操作:发送话术 */ if (this.batchOperateValue == 7) { - alert("批量发送话术"); - alert(this.scriptForm.isCustom); - alert(this.ids); + this.scriptForm.userIdList = this.ids; + this.scriptForm.tagIds = this.tagIdArray; + batchSendScript(this.scriptForm).then(Response => { + this.$modal.msgSuccess("批量发送话术成功"); + this.cancelscriptDialog(true); + }) } if (this.batchOperateValue == 8) { - alert("全量发送话术"); - alert(this.scriptForm.isCustom); - alert(this.queryParams.nickname); + this.scriptForm.tagIds = this.tagIdArray; + allSendScript(this.scriptForm, this.queryParams).then(Response => { + this.$modal.msgSuccess("全量发送话术成功"); + this.cancelscriptDialog(true); + }) } // 批量操作备注