zhongrj
2023-10-12 39b3d16e78a22e70e99341f366dcfa2c3e6519b9
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -4,12 +4,14 @@
import cn.gistack.sm.intelligentCall.constant.CallConstant;
import cn.gistack.sm.intelligentCall.constant.ZtConstant;
import cn.gistack.sm.intelligentCall.entity.Scene;
import cn.gistack.sm.intelligentCall.excel.CallExcel;
import cn.gistack.sm.intelligentCall.mapper.CallTaskMapper;
import cn.gistack.sm.intelligentCall.service.CallService;
import cn.gistack.sm.intelligentCall.vo.CallTaskResultVO;
import cn.gistack.sm.intelligentCall.vo.CallTaskStatistic;
import cn.gistack.sm.sjztmd.entity.AttAdBase;
import cn.gistack.sm.sjztmd.service.IAttAdBaseService;
import cn.gistack.sm.sjztmd.service.IAttResManagePersonService;
import cn.gistack.sm.sjztmd.vo.AttAdBaseVO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
@@ -20,6 +22,7 @@
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
@@ -53,6 +56,9 @@
   @Autowired
   private BladeRedis bladeRedis;
   @Autowired
   private IAttResManagePersonService attResManagePersonService;
   @Autowired
   private AsyncCallService asyncCallService;
@@ -133,6 +139,7 @@
      bodyJson.put("body", paramJson);
      HttpEntity<String> stringHttpEntity = new HttpEntity<>(bodyJson.toJSONString(), httpHeaders);
      log.info("创建超汛限智能外呼任务请求参数:{}", bodyJson.toJSONString());
      log.info("创建超汛限智能外呼任务呼叫人数:{}", arr.size());
      ResponseEntity<String> response = restTemplate.postForEntity(requestUrl, stringHttpEntity, String.class);
      log.info("创建外呼任务请求结果:{}", response.getBody());
      if (response.getStatusCode() != HttpStatus.OK) {
@@ -144,6 +151,9 @@
      if (success){
         //通过任务名称查询taskId
         taskId = callTaskMapper.getTaskIdByTaskName(taskName);
      }else {
         // 任务创建失败,发送短信告知
         asyncCallService.createOutCallErrorSendSms(jsonObject.getString("code"),jsonObject.getString("message"));
      }
      List<String> list = new ArrayList<>();
      list.add(response.getBody());
@@ -454,6 +464,7 @@
         if (null!= callTaskStatistic.getIsPage()) {
            return totalList;
         }else {
            page.setTotal(totalList.size());
            return page.setRecords(totalList);
         }
      } catch (InterruptedException e) {
@@ -783,6 +794,28 @@
   }
   /**
    * 根据条件自动创建外呼任务--指定区域呼叫
    * @param params
    * @return
    */
   @Override
   public List<String> createOutCallTaskJobHandlerByArea(Map<String, Object> params) {
      // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
      String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
      if (null==redisOneKey){
         List<String> stringList = everydayCallByArea(params);
         // 取出数据进行设置 taskId
         bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
         // 异步保存日常关联呼叫任务信息
         asyncCallService.saveDailyCallTask(stringList.get(1),1);
         // 响应
         return stringList;
      }else {
         return createEverydayAfter(redisOneKey);
      }
   }
   /**
    * 日常外呼任务未接通的继续拨打
    * @param redisOneKey 取值为上一次外呼的任务id
    * @return
@@ -832,6 +865,36 @@
   private List<String> everydayCallByNotCall(Map<String, Object> params) {
      // 查询从未接通和从未呼叫的水库
      List<Scene> totalList = callTaskMapper.getNotCallOrCallNotConnect();
      // 取出随机的150人
      Set<Scene> taskRandomList = new HashSet<>(totalList);
//      Integer personNumber = 220;
//      Random random = new Random();
//      for (int i = 0; i < totalList.size(); i++) {
//         // 获取随机数作为下标索引
//         int num = random.nextInt(totalList.size());
//         // 保存到 hashSet ,保证唯一
//         taskRandomList.add(totalList.get(num));
//         // 数量达到预期设定退出循环
//         if (taskRandomList.size() == personNumber) {
//            break;
//         }
//      }
      //4. 传入调度时间和随机得到的人员信息进行任务的创建并返回
      params.put("list",setForListMap(taskRandomList));
      // 调度时间处理
      params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " +params.get("taskScheduleTime") + ":00");
      // 创建任务并返回结果
      return createTask(params);
   }
   /**
    * 日常外呼任务创建--按区域
    * @param params
    * @return
    */
   private List<String> everydayCallByArea(Map<String, Object> params) {
      // 按区域查询需要呼叫的人员信息
      List<Scene> totalList = callTaskMapper.getCallListByArea();
      // 取出随机的150人
      Set<Scene> taskRandomList = new HashSet<>();
      Integer personNumber = 150;
@@ -1144,16 +1207,11 @@
    */
   @Override
   public Object getCallResultList(IPage<CallTaskStatistic> page, CallTaskStatistic callTaskStatistic) {
      List<String> list = new ArrayList<>();
      if (null!= callTaskStatistic.getAdCode() && !callTaskStatistic.getAdCode().equals("")){
         // 查询所有下级区域code
         list = getAllChildrenAreaByAreaCode(callTaskStatistic.getAdCode());
      }
      if (null!=callTaskStatistic.getIsPage()){
         // 不分页
         return callTaskMapper.getCallResultList(null, list,callTaskStatistic);
         return callTaskMapper.getCallResultList(null,callTaskStatistic);
      }
      List<CallTaskStatistic> callNotConnectResultList = callTaskMapper.getCallResultList(page,list, callTaskStatistic);
      List<CallTaskStatistic> callNotConnectResultList = callTaskMapper.getCallResultList(page, callTaskStatistic);
      // 返回
      return page.setRecords(callNotConnectResultList);
   }
@@ -1173,4 +1231,37 @@
      // 不分页
      return callTaskMapper.getCallResultListTemp(null,callTaskResult,list);
   }
   /**
    * 导入表格发送智能外呼
    * @param list
    * @param time
    * @return
    */
   @Override
   public Object importCall(List<CallExcel> list,String time) {
      // 转换
      List<String> stringList = list.stream().map(CallExcel::getWaterCode).collect(Collectors.toList());
      // 通过水库代码获取水库及巡查责任人信息
      Set<Scene>  personList = attResManagePersonService.getPatrolPersonListByWaterCodeList(stringList);
      Map<String, Object> params = new HashMap<>();
      //传入调度时间和随机得到的人员信息进行任务的创建并返回
      params.put("list",setForListMap(personList));
      // 调度时间处理
      if (null!=time && !time.equals("")){
         params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " + time + ":00");
      }else {
         params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
      }
      // 创建任务并返回结果
      List<String> task = createTask(params);
      if (null!=task.get(1) && !task.get(1).equals("")){
         String successMsg = "外呼任务创建成功";
         // 返回
         return R.data(200,successMsg,null);
      }
      String errorMsg = task.get(0);
      // 返回
      return R.data(400,errorMsg,null);
   }
}