skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/pom.xml
@@ -19,6 +19,11 @@ <groupId>org.springblade</groupId> <artifactId>blade-starter-cache</artifactId> </dependency> <!--excel--> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-starter-excel</artifactId> </dependency> </dependencies> </project> skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/excel/CallExcel.java
New file @@ -0,0 +1,21 @@ package cn.gistack.sm.intelligentCall.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; import lombok.Data; import java.io.Serializable; @Data @ColumnWidth(25) @HeadRowHeight(20) @ContentRowHeight(18) public class CallExcel implements Serializable { private static final long serialVersionUID = 1L; @ColumnWidth(15) @ExcelProperty("水库代码") private String waterCode; } skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/listener/ExcelListener.java
New file @@ -0,0 +1,55 @@ package cn.gistack.sm.intelligentCall.listener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; /** * 自定义excel 解析监听器 * @param <T> */ public final class ExcelListener<T> extends AnalysisEventListener<T> { /** * 自定义用于暂时存储data * 可以通过实例获取该值 */ private List<T> datas = new ArrayList<>(); /** * 每解析一行都会回调invoke()方法 * @param object 读取后的数据对象 * @param context 内容 */ @Override @SuppressWarnings("unchecked") public void invoke(Object object, AnalysisContext context) { T map = (T) object; //数据存储到list,供批量处理,或后续自己业务逻辑处理。 datas.add(map); } @Override public void doAfterAllAnalysed(AnalysisContext context) { //解析结束销毁不用的资源 //注意不要调用datas.clear(),否则getDatas为null } /** * 返回数据 * @return 返回读取的数据集合 **/ public List<T> getDatas() { return datas; } /** * 设置读取的数据集合 * @param datas 设置读取的数据集合 **/ public void setDatas(List<T> datas) { this.datas = datas; } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/hk/constant/HkConstant.java
@@ -135,6 +135,11 @@ */ public static final String eventSubscriptionViewURLs = "/api/eventService/v1/eventSubscriptionView"; /** * 区域的批量添加 */ public static final String batchAddURLs = "/api/resource/v1/region/batch/add"; skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/hk/controller/HkController.java
@@ -4,6 +4,8 @@ import cn.gistack.sm.hk.constant.ProtocolConstant; import cn.gistack.sm.hk.service.HkService; import cn.gistack.sm.hk.vo.HkVO; import cn.gistack.sm.hk.vo.VideoVO; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -13,6 +15,8 @@ import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import static cn.gistack.sm.hk.util.GetCameraUtils.*; @@ -310,4 +314,31 @@ return R.data(common(null==hk.getType()?1:hk.getType(),HkConstant.presetsDeletionURLs, body)); } /** * 同步水库设备信息 * @param hk 水库设备 * @return */ @ApiOperation(value = "海康设备-同步水库设备信息", notes = "海康设备-同步水库设备信息") @PostMapping(value = "/syncVideo") public R syncVideo(@RequestBody HkVO hk) { /** * 组装请求参数 */ List<VideoVO> list = new ArrayList<>(); VideoVO video = new VideoVO(); video.setRegionName(hk.getRegionName()); video.setRegionIndexCode(hk.getRegionIndexCode()); video.setParentIndexCode("root000000"); video.setRegionType(10); list.add(video); String body = JSON.toJSONString(list); /** * 调用接口并返回数据 * post请求application/json类型参数; */ return R.data(JSONObject.parseObject(common(null==hk.getType()?2:hk.getType(),HkConstant.batchAddURLs, body))); } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/hk/vo/HkVO.java
@@ -139,4 +139,14 @@ * 扩展 */ private String expand; /** * 水库/区域名称 */ private String regionName; /** * 水库/区域编号 */ private String regionIndexCode; } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/hk/vo/VideoVO.java
New file @@ -0,0 +1,24 @@ package cn.gistack.sm.hk.vo; import lombok.Data; import java.io.Serializable; @Data public class VideoVO implements Serializable { private String parentIndexCode; /** * 水库名称 */ private String regionName; /** * 水库编号 */ private String regionIndexCode; private Integer regionType; } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/controller/CallController.java
@@ -2,18 +2,26 @@ import cn.gistack.sm.intelligentCall.entity.CallTaskResult; import cn.gistack.sm.intelligentCall.entity.Scene; import cn.gistack.sm.intelligentCall.excel.CallExcel; import cn.gistack.sm.intelligentCall.listener.ExcelListener; import cn.gistack.sm.intelligentCall.service.CallService; import cn.gistack.sm.intelligentCall.service.ICallSmsNoticeTaskService; import cn.gistack.sm.intelligentCall.vo.CallTaskResultVO; import cn.gistack.sm.intelligentCall.vo.CallTaskStatistic; import com.alibaba.excel.EasyExcel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.excel.util.ExcelUtil; 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 org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; /** @@ -177,4 +185,35 @@ // 返回 return R.data(callService.getCallResultListTemp(Condition.getPage(query),callTaskResult)); } /** * 导入表格发送智能外呼 * @param file excel文件 * @param time 呼叫时间(空的话默认选择当前时间) * @return */ @PostMapping("/import-call") public R importCall(MultipartFile file,String time){ ExcelListener<CallExcel> listener = new ExcelListener<>(); //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据 try { EasyExcel.read(file.getInputStream(), CallExcel.class, listener).headRowNumber(1).sheet(0).doRead(); } catch (IOException e) { e.printStackTrace(); } List<CallExcel> list = listener.getDatas(); // 导入并返回 return R.data(callService.importCall(list,time)); } /** * 导出模板 */ @GetMapping("/export-template") @ApiOperation(value = "导出模板") public void exportTemplate(HttpServletResponse response) { List<CallExcel> list = new ArrayList<>(); ExcelUtil.export(response, "智能外呼数据模板", "智能外呼数据表", list, CallExcel.class); } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java
@@ -2,6 +2,7 @@ import cn.gistack.sm.intelligentCall.entity.CallNotFillRecord; import cn.gistack.sm.intelligentCall.excel.CallExcel; import cn.gistack.sm.intelligentCall.vo.CallTaskResultVO; import cn.gistack.sm.intelligentCall.vo.CallTaskStatistic; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -122,4 +123,12 @@ * @return */ List<String> createOutCallTaskByAlarm(Map<String, Object> map); /** * 导入表格发送智能外呼 * @param list * @param time * @return */ Object importCall(List<CallExcel> list,String time); } 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; @@ -1225,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); } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/feign/AttResManagePersonClient.java
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/mapper/AttAdBaseMapper.java
@@ -1,13 +1,12 @@ package cn.gistack.sm.sjztmd.mapper; import cn.gistack.common.node.TreeNode; import cn.gistack.sm.sjztmd.vo.PersonVO; import cn.gistack.sm.sjztmd.entity.AttAdBase; import cn.gistack.sm.sjztmd.vo.AttAdBaseVO; import cn.gistack.sm.sjztmd.vo.PersonVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; import java.util.Map; skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/mapper/AttResManagePersonMapper.java
@@ -1,5 +1,6 @@ package cn.gistack.sm.sjztmd.mapper; import cn.gistack.sm.intelligentCall.entity.Scene; import cn.gistack.sm.sjztmd.entity.AttResManagePerson; import cn.gistack.sm.sjztmd.entity.PatrolResponsiblePerson; import cn.gistack.sm.sjztmd.vo.PersonVO; @@ -63,4 +64,12 @@ @Param("type") String type); List<PatrolResponsiblePerson> getPatrolResponsiblePersonByResCdList(@Param("ids") List<String> reservoirList); /** * 通过水库代码获取水库及巡查责任人信息 * @param list * @return */ @DS("zt") Set<Scene> getPatrolPersonListByWaterCodeList(@Param("list") List<String> list); } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/mapper/AttResManagePersonMapper.xml
@@ -175,6 +175,30 @@ group by b."user_phone" </select> <!--通过水库代码获取巡查责任人及技术责任人手机号--> <select id="getPatrolPersonListByWaterCodeList" resultType="cn.gistack.sm.intelligentCall.entity.Scene"> SELECT a."guid" as waterCode, a."name" as waterName, b."user_name" as username, b."user_phone" as userId, b."user_phone" as phone FROM SJZT_MD."att_res_base" a LEFT JOIN SJZT_MD."att_res_manage_person" b ON a."guid" = b."res_guid" where 1=1 and b."type" = 5 <choose> <when test="list!=null and list.size()>0"> and "sk_code" in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> </when> <otherwise> and "sk_code" in ('') </otherwise> </choose> </select> <!--根据水库编号查询市县水利部人员姓名及联系方式--> <select id="getCityCountyPersonListByResGuid" resultType="cn.gistack.sm.sjztmd.vo.PersonVO"> select real_name as name,phone,#{type} as type from YWXT.blade_user bu skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/IAttAdBaseService.java
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/IAttResManagePersonService.java
@@ -1,9 +1,9 @@ package cn.gistack.sm.sjztmd.service; import cn.gistack.sm.intelligentCall.entity.Scene; import cn.gistack.sm.sjztmd.entity.AttResManagePerson; import cn.gistack.sm.sjztmd.entity.PatrolResponsiblePerson; import cn.gistack.sm.sjztmd.vo.PersonVO; import cn.gistack.sm.sjztmd.vo.UserPersonVO; import com.baomidou.mybatisplus.extension.service.IService; import org.springblade.core.tool.api.R; @@ -76,4 +76,11 @@ * @return */ List<PatrolResponsiblePerson> getPatrolResponsiblePersonByResCdList(List<String> reservoirList); /** * 通过水库代码获取水库及巡查责任人信息 * @param stringList * @return */ Set<Scene> getPatrolPersonListByWaterCodeList(List<String> stringList); } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttAdBaseServiceImpl.java
@@ -2,11 +2,11 @@ import cn.gistack.common.node.TreeNode; import cn.gistack.common.utils.NodeTreeUtil; import cn.gistack.sm.sjztmd.vo.PersonVO; import cn.gistack.sm.sjztmd.entity.AttAdBase; import cn.gistack.sm.sjztmd.mapper.AttAdBaseMapper; import cn.gistack.sm.sjztmd.service.IAttAdBaseService; import cn.gistack.sm.sjztmd.vo.AttAdBaseVO; import cn.gistack.sm.sjztmd.vo.PersonVO; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResManagePersonServiceImpl.java
@@ -1,6 +1,6 @@ package cn.gistack.sm.sjztmd.service.impl; import cn.gistack.sm.sjztmd.entity.AttResBase; import cn.gistack.sm.intelligentCall.entity.Scene; import cn.gistack.sm.sjztmd.entity.AttResManagePerson; import cn.gistack.sm.sjztmd.entity.PatrolResponsiblePerson; import cn.gistack.sm.sjztmd.mapper.AttResManagePersonMapper; @@ -178,4 +178,14 @@ public List<PatrolResponsiblePerson> getPatrolResponsiblePersonByResCdList(List<String> reservoirList) { return baseMapper.getPatrolResponsiblePersonByResCdList(reservoirList); } /** * 通过水库代码获取水库及巡查责任人信息 * @param stringList * @return */ @Override public Set<Scene> getPatrolPersonListByWaterCodeList(List<String> stringList) { return baseMapper.getPatrolPersonListByWaterCodeList(stringList); } }