ct 3 settimane fa
parent
commit
496cfe4221

+ 20 - 0
fs-qw-api/src/main/java/com/fs/app/controller/OpenQwApiController.java

@@ -162,5 +162,25 @@ public class OpenQwApiController extends BaseController {
             return R.error("移除标签失败: " + e.getMessage());
         }
     }
+
+    /**
+     * 加密ExternalUserid
+     */
+    @PostMapping("/getOpenExternalUserid")
+    public R getOpenExternalUserid(@RequestParam("externalUserid") String  externalUserid,
+                                   @RequestParam("corpId") String  corpId,
+                                   @RequestParam("qwUserId") String  qwUserId,
+                                   @RequestParam(value = "tenantId", required = true) Long tenantId){
+        try {
+            return tenantDataSourceUtil.executeWithResult(tenantId,
+                    () ->  openQwApiService.getOpenExternalUserid(externalUserid,corpId,qwUserId));
+        } catch (IllegalArgumentException e) {
+            log.error("加密ExternalUserid,租户不存在或已禁用,tenantId={}", tenantId, e);
+            return R.error("租户不存在或已禁用");
+        } catch (Exception e) {
+            log.error("加密ExternalUserid,tenantId={}", tenantId, e);
+            return R.error("加密ExternalUserid失败: " + e.getMessage());
+        }
+    }
 }
 

+ 2 - 0
fs-qw-api/src/main/java/com/fs/app/service/OpenQwApiService.java

@@ -19,4 +19,6 @@ public interface OpenQwApiService {
     R addTag(QwExternalContactAddTagParam param);
 
     R delTag(QwExternalContactAddTagParam param);
+
+    R getOpenExternalUserid(String externalUserid,String corpId,String qwUserId);
 }

+ 31 - 0
fs-qw-api/src/main/java/com/fs/app/service/impl/OpenQwApiServiceImpl.java

@@ -3,11 +3,13 @@ package com.fs.app.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.service.OpenQwApiService;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.domain.QwDept;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.mapper.QwDeptMapper;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
@@ -37,6 +39,7 @@ import com.fs.sop.params.SopUserLogsParamByDate;
 import com.fs.sop.service.ISopUserLogsService;
 import com.fs.voice.utils.StringUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.MDC;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,6 +72,10 @@ public class OpenQwApiServiceImpl implements OpenQwApiService {
 
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    private QwCompanyMapper qwCompanyMapper;
+    @Autowired
+    private RedisCache redisCache;
 
     @Override
     public R getSyncQwUser(String corpId) {
@@ -625,6 +632,30 @@ public class OpenQwApiServiceImpl implements OpenQwApiService {
         return R.ok("成功:" + suc.get() + ",失败:" + failList);
     }
 
+    @Override
+    public R getOpenExternalUserid(String externalUserid,String corpId,String qwUserId) {
+        //先查询redis
+        String key = "qwExternalUserid:trans:"+corpId +":" + qwUserId +":"+externalUserid;
+        String openExternalUserid = redisCache.getCacheObject(key);
+        if (openExternalUserid == null) {
+            //查询数据库
+            QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalByApplicationExternalUserId(externalUserid,corpId,qwUserId);
+            if (externalContact != null) {
+                openExternalUserid = externalContact.getExternalUserId();
+            } else {
+                QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(corpId);
+                String token1 = qwApiService.getToken(corpId, qwCompany.getPermanentCode());
+                openExternalUserid = qwApiService.getOpenExternalUserid(token1, externalUserid, corpId);
+            }
+            if (StringUtils.isNotBlank(openExternalUserid)) {
+                redisCache.setCacheObject(key, openExternalUserid);
+            }
+            return R.ok().put("openExternalUserid",openExternalUserid);
+        } else {
+            return R.ok().put("openExternalUserid",openExternalUserid);
+        }
+    }
+
     @Autowired
     private QwSopMapper qwSopMapper;
 

+ 19 - 2
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.fastGpt.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -53,6 +54,7 @@ import com.fs.qw.domain.*;
 import com.fs.qw.mapper.*;
 import com.fs.qw.param.QwAutoTagsRulesTags;
 import com.fs.qw.service.*;
+import com.fs.qwApi.config.OpenQwConfig;
 import com.fs.qwApi.domain.QwResult;
 import com.fs.qwApi.param.QwEditUserTagParam;
 import com.fs.qwApi.param.QwSendMsgParam;
@@ -410,6 +412,7 @@ public class AiHookServiceImpl implements AiHookService {
         }
         log.info("数据:{}", qwUserId);
         QwUser user = qwUserMapper.selectQwUserById(qwUserId);
+        String corpId = user.getCorpId();
         //查询接收人
         if(user==null){
             log.error("查询接收人为空");
@@ -459,8 +462,22 @@ public class AiHookServiceImpl implements AiHookService {
             return R.ok();
         }
         com.fs.wxwork.dto.WxWorkVid2UserIdRespDTO dto = data.get(0);
-
-        QwExternalContact qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByExternalUserIdAndQwUserId(dto.getOpenid(), user.getCorpId(),user.getQwUserId());
+        QwExternalContact qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByExternalUserIdAndQwUserId(dto.getOpenid(), corpId,user.getQwUserId());
+        try {
+            if (qwExternalContacts == null){
+                String url = OpenQwConfig.baseApi + "/getOpenExternalUserid?externalUserid=" + dto.getOpenid() + "&corpId=" + corpId + "&qwUserId=" + user.getQwUserId() + "&tenantId=" + tenantId;
+                String result = HttpUtil.createPost(url)
+                        .execute()
+                        .body();
+                R r = com.alibaba.fastjson.JSONObject.parseObject(result, R.class);
+                String openExternalUserid = r.get("openExternalUserid").toString();
+                if(StringUtils.isNotBlank(openExternalUserid)){
+                    qwExternalContacts = qwExternalContactMapper.selectQwExternalByApplicationExternalUserId(openExternalUserid, corpId,user.getQwUserId());
+                }
+            }
+        } catch (Exception e) {
+            log.error("未查询到外部联系人id:{},报错{}",e,dto.getOpenid());
+        }
         if (qwExternalContacts==null){
             log.error("没有外部联系人" + "user:" + user);
             return R.ok();

+ 5 - 0
fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -156,5 +156,10 @@ public class QwExternalContact extends BaseEntity
     // 广告链路唯一id
     private String traceId;
 
+    /**
+     * 代开发应用的 应用外部联系人id
+     */
+    private String applicationExternalUserId;
+
 
 }

+ 4 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -88,7 +88,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     public int batchUpdateQwExternalByIsDaysNotStudy(List<QwExternalContact> qwExternalContact);
 
 
-    @Select("SELECT * FROM qw_external_contact WHERE external_user_id = #{externalUserId}  AND corp_id=#{corpId} and user_id=#{qwUserId} limit 1")
+    @Select("SELECT * FROM qw_external_contact WHERE (external_user_id = #{externalUserId} or application_external_user_id = #{externalUserId} )AND corp_id=#{corpId} and user_id=#{qwUserId} limit 1")
     public QwExternalContact selectQwExternalContactByExternalUserIdAndQwUserId(@Param("externalUserId") String externalUserId,@Param("corpId") String corpId,@Param("qwUserId") String qwUserId);
 
     @Select("<script>" +
@@ -648,4 +648,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "</foreach>" +
             "</script>")
     public int batchUpdateQwExternalContactMandatoryRegistration(@Param("map") List<QwMandatoryRegistrParam> batchList);
+
+    QwExternalContact selectQwExternalByApplicationExternalUserId(@Param("externalUserid")String externalUserid,
+                                                                  @Param("corpId")String corpId,@Param("qwUserId") String qwUserId);
 }

+ 3 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -1027,6 +1027,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
 
 
                     // 设置公共属性
+                    qwExternalContact.setQwOpenUserId(qwUser.getQwOpenUserid());
                     qwExternalContact.setCompanyUserId(qwUser.getCompanyUserId());
                     qwExternalContact.setQwUserId(qwUser.getId());
                     qwExternalContact.setName(contact.getName()); // 设置名称
@@ -1195,8 +1196,8 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                         content="您好,您的服务已升级,后续将由我的同事接替我的工作,继续为您服务。";
                     }
                     qwTransferCustomerParam.setTransfer_success_msg(content);
-                    qwTransferCustomerParam.setHandover_userid(qwExternalContact.getUserId());
-                    qwTransferCustomerParam.setTakeover_userid(qwUser.getQwUserId());
+                    qwTransferCustomerParam.setHandover_userid(qwExternalContact.getQwOpenUserId());
+                    qwTransferCustomerParam.setTakeover_userid(qwUser.getQwOpenUserid());
                     qwTransferCustomerParam.setExternal_userid(Arrays.asList(qwExternalContact.getExternalUserId()));
                     QwTransferCustomerResult qwTransferCustomerResult = qwApiService.transferCustomer(qwTransferCustomerParam, param.getCorpId());
 //                    logger.info("返回:{}",qwTransferCustomerResult);

+ 3 - 2
fs-service/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java

@@ -1689,7 +1689,7 @@ public class QwApiServiceImpl implements QwApiService {
     @Override
     public QwExternalContactResult getExternalcontact(String userId,String corpId) {
 
-        String appSecret = getAppSecret(corpId);
+//        String appSecret = getAppSecret(corpId);
         String permanentCode = getPermanentCode(corpId);
 
         String token1 = getToken(corpId, permanentCode);
@@ -1849,7 +1849,8 @@ public class QwApiServiceImpl implements QwApiService {
 
     @Override
     public QwTransferCustomerResult transferCustomer(QwTransferCustomerParam param,String corpId) {
-        String json = sendPost(QwApiConfig.transferCustomerUrl, param,corpId,null);
+        QwCompany qwCompany = iQwCompanyService.selectQwCompanyByCorpId(corpId);
+        String json = sendPost(QwApiConfig.transferCustomerUrl, param,corpId,qwCompany.getPermanentCode());
         QwTransferCustomerResult qwResult = JSON.parseObject(json, QwTransferCustomerResult.class);
         return qwResult;
     }

+ 3 - 1
fs-service/src/main/java/com/fs/statis/impl/FsStatisQwWatchServiceImpl.java

@@ -84,8 +84,10 @@ public class FsStatisQwWatchServiceImpl implements IFsStatisQwWatchService {
             }
         }
         fsStatisQwTempParamMapper.clear();
+        if (paramList != null && !paramList.isEmpty()) {
+            fsStatisQwTempParamMapper.insertList(paramList);
+        }
 
-        fsStatisQwTempParamMapper.insertList(paramList);
 
         fsStatisQwWatchMapper.generateData(paramByDate);
 

+ 18 - 1
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -45,10 +45,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="lastWatchTime"    column="last_watch_time"    />
         <result property="registerTime"    column="register_time"    />
         <result property="isReply"    column="is_reply"    />
+        <result property="applicationExternalUserId"    column="application_external_user_id"    />
     </resultMap>
 
     <sql id="selectQwExternalContactVo">
-        select id,qw_user_id,register_time,state,way_id,qw_open_user_id,stage_status,first_time,open_id,is_interact,level, unionid, user_id,transfer_time,loss_time,del_time,transfer_num, external_user_id,transfer_status,status,create_time, name, avatar, type, gender, remark, description, tag_ids, remark_mobiles, remark_corp_name, add_way, oper_userid, corp_id, company_id, company_user_id, customer_id, fs_user_id,is_reply from qw_external_contact
+        select id,qw_user_id,register_time,state,way_id,qw_open_user_id,stage_status,first_time,open_id,is_interact,level,
+               unionid, user_id,transfer_time,loss_time,del_time,transfer_num, external_user_id,transfer_status,status,
+               create_time, name, avatar, type, gender, remark, description, tag_ids, remark_mobiles,
+               remark_corp_name, add_way, oper_userid, corp_id, company_id, company_user_id, customer_id,
+               fs_user_id,is_reply,application_external_user_id from qw_external_contact
     </sql>
 
     <select id="selectQwExternalContactList" parameterType="QwExternalContact" resultMap="QwExternalContactResult">
@@ -72,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="customerId != null "> and customer_id = #{customerId}</if>
             <if test="fsUserId != null "> and fs_user_id = #{fsUserId}</if>
             <if test="unionid != null "> and unionid = #{unionid}</if>
+            <if test="applicationExternalUserId != null and applicationExternalUserId != '' "> and application_external_user_id = #{applicationExternalUserId}</if>
         </where>
     </select>
 
@@ -277,6 +283,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="levelType != null">level_type,</if>
             <if test="firstTime != null">first_time,</if>
             <if test="registerTime != null">register_time,</if>
+            <if test="applicationExternalUserId != null">application_external_user_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -317,6 +324,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="levelType != null">#{levelType},</if>
             <if test="firstTime != null">#{firstTime},</if>
             <if test="registerTime != null">#{registerTime},</if>
+            <if test="applicationExternalUserId != null">#{applicationExternalUserId},</if>
          </trim>
     </insert>
 
@@ -820,4 +828,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and t1.corp_id = #{corpId}
             and t1.status = 0
      </select>
+
+    <select id="selectQwExternalByApplicationExternalUserId" resultMap="QwExternalContactResult">
+        <include refid="selectQwExternalContactVo"/>
+        where application_external_user_id = #{externalUserid} and corp_id = #{corpId}
+        <if test="qwUserId != null and qwUserId != ''">
+            user_id = #{qwUserId}
+        </if>
+        order by create_time desc limit 1
+    </select>
 </mapper>