diff --git a/linkwe-admin/pom.xml b/linkwe-admin/pom.xml index 7a21ea6a14515fb55ba455ad6de0efa03426a286..b940a787b5d7967c4e690d23b90aecfbe9b84055 100644 --- a/linkwe-admin/pom.xml +++ b/linkwe-admin/pom.xml @@ -74,6 +74,15 @@ 5.6.24 + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + + diff --git a/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java b/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java index 9684fe1a9e2deb6fa0fe9958c71d999b05d3990d..3f7a258a7324a03377a7064296045412b89f894c 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java +++ b/linkwe-admin/src/main/java/com/linkwechat/LinkWeChatApplication.java @@ -6,35 +6,33 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.scheduling.annotation.EnableAsync; /** * 启动程序 - * + * * @author ruoyi */ -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, PageHelperAutoConfiguration.class }) +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, PageHelperAutoConfiguration.class}) @MapperScan("com.linkwechat.*.mapper") @ForestScan(basePackages = "com.linkwechat.wecom.client") @EnableAsync -public class LinkWeChatApplication -{ - public static void main(String[] args) - { +@EnableDiscoveryClient +public class LinkWeChatApplication { + public static void main(String[] args) { - SpringApplication.run(LinkWeChatApplication.class, args); - System.out.println("(♥◠‿◠)ノ゙ LinkWeChat启动成功 ლ(´ڡ`ლ)゙ \n" + - " .-------. ____ __ \n" + - " | _ _ \\ \\ \\ / / \n" + - " | ( ' ) | \\ _. / ' \n" + - " |(_ o _) / _( )_ .' \n" + - " | (_,_).' __ ___(_ o _)' \n" + - " | |\\ \\ | || |(_,_)' \n" + - " | | \\ `' /| `-' / \n" + - " | | \\ / \\ / \n" + - " ''-' `'-' `-..-' "); + SpringApplication.run(LinkWeChatApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ LinkWeChat启动成功 ლ(´ڡ`ლ)゙ \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); } - - } diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java index 53304c6bcc75851323efb0cd9097830a4068af71..7c1d3428b8210dfe02c41a6ae0225bacadb309c2 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/system/SysLoginController.java @@ -159,32 +159,4 @@ public class SysLoginController } -// /** -// * 从群活码获取第一个可用的实际码 -// */ -// @GetMapping("/getChatQRCode") -// public AjaxResult getActual(Long weGroupCodeId) { -// WeGroupCode weGroupCode = weGroupCodeService.selectWeGroupCodeById(weGroupCodeId); -// List weGroupCodeActualList = weGroupCodeService.selectActualListByGroupCodeId(weGroupCodeId); -// WeGroupCodeActual weGroupCodeActual = null; -// for (WeGroupCodeActual item : weGroupCodeActualList) { -// // 获取第一个可用的实际码 -// if (item.getStatus().intValue() == WeConstans.WE_GROUP_CODE_ENABLE) { -// weGroupCodeActual = item; -// break; -// } -// } -// if (StringUtils.isNotNull(weGroupCodeActual)) { -// AjaxResult ajax = AjaxResult.success(); -// ajax.put("tipMsg", weGroupCode.getTipMsg()); -// ajax.put("activityName", weGroupCode.getActivityName()); -// ajax.put("groupName", weGroupCodeActual.getChatGroupName()); -// ajax.put("actualQRCode", weGroupCodeActual.getActualGroupQrCode()); -// return ajax; -// } else { -// return AjaxResult.error(HttpStatus.NOT_FOUND, "数据不存在"); -// } -// } - - } diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCategoryController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCategoryController.java index 211159464f6ad5e8cc87b4c8e5f92245ecbd21b6..f92071599909879db3175d13ed242a1c7d7213ee 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCategoryController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCategoryController.java @@ -30,7 +30,7 @@ public class WeCategoryController extends BaseController { /** * 类目树 */ - @PreAuthorize("@ss.hasPermi('wechat:category:list')") +// @PreAuthorize("@ss.hasPermi('wechat:category:list')") @GetMapping("/list") @ApiOperation("类目树") public AjaxResult list(@RequestParam("mediaType") String mediaType) { @@ -40,7 +40,7 @@ public class WeCategoryController extends BaseController { /** * 通过id查询类目详细信息 */ - @PreAuthorize("@ss.hasPermi('wechat:category:query')") +// @PreAuthorize("@ss.hasPermi('wechat:category:query')") @GetMapping(value = "/{id}") @ApiOperation("通过id查询类目详细信息") public AjaxResult getInfo(@PathVariable("id") Long id) { @@ -50,7 +50,7 @@ public class WeCategoryController extends BaseController { /** * 添加类目 */ - @PreAuthorize("@ss.hasPermi('wechat:category:add')") +// @PreAuthorize("@ss.hasPermi('wechat:category:add')") @Log(title = "添加类目", businessType = BusinessType.INSERT) @PostMapping @ApiOperation("添加类目") @@ -61,7 +61,7 @@ public class WeCategoryController extends BaseController { /** * 更新目录 */ - @PreAuthorize("@ss.hasPermi('wechat:category:edit')") +// @PreAuthorize("@ss.hasPermi('wechat:category:edit')") @Log(title = "更新目录", businessType = BusinessType.UPDATE) @PutMapping @ApiOperation("更新目录") @@ -73,7 +73,7 @@ public class WeCategoryController extends BaseController { /** * 删除类目 */ - @PreAuthorize("@ss.hasPermi('wechat:category:remove')") +// @PreAuthorize("@ss.hasPermi('wechat:category:remove')") @Log(title = "删除类目", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") @ApiOperation("删除类目") diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java index 935e25381ae1addad8cba9c5dc6bb0db48e70386..f802b3824776b37e89be98771a6628e5dd40955a 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeChatContactMappingController.java @@ -39,7 +39,7 @@ public class WeChatContactMappingController extends BaseController /** * 查询聊天关系映射列表 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:list')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:list')") @GetMapping("/list") public TableDataInfo list(WeChatContactMapping weChatContactMapping) { @@ -51,7 +51,7 @@ public class WeChatContactMappingController extends BaseController /** * 按客户查询关系映射列表 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:listByCustomer')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:listByCustomer')") @GetMapping("/listByCustomer") public TableDataInfo listByCustomer() { @@ -63,7 +63,7 @@ public class WeChatContactMappingController extends BaseController /** * 导出聊天关系映射列表 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:export')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:export')") @Log(title = "聊天关系映射", businessType = BusinessType.EXPORT) @GetMapping("/export") public AjaxResult export(WeChatContactMapping weChatContactMapping) @@ -76,7 +76,7 @@ public class WeChatContactMappingController extends BaseController /** * 获取聊天关系映射详细信息 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:query')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { @@ -86,7 +86,7 @@ public class WeChatContactMappingController extends BaseController /** * 新增聊天关系映射 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:add')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:add')") @Log(title = "聊天关系映射", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody WeChatContactMapping weChatContactMapping) @@ -97,7 +97,7 @@ public class WeChatContactMappingController extends BaseController /** * 修改聊天关系映射 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:edit')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:edit')") @Log(title = "聊天关系映射", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody WeChatContactMapping weChatContactMapping) @@ -108,7 +108,7 @@ public class WeChatContactMappingController extends BaseController /** * 删除聊天关系映射 */ - @PreAuthorize("@ss.hasPermi('chat:mapping:remove')") +// @PreAuthorize("@ss.hasPermi('chat:mapping:remove')") @Log(title = "聊天关系映射", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java index b6a88c0061cdcf514f19f631105fe868fb56f981..135b81b8aee3b1dfb1a50b6dfa91ce2fdfca758c 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCommunityNewGroupController.java @@ -1,5 +1,6 @@ package com.linkwechat.web.controller.wecom; +import cn.hutool.core.collection.CollectionUtil; import com.linkwechat.common.annotation.Log; import com.linkwechat.common.core.controller.BaseController; import com.linkwechat.common.core.domain.AjaxResult; @@ -7,20 +8,32 @@ import com.linkwechat.common.core.page.TableDataInfo; import com.linkwechat.common.enums.BusinessType; import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.common.utils.file.FileUtils; import com.linkwechat.wecom.domain.WeCommunityNewGroup; import com.linkwechat.wecom.domain.WeEmpleCode; import com.linkwechat.wecom.domain.dto.WeCommunityNewGroupDto; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; import com.linkwechat.wecom.service.IWeCommunityNewGroupService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 社群运营 新客自动拉群 Controller @@ -28,36 +41,43 @@ import java.util.stream.Collectors; * @author kewen * @date 2021-02-19 */ -@Controller -@RequestMapping(value = "communityNewGroup") +@Api(description = "新客自动拉群 Controller") +@RestController +@RequestMapping(value = "/wecom/communityNewGroup") public class WeCommunityNewGroupController extends BaseController { - @Autowired - private IWeCommunityNewGroupService weCommunityNewGroupService; + @Autowired + private IWeCommunityNewGroupService weCommunityNewGroupService; /** * 查询新客自动拉群列表 */ + @ApiOperation(value = "查询新客自动拉群列表", httpMethod = "GET") @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:list')") @GetMapping("/list") - public TableDataInfo list(WeCommunityNewGroup communityNewGroup) { + public TableDataInfo> list(@RequestParam(value = "empleCodeName", required = false) String empleCodeName + , @RequestParam(value = "createBy", required = false) String createBy + , @RequestParam(value = "beginTime", required = false) String beginTime + , @RequestParam(value = "endTime", required = false) String endTime) { startPage(); - List communityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupList(communityNewGroup); + List communityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupList(empleCodeName, createBy, beginTime, endTime); return getDataTable(communityNewGroupVos); } /** * 获取新客自动拉群详细信息 */ + @ApiOperation(value = "获取新客自动拉群详细信息", httpMethod = "GET") @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:query')") - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("newGroupId") Long newGroupId) { - return AjaxResult.success(weCommunityNewGroupService.selectWeCommunityNewGroupById(newGroupId)); + @GetMapping(value = "/{newGroupId}") + public AjaxResult getInfo(@PathVariable("newGroupId") @ApiParam("主键ID") String newGroupId) { + return AjaxResult.success(weCommunityNewGroupService.selectWeCommunityNewGroupById(new Long(newGroupId))); } /** * 修改新客自动拉群 */ + @ApiOperation(value = "修改新客自动拉群", httpMethod = "PUT") @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:edit')") @Log(title = "新客自动拉群", businessType = BusinessType.UPDATE) @PutMapping("/update") @@ -70,6 +90,7 @@ public class WeCommunityNewGroupController extends BaseController { /** * 删除新客自动拉群 */ + @ApiOperation(value = "删除新客自动拉群", httpMethod = "DELETE") @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:remove')") @Log(title = "新客自动拉群", businessType = BusinessType.DELETE) @DeleteMapping("/delete/{ids}") @@ -82,6 +103,7 @@ public class WeCommunityNewGroupController extends BaseController { /** * 新增新客自动拉群 */ + @ApiOperation(value = "新增新客自动拉群", httpMethod = "POST") @PreAuthorize("@ss.hasPermi('wecom:communityNewGroup:add')") @Log(title = "新客自动拉群", businessType = BusinessType.INSERT) @PostMapping("/add") @@ -91,9 +113,9 @@ public class WeCommunityNewGroupController extends BaseController { return AjaxResult.success(); } catch (Exception e) { e.printStackTrace(); - if (e instanceof WeComException){ + if (e instanceof WeComException) { return AjaxResult.error(e.getMessage()); - }else { + } else { return AjaxResult.error("请求接口异常!"); } } @@ -101,4 +123,72 @@ public class WeCommunityNewGroupController extends BaseController { } + /** + * 员工活码批量下载 + * + * @param ids 新客自动拉群ids + * @param request 请求 + * @param response 输出 + * @throws Exception + */ + @ApiOperation(value = "员工活码批量下载", httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:code:downloadBatch')") + @Log(title = "员工活码批量下载", businessType = BusinessType.OTHER) + @GetMapping("/downloadBatch") + public void downloadBatch(String ids, HttpServletRequest request, HttpServletResponse response) { + List idList = Arrays.stream(Optional.ofNullable(ids).orElse("").split(",")) + .filter(StringUtils::isNotEmpty).collect(Collectors.toList()); + try { + + List weCommunityNewGroupVos = weCommunityNewGroupService.selectWeCommunityNewGroupByIds(idList); + + //zip输出流 + ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); + if (CollectionUtil.isNotEmpty(weCommunityNewGroupVos)) { + for (WeCommunityNewGroupVo communityNewGroupVo : weCommunityNewGroupVos) { + String qrCode = communityNewGroupVo.getQrCode(); + if (StringUtils.isEmpty(qrCode)) { + continue; + } + URL url = new URL(qrCode); + //每个二维码名称 + String fileName = communityNewGroupVo.getEmpleCodeName() + communityNewGroupVo.getActivityScene() + ".jpg"; + zos.putNextEntry(new ZipEntry(fileName)); + InputStream fis = url.openConnection().getInputStream(); + byte[] buffer = new byte[1024]; + int r = 0; + while ((r = fis.read(buffer)) != -1) { + zos.write(buffer, 0, r); + } + fis.close(); + } + } + //关闭zip输出流 + zos.flush(); + zos.close(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @ApiOperation(value = "员工活码下载", httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:code:download')") + @Log(title = "员工活码下载", businessType = BusinessType.OTHER) + @GetMapping("/download") + public void download(String id, HttpServletRequest request, HttpServletResponse response) { + WeCommunityNewGroupVo communityNewGroupVo = weCommunityNewGroupService.selectWeCommunityNewGroupById(Long.valueOf(id)); + if (StringUtils.isEmpty(communityNewGroupVo.getQrCode())) { + return; + } else { + try { + FileUtils.downloadFile(communityNewGroupVo.getQrCode(), response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } 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 new file mode 100644 index 0000000000000000000000000000000000000000..6c422f5eb86f072e19098e28edbd903494ab78ed --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeCustomerPortraitController.java @@ -0,0 +1,220 @@ +package com.linkwechat.web.controller.wecom; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.linkwechat.common.constant.Constants; +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.WeCustomerPortrait; +import com.linkwechat.wecom.domain.WeCustomerTrajectory; +import com.linkwechat.wecom.domain.WeFlowerCustomerTagRel; +import com.linkwechat.wecom.domain.WeTagGroup; +import com.linkwechat.wecom.domain.vo.WeMakeCustomerTag; +import com.linkwechat.wecom.service.*; +import org.aspectj.weaver.loadtime.Aj; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @description: 客户画像相关controller + * @author: HaoN + * @create: 2021-03-03 15:10 + **/ +@RestController +@RequestMapping("/wecom/portrait") +public class WeCustomerPortraitController extends BaseController { + + + @Autowired + private IWeCustomerService iWeCustomerService; + + + @Autowired + private IWeTagGroupService weTagGroupService; + + + @Autowired + private IWeUserService iWeUserService; + + + @Autowired + private IWeGroupService iWeGroupService; + + + + @Autowired + private IWeCustomerTrajectoryService iWeCustomerTrajectoryService; + + + /** + * 根据客户id和当前企业员工id获取客户详细信息 + * @param externalUserid + * @param userid + * @return + */ + @GetMapping(value = "/findWeCustomerInfo") + public AjaxResult findWeCustomerInfo(String externalUserid, String userid){ + + return AjaxResult.success( + iWeCustomerService.findCustomerByOperUseridAndCustomerId(externalUserid,userid) + ); + } + + + /** + * 客户画像资料更新 + * @param weCustomerPortrait + * @return + */ + @PostMapping(value = "/updateWeCustomerInfo") + public AjaxResult updateWeCustomerInfo(@RequestBody WeCustomerPortrait weCustomerPortrait){ + + + + + iWeCustomerService.updateWeCustomerPortrait(weCustomerPortrait); + + + return AjaxResult.success(); + } + + + + /** + * 获取当前系统所有可用标签 + * @return + */ + @GetMapping(value = "/findAllTags") + public AjaxResult findAllTags(){ + + return AjaxResult.success( + weTagGroupService.selectWeTagGroupList( + WeTagGroup.builder() + .build() + ) + ); + + } + + + /** + * 更新客户画像标签 + * @param weMakeCustomerTag + * @return + */ + @PostMapping(value = "/updateWeCustomerPorTraitTag") + public AjaxResult updateWeCustomerPorTraitTag(@RequestBody WeMakeCustomerTag weMakeCustomerTag){ + + + + iWeCustomerService.makeLabel(weMakeCustomerTag); + + return AjaxResult.success(); + } + + + /** + * 查看客户添加的员工 + * @param externalUserid + * @return + */ + @GetMapping(value = "/findAddaddEmployes/{externalUserid}") + public AjaxResult findaddEmployes(@PathVariable String externalUserid){ + + + return AjaxResult.success( + iWeUserService.findWeUserByCutomerId(externalUserid) + ); + } + + + /** + * 获取用户添加的群 + * @param externalUserid + * @param userId + * @return + */ + @GetMapping(value = "/findAddGroupNum") + public AjaxResult findAddGroupNum(String externalUserid,String userId){ + + return AjaxResult.success( + iWeGroupService.findWeGroupByCustomer(userId,externalUserid) + ); + } + + + /** + * 获取轨迹信息 + * @param trajectoryType + * @return + */ + @GetMapping(value = "/findTrajectory") + public TableDataInfo findTrajectory(Integer trajectoryType){ + startPage(); + return getDataTable( + iWeCustomerTrajectoryService.list(new LambdaQueryWrapper() + .eq(WeCustomerTrajectory::getTrajectoryType,trajectoryType) + .ne(WeCustomerTrajectory::getStatus,Constants.DELETE_CODE)) + ); + } + + + /** + * 添加或编辑轨迹 + * @param trajectory + * @return + */ + @PostMapping(value = "/addOrEditWaitHandle") + public AjaxResult addOrEditWaitHandle(@RequestBody WeCustomerTrajectory trajectory){ + + + iWeCustomerTrajectoryService.saveOrUpdate(trajectory); + + return AjaxResult.success(); + } + + + /** + * 删除轨迹 + * @param trajectoryId + * @return + */ + @DeleteMapping(value = "/removeTrajectory/{trajectoryId}") + public AjaxResult removeTrajectory(@PathVariable String trajectoryId){ + iWeCustomerTrajectoryService.updateById(WeCustomerTrajectory.builder() + .id(trajectoryId) + .status(Constants.DELETE_CODE) + .build()); + return AjaxResult.success(); + } + + + /** + * 完成待办 + * @param trajectoryId + * @return + */ + @DeleteMapping(value = "/handleWait/{trajectoryId}") + public AjaxResult handleWait(@PathVariable String trajectoryId){ + iWeCustomerTrajectoryService.updateById(WeCustomerTrajectory.builder() + .id(trajectoryId) + .status(Constants.HANDLE_SUCCESS) + .build()); + return AjaxResult.success(); + } + + + + + + + + + + + + + +} diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java index 2f77bd264bdb3be20f7a2a9f9abca39fd79195d5..e17c81f2c4c5f9f04c1233a7b265de6e6d118602 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeGroupCodeController.java @@ -46,7 +46,7 @@ public class WeGroupCodeController extends BaseController { /** * 查询客户群活码列表 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:list')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:list')") @GetMapping("/list") public TableDataInfo list(WeGroupCode weGroupCode) { startPage(); @@ -57,7 +57,7 @@ public class WeGroupCodeController extends BaseController { /** * 批量下载群活码 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:downloadBatch')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:downloadBatch')") @Log(title = "群活码批量下载", businessType = BusinessType.OTHER) @GetMapping("/downloadBatch") public void downloadBatch(String ids, HttpServletRequest request, HttpServletResponse response) { @@ -92,7 +92,7 @@ public class WeGroupCodeController extends BaseController { } } - @PreAuthorize("@ss.hasPermi('wecom:groupCode:download')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:download')") @Log(title = "群活码下载", businessType = BusinessType.OTHER) @GetMapping("/download") public void download(String id, HttpServletRequest request, HttpServletResponse response) { @@ -120,7 +120,7 @@ public class WeGroupCodeController extends BaseController { /** * 获取客户群活码详细信息 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:query')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { WeGroupCode weGroupCode = weGroupCodeService.selectWeGroupCodeById(id); @@ -135,7 +135,7 @@ public class WeGroupCodeController extends BaseController { /** * 新增客户群活码 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:add')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:add')") @Log(title = "客户群活码", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@Validated @RequestBody WeGroupCode weGroupCode) { @@ -153,7 +153,7 @@ public class WeGroupCodeController extends BaseController { /** * 修改客户群活码 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:edit')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:edit')") @Log(title = "客户群活码", businessType = BusinessType.UPDATE) @PutMapping(value = "/{id}") public AjaxResult edit(@PathVariable("id") Long id, @RequestBody WeGroupCode weGroupCode) { @@ -174,7 +174,7 @@ public class WeGroupCodeController extends BaseController { /** * 删除客户群活码 */ - @PreAuthorize("@ss.hasPermi('wecom:groupCode:remove')") + @PreAuthorize("@ss.hasPermi('drainageCode:group:remove')") @Log(title = "客户群活码", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult batchRemove(@PathVariable Long[] ids) { diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePageDateContraller.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePageDateContraller.java new file mode 100644 index 0000000000000000000000000000000000000000..497fc5734056f24147f05ee90d65de6fc38210f9 --- /dev/null +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePageDateContraller.java @@ -0,0 +1,49 @@ +package com.linkwechat.web.controller.wecom; + +import com.linkwechat.common.core.domain.AjaxResult; +import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.wecom.domain.dto.WePageStaticDataDto; +import com.linkwechat.wecom.service.IWeCorpAccountService; +import com.linkwechat.wecom.service.IWeUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author danmo + * @description 首页统计 + * @date 2021/2/23 15:30 + **/ +@Api(description = "首页统计contraller") +@Slf4j +@RestController +@RequestMapping("wecom/page/") +public class WePageDateContraller { + @Autowired + private RedisCache redisCache; + + /** + * + */ + @ApiOperation(value = "数据总览controller",httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:page:getCorpBasicData')") + @GetMapping("/getCorpBasicData") + public AjaxResult getCorpBasicData(){ + return AjaxResult.success(redisCache.getCacheMap("getCorpBasicData")); + } + + @ApiOperation(value = "实时数据controller",httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:page:getCorpRealTimeData')") + @GetMapping("/getCorpRealTimeData") + public AjaxResult getCorpRealTimeData(){ + WePageStaticDataDto wePageStaticDataDto = redisCache.getCacheObject("getCorpRealTimeData"); + return AjaxResult.success(wePageStaticDataDto); + } +} diff --git a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePosterController.java b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePosterController.java index 63ae5c518a097f956667b6c50c7013ff3ab77376..13ba4056442333f945567889d29f346022357835 100644 --- a/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePosterController.java +++ b/linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WePosterController.java @@ -79,7 +79,7 @@ public class WePosterController extends BaseController { poster.setMediaType(null); wePosterService.generateSimpleImg(poster); wePosterService.saveOrUpdate(poster); - List posterSubassemblyList = wePosterSubassemblyService.lambdaQuery().eq(WePosterSubassembly::getPosterId, poster.getId()).eq(WePosterSubassembly::getDelFlag, 1).list(); + List posterSubassemblyList = wePosterSubassemblyService.lambdaQuery().eq(WePosterSubassembly::getPosterId, poster.getId()).eq(WePosterSubassembly::getDelFlag, 0).list(); Map posterSubassemblyMap = posterSubassemblyList.stream().collect(Collectors.toMap(WePosterSubassembly::getId, p -> p)); if(!CollectionUtils.isEmpty(poster.getPosterSubassemblyList())) { List insertList = new ArrayList<>(); @@ -104,8 +104,7 @@ public class WePosterController extends BaseController { } List deleteList = new ArrayList<>(posterSubassemblyMap.values()); if (!CollectionUtils.isEmpty(deleteList)) { - deleteList.forEach(wePosterSubassembly -> wePosterSubassembly.setDelFlag(1)); - wePosterSubassemblyService.updateBatchById(deleteList); + wePosterSubassemblyService.update(Wrappers.lambdaUpdate(WePosterSubassembly.class).set(WePosterSubassembly::getDelFlag,1).in(WePosterSubassembly::getId,deleteList.stream().map(WePosterSubassembly::getId).collect(Collectors.toList()))); } return AjaxResult.success("修改成功"); } 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 83246a1c4aa6e57cdb6661af7f5116e2f1359ada..896d1bbb417eb7a8466876d59b07f473b6d27dc1 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 @@ -13,6 +13,7 @@ import com.linkwechat.common.utils.poi.ExcelUtil; import com.linkwechat.wecom.domain.WeTaskFission; import com.linkwechat.wecom.domain.dto.WeChatUserDTO; import com.linkwechat.wecom.domain.dto.WeTaskFissionPosterDTO; +import com.linkwechat.wecom.domain.query.WeTaskFissionStatisticQO; import com.linkwechat.wecom.service.IWeTaskFissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -52,6 +53,17 @@ public class WeTaskFissionController extends BaseController { return getDataTable(list); } + /** + * 查询统计信息 + */ + @ApiOperation(value = "查询统计信息", httpMethod = "GET") + @PreAuthorize("@ss.hasPermi('wecom:fission:stat')") + @GetMapping("/stat") + public AjaxResult statistics(WeTaskFissionStatisticQO weTaskFissionStatisticQO) { + //TODO 待完成 + return null; + } + /** * 导出任务宝列表 */ diff --git a/linkwe-admin/src/main/resources/application.yml b/linkwe-admin/src/main/resources/application.yml index 5f60dbcf91d1d6c9eab8f74ce6927e275b41bd12..fc0eabdb548abed90082023d4b086b50c8c9a507 100644 --- a/linkwe-admin/src/main/resources/application.yml +++ b/linkwe-admin/src/main/resources/application.yml @@ -150,6 +150,8 @@ xss: elasticsearch: schema: http address: ${ES_ADDRESS:localhost} + userName: "" + password: "" connectTimeout: 10000 socketTimeout: 10000 connectionRequestTimeout: 10000 @@ -167,6 +169,7 @@ forest: wecome: + chatKey: finance serverUrl: https://qyapi.weixin.qq.com/ weComePrefix: cgi-bin noAccessTokenUrl: @@ -198,6 +201,8 @@ wecome: - /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 diff --git a/linkwe-admin/src/main/resources/bootstrap.properties b/linkwe-admin/src/main/resources/bootstrap.properties new file mode 100644 index 0000000000000000000000000000000000000000..1c2bb0da552f685ac64d5be87677b573b0a0844e --- /dev/null +++ b/linkwe-admin/src/main/resources/bootstrap.properties @@ -0,0 +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 diff --git a/linkwe-common/pom.xml b/linkwe-common/pom.xml index 0d9c26b2b6d77312028d1e7a50a64bb5a3422bbc..75b1110095434a5bd010675d12e4bce461b2149d 100644 --- a/linkwe-common/pom.xml +++ b/linkwe-common/pom.xml @@ -149,8 +149,6 @@ - - io.swagger @@ -245,6 +243,23 @@ cos_api 5.6.24 + + + + org.bouncycastle + bcprov-jdk15on + 1.68 + + + org.bouncycastle + bcpg-jdk15on + 1.68 + + + org.bouncycastle + bcpkix-jdk15on + 1.68 + \ No newline at end of file diff --git a/linkwe-common/src/main/java/com/linkwechat/common/config/ElasticSearchConfig.java b/linkwe-common/src/main/java/com/linkwechat/common/config/ElasticSearchConfig.java index 61754cb57f5fed7b8bb4ec90c6896329a1fcfdac..69a7b5f5fb55b0dbc3de8e3bfc41b22a011557fd 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/config/ElasticSearchConfig.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/config/ElasticSearchConfig.java @@ -1,6 +1,10 @@ package com.linkwechat.common.config; import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; @@ -30,6 +34,11 @@ public class ElasticSearchConfig { @Value("${elasticsearch.address}") private String address; + @Value("${elasticsearch.userName}") + private String userName; + + @Value("${elasticsearch.password}") + private String password; /** * 连接超时时间 */ @@ -70,6 +79,8 @@ public class ElasticSearchConfig { String port = addr.split(":")[1]; hostLists.add(new HttpHost(host, Integer.parseInt(port), schema)); } + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); // 转换成 HttpHost 数组 HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{}); // 构建连接对象 @@ -85,6 +96,7 @@ public class ElasticSearchConfig { builder.setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute); + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); return httpClientBuilder; }); return new RestHighLevelClient(builder); diff --git a/linkwe-common/src/main/java/com/linkwechat/common/constant/Constants.java b/linkwe-common/src/main/java/com/linkwechat/common/constant/Constants.java index 76911062c89d745b23711a6a123b4c53099db7a7..ee3d6c95445a79a0174d96b065a31b67f7f40e9b 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/constant/Constants.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/constant/Constants.java @@ -156,6 +156,11 @@ public class Constants + /**完成待办*/ + public static final String HANDLE_SUCCESS="1"; + + + diff --git a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/AjaxResult.java b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/AjaxResult.java index bbb2dcd6e07bc94f16cc34e44eaf8e3879e8f499..73af9928320bc56b3e75762bdbfcf36f85a35610 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/core/domain/AjaxResult.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/core/domain/AjaxResult.java @@ -10,7 +10,7 @@ import com.linkwechat.common.constant.HttpStatus; * * @author ruoyi */ -public class AjaxResult extends HashMap +public class AjaxResult extends HashMap { private static final long serialVersionUID = 1L; diff --git a/linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java b/linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java index 7aa5bafd934241af715cdf3ae2d3187266903057..c9dac0b52bfbeacdd1b89192e15b138aa95dd01b 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java @@ -14,6 +14,7 @@ import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.IndicesOptions; +import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; @@ -31,12 +32,14 @@ import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; /** @@ -97,12 +100,16 @@ public class ElasticSearch { return; } CreateIndexRequest request = new CreateIndexRequest(idxName); + GetIndexRequest getIndexRequest = new GetIndexRequest(idxName); buildSetting(request); request.mapping(builder); // request.settings() 手工指定Setting - CreateIndexResponse res = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); - if (!res.isAcknowledged()) { - log.info("初始化失败"); + boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + if (!exists) { + CreateIndexResponse res = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); + if (!res.isAcknowledged()) { + log.info("初始化失败"); + } } } catch (Exception e) { e.printStackTrace(); @@ -201,7 +208,9 @@ public class ElasticSearch { list.forEach(item -> request.add(new IndexRequest(idxName, "_doc").id(item.getId()) .source(item.getData(), XContentType.JSON))); try { - restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + if (!CollectionUtils.isEmpty(request.requests())) { + restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + } } catch (Exception e) { throw new RuntimeException(e); } @@ -212,14 +221,41 @@ public class ElasticSearch { * * @param idxName * @param list - * @param consumers + * @param consumer */ - public void insertBatchAsync(String idxName, List list, List>> consumers) { + public void insertBatchAsync(String idxName, List list, BiConsumer consumer, Object param) { + BulkRequest request = new BulkRequest(); + list.parallelStream().forEach(item -> request.add(new IndexRequest(idxName, "_doc").id(item.getId()) + .source(item.getData(), XContentType.JSON))); + try { + if (!CollectionUtils.isEmpty(request.requests())) { + restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT, getActionListener(consumer, list, param)); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void insertBatchAsync(String idxName, List list, Consumer> consumer) { BulkRequest request = new BulkRequest(); - list.parallelStream().forEach(item -> request.add(new IndexRequest(idxName, "_doc").id(item.getString("msgid")) + list.forEach(item -> request.add(new IndexRequest(idxName, "_doc").id(item.getString("msgid")) .source(item, XContentType.JSON))); try { - restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT, getActionListener(list, consumers)); + if (!CollectionUtils.isEmpty(request.requests())) { + restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT, getActionListener(consumer, list)); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void updateBatch(String idxName, List list) { + BulkRequest request = new BulkRequest(); + list.forEach(item -> request.add(new UpdateRequest(idxName, item.getId()).upsert(item.getData(), XContentType.JSON))); + try { + if (!CollectionUtils.isEmpty(request.requests())) { + restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + } } catch (Exception e) { throw new RuntimeException(e); } @@ -241,7 +277,9 @@ public class ElasticSearch { BulkRequest request = new BulkRequest(); idList.forEach(item -> request.add(new DeleteRequest(idxName, "_doc", item.toString()))); try { - restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + if (!CollectionUtils.isEmpty(request.requests())) { + restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + } } catch (Exception e) { throw new RuntimeException(e); } @@ -362,11 +400,25 @@ public class ElasticSearch { } } - public ActionListener getActionListener(List list, List>> consumers) { + public ActionListener getActionListener(Consumer consumer, List list) { + return new ActionListener() { + @Override + public void onResponse(Object o) { + consumer.accept(list); + } + + @Override + public void onFailure(Exception e) { + log.warn("work with es failed, exception={}", ExceptionUtils.getStackTrace(e)); + } + }; + } + + public ActionListener getActionListener(BiConsumer consumer, List list, Object param) { return new ActionListener() { @Override public void onResponse(Object o) { - consumers.forEach(consumer -> consumer.accept(list)); + consumer.accept(list, param); } @Override diff --git a/linkwe-common/src/main/java/com/linkwechat/common/core/page/TableDataInfo.java b/linkwe-common/src/main/java/com/linkwechat/common/core/page/TableDataInfo.java index 853ecb551931bfe380a358666334e6eca01a3bb9..d8b4196c999fd21dd1c4f2cff0fde1c2c16d1d8d 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/core/page/TableDataInfo.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/core/page/TableDataInfo.java @@ -8,7 +8,7 @@ import java.util.List; * * @author ruoyi */ -public class TableDataInfo implements Serializable +public class TableDataInfo implements Serializable { private static final long serialVersionUID = 1L; @@ -16,7 +16,7 @@ public class TableDataInfo implements Serializable private long total; /** 列表数据 */ - private List rows; + private T rows; /** 消息状态码 */ private int code; @@ -37,7 +37,7 @@ public class TableDataInfo implements Serializable * @param list 列表数据 * @param total 总记录数 */ - public TableDataInfo(List list, int total) + public TableDataInfo(T list, int total) { this.rows = list; this.total = total; @@ -53,12 +53,12 @@ public class TableDataInfo implements Serializable this.total = total; } - public List getRows() + public T getRows() { return rows; } - public void setRows(List rows) + public void setRows(T rows) { this.rows = rows; } diff --git a/linkwe-common/src/main/java/com/linkwechat/common/utils/file/MimeTypeUtils.java b/linkwe-common/src/main/java/com/linkwechat/common/utils/file/MimeTypeUtils.java index 9001088f240e1b13d0a5e12eae1a4ee1aacf3821..34a7a985ee43577481dc650ce06e02520012e1f6 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/utils/file/MimeTypeUtils.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/utils/file/MimeTypeUtils.java @@ -32,7 +32,7 @@ public class MimeTypeUtils // 压缩文件 "rar", "zip", "gz", "bz2", // pdf - "pdf" ,"wav","amr","mp4"}; + "pdf" ,"wav","amr","mp4","mp3"}; public static String getExtension(String prefix) { diff --git a/linkwe-common/src/main/java/com/linkwechat/common/utils/wecom/RSAUtil.java b/linkwe-common/src/main/java/com/linkwechat/common/utils/wecom/RSAUtil.java index 8a4d30c760fc963a22788c8fe3efb86650abe1ae..a959faebbb05f0288c45321ad4b10aefb64ee9f6 100644 --- a/linkwe-common/src/main/java/com/linkwechat/common/utils/wecom/RSAUtil.java +++ b/linkwe-common/src/main/java/com/linkwechat/common/utils/wecom/RSAUtil.java @@ -1,20 +1,18 @@ package com.linkwechat.common.utils.wecom; -import sun.security.util.DerInputStream; -import sun.security.util.DerValue; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.IOException; -import java.math.BigInteger; -import java.security.InvalidKeyException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.RSAPrivateCrtKeySpec; +import java.io.Reader; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.security.*; import java.util.Base64; /** @@ -26,51 +24,42 @@ public class RSAUtil { /** * RSA pkcs1 2048bit 解密工具, * 获取私钥PrivateKey + * * @param privKeyPEM 2048bit pkcs1格式,base64编码后的RSA字符串 - * @return PrivateKey,用于解密 decryptRSA + * @return PrivateKey, 用于解密 decryptRSA * @throws IOException 异常 - * @throws NoSuchAlgorithmException 异常 - * @throws InvalidKeySpecException 异常 */ - public static PrivateKey getPrivateKey(String privKeyPEM) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { - String privKeyPEMnew = privKeyPEM.replaceAll("\\r\\n", "")//看看保存到数据库的这个字符是不是有\r,如果没有,那就只需要替换掉"\\n" - .replaceAll("\n", "") - .replace("-----BEGIN RSA PRIVATE KEY-----", "") - .replace("-----END RSA PRIVATE KEY-----", ""); - byte[] bytes = java.util.Base64.getDecoder().decode(privKeyPEMnew); - DerInputStream derReader = new DerInputStream(bytes); - DerValue[] seq = derReader.getSequence(0); - BigInteger modulus = seq[1].getBigInteger(); - BigInteger publicExp = seq[2].getBigInteger(); - BigInteger privateExp = seq[3].getBigInteger(); - BigInteger prime1 = seq[4].getBigInteger(); - BigInteger prime2 = seq[5].getBigInteger(); - BigInteger exp1 = seq[6].getBigInteger(); - BigInteger exp2 = seq[7].getBigInteger(); - BigInteger crtCoef = seq[8].getBigInteger(); - RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + public static PrivateKey getPrivateKey(String privKeyPEM) throws IOException { + PrivateKey privateKey = null; + Reader privateKeyReader = new StringReader(privKeyPEM); + PEMParser privatePemParser = new PEMParser(privateKeyReader); + Object privateObject = privatePemParser.readObject(); + if (privateObject instanceof PEMKeyPair) { + PEMKeyPair pemKeyPair = (PEMKeyPair) privateObject; + JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); + privateKey = converter.getPrivateKey(pemKeyPair.getPrivateKeyInfo()); + } return privateKey; } /** * RSA pkcs1 2048bit 解密工具, - * @param str 被解密的字符串 + * + * @param str 被解密的字符串 * @param privateKey 私钥对象 从 getPrivateKey 获取 * @return 解密后数据 - * @throws NoSuchPaddingException 异常 - * @throws NoSuchAlgorithmException 异常 - * @throws InvalidKeyException 异常 - * @throws BadPaddingException 异常 + * @throws NoSuchPaddingException 异常 + * @throws NoSuchAlgorithmException 异常 + * @throws InvalidKeyException 异常 + * @throws BadPaddingException 异常 * @throws IllegalBlockSizeException 异常 */ - public static String decryptRSA(String str, PrivateKey privateKey) throws NoSuchPaddingException, - NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] randomkeybyte = Base64.getDecoder().decode(str); - byte[] finalrandomkeybyte = cipher.doFinal(randomkeybyte); - return new String(finalrandomkeybyte); + public static String decryptRSA(String str, PrivateKey privateKey) throws NoSuchPaddingException, + NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchProviderException { + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC"); + rsa.init(Cipher.DECRYPT_MODE, privateKey); + byte[] utf8 = rsa.doFinal(Base64.getDecoder().decode(str)); + return new String(utf8, StandardCharsets.UTF_8); } } diff --git a/linkwe-common/src/main/java/com/tencent/wework/Finance.java b/linkwe-common/src/main/java/com/tencent/wework/Finance.java index 2c74ce95d868cd6661d1f6d18d52edf975fb3b86..935920bef0a20c659d7b0996b1b3ed1446247a0d 100644 --- a/linkwe-common/src/main/java/com/tencent/wework/Finance.java +++ b/linkwe-common/src/main/java/com/tencent/wework/Finance.java @@ -118,7 +118,7 @@ public class Finance { System.loadLibrary("libcurl"); System.loadLibrary("WeWorkFinanceSdk"); } else { - System.load("/var/jenkins_home/app/projects/libWeWorkFinanceSdk_Java.so"); + System.load("/data/jenkins_home/app/projects/libWeWorkFinanceSdk_Java.so"); } } diff --git a/linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java b/linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java index b6e29908782f018695eeaa010c41e6a1b268666a..ba9a8dc7c21dcd76f1ec7c2c19479d7def6009dc 100644 --- a/linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java +++ b/linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java @@ -3,16 +3,20 @@ package com.tencent.wework; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.linkwechat.common.config.CosConfig; import com.linkwechat.common.config.RuoYiConfig; import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.core.redis.RedisCache; import com.linkwechat.common.utils.DateUtils; import com.linkwechat.common.utils.StringUtils; +import com.linkwechat.common.utils.file.FileUploadUtils; +import com.linkwechat.common.utils.spring.SpringUtils; import com.linkwechat.common.utils.uuid.IdUtils; import com.linkwechat.common.utils.wecom.RSAUtil; import lombok.extern.slf4j.Slf4j; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.PrivateKey; import java.util.ArrayList; @@ -244,6 +248,7 @@ public class FinanceUtils { getPath(realJsonData, msgType, fileName); } + /*//本地存储 private static void getPath(JSONObject realJsonData, String msgType, String fileName) { String filePath = getFilePath(msgType); JSONObject data = Optional.ofNullable(realJsonData.getJSONObject(msgType)) @@ -254,7 +259,39 @@ public class FinanceUtils { } catch (Exception e) { e.printStackTrace(); } - data.put("attachment", filePath + "/" + fileName); + String currentDir = StringUtils.substring(filePath,downloadWeWorkPath.length()+1); + String pathFileName; + if(org.apache.commons.lang3.StringUtils.isBlank(currentDir)){ + pathFileName = Constants.RESOURCE_PREFIX + "/" +fileName; + }else { + pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + data.put("attachment", pathFileName); + if (realJsonData.containsKey("content")) { + realJsonData.put("content", data); + } else { + realJsonData.put(msgType, data); + } + + }*/ + + //云存储 + private static void getPath(JSONObject realJsonData, String msgType, String fileName) { + String filePath = getFilePath(msgType); + JSONObject data = Optional.ofNullable(realJsonData.getJSONObject(msgType)) + .orElse(realJsonData.getJSONObject("content")); + String sdkfileid = data.getString("sdkfileid"); + try { + getMediaData(sdkfileid, "", "", filePath, fileName); + CosConfig cosConfig = SpringUtils.getBean(CosConfig.class); + String suffix = fileName.substring(fileName.lastIndexOf(".") + 1); + StringBuilder cosUrl = new StringBuilder(cosConfig.getImgUrlPrefix()); + String cosFilePath = FileUploadUtils.upload2Cos(new FileInputStream(new File(filePath, fileName)), suffix, cosConfig); + cosUrl.append(cosFilePath); + data.put("attachment", cosUrl.toString()); + } catch (Exception e) { + e.printStackTrace(); + } if (realJsonData.containsKey("content")) { realJsonData.put("content", data); } else { diff --git a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java index 0d4f3377285ddfbbfba0d65717f31330eb76627d..12a14cff82eedae15f66e38e6d94c76c8a8b9622 100644 --- a/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java +++ b/linkwe-framework/src/main/java/com/linkwechat/framework/config/SecurityConfig.java @@ -126,6 +126,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/wecom/user/getUserInfo").anonymous() // .antMatchers("/common/uploadFile2Cos").anonymous() .antMatchers("/wecom/material/temporaryMaterialMediaId").anonymous() + .antMatchers("/wecom/portrait/**").anonymous() + // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/linkwe-generator/src/main/resources/vm/java/sub-domain.java.vm b/linkwe-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..a3f53ebab9896cd40de0fd40d80153c3d2ba812e --- /dev/null +++ b/linkwe-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/GroupChatStatisticTask.java b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/GroupChatStatisticTask.java new file mode 100644 index 0000000000000000000000000000000000000000..faa18529c4424c80834fabe8a82c78a2f39614b3 --- /dev/null +++ b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/GroupChatStatisticTask.java @@ -0,0 +1,104 @@ +package com.linkwechat.quartz.task; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.linkwechat.common.utils.bean.BeanUtils; +import com.linkwechat.wecom.client.WeCustomerClient; +import com.linkwechat.wecom.domain.WeGroup; +import com.linkwechat.wecom.domain.WeGroupStatistic; +import com.linkwechat.wecom.domain.dto.GroupChatStatisticDto; +import com.linkwechat.wecom.domain.query.GroupChatStatisticQuery; +import com.linkwechat.wecom.service.IWeGroupService; +import com.linkwechat.wecom.service.IWeGroupStatisticService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * @author sxw + * @description 群聊数据统计 + * @date 2021/2/24 0:42 + **/ +@Slf4j +@Component("GroupChatStatisticTask") +public class GroupChatStatisticTask { + @Autowired + private WeCustomerClient weCustomerClient; + @Autowired + private IWeGroupService weGroupService; + @Autowired + private IWeGroupStatisticService weGroupStatisticService; + + public void getGroupChatData() { + log.info("群聊数据统计>>>>>>>>>>>>>>>>>>>启动"); + List weGroupList = weGroupService.list(new LambdaQueryWrapper().eq(WeGroup::getStatus, 0)); + log.info("群聊数据统计>>>>>>>>>>>>>>>>>>>weGroupList:{}",weGroupList.size()); + if (CollectionUtil.isNotEmpty(weGroupList)){ + List weGroupStatisticList = new ArrayList<>(); + GroupChatStatisticQuery query = new GroupChatStatisticQuery(); + //前一天的数据 + Long startTime = strToDate(-1, 0); + Long endTime = strToDate(-1, 1); + query.setDay_begin_time(startTime); + query.setDay_end_time(endTime); + weGroupList.forEach(weGroup -> { + GroupChatStatisticQuery.OwnerFilter ownerFilter = new GroupChatStatisticQuery.OwnerFilter(); + List idList = new ArrayList<>(); + idList.add(weGroup.getOwner()); + ownerFilter.setUserid_list(idList); + query.setOwnerFilter(ownerFilter); + try { + GroupChatStatisticDto groupChatStatistic = weCustomerClient.getGroupChatStatisticGroupByDay(query); + List items = groupChatStatistic.getItems(); + if(CollectionUtil.isNotEmpty(items)){ + items.forEach(groupchatStatisticData -> { + WeGroupStatistic weGroupStatistic = new WeGroupStatistic(); + GroupChatStatisticDto.StatisticData data = groupchatStatisticData.getData(); + BeanUtils.copyPropertiesignoreOther(data, weGroupStatistic); + weGroupStatistic.setChatId(weGroup.getChatId()); + weGroupStatistic.setStatTime(groupchatStatisticData.getStatTime()); + weGroupStatisticList.add(weGroupStatistic); + }); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("群聊数据拉取失败: ownerFilter:【{}】,ex:【{}】", JSONObject.toJSONString(ownerFilter),e.getStackTrace()); + } + }); + weGroupStatisticService.saveBatch(weGroupStatisticList); + } + } + + private Long strToDate(int days, Integer type) { + Long time = null; + DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + Calendar cale = Calendar.getInstance(); + cale.add(Calendar.DATE, days); + String tarday = new SimpleDateFormat("yyyy-MM-dd").format(cale.getTime()); + if (type.equals(0)) { + tarday += " 00:00:00"; + } else { + tarday += " 23:59:59"; + } + // String转Date + try { + date = format2.parse(tarday); + System.out.println(date.getTime()); + time = date.getTime() / 1000; + System.out.println(time.toString()); + } catch (ParseException e) { + e.printStackTrace(); + } + return time; + } +} diff --git a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/PageHomeDataTask.java b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/PageHomeDataTask.java new file mode 100644 index 0000000000000000000000000000000000000000..9b6ff39cb4343f3a0b0e2fc864068c64b0316dc3 --- /dev/null +++ b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/PageHomeDataTask.java @@ -0,0 +1,175 @@ +package com.linkwechat.quartz.task; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.core.redis.RedisCache; +import com.linkwechat.wecom.domain.WeUser; +import com.linkwechat.wecom.domain.dto.WePageCountDto; +import com.linkwechat.wecom.domain.dto.WePageStaticDataDto; +import com.linkwechat.wecom.domain.query.WePageStateQuery; +import com.linkwechat.wecom.service.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author danmo + * @description 首页数据统计 + * @date 2021/2/23 23:51 + **/ +@Slf4j +@Component("PageHomeDataTask") +public class PageHomeDataTask { + @Autowired + private IWeCorpAccountService weCorpAccountService; + + @Autowired + private IWeUserService weUserService; + + @Autowired + private IWeCustomerService weCustomerService; + + @Autowired + private IWeGroupService weGroupService; + + @Autowired + private IWeGroupMemberService weGroupMemberService; + + @Autowired + private IWeUserBehaviorDataService weUserBehaviorDataService; + + @Autowired + private IWeGroupStatisticService weGroupStatisticService; + + @Autowired + private RedisCache redisCache; + + + public void getPageHomeDataData(){ + getCorpBasicData(); + getCorpRealTimeData(); + } + + public void getCorpBasicData(){ + //查询当前使用企业 + //WeCorpAccount weCorpAccount = weCorpAccountService.findValidWeCorpAccount(); + //String corpId = weCorpAccount.getCorpId(); + Map totalMap = new HashMap<>(16); + //企业成员总数 + int userCount = weUserService.count(new LambdaQueryWrapper().eq(WeUser::getIsActivate, WeConstans.WE_USER_IS_ACTIVATE)); + //客户总人数 + int customerCount = weCustomerService.count(); + //客户群总数 + int groupCount = weGroupService.count(); + //群成员总数 + int groupMemberCount = weGroupMemberService.count(); + + totalMap.put("userCount",userCount); + totalMap.put("customerCount",customerCount); + totalMap.put("groupCount",groupCount); + totalMap.put("groupMemberCount",groupMemberCount); + redisCache.setCacheMap("getCorpBasicData",totalMap); + } + + + public void getCorpRealTimeData(){ + WePageStaticDataDto wePageStaticDataDto = new WePageStaticDataDto(); + //今天 + wePageStaticDataDto.setToday(getTodayData()); + wePageStaticDataDto.setWeek(getWeekData()); + wePageStaticDataDto.setMonth(getMonthData()); + wePageStaticDataDto.setUpdateTime(DateUtil.now()); + redisCache.setCacheObject("getCorpRealTimeData",wePageStaticDataDto); + } + + private WePageStaticDataDto.PageStaticData getTodayData(){ + /** + * 今日 + */ + String today = DateUtil.today(); + String yesterday = DateUtil.yesterday().toDateStr(); + //客户统计 + WePageCountDto newTime = weUserBehaviorDataService.getCountDataByDay(today,"day"); + /** + * 昨日 + */ + //客户统计 + WePageCountDto lastTime = weUserBehaviorDataService.getCountDataByDay(yesterday,"day"); + + WePageStaticDataDto.PageStaticData pageStaticData = setPageStaticData(newTime, lastTime); + + WePageStateQuery wePageStateQuery = new WePageStateQuery(); + //获取15天前的时间 + wePageStateQuery.setStartTime(DateUtil.offsetDay(new Date(), -15).toDateStr()); + wePageStateQuery.setEndTime(today); + wePageStateQuery.setFew(14); + List dayCountData = weUserBehaviorDataService.getDayCountData(wePageStateQuery); + pageStaticData.setDataList(dayCountData); + + return pageStaticData; + } + + private WePageStaticDataDto.PageStaticData getWeekData(){ + /** + * 本周 + */ + //客户统计 + WePageCountDto newTime = weUserBehaviorDataService.getCountDataByDay(DateUtil.today(),"week"); + /** + * 上周 + */ + //客户统计 + WePageCountDto lastTime = weUserBehaviorDataService.getCountDataByDay(DateUtil.lastWeek().toDateStr(),"week"); + + WePageStaticDataDto.PageStaticData pageStaticData = setPageStaticData(newTime, lastTime); + + WePageStateQuery wePageStateQuery = new WePageStateQuery(); + wePageStateQuery.setFew(5); + List weekCountData = weUserBehaviorDataService.getWeekCountData(wePageStateQuery); + pageStaticData.setDataList(weekCountData); + + return pageStaticData; + } + + private WePageStaticDataDto.PageStaticData getMonthData(){ + /** + * 本周 + */ + //客户统计 + WePageCountDto newTime = weUserBehaviorDataService.getCountDataByDay(DateUtil.today(),"month"); + /** + * 上周 + */ + //客户统计 + WePageCountDto lastTime = weUserBehaviorDataService.getCountDataByDay(DateUtil.lastMonth().toDateStr(),"month"); + + WePageStaticDataDto.PageStaticData pageStaticData = setPageStaticData(newTime, lastTime); + + WePageStateQuery wePageStateQuery = new WePageStateQuery(); + wePageStateQuery.setFew(5); + List monthCountData = weUserBehaviorDataService.getMonthCountData(wePageStateQuery); + pageStaticData.setDataList(monthCountData); + + return pageStaticData; + } + + + private WePageStaticDataDto.PageStaticData setPageStaticData(WePageCountDto nowTime,WePageCountDto lastTime){ + WePageStaticDataDto.PageStaticData pageStaticData = new WePageStaticDataDto.PageStaticData(); + + pageStaticData.setNewApplyCnt(nowTime.getNewApplyCnt()); + pageStaticData.setNewApplyCntDiff(nowTime.getNewApplyCnt() - lastTime.getNewApplyCnt()); + pageStaticData.setNegativeFeedbackCnt(nowTime.getNegativeFeedbackCnt()); + pageStaticData.setNegativeFeedbackCntDiff(nowTime.getNegativeFeedbackCnt() - lastTime.getNegativeFeedbackCnt()); + pageStaticData.setNewContactCnt(nowTime.getNewContactCnt()); + pageStaticData.setNewContactCntDiff(nowTime.getNewContactCnt() - lastTime.getNewContactCnt()); + + return pageStaticData; + } +} diff --git a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java index 1d20f365aa09bed9f9f7882f3526a74248647006..a548c3817c7c5531f5534977422e146f1865ccf3 100644 --- a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java +++ b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java @@ -3,7 +3,6 @@ package com.linkwechat.quartz.task; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.collect.Lists; import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.core.elasticsearch.ElasticSearch; import com.linkwechat.common.core.redis.RedisCache; @@ -20,6 +19,7 @@ import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.IOException; @@ -27,7 +27,6 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Consumer; /** * 定时任务调度测试 @@ -55,6 +54,9 @@ public class RyTask { @Autowired private IWeCustomerMessageService weCustomerMessageService; + @Value("${wecome.chatKey}") + private String chartKey; + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); @@ -72,7 +74,7 @@ public class RyTask { public void FinanceTask(String corpId, String secret) throws IOException { log.info("执行有参方法: params:{},{}", corpId, secret); //创建索引 - elasticSearch.createIndex2(WeConstans.WECOM_FINANCE_INDEX, elasticSearch.getFinanceMapping()); + elasticSearch.createIndex2(chartKey, elasticSearch.getFinanceMapping()); //从缓存中获取消息标识 Object seqObject = Optional.ofNullable(redisCache.getCacheObject(WeConstans.CONTACT_SEQ_KEY)).orElse(0L); @@ -92,9 +94,7 @@ public class RyTask { List elasticSearchEntities = weChatContactMappingService.saveWeChatContactMapping(chatDataList); //获取敏感行为命中信息 weSensitiveActHitService.hitWeSensitiveAct(chatDataList); - List>> consumerList = Lists.newArrayList(); - consumerList.add(weSensitiveService::hitSensitive); - elasticSearch.insertBatchAsync(WeConstans.WECOM_FINANCE_INDEX, elasticSearchEntities, consumerList); + elasticSearch.insertBatchAsync(chartKey, elasticSearchEntities, weSensitiveService::hitSensitive); } catch (Exception e) { log.error("消息处理异常:ex:{}", e); e.printStackTrace(); @@ -122,7 +122,7 @@ public class RyTask { SortBuilder sortBuilderPrice = SortBuilders.fieldSort(WeConstans.CONTACT_SEQ_KEY).order(SortOrder.DESC); searchSourceBuilder.sort(sortBuilderPrice); searchSourceBuilder.size(1); - List searchResultList = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, searchSourceBuilder, JSONObject.class); + List searchResultList = elasticSearch.search(chartKey, searchSourceBuilder, JSONObject.class); searchResultList.stream().findFirst().ifPresent(result -> { index.set(result.getLong(WeConstans.CONTACT_SEQ_KEY) + 1); }); @@ -161,7 +161,7 @@ public class RyTask { semaphore.acquire(); if (s.getMessageInfo() != null && s.getMessageId() != null || (s.getMessageInfo().getPushType().equals(WeConstans.SEND_MESSAGE_CUSTOMER) - && CollectionUtils.isNotEmpty(s.getCustomersInfo())) ||(s.getMessageInfo().getPushType().equals(WeConstans.SEND_MESSAGE_GROUP) + && CollectionUtils.isNotEmpty(s.getCustomersInfo())) || (s.getMessageInfo().getPushType().equals(WeConstans.SEND_MESSAGE_GROUP) && CollectionUtils.isNotEmpty(s.getGroupsInfo()))) { weCustomerMessageService.sendMessgae(s.getMessageInfo(), s.getMessageId(), s.getCustomersInfo(), s.getGroupsInfo()); diff --git a/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/UserBehaviorDataTak.java b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/UserBehaviorDataTak.java new file mode 100644 index 0000000000000000000000000000000000000000..b2d718490206c17c6f6a0f17f1b456e68592e180 --- /dev/null +++ b/linkwe-quartz/src/main/java/com/linkwechat/quartz/task/UserBehaviorDataTak.java @@ -0,0 +1,113 @@ +package com.linkwechat.quartz.task; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.dtflys.forest.exceptions.ForestRuntimeException; +import com.linkwechat.common.constant.WeConstans; +import com.linkwechat.common.utils.bean.BeanUtils; +import com.linkwechat.wecom.client.WeCustomerClient; +import com.linkwechat.wecom.domain.WeUser; +import com.linkwechat.wecom.domain.WeUserBehaviorData; +import com.linkwechat.wecom.domain.dto.UserBehaviorDataDto; +import com.linkwechat.wecom.domain.query.UserBehaviorDataQuery; +import com.linkwechat.wecom.service.IWeUserBehaviorDataService; +import com.linkwechat.wecom.service.IWeUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * @author sxw + * @description 联系客户统计 + * @date 2021/2/24 0:41 + **/ +@Slf4j +@Component("UserBehaviorDataTak") +public class UserBehaviorDataTak { + @Autowired + private WeCustomerClient weCustomerClient; + @Autowired + private IWeUserService weUserService; + @Autowired + private IWeUserBehaviorDataService weUserBehaviorDataService; + + private final int offset = 500; + + public void getUserBehaviorData() { + log.info("联系客户统计>>>>>>>>>>>>>>>>>>>启动"); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(WeUser::getIsActivate, WeConstans.WE_USER_IS_ACTIVATE); + int userCount = weUserService.count(wrapper); + log.info("联系客户统计>>>>>>>>>>>>>>>>>>>userCount:{}",userCount); + double num = 1; + if (userCount > offset) { + num = Math.ceil((double) userCount / offset); + } + int temp = 0; + for (int i = 0; i < num; i++) { + wrapper.last("limit " + temp + "," + offset); + List list = weUserService.list(wrapper); + if (CollectionUtil.isNotEmpty(list)) { + List dataList = new ArrayList<>(); + UserBehaviorDataQuery query = new UserBehaviorDataQuery(); + //前一天的数据 + Long startTime = strToDate(-1, 0); + Long endTime = strToDate(-1, 1); + query.setStart_time(startTime); + query.setEnd_time(endTime); + list.forEach(weUser -> { + List idList = new ArrayList<>(); + idList.add(weUser.getUserId()); + query.setUserid(idList); + try { + UserBehaviorDataDto userBehaviorData = weCustomerClient.getUserBehaviorData(query); + List behaviorDataList = userBehaviorData.getBehaviorData(); + for (UserBehaviorDataDto.BehaviorData data : behaviorDataList) { + WeUserBehaviorData weUserBehaviorData = new WeUserBehaviorData(); + BeanUtils.copyPropertiesignoreOther(data, weUserBehaviorData); + weUserBehaviorData.setUserId(weUser.getUserId()); + dataList.add(weUserBehaviorData); + } + } catch (ForestRuntimeException e) { + e.printStackTrace(); + log.error("员工数据拉取失败: userId:【{}】,ex:【{}】",weUser.getUserId(),e.getStackTrace()); + } + }); + weUserBehaviorDataService.saveBatch(dataList); + } + temp += offset; + } + + } + + private Long strToDate(int days, Integer type) { + Long time = null; + DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + Calendar cale = Calendar.getInstance(); + cale.add(Calendar.DATE, days); + String tarday = new SimpleDateFormat("yyyy-MM-dd").format(cale.getTime()); + if (type.equals(0)) { + tarday += " 00:00:00"; + } else { + tarday += " 23:59:59"; + } + // String转Date + try { + date = format2.parse(tarday); + System.out.println(date.getTime()); + time = date.getTime() / 1000; + System.out.println(time.toString()); + } catch (ParseException e) { + e.printStackTrace(); + } + return time; + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java index a5279f1bea0d410cae899f5a0e1ff1115006fb4e..c18256ec21a4efcb8901c723f7c439fa6b535efe 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/client/WeCustomerClient.java @@ -1,15 +1,13 @@ package com.linkwechat.wecom.client; import com.dtflys.forest.annotation.DataObject; +import com.dtflys.forest.annotation.JSONBody; import com.dtflys.forest.annotation.Query; import com.dtflys.forest.annotation.Request; -import com.linkwechat.wecom.domain.dto.WeCustomerDto; -import com.linkwechat.wecom.domain.dto.WeResultDto; -import com.linkwechat.wecom.domain.dto.WeWelcomeMsg; -import com.linkwechat.wecom.domain.dto.customer.CutomerTagEdit; -import com.linkwechat.wecom.domain.dto.customer.ExternalUserDetail; -import com.linkwechat.wecom.domain.dto.customer.ExternalUserList; -import com.linkwechat.wecom.domain.dto.customer.FollowUserList; +import com.linkwechat.wecom.domain.dto.*; +import com.linkwechat.wecom.domain.dto.customer.*; +import com.linkwechat.wecom.domain.query.GroupChatStatisticQuery; +import com.linkwechat.wecom.domain.query.UserBehaviorDataQuery; import java.util.Map; @@ -93,5 +91,27 @@ public interface WeCustomerClient { ExternalUserDetail unionidToExternalUserid(@DataObject ExternalUserDetail.ExternalContact unionid); + /** + * 联系客户统计 + * @return + */ + @Request(url = "/externalcontact/get_user_behavior_data", + type = "POST") + UserBehaviorDataDto getUserBehaviorData(@JSONBody UserBehaviorDataQuery query); + /** + * 群聊数据统计(按群主聚合的方式) + * @return + */ + @Request(url = "/externalcontact/groupchat/statistic", + type = "POST") + GroupChatStatisticDto getGroupChatStatistic(@JSONBody GroupChatStatisticQuery query); + + /** + * 群聊数据统计(按自然日聚合的方式) + * @return + */ + @Request(url = "/externalcontact/groupchat/statistic_group_by_day", + type = "POST") + GroupChatStatisticDto getGroupChatStatisticGroupByDay(@JSONBody GroupChatStatisticQuery query); } 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 eda560e49af80f4d8aaf9821fb7668be88f18f42..c19ef8504473e213bc392fd7610618a31ad56646 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 @@ -2,6 +2,8 @@ package com.linkwechat.wecom.domain; import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -10,6 +12,7 @@ import lombok.Data; * @author kewen * @date 2021-02-19 */ +@ApiModel @Data public class WeCommunityNewGroup extends BaseEntity { @@ -19,23 +22,57 @@ public class WeCommunityNewGroup extends BaseEntity { private Long newGroupId= SnowFlakeUtil.nextId(); /** - *员工活码ID + * 员工活码名称 */ - private Long empleCodeId; + @ApiModelProperty("员工活码名称") + private String empleCodeName; /** - * 员工活码名称 + * 活动场景 */ - private String empleCodeName; + @ApiModelProperty("活动场景") + private String activityScene; + + /** + * 欢迎语 + */ + @ApiModelProperty("欢迎语") + private String welcomeMsg; + + /** + * 二维码链接 + */ + @ApiModelProperty("二维码链接") + private String qrCode; + + /** + * 客户添加时无需经过确认自动成为好友:1:是;0:否 + */ + @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") + private Boolean isJoinConfirmFriends; + + /** + * 添加好友数 + */ + @ApiModelProperty("添加好友数") + private Integer joinFriendNums; /** * 群活码ID */ + @ApiModelProperty("群活码ID") private Long groupCodeId; + /** + * 素材的id + */ + @ApiModelProperty("素材的id") + private Long mediaId; + /** * 0 未删除 1 已删除 */ + @ApiModelProperty("0 未删除 1 已删除") private int delFlag; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddGroup.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..281e51730a130de9985e017e7a087cfa5409285a --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddGroup.java @@ -0,0 +1,27 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * @description: + * @author: HaoN + * @create: 2021-03-08 17:04 + **/ +@Data +public class WeCustomerAddGroup { + //群id + private String chatId; + //群名 + private String groupName; + //群主名 + private String ownerName; + //群成员数 + private Integer groupMemberNum; + //加入时间 + private Date joinTime; + + //是否共同群 0:不是共同群;1:是共同群 + private Integer commonGroup; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddUser.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddUser.java new file mode 100644 index 0000000000000000000000000000000000000000..010b98fbf3961d77820a1c4cebd9e6b66b023fb7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerAddUser.java @@ -0,0 +1,22 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * @description: 客户添加人 + * @author: HaoN + * @create: 2021-03-08 15:47 + **/ +@Data +public class WeCustomerAddUser { + //员工名称 + private String userName; + //员工id + private String userId; + //员工头像 + private String headImageUrl; + //创建时间 + private Date createTime; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..d87e26eccce4084b4264c481f0b195c89cac562c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortrait.java @@ -0,0 +1,48 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @description: 客户画像实体VO + * @author: HaoN + * @create: 2021-03-03 11:49 + **/ +@Data +public class WeCustomerPortrait { + //外部联系人id + private String externalUserid; + //企业员工id + private String userId; + //客户与企业员工关系id + private String flowerCustomerRelId; + //客户昵称 + private String name; + //客户备注 + private String remark; + //备注客户手机号 + private String remarkMobiles; + //客户生日 + private Date birthday; + //邮箱 + private String email; + //地址 + private String address; + //qq + private String qq; + //职业 + private String position; + //公司 + private String remarkCorpName; + //描述 + private String description; + + //客户标签 + private List weTagGroupList; + + //客户社交关系 + private WeCustomerSocialConn socialConn; + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortraitTag.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortraitTag.java new file mode 100644 index 0000000000000000000000000000000000000000..7b0aaea6ae60a6061a7f87e24e68062e325eea53 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerPortraitTag.java @@ -0,0 +1,12 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; + +/** + * @description: 客户画像标签 + * @author: HaoN + * @create: 2021-03-04 12:31 + **/ +@Data +public class WeCustomerPortraitTag { +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerSocialConn.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerSocialConn.java new file mode 100644 index 0000000000000000000000000000000000000000..b5a18c249d22e3eaa76b8d3584a89d4ca760c9e7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerSocialConn.java @@ -0,0 +1,16 @@ +package com.linkwechat.wecom.domain; + +import lombok.Data; + +/** + * 客户社交关系 + */ +@Data +public class WeCustomerSocialConn { + /**添加员工数*/ + private Integer addEmployeNum; + /**添加群聊数*/ + private Integer addGroupNum; + /**共同群聊数*/ + private Integer commonGroupNum; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerTrajectory.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerTrajectory.java new file mode 100644 index 0000000000000000000000000000000000000000..2b601c25330d38ab560cb0ecae3d82ef7c1bb78b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeCustomerTrajectory.java @@ -0,0 +1,36 @@ +package com.linkwechat.wecom.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.sql.Time; +import java.util.Date; + +/** + * 活动轨迹相关 + */ +@Data +@TableName("we_customer_trajectory") +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WeCustomerTrajectory { + @TableId + private String id; + //轨迹类型(1:信息动态;2:社交动态;3:活动规则;4:待办动态) + private Integer trajectoryType; + //外部联系人id + private String externalUserid; + //文案内容 + private String content; + //处理日期 + private Date createDate; + //处理时间 + private Time createTime; + //0:正常;1:删除;2:完成 + private String status; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java index a69fd2b8d865e71dadcc92d6249359cd5b7dd097..2d2e22c9b3b6a050216a594e67eb6bb447110e1a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeTag.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,6 +16,7 @@ import lombok.Data; * @author ruoyi * @date 2020-10-04 */ +@ApiModel @Data @TableName("we_emple_code_tag") public class WeEmpleCodeTag @@ -25,15 +28,19 @@ public class WeEmpleCodeTag private Long id= SnowFlakeUtil.nextId(); /** 标签id */ + @ApiModelProperty("标签id") private String tagId; /** 员工活码id */ + @ApiModelProperty("员工活码id") private Long empleCodeId; /** 0:正常;2:删除; */ + @ApiModelProperty("0:正常;2:删除") private Integer delFlag=new Integer(0); /** 标签名 */ + @ApiModelProperty("标签名") private String tagName; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java index 1cf84b2b86fb57a684cd8c95652547cfa2a00825..7a16f622c974763ba9f36ff82b33f6780cd7e3d5 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeEmpleCodeUseScop.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @@ -16,6 +18,7 @@ import java.util.Date; * @author ruoyi * @date 2020-10-04 */ +@ApiModel @Data @TableName("we_emple_code_use_scop") public class WeEmpleCodeUseScop @@ -27,21 +30,27 @@ public class WeEmpleCodeUseScop private Long id = SnowFlakeUtil.nextId(); /** 员工活码id */ + @ApiModelProperty("员工活码id") private Long empleCodeId; /** 业务id类型1:组织机构id,2:成员id */ + @ApiModelProperty("业务id类型1:组织机构id,2:成员id") private Integer businessIdType; /** 活码类型下业务使用人的id */ + @ApiModelProperty("活码类型下业务使用人的id") private String businessId; /** 0:正常;2:删除; */ + @ApiModelProperty("0:正常;2:删除") private Integer delFlag=new Integer(0); /** 活码使用人员名称 */ + @ApiModelProperty("活码使用人员名称") private String businessName; /** 活码使用人员手机号 */ + @ApiModelProperty("活码使用人员手机号") @TableField(exist = false) private String mobile; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeFlowerCustomerRel.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeFlowerCustomerRel.java index b2511086328555e70f090e22083b4ca9e4b5841d..a22f4807bd736859ba4d0176074f3bdcd05b5844 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeFlowerCustomerRel.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeFlowerCustomerRel.java @@ -89,4 +89,23 @@ public class WeFlowerCustomerRel @TableField(exist = false) private String endTime; + + /** 备注 */ + private String remark; + + + /** 邮件 */ + private String email; + + + /** qq */ + private String qq; + + /**地址*/ + private String address; + + + + + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCode.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCode.java index b9dad9cd1c63ddb2225cf2f1ca38794a4848d7ed..f0b35f53f6a8f3af63b3b47ffc10a48959dd16b5 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCode.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCode.java @@ -35,6 +35,11 @@ public class WeGroupCode extends BaseEntity { */ private String codeUrl; + /** + * 二维码的uuid + */ + private String uuid; + /** * 活码头像 */ diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCodeActual.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCodeActual.java index 88678a0082aced6716103b42cf2eb9f47883c699..fc4aaa2ce64194e5454a2ca2b1711aa777585597 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCodeActual.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupCodeActual.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.linkwechat.common.utils.SnowFlakeUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @@ -17,6 +19,7 @@ import javax.validation.constraints.NotNull; * @author ruoyi * @date 2020-10-07 */ +@ApiModel @Data @TableName("we_group_code_actual") public class WeGroupCodeActual @@ -29,37 +32,47 @@ public class WeGroupCodeActual /** 实际群码 */ @NotNull(message = "实际群活码称不能为空") + @ApiModelProperty("实际群码") private String actualGroupQrCode; /** 群名称 */ @NotNull(message = "群名称不能为空") + @ApiModelProperty("群名称") private String groupName; /** 有效期 */ @NotNull(message = "有效期不能为空") @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("有效期") private Date effectTime; /** 扫码次数限制 */ @NotNull(message = "次数限制不能为空") + @ApiModelProperty("扫码次数限制") private Long scanCodeTimesLimit; /** 群活码id */ @NotNull(message = "群活码id不能为空") + @ApiModelProperty("群活码id") private Long groupCodeId; /** 客户群id */ + @ApiModelProperty("客户群id") private String chatId; /** 客户群名称 */ + @ApiModelProperty("客户群名称") private String chatGroupName; /** 扫码次数 */ + @ApiModelProperty("扫码次数") private Long scanCodeTimes; /** 0:正常使用;2:删除; */ + @ApiModelProperty("0:正常使用;2:删除;") private Long delFlag; /** 0:使用中 */ + @ApiModelProperty("0:使用中") private Long status; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupStatistic.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupStatistic.java new file mode 100644 index 0000000000000000000000000000000000000000..b554639433756ca78ea88f9b1cd4810f10f76eb0 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeGroupStatistic.java @@ -0,0 +1,96 @@ +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.fasterxml.jackson.annotation.JsonFormat; +import com.linkwechat.common.annotation.Excel; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 群聊数据统计数据 + * 对象 we_group_statistic + * + * @author ruoyi + * @date 2021-02-24 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +@TableName("we_group_statistic") +public class WeGroupStatistic implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 群主ID + */ + @Excel(name = "群ID") + private String chatId; + + /** + * 数据日期 + */ + @Excel(name = "数据日期", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date statTime; + + /** + * 新增客户群数量 + */ + @Excel(name = "新增客户群数量") + private Integer newChatCnt; + + /** + * 截至当天客户群总数量 + */ + @Excel(name = "截至当天客户群总数量") + private Integer chatTotal; + + /** + * 截至当天有发过消息的客户群数量 + */ + @Excel(name = "截至当天有发过消息的客户群数量") + private Integer chatHasMsg; + + /** + * 客户群新增群人数 + */ + @Excel(name = "客户群新增群人数") + private Integer newMemberCnt; + + /** + * 截至当天客户群总人数 + */ + @Excel(name = "截至当天客户群总人数") + private Integer memberTotal; + + /** + * 截至当天有发过消息的群成员数 + */ + @Excel(name = "截至当天有发过消息的群成员数") + private Integer memberHasMsg; + + /** + * 截至当天客户群消息总数 + */ + @Excel(name = "截至当天客户群消息总数") + private Integer msgTotal; + + @TableField(exist = false) + private Map params = new HashMap<>(); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeMaterial.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeMaterial.java index 711b56e7c9cc59e9943024f6c2cfa38f1ffb52bf..fb6af3710a9560922dc733f0915529a567d8d492 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeMaterial.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeMaterial.java @@ -2,6 +2,8 @@ package com.linkwechat.wecom.domain; import com.linkwechat.common.core.domain.BaseEntity; import com.linkwechat.common.utils.SnowFlakeUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -9,6 +11,7 @@ import lombok.Data; * @author: KEWEN * @create: 2020-09-21 21:17 **/ +@ApiModel @Data public class WeMaterial extends BaseEntity { @@ -19,36 +22,43 @@ public class WeMaterial extends BaseEntity { /** * 分类id */ + @ApiModelProperty("分类id") private Long categoryId; /** * 本地资源文件地址 */ + @ApiModelProperty("本地资源文件地址") private String materialUrl; /** * 文本内容、图片文案 */ + @ApiModelProperty("文本内容、图片文案") private String content; /** * 图片名称 */ + @ApiModelProperty("图片名称") private String materialName; /** * 摘要 */ + @ApiModelProperty("摘要") private String digest; /** * 封面本地资源文件 */ + @ApiModelProperty("封面本地资源文件") private String coverUrl; /** * 音频时长 */ + @ApiModelProperty("音频时长") private String audioTime; } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java index 9bf03b0d75d44b6a013ba40f420318c52b40c616..13dd7649ef829ceb6b85dd610cfa7082f6dc14e7 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUser.java @@ -114,7 +114,7 @@ public class WeUser private String remark; - + @TableField(exist = false) private String departmentStr; diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUserBehaviorData.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUserBehaviorData.java new file mode 100644 index 0000000000000000000000000000000000000000..08c2f9def33419ed92a5963d8cb4f7065fe1f5fa --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeUserBehaviorData.java @@ -0,0 +1,95 @@ +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.fasterxml.jackson.annotation.JsonFormat; +import com.linkwechat.common.annotation.Excel; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 联系客户统计数据 对象 we_user_behavior_data + * + * @author ruoyi + * @date 2021-02-24 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +@TableName("we_user_behavior_data") +public class WeUserBehaviorData implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * $column.columnComment + */ + @TableId(value = "id") + private Long id; + + /** + * 客户id + */ + @Excel(name = "客户id") + private String userId; + + /** + * 数据日期,为当日0点的时间戳 + */ + @Excel(name = "数据日期,为当日0点的时间戳", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date statTime; + + /** + * 发起申请数 + */ + @Excel(name = "发起申请数") + private Integer newApplyCnt; + + /** + * 新增客户数,成员新添加的客户数量 + */ + @Excel(name = "新增客户数,成员新添加的客户数量") + private Integer newContactCnt; + + /** + * 聊天总数, 成员有主动发送过消息的单聊总数 + */ + @Excel(name = "聊天总数, 成员有主动发送过消息的单聊总数") + private Integer chatCnt; + + /** + * 发送消息数,成员在单聊中发送的消息总数 + */ + @Excel(name = "发送消息数,成员在单聊中发送的消息总数") + private Integer messageCnt; + + /** + * 已回复聊天占比,浮点型,客户主动发起聊天后,成员在一个自然日内有回复过消息的聊天数/客户主动发起的聊天数比例,不包括群聊,仅在确有聊天时返回 + */ + @Excel(name = "已回复聊天占比,浮点型,客户主动发起聊天后,成员在一个自然日内有回复过消息的聊天数/客户主动发起的聊天数比例,不包括群聊,仅在确有聊天时返回") + private Float replyPercentage; + + /** + * 平均首次回复时长 + */ + @Excel(name = "平均首次回复时长") + private Integer avgReplyTime; + + /** + * 删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数 + */ + @Excel(name = "删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数") + private Integer negativeFeedbackCnt; + + @TableField(exist = false) + private Map params = new HashMap<>(); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/GroupChatStatisticDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/GroupChatStatisticDto.java new file mode 100644 index 0000000000000000000000000000000000000000..c52c20147dc7388becd60a153ffae59115b6adbe --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/GroupChatStatisticDto.java @@ -0,0 +1,68 @@ +package com.linkwechat.wecom.domain.dto; + + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author danmo + */ +@Data +public class GroupChatStatisticDto { + + + private List items; + + @Data + public static class GroupchatStatisticData { + + /** + * 数据日期,为当日0点的时间戳 + */ + private Date statTime; + + public void setStatTime(Long statTime) { + this.statTime = new Date(statTime * 1000); + } + + private StatisticData data; + + + } + + @Data + public static class StatisticData { + /** + * 新增客户群数量 + */ + private Integer newChatCnt; + /** + * 截至当天客户群总数量 + */ + private Integer chatTotal; + /** + * 截至当天有发过消息的客户群数量 + */ + private Integer chatHasMsg; + /** + * 客户群新增群人数 + */ + private Integer newMemberCnt; + /** + * 截至当天客户群总人数 + */ + private Integer memberTotal; + /** + * 截至当天有发过消息的群成员数 + */ + private Integer memberHasMsg; + /** + * 截至当天客户群消息总数 + */ + private Integer msgTotal; + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/UserBehaviorDataDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/UserBehaviorDataDto.java new file mode 100644 index 0000000000000000000000000000000000000000..efe07a08098a250b4d81e1cd980369e04ef4da64 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/UserBehaviorDataDto.java @@ -0,0 +1,59 @@ +package com.linkwechat.wecom.domain.dto; + + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author danmo + */ +@Data +public class UserBehaviorDataDto{ + + private List behaviorData; + + @Data + public static class BehaviorData{ + + /** + * 数据日期,为当日0点的时间戳 + */ + private Date statTime; + + public void setStatTime(Long statTime) { + this.statTime = new Date(statTime * 1000); + } + + /** + * 聊天总数, 成员有主动发送过消息的单聊总数。 + */ + private Integer chatCnt = 0; + /** + * 发送消息数,成员在单聊中发送的消息总数。 + */ + private Integer messageCnt = 0; + /** + * 已回复聊天占比,浮点型,客户主动发起聊天后,成员在一个自然日内有回复过消息的聊天数/客户主动发起的聊天数比例,不包括群聊,仅在确有聊天时返回。 + */ + private Float replyPercentage = 0.00f; + /** + * 平均首次回复时长,单位为分钟,即客户主动发起聊天后,成员在一个自然日内首次回复的时长间隔为首次回复时长,所有聊天的首次回复总时长/已回复的聊天总数即为平均首次回复时长,不包括群聊,仅在确有聊天时返回。 + */ + private Integer avgReplyTime = 0; + /** + * 删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数。 + */ + private Integer negativeFeedbackCnt = 0; + /** + * 主动向客户发起的好友申请数量 + */ + private Integer newApplyCnt = 0; + /** + * 新增客户数,成员新添加的客户数量。 + */ + private Integer newContactCnt = 0; + + } +} 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 58fce09e7991f12fa804ce400e88459da35623e4..235e02e9d02589befe1c68bb5a7b17679a7cbefb 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 @@ -3,9 +3,12 @@ package com.linkwechat.wecom.domain.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.linkwechat.wecom.domain.WeEmpleCodeTag; import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -14,44 +17,57 @@ import java.util.List; * @author kewen * @date 2021-02-19 */ +@ApiModel @Data public class WeCommunityNewGroupDto { /** * 活动场景 */ + @ApiModelProperty("活动场景") private String activityScene; /** * 欢迎语 */ + @ApiModelProperty("欢迎语") private String welcomeMsg; - @NotEmpty(message = "员工信息不能为空") + @NotNull(message = "员工信息不能为空") /** 使用员工 */ @TableField(exist = false) + @ApiModelProperty("使用员工") private List weEmpleCodeUseScops; /** * 扫码标签 */ @TableField(exist = false) + @ApiModelProperty("扫码标签") private List weEmpleCodeTags; - /** - * 员工活码 id - */ - @TableField(exist = false) - private Long weEmpleCodeId; - /** * 群活码ID */ + @ApiModelProperty("群活码ID") private Long groupCodeId; /** * 客户添加时无需经过确认自动成为好友:1:是;0:否 */ + @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") private Boolean isJoinConfirmFriends; + /** + * 二维码链接 + */ + @ApiModelProperty("二维码链接") + private String qrCode; + + /** + * 素材的id + */ + @ApiModelProperty("素材的id") + private Long mediaId; + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageCountDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageCountDto.java new file mode 100644 index 0000000000000000000000000000000000000000..be4d8b79fa83cc54add3cfcf95dd0cf0e7fedd2b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageCountDto.java @@ -0,0 +1,86 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +/** + * @author danmo + * @description + * @date 2021/2/25 11:21 + **/ +@Data +public class WePageCountDto { + /** + * 日期 + */ + private String xTime; + + /** + * 发起申请数 + */ + private Integer newApplyCnt; + + /** + * 新增客户数,成员新添加的客户数量 + */ + private Integer newContactCnt; + + /** + * 聊天总数, 成员有主动发送过消息的单聊总数 + */ + private Integer chatCnt; + + /** + * 发送消息数,成员在单聊中发送的消息总数 + */ + private Integer messageCnt; + + /** + * 已回复聊天占比,浮点型,客户主动发起聊天后,成员在一个自然日内有回复过消息的聊天数/客户主动发起的聊天数比例,不包括群聊,仅在确有聊天时返回 + */ + private Float replyPercentage; + + /** + * 平均首次回复时长 + */ + private Integer avgReplyTime; + + /** + * 删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数 + */ + private Long negativeFeedbackCnt; + + /** + * 新增客户群数量 + */ + private Integer newChatCnt; + + /** + * 截至当天客户群总数量 + */ + private Integer chatTotal; + + /** + * 截至当天有发过消息的客户群数量 + */ + private Integer chatHasMsg; + + /** + * 客户群新增群人数 + */ + private Integer newMemberCnt; + + /** + * 截至当天客户群总人数 + */ + private Integer memberTotal; + + /** + * 截至当天有发过消息的群成员数 + */ + private Integer memberHasMsg; + + /** + * 截至当天客户群消息总数 + */ + private Integer msgTotal; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageStaticDataDto.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageStaticDataDto.java new file mode 100644 index 0000000000000000000000000000000000000000..aa08cc15e2e8297f8f6b2b94becb0a4d2e547ee7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/dto/WePageStaticDataDto.java @@ -0,0 +1,47 @@ +package com.linkwechat.wecom.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author danmo + * @description + * @date 2021/2/25 11:21 + **/ +@Data +public class WePageStaticDataDto { + + /** + * 更新时间 + */ + private String updateTime; + + private PageStaticData today; + + private PageStaticData week; + + private PageStaticData month; + + @Data + public static class PageStaticData{ + //发起申请数 + private Integer newApplyCnt; + //发起申请数差值 + private Integer newApplyCntDiff; + //新增客户数 + private Integer newContactCnt; + //新增客户数差值 + private Integer newContactCntDiff; + //群新增人数 + private Integer newMemberCnt; + //群新增人数差值 + private Integer newMemberCntDiff; + //流失客户数 + private Long negativeFeedbackCnt; + //流失客户数差值 + private Long negativeFeedbackCntDiff; + //图表数据 + private List dataList; + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/GroupChatStatisticQuery.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/GroupChatStatisticQuery.java new file mode 100644 index 0000000000000000000000000000000000000000..171638251bf10904d94e5d2d7a2289858950fe2a --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/GroupChatStatisticQuery.java @@ -0,0 +1,28 @@ +package com.linkwechat.wecom.domain.query; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author danmo + */ +@Data +public class GroupChatStatisticQuery { + @ApiModelProperty(value = "起始日期的时间戳") + private Long day_begin_time; + + @ApiModelProperty(value = "结束日期的时间戳") + private Long day_end_time; + + @ApiModelProperty(value = "群主过滤") + private OwnerFilter ownerFilter; + + @Data + public static class OwnerFilter{ + @ApiModelProperty(value = "群主ID列表") + private List userid_list; + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/UserBehaviorDataQuery.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/UserBehaviorDataQuery.java new file mode 100644 index 0000000000000000000000000000000000000000..82c55b460d4faf032573b16368d74cf5002b6175 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/UserBehaviorDataQuery.java @@ -0,0 +1,25 @@ +package com.linkwechat.wecom.domain.query; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author danmo + */ +@Data +public class UserBehaviorDataQuery { + + @ApiModelProperty(value = "成员ID列表,最多100个") + private List userid; + + @ApiModelProperty(value = "部门ID列表,最多100个") + private List partyid; + + @ApiModelProperty(value = "数据起始时间") + private Long start_time; + + @ApiModelProperty(value = "数据结束时间") + private Long end_time; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WePageStateQuery.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WePageStateQuery.java new file mode 100644 index 0000000000000000000000000000000000000000..84e55a6a5e83cd939e1578a9c48ebeb256d35ae4 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WePageStateQuery.java @@ -0,0 +1,32 @@ +package com.linkwechat.wecom.domain.query; + +import lombok.Data; + +/** + * @author danmo + * @description + * @date 2021/2/25 11:21 + **/ +@Data +public class WePageStateQuery { + /** + * 日期间隔 + */ + private Integer few; + + /** + * 日期 + */ + private String dateTime; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WeTaskFissionStatisticQO.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WeTaskFissionStatisticQO.java new file mode 100644 index 0000000000000000000000000000000000000000..4e3c675fd5d9a91a526021636d5640813b9e1ca4 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WeTaskFissionStatisticQO.java @@ -0,0 +1,16 @@ +package com.linkwechat.wecom.domain.query; + +import lombok.Data; + +/** + * @author leejoker <1056650571@qq.com> + * @version 1.0 + * @date 2021/3/8 17:55 + */ +@Data +public class WeTaskFissionStatisticQO { + private Boolean seven; + private Boolean thirty; + private String beginTime; + private String endTime; +} 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 c4c2b96075ca22a3bd7c0daca05043c7248b5736..fd5a23d19b34c37521a7a0bcd262d5cb1fe190cc 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 @@ -6,6 +6,7 @@ import com.linkwechat.wecom.domain.WeEmpleCodeTag; import com.linkwechat.wecom.domain.WeEmpleCodeUseScop; import com.linkwechat.wecom.domain.WeGroupCodeActual; import com.linkwechat.wecom.domain.WeMaterial; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,83 +17,97 @@ import java.util.List; /** * 社区运营 新客自动拉群 */ +@ApiModel @Data public class WeCommunityNewGroupVo { /** *主键ID */ + @ApiModelProperty("主键ID") private Long newGroupId; - /** - *员工活码ID - */ - private Long empleCodeId; - /** * 员工活码名称 */ + @ApiModelProperty("员工活码名称") private String empleCodeName; /** * 活动场景 */ + @ApiModelProperty("活动场景") private String activityScene; /** * 欢迎语 */ + @ApiModelProperty("欢迎语") private String welcomeMsg; /** * 新增联系方式的配置id */ + @ApiModelProperty("新增联系方式的配置id") private String configId; /** * 二维码链接 */ + @ApiModelProperty("二维码链接") private String qrCode; /** * 客户添加时无需经过确认自动成为好友:1:是;0:否 */ + @ApiModelProperty("客户添加时无需经过确认自动成为好友:1:是;0:否") private Boolean isJoinConfirmFriends; /** * 添加好友数 */ + @ApiModelProperty("添加好友数") private Integer joinFriendNums; @NotEmpty(message = "员工信息不能为空") /** 使用员工 */ @TableField(exist = false) + @ApiModelProperty("使用员工") private List weEmpleCodeUseScops; /** * 扫码标签 */ @TableField(exist = false) + @ApiModelProperty("扫码标签") private List weEmpleCodeTags; /** - * 扫码标签 + * 素材 */ + @ApiModelProperty("素材") @TableField(exist = false) private WeMaterial weMaterial; + /** + * 素材的id + */ + @ApiModelProperty("素材的id") + private Long mediaId; + /** * 实际群聊 */ + @ApiModelProperty("实际群聊") private List weGroupUserScops; /** 创建者 */ - @ApiModelProperty(hidden = true) + @ApiModelProperty(value = "创建者",hidden = true) private String createBy; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(hidden = true) + @ApiModelProperty(value = "创建时间",hidden = true) private Date createTime=new Date(); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionDailyDataVO.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionDailyDataVO.java new file mode 100644 index 0000000000000000000000000000000000000000..9ffd7e0c682cc471d473d47437639a69f6fa0675 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionDailyDataVO.java @@ -0,0 +1,20 @@ +package com.linkwechat.wecom.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author leejoker <1056650571@qq.com> + * @version 1.0 + * @date 2021/3/8 10:24 + */ +@Data +public class WeTaskFissionDailyDataVO { + @JsonFormat(pattern = "yyyy-MM-dd") + private Date day; + private Integer increase; + private Integer attend; + private Integer complete; +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionStatisticVO.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionStatisticVO.java new file mode 100644 index 0000000000000000000000000000000000000000..259b56e54a8da05dead0bdf386378c8b8c3f6cdb --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/vo/WeTaskFissionStatisticVO.java @@ -0,0 +1,23 @@ +package com.linkwechat.wecom.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author leejoker <1056650571@qq.com> + * @version 1.0 + * @date 2021/3/8 10:20 + */ +@Data +public class WeTaskFissionStatisticVO { + private Long id; + private String taskName; + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + private List data; +} 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 81df166e1ddc98d5b379681f43b4414a4be3f581..8dc46fefce7173bc242b540ed3ec4607d7de23c8 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 @@ -21,7 +21,8 @@ public interface WeCommunityNewGroupMapper extends BaseMapper selectWeCommunityNewGroupList(WeCommunityNewGroup communityNewGroup); + List selectWeCommunityNewGroupList(@Param("empleCodeName") String empleCodeName, @Param("createBy") String createBy + ,@Param("beginTime") String beginTime, @Param("endTime") String endTime); /** * 获取新客自动拉群详细信息 @@ -36,6 +37,14 @@ public interface WeCommunityNewGroupMapper extends BaseMapper idList); + int batchRemoveWeCommunityNewGroupIds(@Param("ids") List idList); + + /** + * 通过id查询新客自动拉群信息列表 + * + * @param ids id列表 + * @return {@link WeCommunityNewGroup} 新客自动拉群信息 + */ + List selectWeCommunityNewGroupByIds(@Param("ids") List ids); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerMapper.java index b622d5b724e49ee7fad3b5685fb01915d818cc1b..6bce0289c2ad80200e97f2adbfbc4925ca8d4f4a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerMapper.java @@ -4,6 +4,8 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linkwechat.wecom.domain.WeCustomer; +import com.linkwechat.wecom.domain.WeCustomerPortrait; +import com.linkwechat.wecom.domain.WeCustomerSocialConn; import com.linkwechat.wecom.domain.WeUser; import org.apache.ibatis.annotations.Param; @@ -77,4 +79,24 @@ public interface WeCustomerMapper extends BaseMapper * @return */ List getCustomerByTag(List ids); + + + /** + * 根据外部联系人ID和企业员工ID获取当前客户信息 + * @param externalUserid + * @param userid + * @return + */ + WeCustomerPortrait findCustomerByOperUseridAndCustomerId(@Param("externalUserid") String externalUserid,@Param("userid") String userid); + + + /** + * 统计客户社交关系 + * @param externalUserid 客户id + * @param userid 员工id + * @return + */ + WeCustomerSocialConn countSocialConn(@Param("externalUserid")String externalUserid,@Param("userid")String userid); + + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerTrajectoryMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerTrajectoryMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..df13f27153b3ca352788687bc3ab162d5c1e320c --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeCustomerTrajectoryMapper.java @@ -0,0 +1,9 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeCustomerTrajectory; + +public interface WeCustomerTrajectoryMapper extends BaseMapper { + + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupMapper.java index 39b0afa045828473de0dc5eb8935f405d2122678..49f6d3a8daed5d17db65f788c95ee88bbe107741 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupMapper.java @@ -1,6 +1,7 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeCustomerAddGroup; import com.linkwechat.wecom.domain.WeGroup; import org.apache.ibatis.annotations.Param; @@ -27,4 +28,6 @@ public interface WeGroupMapper extends BaseMapper { // int batchLogicDeleteByIds(@Param("ids") List ids); // // int batchInsetWeGroup(@Param("weGroups") List weGroups); + + List findWeGroupByCustomer(@Param("userId") String userId,@Param("externalUserid") String externalUserid); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupStatisticMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupStatisticMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..145b166de83081bb4f6be57f59f1657109f2cfe0 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeGroupStatisticMapper.java @@ -0,0 +1,15 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeGroupStatistic; + +/** + * 群聊数据统计数据 +Mapper接口 + * + * @author ruoyi + * @date 2021-02-24 + */ +public interface WeGroupStatisticMapper extends BaseMapper { + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagGroupMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagGroupMapper.java index 86919511e1994866d0fdf2cbd0e027863e4ea0b2..7343c4876fce31a18da6c2214d2856e9bef72110 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagGroupMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeTagGroupMapper.java @@ -62,4 +62,16 @@ public interface WeTagGroupMapper extends BaseMapper * @return */ public int batchInsetWeTagGroup(@Param("weTagGroups") List weTagGroups); + + + /** + * 根据企业员工与添加客户关系id给客户打标签 + * @param flowerCustomerRelId + * @return + */ + public List findCustomerTagByFlowerCustomerRelId(@Param("flowerCustomerRelId") String flowerCustomerRelId); + + + + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserBehaviorDataMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserBehaviorDataMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..36f1d91017c442a6493e4a49b573405f4cc16ed9 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserBehaviorDataMapper.java @@ -0,0 +1,45 @@ +package com.linkwechat.wecom.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeUserBehaviorData; +import com.linkwechat.wecom.domain.dto.WePageCountDto; +import com.linkwechat.wecom.domain.query.WePageStateQuery; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 联系客户统计数据 Mapper接口 + * + * @author ruoyi + * @date 2021-02-24 + */ +public interface WeUserBehaviorDataMapper extends BaseMapper { + + /** + * 按日期查询当天数据统计结果 + * @param dateTime + * @return WeUserBehaviorDataDto + */ + public WePageCountDto getCountDataByDay(@Param("dateTime") String dateTime, @Param("type") String type); + + /** + * 按天维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + public List getDayCountData(WePageStateQuery wePageStateQuery); + /** + * 按周维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + public List getWeekCountData(WePageStateQuery wePageStateQuery); + /** + * 按月维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + public List getMonthCountData(WePageStateQuery wePageStateQuery); + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java index 49e1b4abe7fa232dfe646a4f1d6b8563197de10a..d4fa04d8f6e062f67c728d4883d61ca7bb75351a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/mapper/WeUserMapper.java @@ -1,6 +1,7 @@ package com.linkwechat.wecom.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linkwechat.wecom.domain.WeCustomerAddUser; import com.linkwechat.wecom.domain.WeUser; import com.linkwechat.wecom.domain.vo.WeAllocateCustomersVo; import com.linkwechat.wecom.domain.vo.WeAllocateGroupsVo; @@ -97,4 +98,12 @@ public interface WeUserMapper extends BaseMapper * @return */ public List getAllocateGroups(WeAllocateGroupsVo weAllocateGroupsVo); + + + /** + * 根据客户id获取客户添加人 + * @param externalUserid + * @return + */ + List findWeUserByCutomerId(@Param("externalUserid") String externalUserid); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java index 978fe107b1a5bdd6af6eb4ecb2541c44c338a414..cffe13910db0890f7290e50f988be5694b4ae321 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCommunityNewGroupService.java @@ -26,13 +26,13 @@ public interface IWeCommunityNewGroupService extends IService selectWeCommunityNewGroupList(WeCommunityNewGroup communityNewGroup); + List selectWeCommunityNewGroupList(String empleCodeName, String createBy, String beginTime, String endTime); /** * 获取新客自动拉群详细信息 + * * @param newGroupId 主键id * @return {@link WeCommunityNewGroupVo} 自动拉群信息 */ @@ -40,6 +40,7 @@ public interface IWeCommunityNewGroupService extends IService idList); + int batchRemoveWeCommunityNewGroupIds(List idList); + + /** + * 通过id查询新客自动拉群信息 + * + * @param id id + * @return {@link WeCommunityNewGroup} 新客自动拉群信息 + */ + WeCommunityNewGroupVo selectWeCommunityNewGroupById(long id); + + /** + * 通过id查询新客自动拉群信息列表 + * + * @param ids id列表 + * @return {@link WeCommunityNewGroup} 新客自动拉群信息 + */ + List selectWeCommunityNewGroupByIds(List ids); + } 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 f02807f2343a10ede5d5b407c6c7b67117088f0c..f80cc58a35f3928499512172aca133ee6907ac1e 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 @@ -2,12 +2,12 @@ package com.linkwechat.wecom.service; import com.baomidou.mybatisplus.extension.service.IService; import com.linkwechat.wecom.domain.WeCustomer; +import com.linkwechat.wecom.domain.WeCustomerPortrait; import com.linkwechat.wecom.domain.WeUser; import com.linkwechat.wecom.domain.dto.WeWelcomeMsg; import com.linkwechat.wecom.domain.vo.WeLeaveUserInfoAllocateVo; import com.linkwechat.wecom.domain.vo.WeMakeCustomerTag; - import java.util.List; /** @@ -109,4 +109,26 @@ public interface IWeCustomerService extends IService * @return */ public List getCustomerByTag(List ids); + + + + /** + * 根据外部联系人ID和企业员工ID获取当前客户信息 + * @param externalUserid + * @param userid + * @return + */ + WeCustomerPortrait findCustomerByOperUseridAndCustomerId(String externalUserid,String userid); + + + /** + * 跟新客户画像 + * @param weCustomerPortrait + */ + void updateWeCustomerPortrait(WeCustomerPortrait weCustomerPortrait); + + + + + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerTrajectoryService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerTrajectoryService.java new file mode 100644 index 0000000000000000000000000000000000000000..700bc077641cfb2315fc2735cf60e4226a7f6d5d --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeCustomerTrajectoryService.java @@ -0,0 +1,8 @@ +package com.linkwechat.wecom.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.linkwechat.wecom.domain.WeCustomerTrajectory; + +public interface IWeCustomerTrajectoryService extends IService { + +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupService.java index a043b1462ab28d324642c581fd1caa7e56f8d89c..083eccaf2893ee2ec6f66d551f225cd45bc30147 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupService.java @@ -1,6 +1,7 @@ package com.linkwechat.wecom.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.linkwechat.wecom.domain.WeCustomerAddGroup; import com.linkwechat.wecom.domain.WeGroup; import com.linkwechat.wecom.domain.vo.WeLeaveUserInfoAllocateVo; @@ -26,4 +27,6 @@ public interface IWeGroupService extends IService { void updateWeGroup(String chatId); void deleteWeGroup(String chatId); + + List findWeGroupByCustomer(String userId,String externalUserid); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupStatisticService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupStatisticService.java new file mode 100644 index 0000000000000000000000000000000000000000..8c2b56c3fc561a7787ca774c711ce7396828e9d6 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeGroupStatisticService.java @@ -0,0 +1,21 @@ +package com.linkwechat.wecom.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.linkwechat.wecom.domain.WeGroupStatistic; + +import java.util.List; + +/** + * 群聊数据统计数据 +Service接口 + * + * @author ruoyi + * @date 2021-02-24 + */ +public interface IWeGroupStatisticService extends IService { + + /** + * 查询列表 + */ + List queryList(WeGroupStatistic weGroupStatistic); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTagGroupService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTagGroupService.java index b0e29ea2121c5f7ab9c349f0b43c5105d6c18db8..4828d2d8543a6c56d89f2ec62322ede56915087a 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTagGroupService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeTagGroupService.java @@ -1,11 +1,11 @@ package com.linkwechat.wecom.service; -import java.util.List; - import com.baomidou.mybatisplus.extension.service.IService; import com.linkwechat.wecom.domain.WeTagGroup; import com.linkwechat.wecom.domain.dto.tag.WeCropGroupTagDto; +import java.util.List; + /** * 标签组Service接口 * @@ -69,4 +69,13 @@ public interface IWeTagGroupService extends IService void deleteTagGroup(String id); void updateTagGroup(String id); + + + + /** + * 根据企业员工与添加客户关系id给客户打标签 + * @param flowerCustomerRelId + * @return + */ + public List findCustomerTagByFlowerCustomerRelId(String flowerCustomerRelId); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserBehaviorDataService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserBehaviorDataService.java new file mode 100644 index 0000000000000000000000000000000000000000..904cae6f46f0773216d111e6d5b144e5e468dae7 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserBehaviorDataService.java @@ -0,0 +1,49 @@ +package com.linkwechat.wecom.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.linkwechat.wecom.domain.WeUserBehaviorData; +import com.linkwechat.wecom.domain.dto.WePageCountDto; +import com.linkwechat.wecom.domain.query.WePageStateQuery; + +import java.util.List; + +/** + * 联系客户统计数据 Service接口 + * + * @author ruoyi + * @date 2021-02-24 + */ +public interface IWeUserBehaviorDataService extends IService { + + /** + * 查询列表 + */ + List queryList(WeUserBehaviorData weUserBehaviorData); + + /** + * 按日期查询当天数据统计结果 + * @param dateTime + * @return WeUserBehaviorDataDto + */ + WePageCountDto getCountDataByDay(String dateTime,String type); + + /** + * 按天维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + List getDayCountData(WePageStateQuery wePageStateQuery); + /** + * 按周维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + List getWeekCountData(WePageStateQuery wePageStateQuery); + + /** + * 按月维度查询数据统计 + * @param wePageStateQuery 入参 + * @return List + */ + List getMonthCountData(WePageStateQuery wePageStateQuery); +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserService.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserService.java index 0ecbd8be724022c14a350007cfbaf19aa6cb3648..c31b06b54f3b42b448015ec021301dc8544995cd 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserService.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeUserService.java @@ -2,10 +2,12 @@ package com.linkwechat.wecom.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dtflys.forest.annotation.Query; +import com.linkwechat.wecom.domain.WeCustomerAddUser; import com.linkwechat.wecom.domain.WeUser; import com.linkwechat.wecom.domain.dto.WeUserInfoDto; import com.linkwechat.wecom.domain.dto.msgaudit.WeMsgAuditDto; import com.linkwechat.wecom.domain.vo.*; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -144,4 +146,12 @@ public interface IWeUserService extends IService * @return */ WeUserInfoVo getUserInfo(String code,String agentId); + + + /** + * 根据客户id获取客户添加人 + * @param externalUserid + * @return + */ + List findWeUserByCutomerId(String externalUserid); } 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 d979970a3b56e14d33be51d3bceee62db97472cf..40dd47d5abadf74159d36e1ddb48a403e58edc6a 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,23 +1,28 @@ package com.linkwechat.wecom.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.common.utils.SecurityUtils; -import com.linkwechat.wecom.domain.WeCommunityNewGroup; -import com.linkwechat.wecom.domain.WeEmpleCode; -import com.linkwechat.wecom.domain.WeGroupCode; +import com.linkwechat.wecom.client.WeExternalContactClient; +import com.linkwechat.wecom.domain.*; import com.linkwechat.wecom.domain.dto.WeCommunityNewGroupDto; +import com.linkwechat.wecom.domain.dto.WeExternalContactDto; import com.linkwechat.wecom.domain.vo.WeCommunityNewGroupVo; import com.linkwechat.wecom.mapper.WeCommunityNewGroupMapper; import com.linkwechat.wecom.mapper.WeGroupCodeMapper; import com.linkwechat.wecom.service.IWeCommunityNewGroupService; -import com.linkwechat.wecom.service.IWeEmpleCodeService; +import com.linkwechat.wecom.service.IWeEmpleCodeTagService; +import com.linkwechat.wecom.service.IWeEmpleCodeUseScopService; +import com.linkwechat.wecom.service.IWeGroupCodeActualService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * 社群运营 新客自动拉群 @@ -27,58 +32,133 @@ import java.util.List; */ @Service @Slf4j -public class WeCommunityNewGroupServiceImpl extends ServiceImpl implements IWeCommunityNewGroupService { +public class WeCommunityNewGroupServiceImpl extends ServiceImpl implements IWeCommunityNewGroupService { @Autowired private WeGroupCodeMapper weGroupCodeMapper; @Autowired - private IWeEmpleCodeService weEmpleCodeService; + private WeEmpleCodeServiceImpl weEmpleCodeService; @Autowired private WeCommunityNewGroupMapper weCommunityNewGroupMapper; + @Autowired + private IWeEmpleCodeTagService weEmpleCodeTagService; + + + @Autowired + private IWeEmpleCodeUseScopService iWeEmpleCodeUseScopService; + + @Autowired + private WeExternalContactClient weExternalContactClient; + + @Autowired + private IWeGroupCodeActualService weGroupCodeActualService; + @Override public int add(WeCommunityNewGroupDto communityNewGroupDto) { //检查群活码是否存在 WeGroupCode weGroupCode = weGroupCodeMapper.selectWeGroupCodeById(communityNewGroupDto.getGroupCodeId()); - if(null!=weGroupCode){ + if (null == weGroupCode) { throw new WeComException("群活码不存在!"); } - WeEmpleCode weEmpleCode=new WeEmpleCode(); - weEmpleCode.setCodeType(2); - weEmpleCode.setActivityScene(communityNewGroupDto.getActivityScene()); - weEmpleCode.setIsJoinConfirmFriends(communityNewGroupDto.getIsJoinConfirmFriends()); - weEmpleCode.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); - weEmpleCode.setWeEmpleCodeUseScops(communityNewGroupDto.getWeEmpleCodeUseScops()); - weEmpleCode.setWeEmpleCodeTags(communityNewGroupDto.getWeEmpleCodeTags()); - weEmpleCode.setCreateTime(new Date()); - weEmpleCode.setCreateBy(SecurityUtils.getUsername()); + WeEmpleCode weEmpleCode = getWeEmpleCode(communityNewGroupDto); + //生成员工活码信息 - weEmpleCodeService.insertWeEmpleCode(weEmpleCode); + WeExternalContactDto.WeContactWay weContactWay = weEmpleCodeService.getWeContactWay(weEmpleCode); + WeExternalContactDto qrCode = weEmpleCodeService.getQrCode(weContactWay); + //保存新客自动拉群信息 - WeCommunityNewGroup communityNewGroup=new WeCommunityNewGroup(); + WeCommunityNewGroup communityNewGroup = new WeCommunityNewGroup(); communityNewGroup.setNewGroupId(weGroupCode.getId()); - communityNewGroup.setEmpleCodeId(weEmpleCode.getId()); communityNewGroup.setEmpleCodeName(communityNewGroupDto.getActivityScene()); communityNewGroup.setDelFlag(0); communityNewGroup.setCreateTime(new Date()); communityNewGroup.setCreateBy(SecurityUtils.getUsername()); - this.save(communityNewGroup); + communityNewGroup.setActivityScene(communityNewGroupDto.getActivityScene()); + communityNewGroup.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); + communityNewGroup.setIsJoinConfirmFriends(communityNewGroupDto.getIsJoinConfirmFriends()); + communityNewGroup.setMediaId(communityNewGroup.getMediaId()); + + if (qrCode != null) { + communityNewGroup.setQrCode(qrCode.getQr_code()); + } + + if (this.save(communityNewGroup)) { + if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeUseScops())) { + weEmpleCode.getWeEmpleCodeUseScops().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); + iWeEmpleCodeUseScopService.saveBatch(weEmpleCode.getWeEmpleCodeUseScops()); + } + if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) { + weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); + weEmpleCodeTagService.saveBatch(weEmpleCode.getWeEmpleCodeTags()); + } + } return 1; } + private WeEmpleCode getWeEmpleCode(WeCommunityNewGroupDto communityNewGroupDto) { + WeEmpleCode weEmpleCode = new WeEmpleCode(); + weEmpleCode.setCodeType(2); + weEmpleCode.setActivityScene(communityNewGroupDto.getActivityScene()); + weEmpleCode.setIsJoinConfirmFriends(communityNewGroupDto.getIsJoinConfirmFriends()); + weEmpleCode.setWelcomeMsg(communityNewGroupDto.getWelcomeMsg()); + weEmpleCode.setWeEmpleCodeUseScops(communityNewGroupDto.getWeEmpleCodeUseScops()); + weEmpleCode.setWeEmpleCodeTags(communityNewGroupDto.getWeEmpleCodeTags()); + weEmpleCode.setQrCode(communityNewGroupDto.getQrCode()); + weEmpleCode.setMediaId(communityNewGroupDto.getMediaId()); + return weEmpleCode; + } + @Override - public List selectWeCommunityNewGroupList(WeCommunityNewGroup communityNewGroup) { - return weCommunityNewGroupMapper.selectWeCommunityNewGroupList(communityNewGroup); + public List selectWeCommunityNewGroupList(String empleCodeName, String createBy, String beginTime, String endTime) { + List weCommunityNewGroupVos = weCommunityNewGroupMapper.selectWeCommunityNewGroupList(empleCodeName, createBy, beginTime, endTime); + if (CollectionUtil.isNotEmpty(weCommunityNewGroupVos)) { + List newGroupIdList = weCommunityNewGroupVos.stream().map(WeCommunityNewGroupVo::getNewGroupId).collect(Collectors.toList()); + List useScopList = iWeEmpleCodeUseScopService.selectWeEmpleCodeUseScopListByIds(newGroupIdList); + List tagList = weEmpleCodeTagService.selectWeEmpleCodeTagListByIds(newGroupIdList); + weCommunityNewGroupVos.forEach(newGroup -> { + List weGroupCodeActuals = getWeGroupCodeActuals(newGroup); + newGroup.setWeGroupUserScops(weGroupCodeActuals); + //活码使用人对象 + List weEmpleCodeUseScopList = useScopList.stream() + .filter(useScop -> useScop.getEmpleCodeId().equals(newGroup.getNewGroupId())).collect(Collectors.toList()); + newGroup.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); + //员工活码标签对象 + newGroup.setWeEmpleCodeTags(tagList.stream() + .filter(tag -> tag.getEmpleCodeId().equals(newGroup.getNewGroupId())).collect(Collectors.toList())); + }); + } + return weCommunityNewGroupVos; } @Override public WeCommunityNewGroupVo selectWeCommunityNewGroupById(Long newGroupId) { - return weCommunityNewGroupMapper.selectWeCommunityNewGroupById(newGroupId); + WeCommunityNewGroupVo weCommunityNewGroupVo = weCommunityNewGroupMapper.selectWeCommunityNewGroupById(newGroupId); + if (null != weCommunityNewGroupVo) { + List weGroupCodeActuals = getWeGroupCodeActuals(weCommunityNewGroupVo); + weCommunityNewGroupVo.setWeGroupUserScops(weGroupCodeActuals); + List useScopList = iWeEmpleCodeUseScopService.selectWeEmpleCodeUseScopListByIds(Lists.newArrayList(weCommunityNewGroupVo.getNewGroupId())); + List tagList = weEmpleCodeTagService.selectWeEmpleCodeTagListByIds(Lists.newArrayList(weCommunityNewGroupVo.getNewGroupId())); + //活码使用人对象 + List weEmpleCodeUseScopList = useScopList.stream() + .filter(useScop -> useScop.getEmpleCodeId().equals(weCommunityNewGroupVo.getNewGroupId())).collect(Collectors.toList()); + weCommunityNewGroupVo.setWeEmpleCodeUseScops(weEmpleCodeUseScopList); + //员工活码标签对象 + weCommunityNewGroupVo.setWeEmpleCodeTags(tagList.stream() + .filter(tag -> tag.getEmpleCodeId().equals(weCommunityNewGroupVo.getNewGroupId())).collect(Collectors.toList())); + } + return weCommunityNewGroupVo; + } + + private List getWeGroupCodeActuals(WeCommunityNewGroupVo weCommunityNewGroupVo) { + WeGroupCodeActual weGroupCodeActual = new WeGroupCodeActual(); + weGroupCodeActual.setGroupCodeId(weCommunityNewGroupVo.getNewGroupId()); + return weGroupCodeActualService.selectWeGroupCodeActualList(weGroupCodeActual); } @Override @@ -86,36 +166,47 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl item.setEmpleCodeId(communityNewGroup.getNewGroupId())); + iWeEmpleCodeUseScopService.updateBatchById(weEmpleCode.getWeEmpleCodeUseScops()); + } + if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) { + weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(communityNewGroup.getNewGroupId())); + weEmpleCodeTagService.updateBatchById(weEmpleCode.getWeEmpleCodeTags()); + } + } return 1; } @@ -125,4 +216,13 @@ public class WeCommunityNewGroupServiceImpl extends ServiceImpl selectWeCommunityNewGroupByIds(List ids) { + return weCommunityNewGroupMapper.selectWeCommunityNewGroupByIds(ids); + } } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeConversationArchiveServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeConversationArchiveServiceImpl.java index c329a887b1be864584d865a5aa6a3f3dcc40ca81..b994dd68b14f8679c31422b7b763f43166fa499e 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeConversationArchiveServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeConversationArchiveServiceImpl.java @@ -18,6 +18,7 @@ import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.Date; @@ -34,6 +35,9 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS @Autowired private ElasticSearch elasticSearch; + @Value("${wecome.chatKey}") + private String chartKey; + /** * 根据用户ID 获取对应内部联系人列表 * @@ -49,7 +53,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS int from = (pageNum - 1) * pageSize; builder.size(pageSize); builder.from(from); - builder.sort("msgtime", SortOrder.DESC); + builder.sort("msgtime", SortOrder.ASC); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", query.getFromId())) .must(QueryBuilders.matchQuery("tolist.keyword", query.getReceiveId())); @@ -73,7 +77,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS boolQueryBuilder.filter(QueryBuilders.rangeQuery("msgtime").gte(beginTime).lte(endTime)); } builder.query(boolQueryBuilder); - return elasticSearch.searchPage(WeConstans.WECOM_FINANCE_INDEX, builder, pageNum, pageSize, JSONObject.class); + return elasticSearch.searchPage(chartKey, builder, pageNum, pageSize, JSONObject.class); } @Override @@ -85,7 +89,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS int from = (pageNum - 1) * pageSize; builder.size(pageSize); builder.from(from); - builder.sort("msgtime", SortOrder.DESC); + builder.sort("msgtime", SortOrder.ASC); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", query.getRoomId())) .must(QueryBuilders.matchQuery("from", query.getFromId())); @@ -111,14 +115,14 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS } builder.query(boolQueryBuilder); - return elasticSearch.searchPage(WeConstans.WECOM_FINANCE_INDEX, builder, pageNum, pageSize, JSONObject.class); + return elasticSearch.searchPage(chartKey, builder, pageNum, pageSize, JSONObject.class); } @Override public JSONObject getFinalChatContactInfo(String fromId, String receiveId) { SearchSourceBuilder builder = new SearchSourceBuilder(); - builder.sort("msgtime", SortOrder.DESC); + builder.sort("msgtime", SortOrder.ASC); builder.size(1); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", fromId)) @@ -132,7 +136,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS .should(toLsitBuilder) .minimumShouldMatch(1); builder.query(boolQueryBuilder); - List resultList = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, builder, JSONObject.class); + List resultList = elasticSearch.search(chartKey, builder, JSONObject.class); if (CollectionUtil.isNotEmpty(resultList)) { return resultList.get(0); } else { @@ -143,7 +147,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS @Override public JSONObject getFinalChatRoomContactInfo(String fromId, String roomId) { SearchSourceBuilder builder = new SearchSourceBuilder(); - builder.sort("msgtime", SortOrder.DESC); + builder.sort("msgtime", SortOrder.ASC); builder.size(1); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", roomId)) .must(QueryBuilders.matchQuery("from", fromId)); @@ -154,7 +158,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS .should(fromBuilder) .should(roomidBuilder); builder.query(boolQueryBuilder); - List resultList = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, builder, JSONObject.class); + List resultList = elasticSearch.search(chartKey, builder, JSONObject.class); if (CollectionUtil.isNotEmpty(resultList)) { return resultList.get(0); } else { @@ -171,10 +175,10 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS int from = (pageNum - 1) * pageSize; builder.size(pageSize); builder.from(from); - builder.sort("msgtime", SortOrder.DESC); + builder.sort("msgtime", SortOrder.ASC); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - + boolQueryBuilder.must(QueryBuilders.termQuery("msgtype", "text")); //成员姓名查询 if(StringUtils.isNotEmpty(query.getUserName())){ boolQueryBuilder.must(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("fromInfo.name",query.getUserName())) @@ -204,7 +208,7 @@ public class WeConversationArchiveServiceImpl implements IWeConversationArchiveS boolQueryBuilder.filter(QueryBuilders.rangeQuery("msgtime").gte(beginTime).lte(endTime)); } builder.query(boolQueryBuilder); - PageInfo pageInfo = elasticSearch.searchPage(WeConstans.WECOM_FINANCE_INDEX, builder, pageNum, pageSize, JSONObject.class); + PageInfo pageInfo = elasticSearch.searchPage(chartKey, builder, pageNum, pageSize, JSONObject.class); return pageInfo; } } 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 db579e286f3f2ea3ce2d0248492585e3633ceb32..3168c12b145bfe4249f62b20c2d391537556a17a 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 @@ -8,7 +8,6 @@ import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.utils.SecurityUtils; import com.linkwechat.common.utils.SnowFlakeUtil; import com.linkwechat.common.utils.StringUtils; -import com.linkwechat.common.utils.Threads; import com.linkwechat.common.utils.bean.BeanUtils; import com.linkwechat.wecom.client.WeCropTagClient; import com.linkwechat.wecom.client.WeCustomerClient; @@ -626,4 +625,55 @@ public class WeCustomerServiceImpl extends ServiceImpl() + .eq(WeFlowerCustomerRel::getExternalUserid,weCustomerPortrait.getExternalUserid()) + .eq(WeFlowerCustomerRel::getUserId,weCustomerPortrait.getUserId())); + + } + + + + + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerTrajectoryServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerTrajectoryServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e71773b76d51843b83c5393415995b5d93ec0b4b --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeCustomerTrajectoryServiceImpl.java @@ -0,0 +1,11 @@ +package com.linkwechat.wecom.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linkwechat.wecom.domain.WeCustomerTrajectory; +import com.linkwechat.wecom.mapper.WeCustomerTrajectoryMapper; +import com.linkwechat.wecom.service.IWeCustomerTrajectoryService; +import org.springframework.stereotype.Service; + +@Service +public class WeCustomerTrajectoryServiceImpl extends ServiceImpl implements IWeCustomerTrajectoryService { +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java index e094117de86b5e230064666f60b9e62b086fc52e..ce146e59dfd9d04294ac83239dee1cfb2d33279b 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeEmpleCodeServiceImpl.java @@ -326,7 +326,7 @@ public class WeEmpleCodeServiceImpl extends ServiceImpl weEmpleCodeUseScops = weEmpleCode.getWeEmpleCodeUseScops(); //根据类型生成相应的活码 diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java index bd9ee7ea9d5ee545e19a3e7abf38941452cc2e16..b46fcee395124f011fe214f99b557dc866abed45 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupCodeServiceImpl.java @@ -102,12 +102,6 @@ public class WeGroupCodeServiceImpl extends ServiceImpl impl @Autowired private IWeGroupMemberService iWeGroupMemberService; - @Autowired - private IWeUserService weUserService; - - @Autowired - private IWeCustomerService weCustomerService; @Autowired @@ -206,20 +204,11 @@ public class WeGroupServiceImpl extends ServiceImpl impl this.saveOrUpdateBatch(weGroups); List weGroupMemberList = iWeGroupMemberService.list(new LambdaQueryWrapper().in(WeGroupMember::getChatId, weGroups.stream().map(WeGroup::getChatId).collect(Collectors.toList()))); - //存量去重 + if (CollectionUtil.isNotEmpty(weGroupMemberList)) { - List groupMemberList = weGroupMembers.stream().filter(e -> { - for (WeGroupMember weGroupMember : weGroupMemberList) { - if (e.getUserId().equals(weGroupMember.getUserId())) { - return false; - } - } - return true; - }).collect(Collectors.toList()); - iWeGroupMemberService.saveBatch(groupMemberList); - } else { - iWeGroupMemberService.saveBatch(weGroupMembers); + iWeGroupMemberService.removeByIds(weGroupMemberList.stream().map(WeGroupMember::getId).collect(Collectors.toList())); } + iWeGroupMemberService.saveBatch(weGroupMembers); } @@ -332,4 +321,9 @@ public class WeGroupServiceImpl extends ServiceImpl impl iWeGroupMemberService.remove(new LambdaQueryWrapper().eq(WeGroupMember::getChatId,chatId)); } + @Override + public List findWeGroupByCustomer(String userId, String externalUserid) { + return this.baseMapper.findWeGroupByCustomer(userId,externalUserid); + } + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupStatisticServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupStatisticServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..609fe1bb890dec38c278b3160d263a8e94d87752 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeGroupStatisticServiceImpl.java @@ -0,0 +1,57 @@ +package com.linkwechat.wecom.service.impl; + +import com.linkwechat.wecom.domain.WeGroupStatistic; +import com.linkwechat.wecom.mapper.WeGroupStatisticMapper; +import com.linkwechat.wecom.service.IWeGroupStatisticService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * 群聊数据统计数据 +Service业务层处理 + * + * @author ruoyi + * @date 2021-02-24 + */ +@Service +public class WeGroupStatisticServiceImpl extends ServiceImpl implements IWeGroupStatisticService { + + @Override + public List queryList(WeGroupStatistic weGroupStatistic) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(weGroupStatistic.getChatId())){ + lqw.eq(WeGroupStatistic::getChatId ,weGroupStatistic.getChatId()); + } + if (weGroupStatistic.getStatTime() != null){ + lqw.eq(WeGroupStatistic::getStatTime ,weGroupStatistic.getStatTime()); + } + if (weGroupStatistic.getNewChatCnt() != null){ + lqw.eq(WeGroupStatistic::getNewChatCnt ,weGroupStatistic.getNewChatCnt()); + } + if (weGroupStatistic.getChatTotal() != null){ + lqw.eq(WeGroupStatistic::getChatTotal ,weGroupStatistic.getChatTotal()); + } + if (weGroupStatistic.getChatHasMsg() != null){ + lqw.eq(WeGroupStatistic::getChatHasMsg ,weGroupStatistic.getChatHasMsg()); + } + if (weGroupStatistic.getNewMemberCnt() != null){ + lqw.eq(WeGroupStatistic::getNewMemberCnt ,weGroupStatistic.getNewMemberCnt()); + } + if (weGroupStatistic.getMemberTotal() != null){ + lqw.eq(WeGroupStatistic::getMemberTotal ,weGroupStatistic.getMemberTotal()); + } + if (weGroupStatistic.getMemberHasMsg() != null){ + lqw.eq(WeGroupStatistic::getMemberHasMsg ,weGroupStatistic.getMemberHasMsg()); + } + if (weGroupStatistic.getMsgTotal() != null){ + lqw.eq(WeGroupStatistic::getMsgTotal ,weGroupStatistic.getMsgTotal()); + } + return this.list(lqw); + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePosterServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePosterServiceImpl.java index e264e27bfe63a345200ce7073b4de4ca91d035dd..871385294097875c7a502b841b69dbccb74ba484 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePosterServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WePosterServiceImpl.java @@ -126,14 +126,25 @@ public class WePosterServiceImpl extends ServiceImpl i poster.setSampleImgPath(poster.getBackgroundImgPath()); return poster.getBackgroundImgPath(); } - Map fontMap = poster.getPosterSubassemblyList().stream().filter(wePosterSubassembly -> wePosterSubassembly.getType().equals(1)) + Set existFontId = new HashSet<>(); + Map fontMap = poster.getPosterSubassemblyList().stream().filter(wePosterSubassembly -> wePosterSubassembly.getType().equals(1)) .peek(wePosterSubassembly -> { - if(wePosterSubassembly.getFontId() == null){ + if (wePosterSubassembly.getFontId() == null) { wePosterSubassembly.setFontId(0L); } }) - .collect(Collectors.toMap(WePosterSubassembly::getFontId, wePosterSubassembly -> posterFontService.getFont(wePosterSubassembly.getFontId(), wePosterSubassembly.getFontSize(),wePosterSubassembly.getFontStyle()))); - Map fileCallableMap = poster.getPosterSubassemblyList().stream().filter(wePosterSubassembly -> StringUtils.isNotBlank(wePosterSubassembly.getImgPath())).distinct().collect(Collectors.toMap(WePosterSubassembly::getImgPath, wePosterSubassembly -> NetFileUtils.getNetFile(wePosterSubassembly.getImgPath()))); + .filter(wePosterSubassembly -> { + if(existFontId.contains(wePosterSubassembly.getFontId()+"_"+wePosterSubassembly.getFontSize()+"_"+wePosterSubassembly.getFontStyle())){ + return false; + }else { + existFontId.add(wePosterSubassembly.getFontId()+"_"+wePosterSubassembly.getFontSize()+"_"+wePosterSubassembly.getFontStyle()); + return true; + } + }) + .collect(Collectors.toMap(wePosterSubassembly -> { + return wePosterSubassembly.getFontId()+"_"+wePosterSubassembly.getFontSize()+"_"+wePosterSubassembly.getFontStyle(); + }, wePosterSubassembly -> posterFontService.getFont(wePosterSubassembly.getFontId(), wePosterSubassembly.getFontSize(),wePosterSubassembly.getFontStyle()))); + Map fileCallableMap = poster.getPosterSubassemblyList().stream().map(WePosterSubassembly::getImgPath).filter(StringUtils::isNotBlank).distinct().collect(Collectors.toMap(s->s, NetFileUtils::getNetFile)); if (CollectionUtils.isEmpty(fileCallableMap)) { fileCallableMap = new HashMap<>(); } @@ -151,7 +162,7 @@ public class WePosterServiceImpl extends ServiceImpl i poster.setHeight(backgroundImg.getHeight()); poster.getPosterSubassemblyList().forEach(wePosterSubassembly -> { if (wePosterSubassembly.getType().equals(1)) { - Font font = fontMap.get(wePosterSubassembly.getFontId()); + Font font = fontMap.get(wePosterSubassembly.getFontId()+"_"+wePosterSubassembly.getFontSize()+"_"+wePosterSubassembly.getFontStyle()); FontMetrics fontMetrics = ImageUtils.getFontMetrics(font); Color color; if (StringUtils.isNotBlank(wePosterSubassembly.getFontColor())) { diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java index aee74fc0a24412a79647dd59518aab964db8b009..8168615b4362abb7878de9b7073c17ecd57499eb 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java @@ -35,11 +35,13 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -70,6 +72,9 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService { @Autowired private IWeCorpAccountService weCorpAccountService; + @Value("${wecome.chatKey}") + private String chartKey; + /** * 查询敏感词设置 * @@ -256,8 +261,23 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService { private void addHitSensitiveList(List json, WeSensitive weSensitive) { elasticSearch.createIndex2(WeConstans.WECOM_SENSITIVE_HIT_INDEX, getSensitiveHitMapping()); - boolean sendMessage = false; - if (weSensitive.getAlertFlag().equals(1)) { + //批量提交插入记录 + if (CollectionUtils.isNotEmpty(json)) { + List list = json.stream().filter(Objects::nonNull).map(j -> { + ElasticSearchEntity ese = new ElasticSearchEntity(); + j.put("status", "0"); + ese.setData(j); + ese.setId(j.getString("msgid")); + return ese; + }).collect(Collectors.toList()); + elasticSearch.insertBatchAsync(WeConstans.WECOM_SENSITIVE_HIT_INDEX, list, this::sendMessage, weSensitive); + } + } + + private void sendMessage(Object listObj, Object weSensitiveObj) { + WeSensitive weSensitive = (WeSensitive) weSensitiveObj; + List list = (List) listObj; + if (weSensitive.getAlertFlag().equals(1) && CollectionUtils.isNotEmpty(list)) { //发送消息通知给相应的审计人 WeCorpAccount weCorpAccount = weCorpAccountService.findValidWeCorpAccount(); String auditUserId = weSensitive.getAuditUserId(); @@ -268,22 +288,14 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService { pushDto.setTouser(auditUserId); pushDto.setMsgtype(MessageType.TEXT.getMessageType()); pushDto.setText(textMessageDto); - weMessagePushClient.sendMessageToUser(pushDto,weCorpAccount.getAgentId()); - sendMessage = true; - } - //批量提交插入记录 - if (CollectionUtils.isNotEmpty(json)) { - boolean finalSendMessage = sendMessage; - List list = json.stream().filter(Objects::nonNull).map(j -> { - ElasticSearchEntity ese = new ElasticSearchEntity(); - if (finalSendMessage) { - j.put("status", "1"); - } - ese.setData(j); - ese.setId(j.getString("msgid")); - return ese; + weMessagePushClient.sendMessageToUser(pushDto, weCorpAccount.getAgentId()); + //批量更新 + list = list.stream().peek(entity -> { + Map map = entity.getData(); + map.put("status", "1"); + entity.setData(map); }).collect(Collectors.toList()); - elasticSearch.insertBatch(WeConstans.WECOM_SENSITIVE_HIT_INDEX, list); + elasticSearch.updateBatch(WeConstans.WECOM_SENSITIVE_HIT_INDEX, list); } } @@ -314,7 +326,7 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService { userBuilder.minimumShouldMatch(1); BoolQueryBuilder searchBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchPhraseQuery("text.content", patternWord)).must(userBuilder); builder.query(searchBuilder); - List list = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, builder, JSONObject.class); + List list = elasticSearch.search(chartKey, builder, JSONObject.class); list.parallelStream().forEach(j -> j.put("pattern_words", patternWord)); resultList.addAll(list); } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTagGroupServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTagGroupServiceImpl.java index 11b917ca204c253a14466bd7340aec74c285b8de..065aadb16be11f5aea21fe1bcb8ef72cb6db0725 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTagGroupServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeTagGroupServiceImpl.java @@ -337,5 +337,10 @@ public class WeTagGroupServiceImpl extends ServiceImpl findCustomerTagByFlowerCustomerRelId(String flowerCustomerRelId) { + return this.baseMapper.findCustomerTagByFlowerCustomerRelId(flowerCustomerRelId); + } + } diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserBehaviorDataServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserBehaviorDataServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c50f32a36255a575da502d9a57af13e835f65e37 --- /dev/null +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserBehaviorDataServiceImpl.java @@ -0,0 +1,77 @@ +package com.linkwechat.wecom.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linkwechat.wecom.domain.WeUserBehaviorData; +import com.linkwechat.wecom.domain.dto.WePageCountDto; +import com.linkwechat.wecom.domain.query.WePageStateQuery; +import com.linkwechat.wecom.mapper.WeUserBehaviorDataMapper; +import com.linkwechat.wecom.service.IWeUserBehaviorDataService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 联系客户统计数据 Service业务层处理 + * + * @author ruoyi + * @date 2021-02-24 + */ +@Service +public class WeUserBehaviorDataServiceImpl extends ServiceImpl implements IWeUserBehaviorDataService { + + @Override + public List queryList(WeUserBehaviorData weUserBehaviorData) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(weUserBehaviorData.getUserId())){ + lqw.eq(WeUserBehaviorData::getUserId ,weUserBehaviorData.getUserId()); + } + if (weUserBehaviorData.getStatTime() != null){ + lqw.eq(WeUserBehaviorData::getStatTime ,weUserBehaviorData.getStatTime()); + } + if (weUserBehaviorData.getNewApplyCnt() != null){ + lqw.eq(WeUserBehaviorData::getNewApplyCnt ,weUserBehaviorData.getNewApplyCnt()); + } + if (weUserBehaviorData.getNewContactCnt() != null){ + lqw.eq(WeUserBehaviorData::getNewContactCnt ,weUserBehaviorData.getNewContactCnt()); + } + if (weUserBehaviorData.getChatCnt() != null){ + lqw.eq(WeUserBehaviorData::getChatCnt ,weUserBehaviorData.getChatCnt()); + } + if (weUserBehaviorData.getMessageCnt() != null){ + lqw.eq(WeUserBehaviorData::getMessageCnt ,weUserBehaviorData.getMessageCnt()); + } + if (weUserBehaviorData.getReplyPercentage() != null){ + lqw.eq(WeUserBehaviorData::getReplyPercentage ,weUserBehaviorData.getReplyPercentage()); + } + if (weUserBehaviorData.getAvgReplyTime() != null){ + lqw.eq(WeUserBehaviorData::getAvgReplyTime ,weUserBehaviorData.getAvgReplyTime()); + } + if (weUserBehaviorData.getNegativeFeedbackCnt() != null){ + lqw.eq(WeUserBehaviorData::getNegativeFeedbackCnt ,weUserBehaviorData.getNegativeFeedbackCnt()); + } + return this.list(lqw); + } + + @Override + public WePageCountDto getCountDataByDay(String dateTime,String type) { + return this.baseMapper.getCountDataByDay(dateTime,type); + } + + @Override + public List getDayCountData(WePageStateQuery wePageStateQuery) { + return this.baseMapper.getDayCountData(wePageStateQuery); + } + + @Override + public List getWeekCountData(WePageStateQuery wePageStateQuery) { + return this.baseMapper.getWeekCountData(wePageStateQuery); + } + + @Override + public List getMonthCountData(WePageStateQuery wePageStateQuery) { + return this.baseMapper.getMonthCountData(wePageStateQuery); + } +} diff --git a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserServiceImpl.java b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserServiceImpl.java index e2b5869b579061f5852b79fbf9a4443742458117..b5cc4829f6137f64c26b7f1d3bdb0e455d0c9303 100644 --- a/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserServiceImpl.java +++ b/linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeUserServiceImpl.java @@ -8,6 +8,7 @@ import com.linkwechat.common.core.redis.RedisCache; import com.linkwechat.common.exception.wecom.WeComException; import com.linkwechat.wecom.client.WeMsgAuditClient; import com.linkwechat.wecom.client.WeUserClient; +import com.linkwechat.wecom.domain.WeCustomerAddUser; import com.linkwechat.wecom.domain.WeUser; import com.linkwechat.wecom.domain.dto.WeUserInfoDto; import com.linkwechat.wecom.domain.dto.msgaudit.WeMsgAuditDto; @@ -222,8 +223,9 @@ public class WeUserServiceImpl extends ServiceImpl implemen List weUsers = weUserClient.list(WeConstans.WE_ROOT_DEPARMENT_ID, WeConstans.DEPARTMENT_SUB_WEUSER).getWeUsers(); if(CollectionUtil.isNotEmpty(weUsers)){ - - this.saveOrUpdateBatch(weUsers); + weUsers.forEach(userInfo ->{ + insertWeUserNoToWeCom(userInfo); + }); } } @@ -316,5 +318,10 @@ public class WeUserServiceImpl extends ServiceImpl implemen } + @Override + public List findWeUserByCutomerId(String externalUserid) { + return this.baseMapper.findWeUserByCutomerId(externalUserid); + } + } diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml index 6a57d7e04a0cbfef15bc590e46b3e9ba0330f4a4..22c4dc9683b3fab1ffa6e39b34a9133c33f3e469 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeCommunityNewGroupMapper.xml @@ -4,24 +4,71 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + SELECT new_group_id, + emple_code_name, + group_code_id, + create_by, + create_time, + update_by, + update_time, + del_flag, + activity_scene, + welcome_msg, + qr_code, + is_join_confirm_friends, + media_id, + join_friend_nums + FROM we_community_new_group + update we_community_new_group set del_flag = 1 where new_group_id in - #{newGroupId} + #{id} + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMapper.xml index 73693b34c30380c5f234f21966da8866ab7a06e2..2063757514ef277feed4d46235e1481f642cfb4e 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMapper.xml @@ -303,4 +303,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMessageOriginalMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMessageOriginalMapper.xml index 7f92fba68ade4f03f32dd7219c39c23ba56529cf..c0e84d813756d33dd40eb084d848fcb779ffc32b 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMessageOriginalMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeCustomerMessageOriginalMapper.xml @@ -40,6 +40,7 @@ AND wcm.create_by=#{sender} + ORDER BY wcmo.create_time DESC + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupStatisticMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupStatisticMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..69ff242309f05fafec849ba723da1fbb562f0823 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeGroupStatisticMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeTagGroupMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeTagGroupMapper.xml index a53d9f1b911ce067e525fd44a3208b696067a357..2385248ee986a965710a867f98a70a05139e800c 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeTagGroupMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeTagGroupMapper.xml @@ -101,5 +101,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeUserBehaviorDataMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeUserBehaviorDataMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..058c832a85633aa6d489ae69cf12e9d6d6be5ef4 --- /dev/null +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeUserBehaviorDataMapper.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linkwe-wecom/src/main/resources/mapper/wecom/WeUserMapper.xml b/linkwe-wecom/src/main/resources/mapper/wecom/WeUserMapper.xml index 145043d690d0f85e661e69357c080c30315df06c..a178406ffde4003b70cd29f05a1bc401f6803590 100644 --- a/linkwe-wecom/src/main/resources/mapper/wecom/WeUserMapper.xml +++ b/linkwe-wecom/src/main/resources/mapper/wecom/WeUserMapper.xml @@ -266,6 +266,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + diff --git a/pom.xml b/pom.xml index 35a110bf84f34229befa4fa328c29043746729b1..e720072003f744bede60084f2429ea5a3dd76ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -2,8 +2,8 @@ - 4.0.0 - + 4.0.0 + com.linkwechat linkwechat 3.1.0 @@ -11,18 +11,18 @@ linkwechat http://www.ruoyi.vip 若依管理系统 - + 2.3.7.RELEASE 3.1.0 UTF-8 UTF-8 1.8 - + 1.1.14 1.19 2.9.2 - 2.3.2 + 2.3.2 1.2.7 1.2.73 3.9.1 @@ -39,8 +39,9 @@ 3.4.0 4.0.0 4.1.49.Final + 2.2.5.RELEASE - + @@ -61,35 +62,35 @@ pom import - + com.alibaba druid-spring-boot-starter ${druid.version} - + eu.bitwalker UserAgentUtils ${bitwalker.version} - + com.github.pagehelper pagehelper-spring-boot-starter ${pagehelper.boot.version} - + com.github.oshi oshi-core ${oshi.version} - + io.springfox @@ -106,91 +107,91 @@ - + io.springfox springfox-swagger-ui ${swagger.version} - + commons-io commons-io ${commons.io.version} - + commons-fileupload commons-fileupload ${commons.fileupload.version} - + org.apache.poi poi-ooxml ${poi.version} - + org.apache.velocity velocity ${velocity.version} - + com.alibaba fastjson ${fastjson.version} - + io.jsonwebtoken jjwt ${jwt.version} - + com.github.penggle kaptcha ${kaptcha.version} - + com.linkwechat linkwe-quartz ${linkwe.version} - + com.linkwechat linkwe-generator ${linkwe.version} - + com.linkwechat linkwe-framework ${linkwe.version} - + com.linkwechat linkwe-system ${linkwe.version} - + com.linkwechat @@ -257,6 +258,17 @@ ${vertx.version} + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + ${nacos.version} + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + ${nacos.version} + @@ -269,12 +281,8 @@ linkwe-common linkwe-wecom - pom - - - - + pom diff --git a/sql/link-wechat.sql b/sql/link-wechat.sql index 89070dc89184fc13c7dc871c58992e4769c851bd..624d7546e5153d1c56d4c40d07dc0ef727e2f700 100644 --- a/sql/link-wechat.sql +++ b/sql/link-wechat.sql @@ -24730,6 +24730,7 @@ DROP TABLE IF EXISTS `we_group_code`; CREATE TABLE `we_group_code` ( `id` bigint(20) NOT NULL, `code_url` varchar(150) NOT NULL COMMENT '二维码链接', + `uuid` varchar(32) NOT NULL COMMENT '二维码标识符', `activity_head_url` varchar(150) DEFAULT NULL COMMENT '活码头像链接', `activity_name` varchar(60) DEFAULT NULL COMMENT '活码名称', `activity_desc` varchar(60) DEFAULT NULL COMMENT '活码描述', @@ -24750,14 +24751,7 @@ CREATE TABLE `we_group_code` ( -- ---------------------------- -- Records of we_group_code -- ---------------------------- -INSERT INTO `we_group_code` VALUES ('1354247069136719872', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/01/27/1e46f0f1-0461-4837-ab54-bf107d92d7b6.png', '', '哈哈', '哈哈', null, '哈哈', '0', '', '', null, 'admin', '2021-01-27 09:57:17', 'admin', '2021-02-18 22:26:05', null); -INSERT INTO `we_group_code` VALUES ('1354247279053246464', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/01/27/739b72e1-f304-4dfe-928b-ace989dc5968.png', '', '123321', 'test、', null, '', '0', '', '', null, 'admin', '2021-01-27 09:58:07', '', '2021-01-27 09:58:07', null); -INSERT INTO `we_group_code` VALUES ('1354258116010708992', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/01/27/aaf5440a-d113-445a-b870-95c884a9bfa1.png', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/01/27/64fdeab7-79cd-4f90-821b-3836b863cb82.jpg', '滴了个滴', '哒了个哒', null, '瞧一瞧,看一看', '1', '咚了个咚', '', null, 'admin', '2021-01-27 10:41:10', '', '2021-01-27 10:41:10', null); -INSERT INTO `we_group_code` VALUES ('1361969875039424512', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/17/4f913c79-978e-40a3-ad3a-e1f8d4167f65.png', '', '辅导费 ', '辅导费', null, '短发短发', '0', '', '', null, 'admin', '2021-02-17 17:24:57', '', '2021-02-17 17:24:57', null); -INSERT INTO `we_group_code` VALUES ('1362406755178516480', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/18/36ef3dc3-f203-47c3-9412-8cb3a184d5b1.png', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/18/2f3316fa-4ab5-458f-977c-34657c83ab10.JPG', '时代大厦', 'da s d', null, '阿迪三大', '0', '哈哈哈', '', null, 'admin', '2021-02-18 22:20:57', '', '2021-02-18 22:20:57', null); -INSERT INTO `we_group_code` VALUES ('1362579210891300864', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/f4bfdaa6-ad93-42e4-8b23-a61136b20277.png', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/f6915c67-9be2-4b59-b5b7-1b38543c0703.jpg', '322', '3232', null, '323232232323rere', '0', '', '', null, 'admin', '2021-02-19 09:46:14', '', '2021-02-19 09:46:14', null); -INSERT INTO `we_group_code` VALUES ('1362580445904113664', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/5b9bb660-fdf9-48e6-8018-e9e0a233f1da.png', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/157ede0c-1fd5-4002-98c5-58f10a24162c.jpg', '测试群活码', '测试', null, '测试', '0', '', '', null, 'admin', '2021-02-19 09:51:08', '', '2021-02-19 09:51:08', null); -INSERT INTO `we_group_code` VALUES ('1362600782515539968', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/357fc901-20e2-4227-ac25-7b7df958084e.png', 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/19/53ce7c00-3c6e-4942-b510-6b2387576689.jpg', '信息', '挺好听那', null, '', '0', '', '', null, 'admin', '2021-02-19 11:11:57', '', '2021-02-19 11:11:57', null); +INSERT INTO `we_group_code` VALUES (1364149701775069184, 'https://link-wechat-1251309172.cos.ap-nanjing.myqcloud.com/2021/02/23/142c491d-cf4c-4159-a89d-71c68151e41f.png', '5f8aa1f033d240bbb3d2f5064b905bd0', '', 'test1', '123123123', NULL, '', 0, '', '', NULL, 'admin', '2021-02-23 17:46:48', '', '2021-02-23 17:46:48', NULL); -- ---------------------------- -- Table structure for we_group_code_actual