zhongrj
2023-05-22 9122bbc2defd1bbef5dcfaaf906651489ad1095d
定时任务查询,新增定时任务关联,智能外呼定时任务创建
6 files modified
3 files added
371 ■■■■■ changed files
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java 56 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/controller/TaskXxlJobController.java 126 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/entity/XxlJobInfoType.java 29 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/jobhandler/SampleXxlJob.java 29 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/mapper/XxlJobInfoMapper.java 20 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/mapper/XxlJobInfoMapper.xml 22 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/service/IXxlJobInfoService.java 23 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/service/impl/XxlJobInfoServiceImpl.java 46 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/vo/XxlJobInfoVO.java 20 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -377,20 +377,52 @@
        }
        // 先取差集
        List<Scene> sceneList = totalList.stream().filter(item -> !list.contains(item.getPhone())).collect(Collectors.toList());
        // 再随机抽取对应人员手机号
        Set<Scene> hashSet = new HashSet<>();
        Random random =new Random();
        for(int i=0;i<sceneList.size();i++){
            // 获取随机数作为下标索引
            int num = random.nextInt(sceneList.size());
            // 保存到 hashSet ,保证唯一
            hashSet.add(sceneList.get(num));
            // 数量达到预期设定退出循环
            if (hashSet.size()==personNumber){
                break;
        // 如果差集数量不够 预定的数量(超汛情况),则从未超汛情况数据中补齐预定的数量
        if (sceneList.size()<personNumber){
            Map<String, Object> map = new HashMap<>();
            map.put("isOver",0);
            // 查询未超汛的数据
            JSONArray jsonArray = getZtWaterMangerData(map);
            // 过滤得到手机号集合(排查手机号为null的数据)
            List<Scene> sceneListNoOver = filterJsonToList(jsonArray);
            // 取差集
            List<Scene> differenceSceneListNoOver = sceneListNoOver.stream().filter(item -> !list.contains(item.getPhone())).collect(Collectors.toList());
            // 再随机抽取对应人员手机号
            Set<Scene> hashSet = new HashSet<>();
            // 先将超汛的加入集合
            for (Scene scene : sceneList) {
                hashSet.add(scene);
            }
            // 未超汛的补充
            personNumber = personNumber - sceneList.size();
            Random random = new Random();
            for (int i = 0; i < differenceSceneListNoOver.size(); i++) {
                // 获取随机数作为下标索引
                int num = random.nextInt(differenceSceneListNoOver.size());
                // 保存到 hashSet ,保证唯一
                hashSet.add(differenceSceneListNoOver.get(num));
                // 数量达到预期设定退出循环
                if (hashSet.size() == personNumber) {
                    break;
                }
            }
            return hashSet;
        }else {
            // 再随机抽取对应人员手机号
            Set<Scene> hashSet = new HashSet<>();
            Random random = new Random();
            for (int i = 0; i < sceneList.size(); i++) {
                // 获取随机数作为下标索引
                int num = random.nextInt(sceneList.size());
                // 保存到 hashSet ,保证唯一
                hashSet.add(sceneList.get(num));
                // 数量达到预期设定退出循环
                if (hashSet.size() == personNumber) {
                    break;
                }
            }
            return hashSet;
        }
        return hashSet;
    }
    /**
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/controller/TaskXxlJobController.java
New file
@@ -0,0 +1,126 @@
package cn.gistack.sm.xxljob.controller;
import cn.gistack.sm.xxljob.entity.XxlJobInfo;
import cn.gistack.sm.xxljob.service.IXxlJobInfoService;
import cn.gistack.sm.xxljob.vo.XxlJobInfoVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
/**
 * @author zhongrj
 * @date 2023-05-22
 */
@Slf4j
@Api(tags="定时任务")
@RestController
@AllArgsConstructor
@RequestMapping("/xxl-job/xxl-job")
public class TaskXxlJobController {
    private IXxlJobInfoService xxlJobInfoService;
    @ApiOperation(value="定时任务-分页列表查询", notes="定时任务-分页列表查询")
    @GetMapping(value = "/list")
    public R list(XxlJobInfo xxlJobInfo, Query query) {
        IPage<XxlJobInfo> pageList = xxlJobInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(xxlJobInfo));
        return R.data(pageList);
    }
    /**
     * 自定义分页查询定时任务列表信息
     * @param xxlJobInfo
     * @param query
     * @return
     */
    @ApiOperation(value="定时任务-自定义分页查询定时任务列表信息", notes="定时任务-自定义分页查询定时任务列表信息")
    @GetMapping(value = "/page")
    public R selectXxlJobPage(XxlJobInfoVO xxlJobInfo, Query query) {
        IPage<XxlJobInfoVO> pageList = xxlJobInfoService.selectXxlJobPage(Condition.getPage(query), xxlJobInfo);
        return R.data(pageList);
    }
    /**
     * 通过id查询
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "定时任务-通过id查询", notes = "定时任务-通过id查询")
    @GetMapping(value = "/queryById")
    public R queryById(@RequestParam(name = "id", required = true) String id) {
        XxlJobInfo xxlJobInfo = xxlJobInfoService.getById(id);
        return R.data(xxlJobInfo);
    }
    /**
     * 添加
     */
    @ApiOperation(value="定时任务-添加", notes="定时任务-添加")
    @PostMapping(value = "/add")
    public R add(@RequestBody XxlJobInfo xxlJobInfo) {
        return R.data(xxlJobInfoService.save(xxlJobInfo));
    }
    /**
     * 添加-自定义
     */
    @ApiOperation(value="定时任务-添加", notes="定时任务-添加")
    @PostMapping(value = "/save")
    public R save(@RequestBody XxlJobInfoVO xxlJobInfo) {
        return R.data(xxlJobInfoService.saveXxlJob(xxlJobInfo));
    }
    /**
     * 编辑
     * @return
     */
    @ApiOperation(value="定时任务-编辑", notes="定时任务-编辑")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
    public R edit(@RequestBody XxlJobInfo xxlJobInfo) {
        return R.data(xxlJobInfoService.updateById(xxlJobInfo));
    }
    /**
     * 编辑--自定义
     * @return
     */
    @ApiOperation(value="定时任务-编辑", notes="定时任务-编辑")
    @RequestMapping(value = "/update", method = {RequestMethod.PUT,RequestMethod.POST})
    public R update(@RequestBody XxlJobInfoVO xxlJobInfo) {
        return R.data(xxlJobInfoService.updateXxlJobById(xxlJobInfo));
    }
    /**
     * 通过id删除
     *
     * @param id
     * @return
     */
    @ApiOperation(value="定时任务-通过id删除", notes="定时任务-通过id删除")
    @DeleteMapping(value = "/delete")
    public R delete(@RequestParam(name="id",required=true) String id) {
        return R.data(xxlJobInfoService.removeById(id));
    }
    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @ApiOperation(value="定时任务-批量删除", notes="定时任务-批量删除")
    @DeleteMapping(value = "/deleteBatch")
    public R deleteBatch(@RequestParam(name="ids",required=true) String ids) {
        return R.data(xxlJobInfoService.removeByIds(Arrays.asList(ids.split(","))));
    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/entity/XxlJobInfoType.java
New file
@@ -0,0 +1,29 @@
package cn.gistack.sm.xxljob.entity;
import lombok.Data;
import java.io.Serializable;
/**
 * 任务信息类型关联信息
 * @author zhongrj
 * @date 2023-05-22
 */
@Data
public class XxlJobInfoType implements Serializable {
    /**
     * 主键id
     */
    private Integer id;
    /**
     * 任务信息id
     */
    private Integer xxlJobInfoId;
    /**
     * 任务类型名称
     */
    private String typeName;
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/jobhandler/SampleXxlJob.java
@@ -1,5 +1,6 @@
package cn.gistack.sm.xxljob.jobhandler;
import cn.gistack.sm.intelligentCall.service.CallService;
import cn.gistack.sm.patrol.entity.PatrolTask;
import cn.gistack.sm.patrol.service.IPatrolTaskService;
import cn.gistack.sm.sjztmd.entity.PatrolResponsiblePerson;
@@ -22,7 +23,9 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@@ -40,9 +43,12 @@
    private final IAttResManagePersonService attResManagePersonService;
    public SampleXxlJob(IPatrolTaskService patrolTaskService, IAttResManagePersonService attResManagePersonService) {
    private final CallService callService;
    public SampleXxlJob(IPatrolTaskService patrolTaskService, IAttResManagePersonService attResManagePersonService, CallService callService) {
        this.patrolTaskService = patrolTaskService;
        this.attResManagePersonService = attResManagePersonService;
        this.callService = callService;
    }
    /**
@@ -60,6 +66,27 @@
    }
    /**
     * 智能外呼任务创建定时执行器
     * @param param
     * @return
     * @throws Exception
     */
    @XxlJob("outCallCreateTaskHandle")
    public ReturnT<String> outCallCreateTaskHandle(String param){
        XxlJobLogger.log("开始执行任务...");
        JSONObject jsonParam = JSON.parseObject(param);
        Map<String, Object> map = new HashMap<>();
        map.put("isOver",jsonParam.getString("isOver"));
        map.put("taskScheduleTime",jsonParam.getString("taskScheduleTime"));
        map.put("personNumber",jsonParam.getString("personNumber"));
        map.put("day",jsonParam.getString("day"));
        // 创建外呼任务
        callService.createCallTaskByParam(map);
        XxlJobLogger.log("结束自动创建任务...");
        return ReturnT.SUCCESS;
    }
    /**
     * 给巡查责任人定时创建任务执行器
     * @param param
     * @return
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/mapper/XxlJobInfoMapper.java
@@ -1,7 +1,13 @@
package cn.gistack.sm.xxljob.mapper;
import cn.gistack.sm.xxljob.entity.XxlJobInfo;
import cn.gistack.sm.xxljob.entity.XxlJobInfoType;
import cn.gistack.sm.xxljob.vo.XxlJobInfoVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @PROJECT_NAME: skjcmanager
@@ -12,4 +18,18 @@
public interface XxlJobInfoMapper extends BaseMapper<XxlJobInfo> {
    /**
     * 自定义分页查询定时任务列表信息
     * @param xxlJobInfo
     * @param page
     * @return
     */
    List<XxlJobInfoVO> selectXxlJobPage(IPage<XxlJobInfoVO> page,@Param("xxlJobInfo") XxlJobInfoVO xxlJobInfo);
    /**
     * 新增 xxlJobInfoType 信息
     * @param xxlJobInfoType
     * @return
     */
    Integer insertXxlJobInfoType(@Param("xxlJobInfoType")XxlJobInfoType xxlJobInfoType);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/mapper/XxlJobInfoMapper.xml
@@ -2,5 +2,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.gistack.sm.xxljob.mapper.XxlJobInfoMapper">
    <!--自定义分页查询定时任务列表信息-->
    <select id="selectXxlJobPage" resultType="cn.gistack.sm.xxljob.vo.XxlJobInfoVO">
        select xji.* from YWXT_JOB.xxl_job_info xji
        left join YWXT.xxl_job_info_type xjit on xji.id = xjit.xxl_job_info_id
        where 1=1
        <if test="xxlJobInfo.typeName!=null and xxlJobInfo.typeName!=''">
            and xjit.type_name = #{xxlJobInfo.typeName}
        </if>
        <if test="xxlJobInfo.author!=null and xxlJobInfo.author!=''">
            and xji.author like concat(concat('%',#{xxlJobInfo.author}),'%')
        </if>
        <if test="xxlJobInfo.triggerStatus!=null">
            and xji.trigger_status = #{xxlJobInfo.triggerStatus}
        </if>
    </select>
    <!--自定义新增-->
    <insert id="insertXxlJobInfoType">
        insert into YWXT.xxl_job_info_type(xxl_job_info_id,type_name)
        values
        (#{xxlJobInfoType.xxlJobInfoId},#{xxlJobInfoType.typeName})
    </insert>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/service/IXxlJobInfoService.java
@@ -1,6 +1,8 @@
package cn.gistack.sm.xxljob.service;
import cn.gistack.sm.xxljob.entity.XxlJobInfo;
import cn.gistack.sm.xxljob.vo.XxlJobInfoVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
@@ -11,4 +13,25 @@
 */
public interface IXxlJobInfoService extends IService<XxlJobInfo> {
    /**
     * 自定义新增定时任务
     * @param xxlJobInfo
     * @return
     */
    Object saveXxlJob(XxlJobInfoVO xxlJobInfo);
    /**
     * 自定义修改定时任务
     * @param xxlJobInfo
     * @return
     */
    Object updateXxlJobById(XxlJobInfoVO xxlJobInfo);
    /**
     * 自定义分页查询定时任务列表信息
     * @param xxlJobInfo
     * @param page
     * @return
     */
    IPage<XxlJobInfoVO> selectXxlJobPage(IPage<XxlJobInfoVO> page, XxlJobInfoVO xxlJobInfo);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/service/impl/XxlJobInfoServiceImpl.java
@@ -1,9 +1,12 @@
package cn.gistack.sm.xxljob.service.impl;
import cn.gistack.sm.xxljob.entity.XxlJobInfo;
import cn.gistack.sm.xxljob.entity.XxlJobInfoType;
import cn.gistack.sm.xxljob.mapper.XxlJobInfoMapper;
import cn.gistack.sm.xxljob.service.IXxlJobInfoService;
import cn.gistack.sm.xxljob.vo.XxlJobInfoVO;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@@ -17,4 +20,47 @@
@DS("xxljob")
public class XxlJobInfoServiceImpl extends ServiceImpl<XxlJobInfoMapper, XxlJobInfo> implements IXxlJobInfoService {
    /**
     * 自定义新增定时任务
     * @param xxlJobInfo
     * @return
     */
    @Override
    public Object saveXxlJob(XxlJobInfoVO xxlJobInfo) {
        boolean flag = false;
        boolean save = save(xxlJobInfo);
        if (save){
            XxlJobInfoType xxlJobInfoType = new XxlJobInfoType();
            xxlJobInfoType.setXxlJobInfoId(xxlJobInfo.getId());
            xxlJobInfoType.setTypeName(xxlJobInfo.getTypeName());
            // 插入成功则
            Integer insert = baseMapper.insertXxlJobInfoType(xxlJobInfoType);
            if (insert >0){
                flag = true;
            }
        }
        return flag;
    }
    /**
     * 自定义修改定时任务
     * @param xxlJobInfo
     * @return
     */
    @Override
    public Object updateXxlJobById(XxlJobInfoVO xxlJobInfo) {
        boolean update = updateById(xxlJobInfo);
        return update;
    }
    /**
     * 自定义分页查询定时任务列表信息
     * @param xxlJobInfo
     * @param page
     * @return
     */
    @Override
    public IPage<XxlJobInfoVO> selectXxlJobPage(IPage<XxlJobInfoVO> page, XxlJobInfoVO xxlJobInfo) {
        return page.setRecords(baseMapper.selectXxlJobPage(page,xxlJobInfo));
    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/xxljob/vo/XxlJobInfoVO.java
New file
@@ -0,0 +1,20 @@
package cn.gistack.sm.xxljob.vo;
import cn.gistack.sm.xxljob.entity.XxlJobInfo;
import lombok.Data;
/**
 * xxljobvo
 * @author zhongrj
 * @date 2023-05-22
 */
@Data
public class XxlJobInfoVO extends XxlJobInfo {
    /**
     * xxl-job 类型名称
     */
    private String typeName;
}