فهرست منبع

Merge remote-tracking branch 'origin/企微聊天' into 企微聊天

ct 1 هفته پیش
والد
کامیت
817b85c6ac

+ 32 - 0
fs-admin/src/main/java/com/fs/api/controller/OpenController.java

@@ -0,0 +1,32 @@
+package com.fs.api.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.company.service.OpenService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * @description: 对外接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/open")
+public class OpenController {
+    @Autowired
+    private OpenService openService;
+
+    /**
+     * 康年堂调用发送物流消息 (上午9点;下午4点)
+     */
+    @PostMapping("/kntAiExpress")
+    public R kntAiExpressMessage(@RequestBody Map<String,Object> params){
+        return openService.kntAiExpressMessage(params);
+    }
+
+}

+ 1 - 1
fs-framework/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage","/getWechatQrCode","/checkWechatScan","/callback","/checkIsNeedCheck").anonymous()
+                .antMatchers("/login", "/register", "/captchaImage","/getWechatQrCode","/checkWechatScan","/callback","/checkIsNeedCheck","/api/open/kntAiExpress").anonymous()
                 .antMatchers("/app/common/test").anonymous()
                 .antMatchers("/ad/adDyApi/authorized").anonymous()
                 .antMatchers(

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -352,4 +352,6 @@ public interface CompanyUserMapper
     List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(@Param("companyUserId") Long companyUserId);
 
     int unBind(String userId);
+
+    Long getUserByUserName(String companyUserName);
 }

+ 14 - 0
fs-service/src/main/java/com/fs/company/service/OpenService.java

@@ -0,0 +1,14 @@
+package com.fs.company.service;
+
+import com.fs.common.core.domain.R;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OpenService {
+    /**
+     * 康年堂调用发送物流消息 (上午9点;下午4点)
+     */
+    R kntAiExpressMessage(Map<String,Object> params);
+}

+ 238 - 0
fs-service/src/main/java/com/fs/company/service/impl/OpenServiceImpl.java

@@ -0,0 +1,238 @@
+package com.fs.company.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.fs.common.core.domain.R;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.OpenService;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.dto.ErpDeliverysResponse;
+import com.fs.fastGpt.domain.FastGptRole;
+import com.fs.fastGpt.service.IFastGptRoleService;
+import com.fs.his.mapper.FsStoreOrderMapper;
+import com.fs.his.utils.PhoneUtil;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.wxwork.dto.WxWorkResponseDTO;
+import com.fs.wxwork.dto.WxWorkSendTextMsgDTO;
+import com.fs.wxwork.dto.WxWorkUserId2VidDTO;
+import com.fs.wxwork.dto.WxWorkVid2UserIdRespDTO;
+import com.fs.wxwork.service.WxWorkService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class OpenServiceImpl implements OpenService {
+    @Autowired
+    private IQwExternalContactService externalContactService;
+    @Autowired
+    private QwUserMapper qwUserMapper;
+    @Autowired
+    private IFastGptRoleService fastGptRoleService;
+    @Autowired
+    private WxWorkService wxWorkService;
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    /**
+     * 康年堂调用发送物流消息 (上午9点;下午4点)
+     */
+    @Override
+    public R kntAiExpressMessage(Map<String,Object> params) {
+        FsStoreOrderScrm order = JSON.parseObject(JSON.toJSONString(params.get("order")), FsStoreOrderScrm.class);
+        String stateEx = params.get("stateEx").toString();
+        Long orderId = order.getId();
+        //判断是否添加相关企微员工
+        if(order.getUserId() != null){
+            log.info("检查企微联系人 - orderId: {}, userId: {}, companyUserId: {}",
+                    orderId, order.getUserId(), order.getCompanyUserId());
+
+            // 查询用户userId
+            String phone = PhoneUtil.encryptPhone(order.getUserPhone());
+            Long userId = qwUserMapper.getqwUserByphone(phone);
+            if (userId == null){
+                return R.error("根据电话查询user为空,orderId: " + orderId + ";" + "phone:" + phone);
+            }
+            Long companyUserId = companyUserMapper.getUserByUserName(params.get("companyUserName").toString());
+            if (companyUserId == null) {
+                return R.error("根据用户名查询销售为空,orderId: " + orderId + ";" + "companyUserName:" + params.get("companyUserName"));
+            }
+            List<QwExternalContact> qwExternalContact = externalContactService.selectQwExternalContactByFsUserIdAndCompany(userId, companyUserId);
+
+            log.info("企微联系人查询结果 - orderId: {}, 联系人数量: {}",
+                    orderId, qwExternalContact != null ? qwExternalContact.size() : 0);
+
+            if(qwExternalContact != null && !qwExternalContact.isEmpty()) {
+                for (QwExternalContact externalContact : qwExternalContact) {
+                    Long qwUserId = externalContact.getQwUserId();
+
+                    log.info("康年堂处理企微联系人 - orderId: {}, externalUserId: {}, qwUserId: {}",
+                            orderId, externalContact.getExternalUserId(), qwUserId);
+
+                    if (qwUserId != null) {
+                        QwUser qwUser = qwUserMapper.selectQwUserById(qwUserId);
+
+                        log.info("康年堂企微用户信息 - orderId: {}, qwUserId: {}, uid: {}, fastGptRoleId: {}, serverId: {}, serverStatus: {}, ipadStatus: {}",
+                                orderId, qwUserId,
+                                qwUser != null ? qwUser.getUid() : null,
+                                qwUser != null ? qwUser.getFastGptRoleId() : null,
+                                qwUser != null ? qwUser.getServerId() : null,
+                                qwUser != null ? qwUser.getServerStatus() : null,
+                                qwUser != null ? qwUser.getIpadStatus() : null);
+
+                        if (qwUser != null && qwUser.getUid() != null && qwUser.getFastGptRoleId() != null && qwUser.getServerId() != null && qwUser.getServerStatus() == 1 && qwUser.getIpadStatus() == 1) {
+                            FastGptRole fastGptRole = fastGptRoleService.selectFastGptRoleByRoleId(qwUser.getFastGptRoleId());
+
+                            log.info("康年堂AI角色信息 - orderId: {}, roleId: {}, 物流功能状态: {}",
+                                    orderId, qwUser.getFastGptRoleId(),
+                                    fastGptRole != null ? fastGptRole.getLogistics() : "角色不存在");
+
+                            if (fastGptRole.getLogistics() == 0) {
+                                log.error("康年堂物流功能未开启,roleId:" + qwUser.getFastGptRoleId() + "订单号:" + orderId);
+                                continue; // 跳过这个联系人,继续处理下一个
+                            }
+                            WxWorkUserId2VidDTO wxWorkUserId2VidDTO = new WxWorkUserId2VidDTO();
+                            wxWorkUserId2VidDTO.setOpenid(Collections.singletonList(externalContact.getExternalUserId()));
+                            wxWorkUserId2VidDTO.setUuid(qwUser.getUid());
+
+                            log.info("康年堂调用企微接口获取用户ID - orderId: {}, externalUserId: {}, uid: {}, serverId: {}",
+                                    orderId, externalContact.getExternalUserId(), qwUser.getUid(), qwUser.getServerId());
+
+                            WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> WxWorkVid2UserIdRespDTO = wxWorkService.UserId2Vid(wxWorkUserId2VidDTO, qwUser.getServerId());
+                            List<WxWorkVid2UserIdRespDTO> data = WxWorkVid2UserIdRespDTO.getData();
+
+                            log.info("康年堂企微接口返回结果 - orderId: {}, 返回数据数量: {}, 返回数据: {}",
+                                    orderId, data != null ? data.size() : 0, data);
+
+                            StringBuilder sBuilder = new StringBuilder();
+                            if (data != null && !data.isEmpty()) {
+                                Long sendId = data.get(0).getUser_id();
+                                switch (order.getStatus()) {
+                                    case -1:
+                                        break;
+                                    case -2:
+                                        break;
+                                    case 1:
+                                        break;
+                                    case 2:
+                                        //你好,这边查询到您购买的XXX(购买套餐)在XXX(时间)已经送到了,送货员电话为XXX(送货员信息)
+                                        ErpDeliverysResponse express = JSON.parseObject(JSON.toJSONString(params.get("express")), ErpDeliverysResponse.class);
+                                        if (express != null && express.getDeliverys() != null && !express.getDeliverys().isEmpty()) {
+                                            List<ErpDeliverys> deliverys = express.getDeliverys();
+                                            ErpDeliverys tracesDTO = deliverys.get(deliverys.size() - 1);
+                                            String remark = tracesDTO.getRemark();
+
+                                            if ("0".equals(stateEx) || "1".equals(stateEx) || "2".equals(stateEx)) {
+                                                if (remark.contains("已收取快件")){
+                                                    sBuilder.append("您好,您有一个包裹正在准备发货,请耐心等待;\n");
+                                                    if (order.getDeliverySn() != null && !order.getDeliverySn().isEmpty()) {
+                                                        sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    }
+
+                                                    if (!"0".equals(stateEx)) {
+                                                        sBuilder.append("物流状态:").append("1".equals(stateEx) ? "已揽收" : "运输中").append("\n");
+                                                    }
+                                                    sBuilder.append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
+                                                } else {
+                                                    sBuilder.append("您好,您有一个包裹在运输途中,请耐心等待;\n");
+                                                    if (order.getDeliverySn() != null && !order.getDeliverySn().isEmpty()) {
+                                                        sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    }
+
+                                                    sBuilder.append("物流信息:").append(remark).append("\n");
+                                                    sBuilder.append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
+                                                }
+                                            } else if ("202".equals(stateEx)) {
+                                                if (remark.contains("正在派送")) {
+                                                    sBuilder.append("这边查询到您有一个包裹 ");
+                                                    sBuilder.append("正在派送中\n");
+                                                    sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    sBuilder.append("物流信息:").append(remark).append("\n");
+                                                    sBuilder.append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
+                                                }
+
+                                            } else if ("301".equals(stateEx)){
+                                                if (remark.contains("派送至本人") || remark.contains("签收")) {
+                                                    sBuilder.append("这边查询到您有一个包裹 ");
+                                                    sBuilder.append(" 在").append(tracesDTO.getAcceptTime()).append("已经签收了\n");
+                                                    sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    sBuilder.append("物流信息:").append(remark).append("\n");
+                                                }
+                                            }
+                                        }
+                                        break;
+                                    case 3:
+                                        break;
+                                    case 4:
+                                    case 5:
+                                }
+
+                                if (!"".contentEquals(sBuilder)) {
+                                    //2.发送模板中的文字内容
+                                    String content = sBuilder.toString();
+                                    content = content.replace("(有事呼叫我,勿找平台,少一次投诉,多一份感恩)", "");
+
+                                    log.info("康年堂每日上午9点和下午4点发送物流消息 准备发送AI物流消息 - orderId: {}, sendId: {}, 消息内容: {}",
+                                            orderId, sendId, content);
+
+                                    WxWorkSendTextMsgDTO wxWorkSendTextMsgDTO = new WxWorkSendTextMsgDTO();
+                                    wxWorkSendTextMsgDTO.setSend_userid(sendId);
+                                    wxWorkSendTextMsgDTO.setUuid(qwUser.getUid());
+                                    wxWorkSendTextMsgDTO.setContent(content);
+                                    wxWorkSendTextMsgDTO.setIsRoom(false);
+
+                                    try {
+                                        wxWorkService.SendTextMsg(wxWorkSendTextMsgDTO, qwUser.getServerId());
+                                        log.info("康年堂每日上午9点和下午4点发送物流消息 AI物流消息发送成功 - orderId: {}, sendId: {}", orderId, sendId);
+
+                                    } catch (Exception e) {
+                                        log.error("康年堂每日上午9点和下午4点发送物流消息 AI物流消息发送失败 - orderId: {}, sendId: {}, 错误信息: {}", orderId, sendId, e.getMessage(), e);
+                                        return R.error("AI物流消息发送失败");
+                                    }
+                                } else {
+                                    log.info("康年堂每日上午9点和下午4点发送物流消息 未生成有效的消息内容 - orderId: {}, stateEx: {}, sBuilder长度: {}",
+                                            orderId, stateEx, sBuilder.length());
+                                    return R.error("未生成有效的消息内容");
+                                }
+                            } else {
+                                log.warn("康年堂每日上午9点和下午4点发送物流消息 企微接口未返回有效的用户ID - orderId: {}, data为空", orderId);
+                                return R.error("企微接口未返回有效的用户ID");
+                            }
+                        } else {
+                            log.warn("康年堂每日上午9点和下午4点发送物流消息 企微用户配置不完整 - orderId: {}, qwUserId: {}, uid: {}, fastGptRoleId: {}, serverId: {}, serverStatus: {}, ipadStatus: {}",
+                                    orderId, qwUserId,
+                                    qwUser.getUid(),
+                                    qwUser.getFastGptRoleId(),
+                                    qwUser.getServerId(),
+                                    qwUser.getServerStatus(),
+                                    qwUser.getIpadStatus());
+                            return R.error("企微用户配置不完整");
+                        }
+                    } else {
+                        log.warn("康年堂每日上午9点和下午4点发送物流消息 未找到企微用户 - orderId: {}, externalUserId: {}", orderId, externalContact.getExternalUserId());
+                        return R.error("未找到企微用户");
+                    }
+                }
+            } else {
+                log.warn("康年堂每日上午9点和下午4点发送物流消息 未找到有效的企微联系人 - orderId: {}, qwExternalContact为空", orderId);
+                return R.error("未找到有效的企微联系人");
+            }
+        } else {
+            log.warn("康年堂每日上午9点和下午4点发送物流消息 订单用户ID为空 - orderId: {}", orderId);
+            return R.error("订单用户ID为空");
+        }
+
+        return R.ok("AI物流消息发送成功");
+    }
+}

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

@@ -529,4 +529,6 @@ public interface QwUserMapper extends BaseMapper<QwUser>
 
 
     List<QwUser> getQwUser(List<String> list);
+
+    Long getqwUserByphone(String phone);
 }

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

@@ -737,4 +737,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND is_del = 0
     </select>
 
+    <select id="getUserByUserName" resultType="java.lang.Long">
+        SELECT user_id FROM `company_user` WHERE user_name = #{companyUserName}
+    </select>
+
 </mapper>

+ 4 - 0
fs-service/src/main/resources/mapper/qw/QwUserMapper.xml

@@ -371,5 +371,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </select>
 
+    <select id="getqwUserByphone" resultType="java.lang.Long">
+        SELECT user_id FROM `fs_user` WHERE phone = #{phone}
+    </select>
+
 
 </mapper>