Bladeren bron

红德堂-销售邀请注册链接绑定用户发送消息提醒

Long 1 week geleden
bovenliggende
commit
401815210f

+ 16 - 2
fs-service/src/main/java/com/fs/company/domain/CompanyUserUser.java

@@ -1,9 +1,14 @@
 package com.fs.company.domain;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * companyUserUser对象 company_user_user
  *
@@ -11,9 +16,8 @@ import lombok.Data;
  * @date 2023-12-19
  */
 @Data
-public class CompanyUserUser extends BaseEntity
+public class CompanyUserUser
 {
-    private static final long serialVersionUID = 1L;
 
     /** id */
     private Long id;
@@ -30,4 +34,14 @@ public class CompanyUserUser extends BaseEntity
     @Excel(name = "用户id")
     private Long userId;
 
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 是否已发送 0未发送 1已发送
+     */
+    private Integer isSend;
+
 }

+ 7 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserUserMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 import com.fs.company.domain.CompanyUserUser;
 import com.fs.his.vo.MyMemberVO;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * companyUserUserMapper接口
@@ -75,4 +76,10 @@ public interface CompanyUserUserMapper
      * 查询销售下已存在的用户ID列表
      */
     List<Long> selectExistingUserIdsByCompanyUserId(@Param("companyUserId") Long companyUserId, @Param("companyId") Long companyId, @Param("userIds") List<Long> userIds);
+
+    /**
+     * 查询需要发送消息的销售
+     */
+    @Select("SELECT * FROM company_user_user WHERE user_id = #{userId} and is_send = 0")
+    List<CompanyUserUser> selectNeedSendByUserId(@Param("userId") Long userId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserUserService.java

@@ -64,4 +64,9 @@ public interface ICompanyUserUserService
      * 查询销售关联会员
      */
     List<MyMemberVO> selectFsUserByCompanyUserId(Long companyUserId, String keyword);
+
+    /**
+     * 查询需要发送消息的销售
+     */
+    List<CompanyUserUser> selectNeedSendByUserId(Long userId);
 }

+ 8 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserUserServiceImpl.java

@@ -102,4 +102,12 @@ public class CompanyUserUserServiceImpl implements ICompanyUserUserService
     public List<MyMemberVO> selectFsUserByCompanyUserId(Long companyUserId, String keyword) {
         return companyUserUserMapper.selectFsUserByCompanyUserId(companyUserId, keyword);
     }
+
+    /**
+     * 查询需要发送消息的销售
+     */
+    @Override
+    public List<CompanyUserUser> selectNeedSendByUserId(Long userId) {
+        return companyUserUserMapper.selectNeedSendByUserId(userId);
+    }
 }

+ 5 - 1
fs-service/src/main/resources/mapper/company/CompanyUserUserMapper.xml

@@ -10,10 +10,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="companyUserId"    column="company_user_id"    />
         <result property="userId"    column="user_id"    />
         <result property="createTime"    column="create_time"    />
+        <result property="isSend"    column="is_send"    />
     </resultMap>
 
     <sql id="selectCompanyUserUserVo">
-        select id, company_id, company_user_id, user_id, create_time from company_user_user
+        select * from company_user_user
     </sql>
 
     <select id="selectCompanyUserUserList" parameterType="CompanyUserUser" resultMap="CompanyUserUserResult">
@@ -69,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserId != null">company_user_id,</if>
             <if test="userId != null">user_id,</if>
             <if test="createTime != null">create_time,</if>
+            <if test="isSend != null">is_send,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -76,6 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserId != null">#{companyUserId},</if>
             <if test="userId != null">#{userId},</if>
             <if test="createTime != null">#{createTime},</if>
+            <if test="isSend != null">#{isSend},</if>
          </trim>
     </insert>
 
@@ -85,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">company_id = #{companyId},</if>
             <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
             <if test="userId != null">user_id = #{userId},</if>
+            <if test="isSend != null">is_send = #{isSend},</if>
         </trim>
         where id = #{id}
     </update>

+ 110 - 0
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController2.java

@@ -15,12 +15,19 @@ import com.fs.common.service.ISmsService;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.sign.Md5Utils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.CompanyUserUser;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.ICompanyUserUserService;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsUserNewTaskService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.vo.FsUserRegisterParam;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -29,6 +36,7 @@ import org.apache.ibatis.annotations.Param;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -36,6 +44,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
 import java.util.*;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
@@ -61,6 +70,16 @@ public class AppLoginController2 extends AppBaseController{
 
     @Autowired
     private ISmsService smsService;
+    @Autowired
+    private ICompanyUserUserService companyUserUserService;
+    @Autowired
+    private OpenIMService openIMService;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+    @Autowired
+    @Qualifier("threadPoolTaskExecutor")
+    private Executor threadPoolTaskExecutor;
+
     @ApiOperation("注册app用户")
     @PostMapping("/register")
     @RepeatSubmit
@@ -455,6 +474,9 @@ public class AppLoginController2 extends AppBaseController{
             return R.error("密码不正确");
         }
 
+        // 发送消息
+        threadPoolTaskExecutor.execute(() -> sendMessage(user));
+
         return generateTokenAndReturn(user);
 
     }
@@ -676,9 +698,97 @@ public class AppLoginController2 extends AppBaseController{
             return R.error("验证码错误");
         }
         updateExistingUserJpushId(user.get(0), map.get("jpushId"));
+
+        // 发送消息
+        FsUser finalUser = user.get(0);
+        threadPoolTaskExecutor.execute(() -> sendMessage(finalUser));
+
         return generateTokenAndReturn(user.get(0));
     }
 
+    /**
+     * 针对新注册app的用户,如果是通过销售发的链接注册的,用户注册成功之后,销售端自动给客户发送消息提醒,提醒模板:
+     * 尊敬的{调用用户昵称},我是您的专属健康管家,有任何健康问题随时找我,期待陪伴您健康每一天!
+     */
+    private void sendMessage(FsUser user) {
+        try {
+            // 消息模板
+            String messageTemplate = "尊敬的{调用用户昵称},我是您的专属健康管家,有任何健康问题随时找我,期待陪伴您健康每一天!";
+            
+            // 查询需要发送消息的销售
+            List<CompanyUserUser> needSendList = companyUserUserService.selectNeedSendByUserId(user.getUserId());
+            
+            if (CollectionUtil.isEmpty(needSendList)) {
+                return;
+            }
+            
+            // 替换用户昵称
+            String userNickName = StringUtils.isNotBlank(user.getNickName()) ? user.getNickName() : "用户";
+            String message = messageTemplate.replace("{调用用户昵称}", userNickName);
+            
+            // 遍历需要发送消息的销售
+            for (CompanyUserUser companyUserUser : needSendList) {
+                String sendId = "C" + companyUserUser.getCompanyUserId();
+                String recvId = "U" + user.getUserId();
+                
+                // 发送文本消息
+                OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+                OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+                OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+
+                // 设置发送者信息
+                CompanyUser companyUser = companyUserMapper.selectCompanyUserByUserId(companyUserUser.getCompanyUserId());
+                if (companyUser == null) {
+                    continue;
+                }
+                if (StringUtils.isNotBlank(companyUser.getAvatar())) {
+                    openImMsgDTO.setSenderNickname(companyUser.getNickName());
+                    openImMsgDTO.setSenderFaceURL(companyUser.getAvatar());
+                }
+                
+                // 设置推送信息
+                if (StringUtils.isNotBlank(companyUser.getNickName())) {
+                    offlinePushInfo.setTitle(companyUser.getNickName());
+                }
+                offlinePushInfo.setDesc(message);
+                offlinePushInfo.setIOSBadgeCount(true);
+                offlinePushInfo.setIOSPushSound("");
+                
+                // 设置基础消息信息
+                openImMsgDTO.setSendID(sendId);
+                openImMsgDTO.setRecvID(recvId);
+                openImMsgDTO.setContentType(101);
+                openImMsgDTO.setSenderPlatformID(5);
+                openImMsgDTO.setSessionType(1);
+                
+                // 设置消息内容
+                content.setContent(message);
+                openImMsgDTO.setContent(content);
+                
+                // 设置推送信息
+                openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+
+                // 检查好友关系
+                openIMService.checkAndImportFriend(companyUser.getUserId(), user.getUserId().toString());
+
+                OpenImResponseDTO response = openIMService.openIMSendMsg(openImMsgDTO);
+                
+                if (response != null && response.getErrCode() == 0) {
+                    // 发送成功,更新isSend状态为1
+                    companyUserUser.setIsSend(1);
+                    companyUserUserService.updateCompanyUserUser(companyUserUser);
+                    log.info("销售{}给用户{}发送欢迎消息成功", companyUserUser.getCompanyUserId(), user.getUserId());
+                } else {
+                    log.error("销售{}给用户{}发送欢迎消息失败: {}", 
+                        companyUserUser.getCompanyUserId(), user.getUserId(), 
+                        response != null ? response.getErrMsg() : "响应为空");
+                }
+            }
+        } catch (Exception e) {
+            log.error("发送欢迎消息时发生异常", e);
+        }
+    }
+
     @PostMapping("/registerSendCode")
     public R registerSendCode(@RequestBody Map<String, String> body){
         String phone = body.get("phone");

+ 6 - 1
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -218,12 +218,17 @@ public class CompanyUserController extends AppBaseController {
             fsUserService.updateFsUser(user);
         }
         List<CompanyUserUser> list = companyUserUserService.selectCompanyUserUserList(map);
-        if (list == null || list.size() == 0) {
+        if (list == null || list.isEmpty()) {
             CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
             if (companyUser != null && companyUser.getStatus().equals("0")) {
                 map.setCompanyId(companyUser.getCompanyId());
+                map.setIsSend(0);
                 companyUserUserService.insertCompanyUserUser(map);
             }
+        } else {
+            CompanyUserUser companyUserUser = list.get(0);
+            companyUserUser.setIsSend(0);
+            companyUserUserService.updateCompanyUserUser(companyUserUser);
         }
         return R.ok();
     }