Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

xgb 1 týždeň pred
rodič
commit
9cfb6bc23f

+ 1 - 2
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -113,7 +113,6 @@ public class QwUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:user:staffList')")
     @GetMapping("/staffList")
     public TableDataInfo staffList(QwUserListParam qwUser) {
-        startPage();
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         qwUser.setCompanyId(loginUser.getCompany().getCompanyId());
 
@@ -131,7 +130,7 @@ public class QwUserController extends BaseController
             }
             qwUser.setQwDeptIdList(qwDeptIdList);
         }
-
+        startPage();
         List<QwUserVO> list = qwUserService.selectQwUserListStaffVO(qwUser);
         return getDataTable(list);
     }

+ 1 - 1
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -334,7 +334,7 @@ public class IpadSendServer {
     public void send(QwSopCourseFinishTempSetting.Setting content, QwUser qwUser, QwSopLogs qwSopLogs, Map<String, FsCoursePlaySourceConfig> miniMap, BaseVo parentVo) {
         BaseVo vo = new BaseVo();
         vo.setId(Long.parseLong(qwSopLogs.getId()));
-        vo.setRoom(qwSopLogs.getSendType() == 6);
+        vo.setRoom(qwSopLogs.getSendType() == 6 || qwSopLogs.getSendType() == 12);
         vo.setUuid(qwUser.getUid());
         vo.setExId(qwSopLogs.getExternalUserId());
         vo.setServerId(qwUser.getServerId());

+ 2 - 2
fs-qw-api-msg/src/main/java/com/fs/app/controller/QwMsgController.java

@@ -376,8 +376,8 @@ public class QwMsgController {
                         log.info("id:{}, 客户发送", id);
                         aiHookService.qwHookNotifyAiReply(id,sender,content,wxWorkMsgResp.getUuid(),wxWorkMessageDTO.getMsgtype());
                     }else {
-                        log.info("id:{}, 销售发送", id);
-                        aiHookService.qwHookNotifyAddMsg(id,receiver,content,wxWorkMsgResp.getUuid());
+                        log.info("销售发送");
+                        aiHookService.qwHookNotifyAddMsgNew(id,receiver,content,wxWorkMsgResp.getUuid(),1);
                     }
 
                 }

+ 2 - 0
fs-service/src/main/java/com/fs/fastGpt/service/AiHookService.java

@@ -20,6 +20,8 @@ public interface AiHookService {
 
     R qwHookNotifyAddMsg(Long qwUserID, Long sender,String count,String uid);
 
+    R qwHookNotifyAddMsgNew(Long qwUserID, Long sender,String count,String uid,Integer type);
+
     void expireAiMsg();
 
     WxWorkResponseDTO<String> getFileUrl(String uuid, String fileId, String aesKey, String authKey, String fileName, Integer fileSize, Long serverId);

+ 65 - 14
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -1937,8 +1937,9 @@ public class AiHookServiceImpl implements AiHookService {
         sendAIParam.setKey(user.getAppKey());
         redisTemplate.opsForList().leftPush("AiMsg:"+user.getAppKey(), JSON.toJSONString(sendAIParam));
     }
+
     @Override
-    public R qwHookNotifyAddMsg(Long qwUserID, Long sender,String count,String uid) {
+    public R qwHookNotifyAddMsgNew(Long qwUserID, Long sender,String count,String uid,Integer type) {
         QwUser sendUser = qwUserMapper.selectQwUserById(qwUserID);
 
 
@@ -1952,6 +1953,25 @@ public class AiHookServiceImpl implements AiHookService {
             FastGptChatSession fastGptChatSession = fastGptChatSessionMapper.selectFastGptChatSessionByQwExternalContactsAndUserId(qwExternalContacts.getId(), sendUser.getId());
             if (fastGptChatSession!=null){
                 saveQwUserMsg(fastGptChatSession,2,count);
+                // 客服进行回复后就转人工10分钟
+                if(type == 1){
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.MINUTE, -5);
+                    Date lastTime = calendar.getTime();
+                    if(lastTime.after(fastGptChatSession.getCreateTime())){
+                        Calendar calendar1 = Calendar.getInstance();
+                        //定时任务会处理10分钟以内的,所以设置20分钟
+                        calendar1.add(Calendar.MINUTE, 10);
+                        Date expireTime = calendar1.getTime();
+
+                        FastGptChatSession chatSession = new FastGptChatSession();
+                        chatSession.setLastTime(expireTime);
+                        chatSession.setIsArtificial(1);
+                        chatSession.setSessionId(fastGptChatSession.getSessionId());
+
+                        fastGptChatSessionMapper.updateFastGptChatSession(chatSession);
+                    }
+                }
             }else {
 
                 if(qwExternalContacts.getType()!=null&&qwExternalContacts.getType()==1){
@@ -1978,19 +1998,50 @@ public class AiHookServiceImpl implements AiHookService {
                     }
                 }
             }
-            // 客服进行回复后就转人工10分钟
-            if(fastGptChatSession != null){
-                Calendar calendar = Calendar.getInstance();
-                //定时任务会处理10分钟以内的,所以设置20分钟
-                calendar.add(Calendar.MINUTE, 30);
-                Date expireTime = calendar.getTime();
-
-                FastGptChatSession chatSession = new FastGptChatSession();
-                chatSession.setLastTime(expireTime);
-                chatSession.setIsArtificial(1);
-                chatSession.setSessionId(fastGptChatSession.getSessionId());
-
-                fastGptChatSessionMapper.updateFastGptChatSession(chatSession);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R qwHookNotifyAddMsg(Long qwUserID, Long sender,String count,String uid) {
+        QwUser sendUser = qwUserMapper.selectQwUserById(qwUserID);
+
+
+        if (sendUser!=null){
+
+            String extId = getExtId(sender, uid, sendUser.getServerId());
+            QwExternalContact qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByExternalUserIdAndQwUserId(extId, sendUser.getCorpId(),sendUser.getQwUserId());
+            if (qwExternalContacts==null){
+                return R.ok();
+            }
+            FastGptChatSession fastGptChatSession = fastGptChatSessionMapper.selectFastGptChatSessionByQwExternalContactsAndUserId(qwExternalContacts.getId(), sendUser.getId());
+            if (fastGptChatSession!=null){
+                saveQwUserMsg(fastGptChatSession,2,count);
+            }else {
+
+                if(qwExternalContacts.getType()!=null&&qwExternalContacts.getType()==1){
+                    if(sendUser.getFastGptRoleId()!=null){
+                        fastGptChatSession = new FastGptChatSession();
+                        String chatId = UUID.randomUUID().toString();
+                        fastGptChatSession.setChatId(chatId);
+                        fastGptChatSession.setKfId(sendUser.getFastGptRoleId().toString());
+                        fastGptChatSession.setStatus(1);
+                        fastGptChatSession.setRemindCount(0);
+                        fastGptChatSession.setRemindStatus(0);
+                        fastGptChatSession.setCreateTime(new Date());
+                        fastGptChatSession.setQwExtId(qwExternalContacts.getId());
+                        fastGptChatSession.setQwUserId(sendUser.getId());
+                        fastGptChatSession.setIsArtificial(0);
+                        fastGptChatSession.setAvatar(qwExternalContacts.getAvatar());
+                        fastGptChatSession.setNickName(qwExternalContacts.getName());
+                        fastGptChatSession.setCompanyId(sendUser.getCompanyId());
+                        fastGptChatSession.setLastTime(new Date());
+                        fastGptChatSession.setIsReply(0);
+                        fastGptChatSessionMapper.insertFastGptChatSession(fastGptChatSession);
+                        addUserSex(qwExternalContacts);
+                        saveQwUserMsg(fastGptChatSession,2,count);
+                    }
+                }
             }
         }
         return R.ok();

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -878,7 +878,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         storePayment.setPayMoney(param.getPayMoney());
         storePayment.setCreateTime(new Date());
         storePayment.setPayTypeCode("weixin");
-        storePayment.setBusinessType(7);//微信收款
+        storePayment.setBusinessType(1);//微信收款
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(user.getMaOpenId());
         storePayment.setUserId(user.getUserId());

+ 3 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -452,4 +452,7 @@ public interface QwUserMapper extends BaseMapper<QwUser>
     @Select("select corp_id from qw_user where id=#{id} limit 1")
     String selectCorpIdById(@Param("id") Long id);
     List<Long> selectDeptByParentId(@Param("deptId")Long deptId,@Param("corpId") String corpId);
+
+    @Select("  select company_id from qw_user where qw_user_id = #{owner} and corp_id = #{corpId}  limit 1")
+    Long getCompanyIdByCorpIdAndOwner(@Param("corpId")String corpId, @Param("owner")String owner);
 }

+ 18 - 2
fs-service/src/main/java/com/fs/qw/service/AsyncQwAiChatSopService.java

@@ -1,6 +1,7 @@
 package com.fs.qw.service;
 
 import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.course.config.CourseConfig;
@@ -12,9 +13,11 @@ import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.fastGpt.domain.FastGptChatReplaceWords;
 import com.fs.fastGpt.mapper.FastGptChatReplaceWordsMapper;
 import com.fs.qw.domain.QwCompany;
+import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwExternalContactInfoMapper;
+import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.vo.QwSopRuleTimeVO;
 import com.fs.qw.vo.QwSopTempSetting;
 import com.fs.sop.domain.QwSopLogs;
@@ -67,6 +70,8 @@ public class AsyncQwAiChatSopService {
 
     @Autowired
     private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
 
     @Autowired
     private QwSopLogsMapper qwSopLogsMapper;
@@ -92,6 +97,13 @@ public class AsyncQwAiChatSopService {
                                    QwUser qwUser, String externalUserID, String externalContactName,
                                    Long externalId, Long fsUserId, LocalDate currentDate, LocalTime localTime) {
 
+
+        QwExternalContact contact;
+        if(externalId != null){
+            contact = qwExternalContactMapper.selectById(externalId);
+        } else {
+            contact = null;
+        }
         //新客对话任务
         List<QwSopRuleTimeVO> qwSopAiRuleTimeVOS = qwSopMapper.selectQwAiSopAutoByTagsByForeach(qwSopAutoByTags);
         List<FastGptChatReplaceWords> words = fastGptChatReplaceWordsMapper.selectAllFastGptChatReplaceWords();
@@ -120,7 +132,6 @@ public class AsyncQwAiChatSopService {
                 List<QwSopTempContent> tempContentList = qwSopTempContentMapper.selectQwSopTempContentByTempIdAndRules(item.getTempId());
 
                 tempContentList.forEach(content->{
-
                     QwSopLogs sopLogs = new QwSopLogs();
                     sopLogs.setQwUserKey(qwUser.getId());
                     sopLogs.setQwUserid(userID);
@@ -162,8 +173,13 @@ public class AsyncQwAiChatSopService {
                         case "3":
 
                             if ("1".equals(setting.getContentType())) {
+                                String defaultName = "同学";
+                                if(contact != null && StringUtils.isNotEmpty(contact.getName()) && !"待同步客户".equals(contact.getName())){
+                                    defaultName = contact.getName();
+                                }
                                 setting.setValue(setting.getValue()
-                                        .replaceAll("#销售称呼#", StringUtil.strIsNullOrEmpty(qwUser.getWelcomeText()) ? "" : qwUser.getWelcomeText()));
+                                        .replaceAll("#销售称呼#", StringUtil.strIsNullOrEmpty(qwUser.getWelcomeText()) ? "" : qwUser.getWelcomeText())
+                                        .replaceAll("#客户称呼#", contact == null || StringUtil.strIsNullOrEmpty(contact.getStageStatus())|| "0".equals(contact.getStageStatus())?defaultName:contact.getStageStatus()));
                             }
 
 

+ 13 - 12
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -2259,18 +2259,18 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
 //        }
 //        iAdHtmlClickLogService.upload(state, AdUploadType.ADD_WX, e -> finalQwExternalContact.setUploadAddWxStatus(1));
         //重粉问题
-        try {
-            new Thread(() -> {
-                try {
-                    Thread.sleep(3000);
-                } catch (InterruptedException e) {
-                    logger.error("添加等待时长错误", e);
-                }
-                rocketMQTemplate.syncSend("repeat-upload", JSON.toJSONString(RepeatUploadVo.builder().type(0).externalUserId(externalUserID).build()));
-            }).start();
-        }catch (Exception e){
-            logger.error("重粉提交mq失败", e);
-        }
+//        try {
+//            new Thread(() -> {
+//                try {
+//                    Thread.sleep(3000);
+//                } catch (InterruptedException e) {
+//                    logger.error("添加等待时长错误", e);
+//                }
+//                rocketMQTemplate.syncSend("repeat-upload", JSON.toJSONString(RepeatUploadVo.builder().type(0).externalUserId(externalUserID).build()));
+//            }).start();
+//        }catch (Exception e){
+//            logger.error("重粉提交mq失败", e);
+//        }
 
 
 
@@ -2526,6 +2526,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                 qwExternalContact.setType(externalContact.getType()); // 设置外部联系人类型(1微信用户,2企业微信用户)
                 qwExternalContact.setGender(externalContact.getGender()); // 设置性别 (0-未知, 1-男性, 2-女性)
                 qwExternalContact.setDescription(followUser.getDescription()); // 设置描述信息
+                qwExternalContact.setUnionid(externalContact.getUnionid());
                 List<Tag> tags = followUser.getTags();
                 Set<String> combinedTagsSet = new HashSet<>();
 

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatServiceImpl.java

@@ -311,6 +311,11 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
                     qwGroupChat.setCorpId(corpId);
                     qwGroupChat.setNotice(notice);
                     qwGroupChat.setOwner(owner);
+                    //2025-10-31 新增维护 qw_group_chat的company_id
+                    Long findCompanyId = qwUserMapper.getCompanyIdByCorpIdAndOwner(corpId, owner);
+                    if(null != findCompanyId){
+                        qwGroupChat.setCompanyId(findCompanyId);
+                    }
                     qwGroupChat.setCreateAt(String.valueOf(createTime));
                     qwGroupChat.setMemberVersion(groupChat.getMemberVersion());
                     qwGroupChat.setChatId(chatId);

+ 7 - 0
fs-service/src/main/resources/application-config-druid-jnlzjk.yml

@@ -98,5 +98,12 @@ ipad:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:
+qw:
+  enableAutoTag: 1
+tag:
+  thread:
+    num: 5
+  rate:
+    limit: 30
 
 

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

@@ -93,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         u.qw_status, u.phonenumber, u.create_time, u.dept_id,
         u.qr_code_weixin, u.user_type, u.qr_code_wecom, u.jpush_id,
         u.is_need_register_member,u.is_allowed_all_register,
-        u.avatar,
+        u.avatar,u.address_id,
         u.qw_user_id,
         d.dept_name,
         d.leader