Bladeren bron

CID,配置每个客户每天给他打电话数量限制,超出限制无法通过系统外呼出去

yjwang 3 dagen geleden
bovenliggende
commit
60e3a8cd33

+ 2 - 2
fs-admin/src/main/resources/application.yml

@@ -4,11 +4,11 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: druid-bjzm-test
+#    active: druid-bjzm-test
 #    active: druid-hdt
 #    active: druid-yzt
 #    active: druid-sxjz-test
 #    active: druid-sft
 #    active: druid-fby
-#    active: dev
+    active: dev
 

+ 7 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogCallphoneMapper.java

@@ -68,4 +68,11 @@ public interface CompanyVoiceRoboticCallLogCallphoneMapper extends BaseMapper<Co
     List<CompanyVoiceRoboticCallLogCallphone>  selectCompanyVoiceRoboticCallLogCallphoneListData(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
 
     CompanyVoiceRoboticCallLogCallphone selectCallLogByCallbackUuid(@Param("uuid") String uuid);
+
+    /**
+     * 根据业务ID查询当天的通话次数
+     * @param businessId 业务ID (bes.id)
+     * @return 当天通话次数,如果没有记录返回0
+     */
+    int countTodayCallsByBusinessId(@Param("businessId") Long businessId);
 }

+ 3 - 3
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -1191,9 +1191,9 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
         CompanyConfig companyConfig = companyConfigMapper.selectCompanyConfigByKey(robotic.getCompanyId(),"cid.config");
         //如果配置为空就获取总后台配置
         if(companyConfig == null){
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("cid.config");
-            if(sysConfig != null){
-                phoneConfig = JSONObject.parseObject(sysConfig.getConfigValue(),CidPhoneConfig.class);
+            String json = configService.selectConfigByKey("his.store");
+            if(StringUtils.isNotEmpty(json)){
+                phoneConfig = JSONObject.parseObject(json,CidPhoneConfig.class);
             }
         } else {
             phoneConfig = JSONObject.parseObject(companyConfig.getConfigValue(),CidPhoneConfig.class);

+ 31 - 1
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java

@@ -5,11 +5,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.*;
+import com.fs.company.mapper.CompanyVoiceRoboticCallLogCallphoneMapper;
 import com.fs.company.mapper.CompanyVoiceRoboticCalleesMapper;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
 import com.fs.company.service.ICompanyVoiceRoboticService;
-import com.fs.company.service.IWorkflowNode;
 import com.fs.company.service.easycall.IEasyCallService;
 import com.fs.company.service.impl.CompanyVoiceRoboticCallLogCallphoneServiceImpl;
 import com.fs.company.vo.AiCallConfigVO;
@@ -21,6 +21,8 @@ import com.fs.company.vo.easycall.EasyCallPhoneItemVO;
 import com.fs.company.vo.easycall.EasyCallTaskVO;
 import com.fs.enums.ExecutionStatusEnum;
 import com.fs.enums.NodeTypeEnum;
+import com.fs.his.config.CidPhoneConfig;
+import com.fs.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.*;
@@ -46,6 +48,10 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
     private final String CALL_FROM_CALLBACK = "callBack";
     private final String CALL_FROM_TIMER = "timer";
 
+    private final ISysConfigService configService = SpringUtils.getBean(ISysConfigService.class);
+
+    private final CompanyVoiceRoboticCallLogCallphoneMapper companyVoiceRoboticCallLogCallphoneMapper = SpringUtils.getBean(CompanyVoiceRoboticCallLogCallphoneMapper.class);;
+
     public AiCallTaskNode(String nodeKey, String nodeName, Map<String, Object> properties) {
         super(nodeKey, nodeName, properties);
     }
@@ -166,11 +172,19 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
                     super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
                     return ExecutionResult.failure().errorMessage("节点配置解析失败").build();
                 }
+
                 //执行外呼逻辑 需要传入节点信息
                 CompanyVoiceRoboticBusiness bus = super.getRoboticBusiness(context.getWorkflowInstanceId());
                 if (bus == null) {
                     return ExecutionResult.failure().errorMessage("未找到业务数据").build();
                 }
+
+                //进入手机号拨打次数校验
+                if(checkPhoneCallLimit(bus.getId())){
+                    super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
+                    return ExecutionResult.failure().errorMessage("今日拨打次数已达上限!").build();
+                }
+
                 //手动外呼配置 1、人工 2、ai外呼
                 if(Integer.valueOf(1).equals(callConfigVo.getCallMode())){
                     super.asyncWorkflowForBlockingNode(context.getWorkflowInstanceId(), context.getCurrentNodeKey(), context, ExecutionStatusEnum.WAITING_DO_CALL);
@@ -316,6 +330,22 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
         context.setVariable("easyCallBatchId", batchId);
     }
 
+    private boolean checkPhoneCallLimit(Long businessId){
+        String json = configService.selectConfigByKey("cid.config");
+        if(StringUtils.isNotEmpty(json)){//数据存在
+            //转换数据
+            CidPhoneConfig config =JSONObject.parseObject(json,CidPhoneConfig.class);
+            if(config.getEnablePhoneLimitConfig() != null && config.getEnablePhoneLimitConfig()){//开启了拨打限制按钮
+                //获取当前外呼业务电话拨打信息
+               int num = companyVoiceRoboticCallLogCallphoneMapper.countTodayCallsByBusinessId(businessId);
+               if(num >= config.getNumberCalls()){
+                   return true;
+               }
+            }
+        }
+        return false;
+    }
+
 //    @Override
 //    protected void postExecute(ExecutionContext context, ExecutionResult result) {
 //        super.postExecute(context, result);

+ 12 - 0
fs-service/src/main/java/com/fs/his/config/CidPhoneConfig.java

@@ -31,4 +31,16 @@ public class CidPhoneConfig implements Serializable {
      * 结束位置(到第几位结束)
      */
     private Integer endIndex;
+
+    /**
+     * 手机拨打限制开关
+     * true: 开启,显示手机拨打限制输入框
+     * false: 关闭,隐藏手机拨打限制输入框
+     * **/
+    private Boolean enablePhoneLimitConfig;
+
+    /**
+     * 拨打次数
+     * **/
+    private Long numberCalls;
 }

+ 18 - 0
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogCallphoneMapper.xml

@@ -177,4 +177,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectCallLogByCallbackUuid" resultType="CompanyVoiceRoboticCallLogCallphone">
         select * from company_voice_robotic_call_log_callphone where callback_uuid = #{uuid}
     </select>
+
+    <select id="countTodayCallsByBusinessId" resultType="int">
+        SELECT IFNULL(COUNT(*), 0)
+        FROM company_voice_robotic_callees es
+        INNER JOIN company_voice_robotic_call_log_callphone callphone
+        ON callphone.caller_id = es.id
+        AND es.is_generate = 0
+        WHERE es.phone = (
+        SELECT es.phone
+        FROM company_voice_robotic_business bes
+        INNER JOIN company_voice_robotic_callees es
+        ON es.id = bes.callee_id
+        WHERE bes.id = #{businessId}
+        AND es.is_generate = 0
+        )
+        AND callphone.create_time >= CURDATE()
+        AND callphone.create_time &lt; CURDATE() + INTERVAL 1 DAY
+    </select>
 </mapper>