Просмотр исходного кода

app销售添加好友 限制用户添加用户

wangxy 13 часов назад
Родитель
Сommit
24af9083fc

+ 3 - 1
fs-company-app/src/main/java/com/fs/app/controller/UserController.java

@@ -22,6 +22,7 @@ import com.fs.common.utils.PinYinUtil;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.common.utils.http.HttpUtils;
+import com.fs.common.utils.sign.Md5Utils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyUserCard;
@@ -216,10 +217,11 @@ public class UserController extends AppBaseController {
 
             //redisCache.setCacheObject("perms:"+companyUser.getUserId(), JSONUtil.toJsonStr(perms),2592000, TimeUnit.SECONDS);
             redisCache.setCacheObject("perms:" + companyUser.getUserId(), JSONUtil.toJsonStr(perms), 604800, TimeUnit.SECONDS);
-
+            redisCache.setCacheObject("company-user-token:" + Md5Utils.hash(companyUser.getUserId().toString()), companyUser.getUserId(), 100, TimeUnit.DAYS);
             Map<String, Object> result = new HashMap<>();
             result.put("token", token);
             result.put("user", companyUser);
+            result.put("companyUserToken", Md5Utils.hash(companyUser.getUserId().toString()));
             result.put("perms", perms);
             return R.ok("登录成功").put("data", result);
         } catch (Exception e) {

+ 7 - 0
fs-service/src/main/java/com/fs/his/param/FindUserByParam.java

@@ -9,4 +9,11 @@ public class FindUserByParam implements Serializable {
     private Integer pageNum;
     private Integer pageSize;
     private String keywords;
+    /** 是否仅查询销售:客户搜索时为 true,销售/其他用户不受影响 */
+    private Boolean onlySales;
+    /**
+     * 客户搜索前缀:C=销售,D=医生。
+     * 仅 onlySales=true 时生效,由服务端根据 keywords 解析设置
+     */
+    private String searchPrefix;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -100,6 +100,8 @@ public interface OpenIMService {
      */
     OpenImResponseDTO batchUrgeCourse(BatchUrgeCourseDTO batchUrgeCourseDTO, FsImMsgSendLog fsImMsgSendLog, String url) throws JsonProcessingException;
 
+    OpenImResponseDTO getUserInfo(String id);
+
     OpenImResponseDTO sendInquiryUtil(String sendID, String recvID, Integer contentType, String payloadData,String inquiryName,String type,Long companyId,Long companyUserId,String doctorId);
 
 

+ 23 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -89,6 +89,9 @@ import java.util.stream.Collectors;
 @Slf4j
 public class OpenIMServiceImpl implements OpenIMService {
     private static final String SMS_SHORT_LINK_DOMAIN = "https://a.hbhdt.top";
+
+    /** HTTP请求超时时间(毫秒) */
+    private static final int HTTP_TIMEOUT_MS = 60000;
     @Autowired
     IMConfig imConfig;
     @Autowired
@@ -1917,6 +1920,26 @@ public class OpenIMServiceImpl implements OpenIMService {
         return openImResponseDTO;
     }
 
+    @Override
+    public OpenImResponseDTO getUserInfo(String id) {
+        // 是数字的话默认用户
+        if(id.matches("\\d+")){
+            id = "U"+id;
+        }
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("userIDs", Collections.singletonList(id));
+        String body = HttpRequest.post(IMConfig.URL+"/user/get_users_info")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .timeout(HTTP_TIMEOUT_MS)
+                .body(jsonObject.toString())
+                .execute()
+                .body();
+        OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+        return responseDTO;
+    }
+
     private List<String> getRecvIds(BatchSendCourseDTO batchSendCourseDTO) {
         List<String> userIds;
         if(!batchSendCourseDTO.getUserIds().isEmpty()) {

+ 51 - 13
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2477,7 +2477,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         limit 10
     </select>
     <select id="findUsersByParam" resultType="com.fs.his.dto.FindUsersByDTO">
-        <!-- 客户搜索时 onlySales=true,仅返回销售信息,不查客户 -->
+        <!-- 销售/其他用户:可查客户+销售(原逻辑) -->
         <if test="onlySales == null or onlySales == false">
             SELECT user_id as id, 0 as type,
             CONCAT(user_id, '_', IFNULL(nick_name, '')) as name
@@ -2498,23 +2498,61 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 WHERE phone = #{keywords}
                 UNION
             </if>
+            <!-- company_user相关查询(销售) -->
+            SELECT user_id as id, 1 as type,
+            IFNULL(nick_name, '') as name
+            FROM company_user
+            WHERE user_id = #{keywords}
+            UNION
+            SELECT user_id as id, 1 as type,
+            IFNULL(nick_name, '') as name
+            FROM company_user
+            WHERE nick_name LIKE CONCAT(#{keywords}, '%')
+            <if test="keywords.matches('\\d+')">
+                UNION
+                SELECT user_id as id, 1 as type,
+                IFNULL(nick_name, '') as name
+                FROM company_user
+                WHERE phonenumber = #{keywords}
+            </if>
         </if>
-        <!-- company_user相关查询 -->
-        SELECT user_id as id, 1 as type,
-        IFNULL(nick_name, '') as name
-        FROM company_user
-        WHERE user_id = #{keywords}
-        UNION
-        SELECT user_id as id, 1 as type,
-        IFNULL(nick_name, '') as name
-        FROM company_user
-        WHERE nick_name LIKE CONCAT(#{keywords}, '%')
-        <if test="keywords.matches('\\d+')">
+        <!-- 客户搜索:keywords 以 C 开头,仅查销售 -->
+        <if test='onlySales != null and onlySales == true and searchPrefix != null and searchPrefix == "C"'>
+            SELECT user_id as id, 1 as type,
+            IFNULL(nick_name, '') as name
+            FROM company_user
+            WHERE user_id = #{keywords}
             UNION
             SELECT user_id as id, 1 as type,
             IFNULL(nick_name, '') as name
             FROM company_user
-            WHERE phonenumber = #{keywords}
+            WHERE nick_name LIKE CONCAT(#{keywords}, '%')
+            <if test="keywords.matches('\\d+')">
+                UNION
+                SELECT user_id as id, 1 as type,
+                IFNULL(nick_name, '') as name
+                FROM company_user
+                WHERE phonenumber = #{keywords}
+            </if>
+        </if>
+        <!-- 客户搜索:keywords 以 D 开头,仅查医生 -->
+        <if test='onlySales != null and onlySales == true and searchPrefix != null and searchPrefix == "D"'>
+            SELECT doctor_id as id, 2 as type,
+            IFNULL(doctor_name, '') as name
+            FROM fs_doctor
+            WHERE doctor_id = #{keywords}
+            UNION
+            SELECT doctor_id as id, 2 as type,
+            IFNULL(doctor_name, '') as name
+            FROM fs_doctor
+            WHERE doctor_name LIKE CONCAT(#{keywords}, '%')
+            <if test="keywords.matches('\\d+')">
+                UNION
+                SELECT doctor_id as id, 2 as type,
+                IFNULL(doctor_name, '') as name
+                FROM fs_doctor
+                WHERE mobile = #{keywords}
+            </if>
         </if>
     </select>
 

+ 13 - 1
fs-user-app/src/main/java/com/fs/app/controller/AppBaseController.java

@@ -43,9 +43,21 @@ public class AppBaseController {
 		}
 		return null;
 	}
+	/**
+	 * 获取销售用户ID;未携带/无效 companyUserToken 时返回 null(不抛异常,用于身份判断)
+	 */
+	public Long getCompanyUserIdOrNull()
+	{
+		String companyUserToken = ServletUtils.getRequest().getHeader("companyUserToken");
+		if (StringUtils.isEmpty(companyUserToken)) {
+			return null;
+		}
+		return redisCache.getCacheObject("company-user-token:" + companyUserToken);
+	}
+
 	public Long getCompanyUserId( )
 	{
-		Long companyUesrId=redisCache.getCacheObject("company-user-token:"+ ServletUtils.getRequest().getHeader("companyUserToken"));
+		Long companyUesrId = getCompanyUserIdOrNull();
 		if(companyUesrId== null){
 			throw  new CustomException("未登录",403);
 		}

+ 17 - 0
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -112,6 +112,23 @@ public class UserController extends  AppBaseController {
         if(StringUtils.isBlank(param.getKeywords())) {
             return R.ok().put("data",new ArrayList<>());
         }
+
+        // 有销售身份(companyUserToken)可搜全部;否则按客户限制,仅允许 C/D 前缀
+        if (getCompanyUserIdOrNull() == null) {
+            String keywords = param.getKeywords().trim();
+            if (keywords.length() < 2) {
+                return R.ok().put("data", new ArrayList<>());
+            }
+            char prefix = Character.toUpperCase(keywords.charAt(0));
+            if (prefix != 'C' && prefix != 'D') {
+                // 非 C/D 开头(如 U 或其他)不给展示
+                return R.ok().put("data", new ArrayList<>());
+            }
+            param.setOnlySales(true);
+            param.setSearchPrefix(String.valueOf(prefix));
+            param.setKeywords(keywords.substring(1));
+        }
+
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
 
         if(StringUtils.isNotBlank(param.getKeywords())){

+ 61 - 0
fs-user-app/src/main/java/com/fs/app/controller/app/ImController.java

@@ -0,0 +1,61 @@
+package com.fs.app.controller.app;
+
+import com.fs.app.controller.AppBaseController;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.StringUtils;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @description: im 相关接口
+ * @author: Xgb
+ * @createDate: 2026/4/3
+ * @version: 1.0
+ */
+@Api("im 相关接口")
+@RestController
+@RequestMapping(value = "/app/im")
+@Slf4j
+public class ImController extends AppBaseController {
+
+    @Autowired
+    private OpenIMService openIMService;
+
+    /**
+     * @Description: 查询用户信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/4/3 15:45
+     */
+    @GetMapping("/getUserInfo")
+    public R getUserInfo(String id) {
+        if (StringUtils.isBlank(id)) {
+            return R.ok().put("data", null);
+        }
+
+        // 有销售身份可查全部;否则按客户限制,仅允许 C/D(纯数字视为 U)
+        if (getCompanyUserIdOrNull() == null) {
+            String checkId = id.trim();
+            char prefix;
+            if (checkId.matches("\\d+")) {
+                prefix = 'U';
+            } else {
+                prefix = Character.toUpperCase(checkId.charAt(0));
+            }
+            if (prefix != 'C' && prefix != 'D') {
+                return R.ok().put("data", null);
+            }
+        }
+
+        OpenImResponseDTO responseDTO = openIMService.getUserInfo(id);
+        return R.ok().put("data", responseDTO);
+    }
+
+}