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; }