Explorar o código

侧边栏发官方通用链接

三七 hai 2 semanas
pai
achega
20b4712e73

+ 46 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java

@@ -1,9 +1,12 @@
 package com.fs.app.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.FsCourseLinkMiniParam;
@@ -17,8 +20,16 @@ import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.course.vo.FsCourseListBySidebarVO;
 import com.fs.course.vo.FsCourseVideoListBySidebarVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.qw.domain.QwTag;
+import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.param.QwGroupMsgParam;
+import com.fs.qw.param.QwTagParam;
 import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwGroupMsgService;
+import com.fs.qw.service.IQwTagGroupService;
+import com.fs.qw.service.IQwTagService;
+import com.fs.qw.vo.QwTagGroupListVO;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -52,6 +63,14 @@ public class ApisFsUserCourseVideoController extends BaseController {
     @Autowired
     private IFsCourseLinkService courseLinkService;
 
+    @Autowired
+    private IQwGroupMsgService qwGroupMsgService;
+
+    @Autowired
+    private IQwTagGroupService qwTagGroupService;
+
+    @Autowired
+    private IQwTagService qwTagService;
 
 
     @ApiOperation("课程视频详情")
@@ -161,4 +180,31 @@ public class ApisFsUserCourseVideoController extends BaseController {
         return fsUserCourseVideoService.createRoomMiniLink(param);
     }
 
+
+    @PostMapping("/sendSidebarOfficial")
+    @ApiOperation("侧边栏发官方群发链接")
+    @Log(title = "侧边栏发官方群发链接", businessType = BusinessType.INSERT)
+    public R sendSidebarOfficial(@RequestBody QwGroupMsgParam qwGroupMsgParam) throws Exception {
+
+        return qwGroupMsgService.sendSidebarOfficial(qwGroupMsgParam);
+    }
+
+    @PostMapping("/selectTagList")
+    @ApiOperation("侧边栏发官方群发链接")
+    public TableDataInfo selectTagList(@RequestBody QwTagGroup qwTagGroup) throws Exception {
+
+        if (StringUtil.strIsNullOrEmpty(qwTagGroup.getName())){
+            startPage();
+            List<QwTagGroupListVO> list = qwTagGroupService.selectQwTagGroupListVO(qwTagGroup);
+            return getDataTable(list);
+        }else {
+            startPage();
+            QwTagParam tagParam=new QwTagParam();
+            tagParam.setName(qwTagGroup.getName());
+            tagParam.setCorpId(qwTagGroup.getCorpId());
+            return getDataTable(qwTagService.searchTags(tagParam));
+        }
+
+    }
+
 }

+ 46 - 3
fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -1,9 +1,13 @@
 package com.fs.app.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.FsCourseLinkMiniParam;
@@ -20,9 +24,12 @@ import com.fs.course.vo.newfs.FsUserCourseListVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
+import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.domain.QwUser;
-import com.fs.qw.service.IQwExternalContactService;
-import com.fs.qw.service.IQwUserService;
+import com.fs.qw.param.QwGroupMsgParam;
+import com.fs.qw.param.QwTagParam;
+import com.fs.qw.service.*;
+import com.fs.qw.vo.QwTagGroupListVO;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -39,7 +46,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/app/fs/course")
 @Slf4j
-public class FsUserCourseVideoController {
+public class FsUserCourseVideoController  extends BaseController  {
 
     @Autowired
     private IFsUserCourseVideoService fsUserCourseVideoService;
@@ -53,6 +60,16 @@ public class FsUserCourseVideoController {
     @Autowired
     private IQwExternalContactService qwExternalContactService;
 
+    @Autowired
+    private IQwGroupMsgService qwGroupMsgService;
+
+    @Autowired
+    private IQwTagGroupService qwTagGroupService;
+
+    @Autowired
+    private IQwTagService qwTagService;
+
+
 
     @ApiOperation("课程视频详情")
     @GetMapping(value = "/videoDetails")
@@ -162,4 +179,30 @@ public class FsUserCourseVideoController {
             return fsUserCourseVideoService.createMiniLink(param);
         }
     }
+
+    @PostMapping("/sendSidebarOfficial")
+    @ApiOperation("侧边栏发官方群发链接")
+    @Log(title = "侧边栏发官方群发链接", businessType = BusinessType.INSERT)
+    public R sendSidebarOfficial(@RequestBody QwGroupMsgParam qwGroupMsgParam) throws Exception {
+
+        return qwGroupMsgService.sendSidebarOfficial(qwGroupMsgParam);
+    }
+
+    @PostMapping("/selectTagList")
+    @ApiOperation("侧边栏发官方群发链接")
+    public TableDataInfo selectTagList(@RequestBody QwTagGroup qwTagGroup) throws Exception {
+
+        if (StringUtil.strIsNullOrEmpty(qwTagGroup.getName())){
+            startPage();
+            List<QwTagGroupListVO> list = qwTagGroupService.selectQwTagGroupListVO(qwTagGroup);
+            return getDataTable(list);
+        }else {
+            startPage();
+            QwTagParam tagParam=new QwTagParam();
+            tagParam.setName(qwTagGroup.getName());
+            tagParam.setCorpId(qwTagGroup.getCorpId());
+            return getDataTable(qwTagService.searchTags(tagParam));
+        }
+
+    }
 }

+ 6 - 0
fs-service/src/main/java/com/fs/qw/param/QwGroupMsgParam.java

@@ -15,7 +15,13 @@ public class QwGroupMsgParam {
     /** 群发任务的类型,默认为single,表示发送给客户,group表示发送给客户群 */
     @Excel(name = "群发任务的类型,默认为single,表示发送给客户,group表示发送给客户群")
     private String chatType;
+
     private String corpId;
+
+    /** 发送企业群发消息的成员userid,当类型为发送给客户群时必填 */
+    @Excel(name = "发送企业群发消息的成员userid,当类型为发送给客户群时必填")
+    private String sender;
+
     /** 是否允许成员在待发送客户列表中重新进行选择,默认为true(Y),仅支持客户群发场景 */
     @Excel(name = "是否允许成员在待发送客户列表中重新进行选择,默认为true(1),仅支持客户群发场景")
     private Integer allowSelect;

+ 1 - 0
fs-service/src/main/java/com/fs/qw/service/IQwGroupMsgService.java

@@ -41,6 +41,7 @@ public interface IQwGroupMsgService
      * @return 结果
      */
     public R insertQwGroupMsg(QwGroupMsgParam qwGroupMsgParam) throws Exception;
+    public R sendSidebarOfficial(QwGroupMsgParam qwGroupMsgParam) throws Exception;
 
     /** 统计数据详情,已发送,未发送,已接收,未接收等 */
     public R getCountGroupMsgUser(Long groupMsgId);

+ 235 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupMsgServiceImpl.java

@@ -6,10 +6,12 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.domain.FsCourseLink;
 import com.fs.course.domain.FsCourseRealLink;
 import com.fs.course.mapper.FsCourseLinkMapper;
 import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.service.impl.FsUserCourseVideoServiceImpl;
 import com.fs.qw.domain.*;
 import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.mapper.QwGroupMsgItemMapper;
@@ -33,6 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.BufferedInputStream;
@@ -59,6 +62,8 @@ public class QwGroupMsgServiceImpl implements IQwGroupMsgService
     private static final Logger logger = LoggerFactory.getLogger(QwGroupMsgServiceImpl.class);
 
     private static final String miniappRealLink = "/pages_course/video.html?course=";
+    private static final String REAL_LINK_PREFIX = "/courseH5/pages/course/learning?course=";
+    private static final String SHORT_LINK_PREFIX = "/courseH5/pages/course/learning?s=";
 
     @Autowired
     private QwGroupMsgMapper qwGroupMsgMapper;
@@ -106,6 +111,9 @@ public class QwGroupMsgServiceImpl implements IQwGroupMsgService
     @Autowired
     private IQwCompanyService iQwCompanyService;
 
+    @Autowired
+    private CloudHostProper cloudHostProper;
+
     /**
      * 查询客户群发记录主
      *
@@ -711,6 +719,233 @@ public class QwGroupMsgServiceImpl implements IQwGroupMsgService
 
         return R.ok();
     }
+
+    @Override
+    public R sendSidebarOfficial(QwGroupMsgParam qwGroupMsgParam) throws Exception {
+        QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(qwGroupMsgParam.getCorpId());
+
+        if (StringUtil.strIsNullOrEmpty(qwGroupMsgParam.getSender())){
+            return R.error("请选择发送对象");
+        }
+
+        //发送消息组件表
+        QwMsgTemplate msgTemplate=new QwMsgTemplate();
+
+        //客户群发消息的附件记录表
+        QwGroupMsgItem qwGroupMsgItem=new QwGroupMsgItem();
+
+        //客户群发记录主表
+        QwGroupMsg qwGroupMsg=new QwGroupMsg();
+
+        qwGroupMsg.setCorpId(qwGroupMsgParam.getCorpId());
+
+        //主表存/任务类型
+        qwGroupMsg.setChatType(qwGroupMsgParam.getChatType());
+
+
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(qwGroupMsgParam.getCorpId().trim(), qwGroupMsgParam.getSender().trim());
+
+        if (qwUser==null||qwUser.getCompanyId()==null||qwUser.getCompanyUserId()==null){
+            return  R.error("员工未绑定 销售公司 或 销售 请先绑定:"+qwGroupMsgParam.getSender()+"|"+qwGroupMsgParam.getCorpId());
+        }
+
+        if (StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())){
+            return  R.error("该主体没有绑定 小程序,请联系管理员");
+        }
+
+        String mediaId =(String)redisCache.getCacheObject("miniprogram:"+qwGroupMsgParam.getCorpId()+":"+qwGroupMsgParam.getCourseId());
+        if (StringUtil.strIsNullOrEmpty(mediaId)){
+            return R.error("该课程封面未上传 至企业微信,请联系管理员");
+        }
+
+        String linkByMiniApp = createLinkByMiniAppGeneral(new Date(), qwGroupMsgParam.getCourseId(), qwGroupMsgParam.getVideoId(), qwUser, 0L,2,null,1);
+
+        msgTemplate.setSender(qwGroupMsgParam.getSender().trim());
+        msgTemplate.setMiniprogramAppid(qwCompany.getMiniAppId());
+        msgTemplate.setMiniprogramTitle(qwGroupMsgParam.getMiniprogramTitle());
+        msgTemplate.setMiniprogramPicMediaId(mediaId);
+        msgTemplate.setMiniprogramPage(linkByMiniApp);
+
+        qwGroupMsgItem.setMsgType(3);
+        qwGroupMsgItem.setMiniprogramTitle(qwGroupMsgParam.getMiniprogramTitle());
+        qwGroupMsgItem.setMiniprogramAppid(qwCompany.getMiniAppId());
+        qwGroupMsgItem.setMiniprogramPicUrl(qwGroupMsgParam.getMiniprogramPicUrl());
+        qwGroupMsgItem.setMiniprogramPicMediaId(mediaId);
+        qwGroupMsgItem.setMiniprogramPage(linkByMiniApp);
+
+
+        //发送这条消息文本的成员集合
+        qwGroupMsg.setSender(qwGroupMsgParam.getSender().trim());
+        qwGroupMsg.setAllowSelect(qwGroupMsgParam.getAllowSelect());
+        qwGroupMsg.setTextContent(qwGroupMsgParam.getTextContent());
+        qwGroupMsg.setCreateName(qwGroupMsgParam.getCreateName());
+        qwGroupMsg.setGroupChatNames(qwGroupMsgParam.getGroupChatNames());
+        qwGroupMsg.setSelectType(qwGroupMsgParam.getSelectType());
+        //筛选出客户
+        QwCountCustomerParam qwCountCustomerParam = new QwCountCustomerParam();
+
+        ArrayList<String> userIdsList=new ArrayList<>();
+        userIdsList.add(qwGroupMsgParam.getSender().trim());
+        qwCountCustomerParam.setUserIdsSelectList(userIdsList);
+
+        qwCountCustomerParam.setSelectType(qwGroupMsgParam.getSelectType());
+        qwCountCustomerParam.setGender(qwGroupMsgParam.getGender());
+        qwCountCustomerParam.setGroupChatSelectList(qwGroupMsgParam.getGroupChatSelectList());
+        qwCountCustomerParam.setTimeScreenCharge(qwGroupMsgParam.getTimeScreenCharge());
+        qwCountCustomerParam.setTagsIdsSelectList(qwGroupMsgParam.getTagsIdsSelectList());
+        qwCountCustomerParam.setOutTagsIdsSelectList(qwGroupMsgParam.getOutTagsIdsSelectList());
+
+        //根据 条件 筛选出预计发送的客户id列表
+        ArrayList<String> customerList = qwExternalContactService.selectQwGroupMsgExpectCustomerList(qwCountCustomerParam, qwCompany.getCorpId());
+
+        qwGroupMsg.setToUserNum(customerList.size());
+        qwGroupMsg.setFilterCustomers(JSON.toJSONString(qwCountCustomerParam));
+
+        //客户列表
+        msgTemplate.setExternalUseridList(customerList);
+
+        //发送消息文本组装
+        //群发任务类型()
+        msgTemplate.setChatType(qwGroupMsgParam.getChatType());
+
+        msgTemplate.setAllowSelect(qwGroupMsgParam.getAllowSelect() == 1 ? true : false);
+        msgTemplate.setTextContent(qwGroupMsgParam.getTextContent());
+        msgTemplate.setType(qwGroupMsgParam.getMsgType());
+
+        QwAddMsgTemplateResult qwAddMsgTemplateResult = qwApiService.addMsgTemplate(msgTemplate, qwGroupMsgParam.getCorpId());
+
+        qwGroupMsg.setMsgid(qwAddMsgTemplateResult.getMsgId() == null ? null : qwAddMsgTemplateResult.getMsgId());
+
+        if (qwAddMsgTemplateResult.getErrCode() != 0 && qwAddMsgTemplateResult.getErrCode() != 41063) {
+
+            //发送失败 主表做记录
+            qwGroupMsg.setIsSend(0);
+            qwGroupMsg.setCreateTime(DateUtils.getNowDate());
+            //主表做记录
+            insertQwGroupMsgSinger(qwGroupMsg, qwGroupMsgItem, qwGroupMsgParam.getCorpId(), qwCompany.getId(), qwAddMsgTemplateResult);
+
+            logger.error("消息发送失败:" + qwAddMsgTemplateResult.getErrMsg());
+            return R.error("消息发送失败:" + qwAddMsgTemplateResult.getErrMsg());
+        }
+        else {
+            qwGroupMsg.setFromUserNum(1);
+            qwGroupMsg.setIsSend(1);
+            qwGroupMsg.setCreateTime(DateUtils.getNowDate());
+
+            //主表做记录
+            int i = qwGroupMsgMapper.insertQwGroupMsg(qwGroupMsg);
+            if (i > 0) {
+
+                qwGroupMsgItem.setGroupMsgId(qwGroupMsg.getId());
+                qwGroupMsgItem.setMsgId(qwAddMsgTemplateResult.getMsgId());
+                qwGroupMsgItem.setCorpId(qwGroupMsgParam.getCorpId());
+                qwGroupMsgItem.setCompanyId(qwCompany.getId());
+                //附件做记录
+                int i1 = qwGroupMsgItemMapper.insertQwGroupMsgItem(qwGroupMsgItem);
+
+                if (i1 <= 0) {
+                    logger.error("录入入群发消息附件表失败");
+                }else {
+                    List<QwGroupMsgUser> qwGroupMsgUserList=new ArrayList<>();
+
+                    for (String excId : customerList) {
+
+                        QwGroupMsgUser ext=new QwGroupMsgUser();
+                        ext.setUserId(qwGroupMsgParam.getSender().trim());
+                        ext.setStatus(0);
+                        ext.setMsgId(qwAddMsgTemplateResult.getMsgId());
+                        ext.setChatType(qwGroupMsgParam.getChatType());
+                        ext.setCorpId(qwGroupMsgParam.getCorpId());
+                        ext.setCompanyId(qwCompany.getId());
+                        ext.setGroupMsgId(qwGroupMsg.getId());
+                        ext.setExternalUserid(excId);
+                        ext.setSendStatus(0);
+                        ext.setSendTime(0L);
+                        qwGroupMsgUserList.add(ext);
+
+                    }
+
+                    boolean isSuccess = qwGroupMsgUserService.saveBatch(qwGroupMsgUserList,500);
+                    if (!isSuccess) {
+                        logger.error("批量录入群发成员发送任务及执行结果反馈记录表失败41063");
+                    }
+                }
+
+            } else {
+                // 插入失败的处理逻辑
+                logger.error("录入入群发消息主表失败");
+            }
+
+        }
+
+
+        return R.ok();
+    }
+
+    private String createLinkByMiniAppGeneral(Date sendTime, Long courseId, Long videoId,
+                                       QwUser qwUser, Long externalId,int type,String domainName,Integer isRoom) {
+
+
+        FsCourseLink link = new FsCourseLink();
+        link.setCompanyId(qwUser.getCompanyId());
+        link.setQwUserId(qwUser.getId());
+        link.setCompanyUserId(qwUser.getCompanyUserId());
+        link.setVideoId(videoId);
+        link.setCorpId(qwUser.getCorpId());
+        link.setCourseId(courseId);
+        link.setQwExternalId(externalId);
+        link.setIsRoom(isRoom);
+        if (type == 1) {
+            link.setLinkType(0);
+        }else {
+            link.setLinkType(3);
+        }
+        link.setProjectCode(cloudHostProper.getProjectCode());
+
+        String randomString = generateRandomStringWithLock();
+        if (StringUtil.strIsNullOrEmpty(randomString)){
+            link.setLink(UUID.randomUUID().toString().replace("-", ""));
+        }else {
+            link.setLink(randomString);
+        }
+
+        link.setCreateTime(sendTime);
+        link.setProjectCode(cloudHostProper.getProjectCode());
+
+        FsCourseRealLink courseMap = new FsCourseRealLink();
+        BeanUtils.copyProperties(link,courseMap);
+
+        String courseJson = JSON.toJSONString(courseMap);
+
+        String realLinkFull = null;
+
+        if (type == 1) {
+            realLinkFull = REAL_LINK_PREFIX + courseJson;
+        }else {
+            realLinkFull = miniappRealLink + courseJson;
+        }
+
+        link.setRealLink(realLinkFull);
+
+
+        // 使用 Java 8 时间 API 计算过期时间
+        LocalDateTime sendDateTime = sendTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime expireDateTime = sendDateTime.plusDays(0);
+        expireDateTime = expireDateTime.toLocalDate().atTime(23, 59, 59);
+        Date updateTime = Date.from(expireDateTime.atZone(ZoneId.systemDefault()).toInstant());
+        link.setUpdateTime(updateTime);
+
+        //存短链-
+        fsCourseLinkMapper.insertFsCourseLink(link);
+
+        if (type==1){
+            return domainName + SHORT_LINK_PREFIX + link.getLink();
+        }else {
+            return link.getRealLink();
+        }
+
+    }
+
     //生成小程序链接 通用链接
     private String createLinkByMiniApp(Date sendTime, Long courseId, Long videoId,
                                        QwUser qwUser, Long externalId, Integer isRoom){