Pārlūkot izejas kodu

今正-ipad 按照主体分配ipad/sip外呼

三七 16 stundas atpakaļ
vecāks
revīzija
23bf883dc0
21 mainītis faili ar 187 papildinājumiem un 8 dzēšanām
  1. 1 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java
  2. 1 1
      fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java
  3. 12 0
      fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerController.java
  4. 1 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  5. 1 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyFsUserMapper.java
  6. 4 0
      fs-service/src/main/java/com/fs/company/vo/CompanyUserQwListVO.java
  7. 1 1
      fs-service/src/main/java/com/fs/live/service/impl/LiveRedPacketLogServiceImpl.java
  8. 4 0
      fs-service/src/main/java/com/fs/qw/domain/QwCompany.java
  9. 3 0
      fs-service/src/main/java/com/fs/qw/mapper/QwCompanyMapper.java
  10. 22 0
      fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerMapper.java
  11. 1 0
      fs-service/src/main/java/com/fs/qw/service/IQwCompanyService.java
  12. 3 0
      fs-service/src/main/java/com/fs/qw/service/IQwIpadServerService.java
  13. 5 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwCompanyServiceImpl.java
  14. 22 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerServiceImpl.java
  15. 48 3
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  16. 1 0
      fs-service/src/main/java/com/fs/qw/vo/QwOptionsVO.java
  17. 2 1
      fs-service/src/main/java/com/fs/sop/mapper/QwSopMapper.java
  18. 20 0
      fs-service/src/main/resources/application-config-druid-sxjz.yml
  19. 10 0
      fs-service/src/main/resources/db/changelog/changes/20260613-live-user-add-is-del.sql
  20. 9 1
      fs-service/src/main/resources/mapper/qw/QwCompanyMapper.xml
  21. 16 0
      fs-service/src/main/resources/mapper/qw/QwIpadServerMapper.xml

+ 1 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java

@@ -129,6 +129,7 @@ public class CompanyUserAllController extends BaseController {
                     if (vcCompanyUser!=null){
                         companyUserQwListVO.setIsBindVoiceSeat(1);
                         companyUserQwListVO.setIsRecordVoiceSeat(!StringUtil.strIsNullOrEmpty(vcCompanyUser.getUploadUrl()) ? 1 : 2);
+                        companyUserQwListVO.setTimes(vcCompanyUser.getTimes());
                     }
 
                     if (ObjectUtil.isEmpty(companyUserDelayTime)) {

+ 1 - 1
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -180,7 +180,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        QueryWrapper<FsCoursePlaySourceConfig> queryWrapper = new QueryWrapper<FsCoursePlaySourceConfig>().eq("is_del", 0);
+        QueryWrapper<FsCoursePlaySourceConfig> queryWrapper = new QueryWrapper<FsCoursePlaySourceConfig>().eq("is_del", 0).eq("status",0);
         if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
             queryWrapper.eq("create_user_id", loginUser.getUserId()).eq(config.getDept() == null || !config.getDept(), "create_dept_id", loginUser.getDeptId());
         }

+ 12 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerController.java

@@ -45,6 +45,18 @@ public class QwIpadServerController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询ipad服务器列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:list')")
+    @GetMapping("/disList")
+    public TableDataInfo disList(QwIpadServer qwIpadServer)
+    {
+        startPage();
+        List<QwIpadServer> list = qwIpadServerService.selectQwIpadServerDisList(qwIpadServer);
+        return getDataTable(list);
+    }
+
     /**
      * 导出ipad服务器列表
      */

+ 1 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -207,6 +207,7 @@ public class CompanyUserController extends BaseController {
                     if (vcCompanyUser!=null){
                         companyUserQwListVO.setIsBindVoiceSeat(1);
                         companyUserQwListVO.setIsRecordVoiceSeat(!StringUtil.strIsNullOrEmpty(vcCompanyUser.getUploadUrl()) ? 1 : 2);
+                        companyUserQwListVO.setTimes(vcCompanyUser.getTimes());
                     }
 
                     if (ObjectUtil.isEmpty(companyUserDelayTime)) {

+ 1 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyFsUserMapper.java

@@ -55,7 +55,7 @@ public interface CompanyFsUserMapper {
 
     List<VcCompanyUser> selectVcCompanyUserList(@Param("list") List<Long> userIds);
 
-    @Select("select id,speaker_id,company_user_id,upload_url from vc_company_user where company_user_id=#{companyUserId}")
+    @Select("select id,speaker_id,company_user_id,upload_url,times from vc_company_user where company_user_id=#{companyUserId}")
     VcCompanyUser selectVcCompanyUser(@Param("companyUserId") String companyUserId);
 
     List<VcCompanyUser> selectAllVcCompanyUser(@Param("companyUserId") String companyUserId);

+ 4 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyUserQwListVO.java

@@ -171,6 +171,10 @@ public class CompanyUserQwListVO extends BaseEntity {
     * 是否绑定语音席位
     */
     private Integer isBindVoiceSeat;
+    /**
+    * 录制次数
+    */
+    private Integer times;
 
     /**
     * 是否录制音色

+ 1 - 1
fs-service/src/main/java/com/fs/live/service/impl/LiveRedPacketLogServiceImpl.java

@@ -391,7 +391,7 @@ public class LiveRedPacketLogServiceImpl extends ServiceImpl<LiveRedPacketLogMap
                             watchUser.setSendType(1);
 
                             watchUserMapper.updateLiveWatchUser(watchUser);
-                            return R.ok();
+                            return R.ok("答题成功");
                         }
                     }
 

+ 4 - 0
fs-service/src/main/java/com/fs/qw/domain/QwCompany.java

@@ -96,4 +96,8 @@ public class QwCompany extends BaseEntity
     private String shareAgentId;
 
     private String shareSchema;
+    /**
+    * 区域地址
+    */
+    private String addressBindIp;
 }

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

@@ -73,6 +73,9 @@ public interface QwCompanyMapper
     @Select("SELECT * from qw_company where corp_id=#{corpId} limit 1")
     QwCompany selectQwCompanyByCorpId(String corpId);
 
+    @Select("SELECT address_bind_ip from qw_company where address_bind_ip is not null")
+    List<String> selectQwCompanyByAddressBindIp();
+
     List<QwOptionsVO> selectQwCompanyListOptionsVO(@Param("userId") Long userId, @Param("deptId") Long deptId);
 
     List<QwCompany> selectByCorpIds(@Param("corpIds") List<String> corpIds);

+ 22 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerMapper.java

@@ -31,6 +31,8 @@ public interface QwIpadServerMapper extends BaseMapper<QwIpadServer>{
      */
     List<QwIpadServer> selectQwIpadServerList(QwIpadServer qwIpadServer);
 
+    List<QwIpadServer> selectQwIpadServerDisList(QwIpadServer qwIpadServer);
+
     /**
      * 新增ipad服务器
      *
@@ -65,6 +67,26 @@ public interface QwIpadServerMapper extends BaseMapper<QwIpadServer>{
 
     @Select("select id from qw_ipad_server where  address_id =#{addressId} and count>0 limit 1 "  )
     Long selectQwIpadServerByAddressId(String addressId);
+
+    @Select("<script>" +
+            "select id from qw_ipad_server where address_id =#{addressId} and ip in " +
+            "<foreach collection='addressIps' item='ip' open='(' separator=',' close=')'>" +
+            "#{ip}" +
+            "</foreach>" +
+            " and count>0 limit 1" +
+            "</script>")
+    Long selectQwIpadServerByAddressIds(@Param("addressIps") List<String> addressIps,@Param("addressId") String addressId);
+
+
+    @Select("<script>" +
+            "select id from qw_ipad_server where address_id =#{addressId} and ip not in " +
+            "<foreach collection='addressIps' item='ip' open='(' separator=',' close=')'>" +
+            "#{ip}" +
+            "</foreach>" +
+            " and count>0 limit 1" +
+            "</script>")
+    Long selectQwIpadServerByNotAddressIds(@Param("addressIps") List<String> addressIps,@Param("addressId") String addressId);
+
     @Update("UPDATE qw_ipad_server  SET count = count - 1 WHERE id = #{serverId}")
     void subtractServer(Long serverId);
     @Update("UPDATE qw_ipad_server  SET count = count + 1 WHERE id = #{serverId}")

+ 1 - 0
fs-service/src/main/java/com/fs/qw/service/IQwCompanyService.java

@@ -22,6 +22,7 @@ public interface IQwCompanyService
     public QwCompany selectQwCompanyById(Long id);
 
     public QwCompany selectQwCompanyByCorpId(String corpId);
+    public List<String> selectQwCompanyByAddressBindIp();
 
     public QwCompany getQwCompanyByRedis(String corpId);
 

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

@@ -27,6 +27,7 @@ public interface IQwIpadServerService extends IService<QwIpadServer>{
      * @return ipad服务器集合
      */
     List<QwIpadServer> selectQwIpadServerList(QwIpadServer qwIpadServer);
+    List<QwIpadServer> selectQwIpadServerDisList(QwIpadServer qwIpadServer);
 
     /**
      * 新增ipad服务器
@@ -61,6 +62,8 @@ public interface IQwIpadServerService extends IService<QwIpadServer>{
     int deleteQwIpadServerById(Long id);
 
     Long selectQwIpadServerByAddressId(String addressId);
+    Long selectQwIpadServerByAddressIds(List<String> addressIp,String addressId);
+    Long selectQwIpadServerByNotAddressIds(List<String> addressIp,String addressId);
 
     void subtractServer(Long serverId);
 

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

@@ -47,6 +47,11 @@ public class QwCompanyServiceImpl implements IQwCompanyService
         return qwCompanyMapper.selectQwCompanyByCorpId(corpId);
     }
 
+    @Override
+    public List<String> selectQwCompanyByAddressBindIp() {
+        return qwCompanyMapper.selectQwCompanyByAddressBindIp();
+    }
+
     @Override
     public QwCompany getQwCompanyByRedis(String corpId) {
         String key =(String) redisCache.getCacheObject("qwCompany:"+corpId);

+ 22 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerServiceImpl.java

@@ -44,6 +44,18 @@ private QwIpadServerMapper qwIpadServerMapper;
         return baseMapper.selectQwIpadServerList(qwIpadServer);
     }
 
+    /**
+     * 查询ipad服务器列表
+     *
+     * @param qwIpadServer ipad服务器
+     * @return ipad服务器
+     */
+    @Override
+    public List<QwIpadServer> selectQwIpadServerDisList(QwIpadServer qwIpadServer)
+    {
+        return baseMapper.selectQwIpadServerDisList(qwIpadServer);
+    }
+
     /**
      * 新增ipad服务器
      *
@@ -99,6 +111,16 @@ private QwIpadServerMapper qwIpadServerMapper;
         return qwIpadServerMapper.selectQwIpadServerByAddressId(addressId);
     }
 
+    @Override
+    public Long selectQwIpadServerByAddressIds(List<String> addressIps,String addressId) {
+        return qwIpadServerMapper.selectQwIpadServerByAddressIds(addressIps,addressId);
+    }
+
+    @Override
+    public Long selectQwIpadServerByNotAddressIds(List<String> addressIps,String addressId) {
+        return qwIpadServerMapper.selectQwIpadServerByNotAddressIds(addressIps,addressId);
+    }
+
     @Override
     public void subtractServer(Long serverId) {
         qwIpadServerMapper.subtractServer(serverId);

+ 48 - 3
fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -37,6 +37,7 @@ import com.fs.qw.domain.*;
 import com.fs.qw.dto.QwUserByToolDTO;
 import com.fs.qw.dto.QwUserKeyDTO;
 import com.fs.qw.dto.QwUserQueryDto;
+import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.mapper.QwWorkTaskMapper;
 import com.fs.qw.param.*;
@@ -151,7 +152,9 @@ public class QwUserServiceImpl implements IQwUserService
         if (qwUser.getAppKey()==null){
             return R.error("请先授权key");
         }
+
         CompanyUser companyUser = companyUserService.selectCompanyUserById(qwUser.getCompanyUserId());
+
         if (companyUser==null){
             return R.error("未绑定销售");
         }
@@ -159,10 +162,52 @@ public class QwUserServiceImpl implements IQwUserService
         if (addressId==null || addressId.isEmpty()){
             return R.error("请先绑定地址");
         }
-        Long serverId = ipadServerService.selectQwIpadServerByAddressId(addressId);
-        if (serverId==null){
-            return  R.error(501,"该地区服务器剩余数量不足");
+
+        Long serverId=null;
+        //今正从 主体上优先查 主体绑定的ip地址 分配
+        if (CloudHostUtils.hasCloudHostName("今正科技")){
+            QwCompany qwCompany = iQwCompanyService.selectQwCompanyByCorpId(qwUser.getCorpId());
+            String addressBindIp = qwCompany.getAddressBindIp();
+            if (!StringUtil.strIsNullOrEmpty(addressBindIp)){
+                List<String> addressIps = Arrays.asList(addressBindIp.split(","));
+                serverId = ipadServerService.selectQwIpadServerByAddressIds(addressIps,addressId);
+                if (serverId==null){
+                    return  R.error(501,"该主体绑定的服务器剩余数量不足");
+                }
+            }else {
+                //获取所有已经绑定了的 ip 排除掉
+                List<String> strings = iQwCompanyService.selectQwCompanyByAddressBindIp();
+                // 整合所有绑定IP,按","拆分为单个IP列表
+                List<String> excludeIps = new ArrayList<>();
+                if (!CollectionUtils.isEmpty(strings)) {
+                    for (String ipStr : strings) {
+                        if (!StringUtil.strIsNullOrEmpty(ipStr)) {
+                            excludeIps.addAll(Arrays.asList(ipStr.split(",")));
+                        }
+                    }
+                }
+
+                if (!StringUtil.strIsNullOrEmpty(addressId)) {
+                    if (CollectionUtils.isEmpty(excludeIps)) {
+                        serverId = ipadServerService.selectQwIpadServerByAddressId(addressId);
+                    } else {
+                        serverId = ipadServerService.selectQwIpadServerByNotAddressIds(excludeIps, addressId);
+                    }
+                }
+                if (serverId == null) {
+                    return R.error(501, "该地区未绑定主体的服务器剩余数量不足");
+                }
+            }
+
+        }else {
+
+             serverId = ipadServerService.selectQwIpadServerByAddressId(addressId);
+
+            if (serverId==null){
+                return  R.error(501,"该地区服务器剩余数量不足");
+            }
         }
+
         QwUser u = new QwUser();
         u.setId(qwUser.getId());
         u.setServerId(serverId);

+ 1 - 0
fs-service/src/main/java/com/fs/qw/vo/QwOptionsVO.java

@@ -10,4 +10,5 @@ public class QwOptionsVO {
     String corpId;
     String corpName;
     String companyIds;
+    String addressBindIp;
 }

+ 2 - 1
fs-service/src/main/java/com/fs/sop/mapper/QwSopMapper.java

@@ -96,7 +96,8 @@ public interface QwSopMapper extends BaseMapper<QwSop> {
                             "    )" +
             "            </if>" +
             "            <!-- 加入固定条件 -->\n" +
-            "            and status != 6" +
+            "            and status != 6 " +
+            "        order by create_time desc " +
             "</script>")
     public List<QwSop> selectQwSopMyList(QwSop qwSop);
 

+ 20 - 0
fs-service/src/main/resources/application-config-druid-sxjz.yml

@@ -112,3 +112,23 @@ weizou:
   appId: 598372344571410ab2598a05ba914178
   appSecret: c3e51122dbf749b6aef170c4b3a712c7
   createName: wz_7f35d1f365e448f6a60a6fc39d5613a1
+
+# sip外呼配置
+sip:
+  call:
+    #是否有自己线路
+    myGateway: true
+    # 自动线路前缀
+    automaticGatewayPrefix: tiaobao
+    # 手动线路前缀
+    manualGatewayPrefix: tiaobao
+    # 公共线路前缀
+    publicGatewayPrefix: outbound
+    #总后台用户前缀,用于绑定分机
+    adminUserPrefix: ad
+    #销售公司前缀,用于绑定分机
+    companyPrefix: cp
+    #销售前缀,用于绑定分机
+    companyUserPrefix: cu
+    #医生前缀,用于绑定分机
+    doctorPrefix: dt

+ 10 - 0
fs-service/src/main/resources/db/changelog/changes/20260613-live-user-add-is-del.sql

@@ -490,3 +490,13 @@ ALTER TABLE fs_user
 ALTER TABLE fs_user
     ADD COLUMN may_withdraw bigint DEFAULT NULL COMMENT '可提现佣金';
 --rollback ALTER TABLE fs_user DROP COLUMN may_withdraw;
+
+
+--changeset sgw:20260723-qw_company_address_bind_ip
+--preconditions onFail:MARK_RAN
+--precondition-sql-check expectedResult:1 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'qw_company'
+--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'qw_company' AND column_name = 'address_bind_ip'
+ALTER TABLE qw_company
+    ADD COLUMN address_bind_ip bigint DEFAULT NULL COMMENT '可提现佣金';
+--rollback ALTER TABLE qw_company DROP COLUMN address_bind_ip;
+

+ 9 - 1
fs-service/src/main/resources/mapper/qw/QwCompanyMapper.xml

@@ -33,10 +33,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="shareAppId"    column="share_app_id"    />
         <result property="shareAgentId"    column="share_agent_id"    />
         <result property="shareSchema"    column="share_schema"    />
+        <result property="addressBindIp"    column="address_bind_ip"    />
     </resultMap>
 
     <sql id="selectQwCompanyVo">
-        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id, server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url, chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,is_buy,mini_app_id,company_server_num,share_app_id,share_agent_id,share_schema from qw_company
+        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id,
+               server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url,
+               chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,
+               is_buy,mini_app_id,company_server_num,share_app_id,share_agent_id,share_schema,address_bind_ip
+        from qw_company
     </sql>
 
     <select id="selectQwCompanyList" parameterType="QwCompany" resultMap="QwCompanyResult">
@@ -108,6 +113,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareAppId != null">share_app_id,</if>
             <if test="shareAgentId != null">share_agent_id,</if>
             <if test="shareSchema != null">share_schema,</if>
+            <if test="addressBindIp != null">address_bind_ip,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="corpId != null">#{corpId},</if>
@@ -137,6 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareAppId != null">#{shareAppId},</if>
             <if test="shareAgentId != null">#{shareAgentId},</if>
             <if test="shareSchema != null">#{shareSchema},</if>
+            <if test="addressBindIp != null">#{addressBindIp},</if>
          </trim>
     </insert>
 
@@ -168,6 +175,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareAppId != null">share_app_id = #{shareAppId},</if>
             <if test="shareAgentId != null">share_agent_id = #{shareAgentId},</if>
             <if test="shareSchema != null">share_schema = #{shareSchema},</if>
+            <if test="addressBindIp != null">address_bind_ip = #{addressBindIp},</if>
         </trim>
         where id = #{id}
     </update>

+ 16 - 0
fs-service/src/main/resources/mapper/qw/QwIpadServerMapper.xml

@@ -34,6 +34,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+    <select id="selectQwIpadServerDisList" parameterType="QwIpadServer" resultMap="QwIpadServerResult">
+        <include refid="selectQwIpadServerVo"/>
+        <where>
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="addressId != null  and addressId != ''"> and address_id = #{addressId}</if>
+            <if test="ip != null  and ip != ''"> and ip = #{ip}</if>
+            <if test="port != null  and port != ''"> and port = #{port}</if>
+            <if test="url != null  and url != ''"> and url = #{url}</if>
+            <if test="totalCount != null "> and total_count = #{totalCount}</if>
+            <if test="count != null "> and count = #{count}</if>
+        </where>
+        group by ip
+    </select>
+
+
     <select id="selectQwIpadServerById" parameterType="Long" resultMap="QwIpadServerResult">
         <include refid="selectQwIpadServerVo"/>
         where id = #{id}
@@ -43,6 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where ip = #{ipAddress} and port = #{port}
     </select>
 
+
     <insert id="insertQwIpadServer" parameterType="QwIpadServer">
         insert into qw_ipad_server
         <trim prefix="(" suffix=")" suffixOverrides=",">