Commit 7a375a4f2ac9dfadd0b00605573e6a2ea9ab7a1c

Authored by 陈杰
1 parent d847e886
Exists in master

智能校卫 告警服务

Showing 43 changed files with 800 additions and 17 deletions   Show diff stats
cloud/common/src/main/java/com/sincere/common/dto/smartCampus/SchoolDto.java
... ... @@ -11,6 +11,15 @@ public class SchoolDto implements Serializable {
11 11  
12 12 private int schoolId ;
13 13 private String schoolName ;
  14 + private int managerUserId ;
  15 +
  16 + public int getManagerUserId() {
  17 + return managerUserId;
  18 + }
  19 +
  20 + public void setManagerUserId(int managerUserId) {
  21 + this.managerUserId = managerUserId;
  22 + }
14 23  
15 24 public int getSchoolId() {
16 25 return schoolId;
... ...
cloud/quartz/src/main/java/com/sincere/quartz/QuartzApplication.java
... ... @@ -3,19 +3,24 @@ package com.sincere.quartz;
3 3 import org.mybatis.spring.annotation.MapperScan;
4 4 import org.springframework.boot.SpringApplication;
5 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
  6 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  7 +import org.springframework.cache.annotation.EnableCaching;
6 8 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
7 9 import org.springframework.cloud.openfeign.EnableFeignClients;
8 10 import org.springframework.scheduling.annotation.EnableScheduling;
  11 +import org.springframework.transaction.annotation.EnableTransactionManagement;
9 12  
10 13 /**
11 14 * @author chen
12 15 * @version 1.0
13 16 * @date 2019/11/27 0027 14:24
14 17 */
  18 +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
  19 +@EnableTransactionManagement(order = 2) //设置事务执行顺序(需要在切换数据源之后,否则只走主库)
  20 +@EnableCaching
15 21 @EnableScheduling
16 22 @EnableFeignClients(basePackages = "com.sincere.quartz.feign")
17 23 @EnableEurekaClient
18   -@SpringBootApplication
19 24 @MapperScan("com.sincere.quartz.mapper")
20 25 public class QuartzApplication {
21 26  
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/DataSourceAspect.java 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +package com.sincere.quartz.datasource;
  2 +
  3 +import org.aspectj.lang.JoinPoint;
  4 +import org.aspectj.lang.annotation.Aspect;
  5 +import org.aspectj.lang.annotation.Before;
  6 +import org.aspectj.lang.annotation.Pointcut;
  7 +import org.aspectj.lang.reflect.MethodSignature;
  8 +import org.springframework.core.annotation.Order;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.lang.reflect.Method;
  12 +
  13 +/**
  14 + * AOP根据注解给上下文赋值
  15 + */
  16 +@Aspect
  17 +@Order(1) //设置AOP执行顺序(需要在事务之前,否则事务只发生在默认库中)
  18 +@Component
  19 +public class DataSourceAspect {
  20 +
  21 + //切点
  22 + @Pointcut("execution(* com.sincere.quartz.service..*.*(..)))")
  23 + public void aspect() { }
  24 +
  25 + @Before("aspect()")
  26 + private void before(JoinPoint point) {
  27 + Object target = point.getTarget();
  28 + String method = point.getSignature().getName();
  29 + Class<?> classz = target.getClass();
  30 + Class<?>[] parameterTypes = ((MethodSignature) point.getSignature())
  31 + .getMethod().getParameterTypes();
  32 + try {
  33 + Method m = classz.getMethod(method, parameterTypes);
  34 + if (m != null && m.isAnnotationPresent(MyDataSource.class)) {
  35 + MyDataSource data = m.getAnnotation(MyDataSource.class);
  36 + JdbcContextHolder.putDataSource(data.value().getName());
  37 + }
  38 + } catch (Exception e) {
  39 + e.printStackTrace();
  40 + }
  41 +
  42 + }
  43 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/DataSourceConfig.java 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +package com.sincere.quartz.datasource;
  2 +
  3 +import org.springframework.boot.context.properties.ConfigurationProperties;
  4 +import org.springframework.boot.jdbc.DataSourceBuilder;
  5 +import org.springframework.context.annotation.Bean;
  6 +import org.springframework.context.annotation.Configuration;
  7 +import org.springframework.context.annotation.Primary;
  8 +
  9 +import javax.sql.DataSource;
  10 +import java.util.HashMap;
  11 +import java.util.Map;
  12 +
  13 +/**
  14 + * 数据源配置
  15 + *
  16 + */
  17 +@Configuration
  18 +public class DataSourceConfig {
  19 +
  20 + @Bean(name = "master")
  21 + @ConfigurationProperties(prefix = "datasource.master")
  22 + public DataSource dataSource1() {
  23 + return DataSourceBuilder.create().build();
  24 + }
  25 +
  26 + @Bean(name = "slave")
  27 + @ConfigurationProperties(prefix = "datasource.slave")
  28 + public DataSource dataSource2() {
  29 + return DataSourceBuilder.create().build();
  30 + }
  31 +
  32 +
  33 + @Bean(name="dynamicDataSource")
  34 + @Primary //优先使用,多数据源
  35 + public DataSource dataSource() {
  36 + DynamicDataSource dynamicDataSource = new DynamicDataSource();
  37 + DataSource master = dataSource1();
  38 + DataSource slave = dataSource2();
  39 + //设置默认数据源
  40 + dynamicDataSource.setDefaultTargetDataSource(master);
  41 + //配置多数据源
  42 + Map<Object,Object> map = new HashMap<>();
  43 + map.put(DataSourceType.Master.getName(), master); //key需要跟ThreadLocal中的值对应
  44 + map.put(DataSourceType.Slave.getName(), slave);
  45 + dynamicDataSource.setTargetDataSources(map);
  46 + return dynamicDataSource;
  47 + }
  48 +
  49 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/DataSourceType.java 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +package com.sincere.quartz.datasource;
  2 +
  3 +public enum DataSourceType {
  4 +
  5 + Master("master"),
  6 +
  7 + Slave("slave");
  8 +
  9 +
  10 + private String name;
  11 +
  12 + private DataSourceType(String name) {
  13 + this.name = name;
  14 + }
  15 +
  16 + public String getName() {
  17 + return name;
  18 + }
  19 +
  20 + public void setName(String name) {
  21 + this.name = name;
  22 + }
  23 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/DynamicDataSource.java 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +package com.sincere.quartz.datasource;
  2 +
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  6 +
  7 +/**
  8 + *
  9 + */
  10 +public class DynamicDataSource extends AbstractRoutingDataSource {
  11 +
  12 + private Logger logger = LoggerFactory.getLogger(this.getClass());
  13 +
  14 + @Override
  15 + protected Object determineCurrentLookupKey() {
  16 + logger.info("数据源为{}",JdbcContextHolder.getDataSource());
  17 + return JdbcContextHolder.getDataSource();
  18 + }
  19 +
  20 +}
0 21 \ No newline at end of file
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/JdbcContextHolder.java 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +package com.sincere.quartz.datasource;
  2 +/**
  3 + */
  4 +public class JdbcContextHolder {
  5 +
  6 + private final static ThreadLocal<String> local = new ThreadLocal<>();
  7 +
  8 + public static void putDataSource(String name) {
  9 + local.set(name);
  10 + }
  11 +
  12 + public static String getDataSource() {
  13 + return local.get();
  14 + }
  15 +
  16 +}
0 17 \ No newline at end of file
... ...
cloud/quartz/src/main/java/com/sincere/quartz/datasource/MyDataSource.java 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +package com.sincere.quartz.datasource;
  2 +
  3 +import java.lang.annotation.ElementType;
  4 +import java.lang.annotation.Retention;
  5 +import java.lang.annotation.RetentionPolicy;
  6 +import java.lang.annotation.Target;
  7 +
  8 +/**
  9 + * 数据源选择--自定义注解
  10 + */
  11 +@Retention(RetentionPolicy.RUNTIME)
  12 +@Target(ElementType.METHOD)
  13 +public @interface MyDataSource {
  14 +
  15 + DataSourceType value() default DataSourceType.Master; //默认主表
  16 +
  17 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/feign/ScFeign.java
... ... @@ -7,9 +7,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
7 7 import org.springframework.web.bind.annotation.RequestMethod;
8 8 import org.springframework.web.bind.annotation.RequestParam;
9 9  
10   -import java.util.HashMap;
11 10 import java.util.List;
12   -import java.util.Map;
13 11  
14 12 /**
15 13 * @author chen
... ... @@ -19,10 +17,26 @@ import java.util.Map;
19 17 @FeignClient("smartCampusSearch")
20 18 public interface ScFeign {
21 19  
  20 + @RequestMapping(value = "/sm/wg/selectSchoolBySchoolId",method = RequestMethod.GET)
  21 + SchoolDto selectSchoolBySchoolId(@RequestParam("schoolId") int schoolId);
  22 +
  23 + //考勤设备
  24 + @RequestMapping(value = "attendance/selectCloudAttendance", method = RequestMethod.GET)
  25 + List<Integer> selectCloudAttendance();
  26 +
  27 + @RequestMapping(value = "attendance/selectCloudAttendanceBySchoolId", method = RequestMethod.GET)
  28 + List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(@RequestParam("schoolId") int schoolId);
  29 +
  30 + @RequestMapping(value = "attendance/selectByDeviceNo", method = RequestMethod.GET)
  31 + String selectByDeviceNo(@RequestParam("deviceNo") String deviceNo);
  32 +
22 33 //考勤推送
23 34 @RequestMapping(value = "/sm/kq/getAllTemplate",method = RequestMethod.GET)
24 35 List<TemplateDto> getAllTemplate();
25 36  
  37 + @RequestMapping(value = "/sm/kq/getAllTemplateAlarm",method = RequestMethod.GET)
  38 + List<TemplateDto> getAllTemplateAlarm();
  39 +
26 40 @RequestMapping(value = "/sm/kq/getTeacherList",method = RequestMethod.GET)
27 41 List<KqTeacherDto> getTeacherList(@RequestParam("schoolId")int schoolId);
28 42  
... ... @@ -35,6 +49,8 @@ public interface ScFeign {
35 49 @RequestMapping(value = "/sm/kq/getThirdId",method = RequestMethod.GET)
36 50 String getThirdId(@RequestParam("userId")String userId , @RequestParam("type") int type);
37 51  
  52 + @RequestMapping(value = "/sm/kq/selectClassBySchoolId",method = RequestMethod.GET)
  53 + List<Integer> selectClassBySchoolId(@RequestParam("schoolId") int schoolId);
38 54  
39 55 //关注绑定推送
40 56 @RequestMapping(value = "/sm/rp/selectBindPushSchool",method = RequestMethod.GET)
... ...
cloud/quartz/src/main/java/com/sincere/quartz/job/AlarmJob.java 0 → 100644
... ... @@ -0,0 +1,169 @@
  1 +package com.sincere.quartz.job;
  2 +
  3 +import com.alibaba.fastjson.JSONArray;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  6 +import com.sincere.common.dto.smartCampus.SchoolDto;
  7 +import com.sincere.common.util.DateUtils;
  8 +import com.sincere.common.util.HttpClientUtils;
  9 +import com.sincere.quartz.feign.ScFeign;
  10 +import com.sincere.quartz.model.ShortMsg;
  11 +import com.sincere.quartz.service.ManagerService;
  12 +import com.sincere.quartz.service.SmsService;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.scheduling.annotation.Scheduled;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +import java.util.ArrayList;
  18 +import java.util.Date;
  19 +import java.util.List;
  20 +
  21 +/**
  22 + * @author chen
  23 + * @version 1.0
  24 + * @date 2020/1/3 0003 10:02
  25 + */
  26 +@Service
  27 +public class AlarmJob {
  28 +
  29 + @Autowired
  30 + ScFeign scFeign;
  31 +
  32 + @Autowired
  33 + SmsService smsService;
  34 +
  35 + @Autowired
  36 + ManagerService managerService ;
  37 +
  38 + private static List<String> opexList ;
  39 + private static String integration ;
  40 +
  41 + static{
  42 + opexList = new ArrayList<>();
  43 + opexList.add("15857566147"); //王汉栋
  44 + opexList.add("13858485977"); //王楠彬
  45 +
  46 + integration = "18767117554" ; //林炜
  47 + }
  48 +
  49 + /**
  50 + * 设备掉线
  51 + */
  52 + @Scheduled(cron = "0 0 6-18 * * ? ")
  53 + public void attendanceAlarm(){
  54 + List<Integer> list = scFeign.selectCloudAttendance();
  55 + for(Integer schoolId : list){
  56 + if(schoolId != 0 && schoolId != 16){
  57 + SchoolDto schoolDto = scFeign.selectSchoolBySchoolId(schoolId);
  58 + List<String> weigengList = new ArrayList<>();
  59 + List<String> faceList = new ArrayList<>();
  60 + List<SZ_AttendanceDto> attendanceList = scFeign.selectCloudAttendanceBySchoolId(schoolId);
  61 + for(SZ_AttendanceDto attendanceDto : attendanceList){
  62 + if(attendanceDto.getClint_type().equals("6")){
  63 + //微耕,查询另一张表
  64 + String lastDate = scFeign.selectByDeviceNo(attendanceDto.getClint_id());
  65 + if(lastDate != null){
  66 + if(DateUtils.getDateDifference(new Date(),DateUtils.string2Date(lastDate,DateUtils.format2),"s") > 20){
  67 + weigengList.add(attendanceDto.getClint_id());
  68 + }
  69 + }
  70 + }else {
  71 + //人脸
  72 + if(attendanceDto.getIsConnection() == 0){
  73 + faceList.add(attendanceDto.getClint_id()); }
  74 + }
  75 + }
  76 + if(weigengList.size() + faceList.size() > 0){
  77 + //有设备掉线,发送短信
  78 + String msg = "【设备掉线预警】" + schoolDto.getSchoolName() + "!" ;
  79 + if(weigengList.size() > 0){
  80 + msg += weigengList.size() + "台闸机掉线。" ;
  81 + }
  82 + if(faceList.size() > 0){
  83 + msg += faceList.size() + "台人脸机掉线。" ;
  84 + }
  85 + msg += "请关注。" ;
  86 + try{
  87 + sendMessage(schoolDto.getSchoolId(),opexList.get(0),msg);
  88 + sendMessage(schoolDto.getSchoolId(),opexList.get(1),msg);
  89 + sendMessage(schoolDto.getSchoolId(),integration,msg);
  90 + sendMessage(schoolDto.getSchoolId(),managerService.selectManagerById(schoolDto.getManagerUserId()),msg);
  91 + }catch (Exception e){
  92 + e.printStackTrace();
  93 + }
  94 + }
  95 + }
  96 + }
  97 + }
  98 +
  99 +
  100 + /**
  101 + * 卡 脸未下发
  102 + */
  103 + @Scheduled(cron = "0 0 12,18 * * ? ")
  104 + public void unPush(){
  105 + List<Integer> list = scFeign.selectCloudAttendance();
  106 + for(Integer schoolId : list) {
  107 + if(schoolId != 0 && schoolId != 16){
  108 + SchoolDto schoolDto = scFeign.selectSchoolBySchoolId(schoolId);
  109 + JSONObject schoolResult = getCount(schoolDto);
  110 + int cardStudentCount = Integer.valueOf( schoolResult.get("studentCardCount").toString() );
  111 + int successStudentCardCount = Integer.valueOf( schoolResult.get("successStudentCardCount").toString() );
  112 + int fushuCardCount = Integer.valueOf( schoolResult.get("fushuCardCount").toString() );
  113 + int successFushuCardCount = Integer.valueOf( schoolResult.get("successFushuCardCount").toString() );
  114 + int teaCardCount = Integer.valueOf( schoolResult.get("teaCardCount").toString() );
  115 + int successTeaCardCount = Integer.valueOf( schoolResult.get("successTeaCardCount").toString() );
  116 + int totalCardNumber = cardStudentCount + fushuCardCount +teaCardCount ;
  117 + int successCardNumber = successFushuCardCount +successStudentCardCount +successTeaCardCount ;
  118 + int unSendCard = totalCardNumber-successCardNumber ;
  119 +
  120 + int errorStudentPhotoCount = Integer.valueOf( schoolResult.get("errorStudentPhotoCount").toString() );
  121 + int errorFushuPhotoCount = Integer.valueOf( schoolResult.get("errorFushuPhotoCount").toString() );
  122 + int errorTeaPhotoCount = Integer.valueOf( schoolResult.get("errorTeaPhotoCount").toString() );
  123 + int unSendFace = errorStudentPhotoCount+errorFushuPhotoCount+errorTeaPhotoCount ;
  124 + if(unSendCard + unSendFace > 0) {
  125 + String msg = "【人脸卡号下发异常预警】" + schoolDto.getSchoolName() + "!";
  126 + if (unSendCard > 0) {
  127 + msg += unSendCard + "卡未下发。";
  128 + }
  129 + if (unSendFace > 0) {
  130 + msg += unSendFace + "脸未下发。";
  131 + }
  132 + msg += "请关注。";
  133 + try {
  134 + sendMessage(schoolDto.getSchoolId(),opexList.get(0),msg);
  135 + sendMessage(schoolDto.getSchoolId(),opexList.get(1),msg);
  136 + sendMessage(schoolDto.getSchoolId(),integration,msg);
  137 + sendMessage(schoolDto.getSchoolId(),managerService.selectManagerById(schoolDto.getManagerUserId()),msg);
  138 + } catch (Exception e) {
  139 + e.printStackTrace();
  140 + }
  141 + }
  142 + }
  143 + }
  144 + }
  145 +
  146 +
  147 + public JSONObject getCount(SchoolDto schoolDto){
  148 + JSONObject object = new JSONObject();
  149 + object.put("schoolName",schoolDto.getSchoolName());
  150 + object.put("pageIndex",1);
  151 + object.put("pageSize",1);
  152 + JSONObject result = HttpClientUtils.httpPostJson("http://campus.myjxt.com/api/GateServiceManager/GetFacePhotoList",object.toJSONString());
  153 + JSONObject data = (JSONObject) result.get("data");
  154 + JSONArray array = (JSONArray) data.get("list");
  155 +
  156 + JSONObject schoolResult = (JSONObject) array.get(0);
  157 + return schoolResult ;
  158 + }
  159 +
  160 + private void sendMessage(int schoolId , String mobile , String msg){
  161 + String tableSuffix = DateUtils.date2String(new Date(), DateUtils.format);
  162 + ShortMsg shortMsg = new ShortMsg();
  163 + shortMsg.setTableName("smsNew"+tableSuffix);
  164 + shortMsg.setSchoolId(schoolId);
  165 + shortMsg.setMobile(mobile);
  166 + shortMsg.setMsg(msg);
  167 + smsService.insertSMS(shortMsg);
  168 + }
  169 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/job/BindPushJob.java
... ... @@ -5,8 +5,8 @@ import com.sincere.common.dto.smartCampus.ParentDto;
5 5 import com.sincere.common.enums.PushTypeEnums;
6 6 import com.sincere.common.util.DateUtils;
7 7 import com.sincere.quartz.feign.ScFeign;
8   -import com.sincere.quartz.mapper.SmsMapper;
9 8 import com.sincere.quartz.model.ShortMsg;
  9 +import com.sincere.quartz.service.SmsService;
10 10 import org.apache.commons.lang3.StringUtils;
11 11 import org.slf4j.Logger;
12 12 import org.slf4j.LoggerFactory;
... ... @@ -14,7 +14,10 @@ import org.springframework.beans.factory.annotation.Autowired;
14 14 import org.springframework.scheduling.annotation.Scheduled;
15 15 import org.springframework.stereotype.Service;
16 16  
17   -import java.util.*;
  17 +import java.util.Date;
  18 +import java.util.HashMap;
  19 +import java.util.List;
  20 +import java.util.Map;
18 21  
19 22 /**
20 23 * 用户注册激活提醒
... ... @@ -32,7 +35,7 @@ public class BindPushJob {
32 35 ScFeign scFeign;
33 36  
34 37 @Autowired
35   - SmsMapper smsMapper;
  38 + SmsService smsService;
36 39  
37 40 private static Map<String , String> intervalDaysMap = new HashMap<>(); //redis 持久化 替换 可避免重启导致间隔的错误
38 41  
... ... @@ -84,7 +87,7 @@ public class BindPushJob {
84 87 shortMsg.setSchoolId(parentDto.getSchoolId());
85 88 shortMsg.setMobile(parentDto.getMobile());
86 89 shortMsg.setMsg(message);
87   - smsMapper.insertSMS(shortMsg);
  90 + smsService.insertSMS(shortMsg);
88 91 logger.info("----学校Id---"+parentDto.getSchoolId() + "----手机号----"+parentDto.getMobile()+"---"+message);
89 92 }
90 93 }
... ...
cloud/quartz/src/main/java/com/sincere/quartz/job/KQJob.java
... ... @@ -9,9 +9,11 @@ import com.sincere.common.util.HttpClientUtils;
9 9 import com.sincere.quartz.enums.KqTypeEnums;
10 10 import com.sincere.quartz.enums.TypeEnums;
11 11 import com.sincere.quartz.feign.ScFeign;
12   -import com.sincere.quartz.mapper.SmsMapper;
13 12 import com.sincere.quartz.model.DingSms;
  13 +import com.sincere.quartz.model.ShortMsg;
14 14 import com.sincere.quartz.model.WeChatSms;
  15 +import com.sincere.quartz.service.ManagerService;
  16 +import com.sincere.quartz.service.SmsService;
15 17 import org.apache.commons.lang3.StringUtils;
16 18 import org.slf4j.Logger;
17 19 import org.slf4j.LoggerFactory;
... ... @@ -19,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
19 21 import org.springframework.scheduling.annotation.Scheduled;
20 22 import org.springframework.stereotype.Service;
21 23  
  24 +import java.math.BigDecimal;
22 25 import java.util.*;
23 26  
24 27 /**
... ... @@ -37,10 +40,28 @@ public class KQJob {
37 40 ScFeign scFeign ;
38 41  
39 42 @Autowired
40   - SmsMapper smsMapper;
  43 + SmsService smsService;
  44 +
  45 + @Autowired
  46 + ManagerService managerService ;
41 47  
42 48 private static String date ;
43   - private static Map<String , String> map = new HashMap<>();
  49 + private static Map<String , String> map = new HashMap<>(); //学校 考勤推送map
  50 +
  51 + private static String alarmDate ;
  52 + private static Map<String , String> alarmMap = new HashMap<>(); //考勤告警推送map
  53 + private static Map<String , BigDecimal> templateMap = new HashMap<>(); // 考勤比例
  54 +
  55 + private static List<String> opexList ;
  56 + private static String integration ;
  57 +
  58 + static{
  59 + opexList = new ArrayList<>();
  60 + opexList.add("15857566147"); //王汉栋
  61 + opexList.add("13858485977"); //王楠彬
  62 +
  63 + integration = "18767117554" ; //林炜
  64 + }
44 65  
45 66 @Scheduled(cron = "0 0-59 * * * ? ")
46 67 public void kaoQing() {
... ... @@ -77,6 +98,90 @@ public class KQJob {
77 98 }
78 99 }
79 100  
  101 + @Scheduled(cron = "0 0 18 * * MON-FRI")
  102 + public void alarmKaoQing() {
  103 + String now = DateUtils.date2String(new Date(),DateUtils.format1) ;
  104 + if(StringUtils.isBlank(alarmDate)){
  105 + initAlarmMap();
  106 + alarmDate = now ;
  107 + }
  108 + if(!DateUtils.date2String(new Date(),DateUtils.format1).equals(alarmDate)){
  109 + initAlarmMap();
  110 + alarmDate = DateUtils.date2String(new Date(),DateUtils.format1) ;
  111 + }
  112 + //开始过滤数据 推送
  113 + List<String> keyList = new ArrayList<>();
  114 + for(Map.Entry<String, String> entity : alarmMap.entrySet()){
  115 + String endTime = entity.getValue().split("_")[1];
  116 + if(DateUtils.getDateDifference(new Date(),DateUtils.string2Date(now+" "+endTime+":00",DateUtils.format2),"m")>=2
  117 + ){
  118 + String key = entity.getKey();
  119 + keyList.add(key);
  120 + alarm(entity);
  121 + }
  122 + }
  123 + for(String key : keyList){
  124 + map.remove(key);
  125 + }
  126 + }
  127 +
  128 + private void initAlarmMap(){
  129 + alarmMap = new HashMap<>();
  130 + List<TemplateDto> list = scFeign.getAllTemplateAlarm();
  131 + logger.info(("------考勤告警模板------"));
  132 + for(TemplateDto templateDto : list){
  133 + String config = templateDto.getConfig();
  134 + String[] array = config.split("<Template");
  135 + for(int i = 1 ; i<array.length ;i++){
  136 + try{
  137 + String msg = array[i];
  138 + String beginTime = msg.substring(msg.indexOf("BeginTime")+11,msg.indexOf("BeginTime")+16);
  139 + String endTime = msg.substring(msg.indexOf("EndTime")+9,msg.indexOf("EndTime")+14);
  140 + String templateId = msg.substring(msg.indexOf("TemplateID")+12,msg.indexOf("TemplateID")+22);
  141 + String Week = msg.substring(msg.indexOf("Week")+6,msg.indexOf("Week")+19);
  142 + String type = msg.substring(msg.indexOf("Type")+6,msg.indexOf("Type")+8);
  143 + type = type.replace("\"","");
  144 + int nowWeek = DateUtils.getWeek() ;
  145 + if(Week.contains(nowWeek+"") && nowWeek != 1 && nowWeek != 7 ){ //周末不告警
  146 + logger.info((templateId+"_"+templateDto.getSchoolId()+"------"+beginTime+"_"+endTime));
  147 + alarmMap.put(templateId+"_"+templateDto.getSchoolId() , beginTime+"_"+endTime+"_"+type+"_"+templateDto.getId());
  148 + }
  149 + }catch (Exception e){
  150 + e.printStackTrace();
  151 + }
  152 + }
  153 + }
  154 + }
  155 +
  156 + //告警推送
  157 + private void alarm(Map.Entry<String,String> entry){
  158 + String templateId = entry.getKey().split("_")[0] ;
  159 + String schoolId = entry.getKey().split("_")[1] ;
  160 + String id = entry.getValue().split("_")[3];
  161 + String type = entry.getValue().split("_")[2] ;
  162 + if(DateUtils.getWeek() == 3 || DateUtils.getWeek() == 6){
  163 + //可以相差40%
  164 + BigDecimal percent = getAlarmCensus(Integer.valueOf(id),templateId,Integer.valueOf(schoolId),Integer.valueOf(type));
  165 + if(templateMap.get(templateId) != null){
  166 + if(percent.subtract(templateMap.get(templateId)).compareTo(new BigDecimal(0.4)) > 0
  167 + || templateMap.get(templateId).subtract(percent).compareTo(new BigDecimal(0.4)) > 0) {
  168 + alarmPush(Integer.valueOf(schoolId));
  169 + }
  170 + }
  171 + templateMap.put(templateId,percent);
  172 + }else {
  173 + //相差30%
  174 + BigDecimal percent = getAlarmCensus(Integer.valueOf(id),templateId,Integer.valueOf(schoolId),Integer.valueOf(type));
  175 + if(templateMap.get(templateId) != null){
  176 + if(percent.subtract(templateMap.get(templateId)).compareTo(new BigDecimal(0.3)) > 0
  177 + || templateMap.get(templateId).subtract(percent).compareTo(new BigDecimal(0.3)) > 0) {
  178 + alarmPush(Integer.valueOf(schoolId));
  179 + }
  180 + }
  181 + templateMap.put(templateId,percent);
  182 + }
  183 + }
  184 +
80 185 //初始化要推送的模板
81 186 private void initMap(){
82 187 map = new HashMap<>();
... ... @@ -316,9 +421,28 @@ public class KQJob {
316 421 return list ;
317 422 }
318 423  
  424 + private BigDecimal getAlarmCensus(int id , String templateId ,int schoolId , int type){
  425 + int allNumber = 0 , attendNumber = 0 ;
  426 + List<Integer> list = scFeign.selectClassBySchoolId(schoolId);
  427 + for(Integer classId : list){
  428 + String url = "http://campus.myjxt.com/api/EasyN/GeAttendDetail?classId="+classId+
  429 + "&id="+id+"&templateID="+templateId+"&type="+type+"&time=" + DateUtils.date2String(new Date(),DateUtils.format1);
  430 + JSONObject jsonObject = HttpClientUtils.httpGet(url);
  431 + try{
  432 + JSONObject data = (JSONObject) jsonObject.get("data");
  433 + attendNumber = attendNumber + (Integer) data.get("stuAttendCount");
  434 + allNumber = allNumber + (Integer) data.get("stuCount");
  435 + }catch (Exception e){
  436 + e.printStackTrace();
  437 + }
  438 + }
  439 + return new BigDecimal(attendNumber).divide(new BigDecimal(allNumber)) ;
  440 + }
  441 +
  442 +
319 443 private void insertDing(DingSms dingSms){
320 444 try{
321   - smsMapper.insertDing(dingSms);
  445 + smsService.insertDing(dingSms);
322 446 }catch (Exception e){
323 447 logger.info(e.toString());
324 448 }
... ... @@ -326,9 +450,34 @@ public class KQJob {
326 450  
327 451 private void insertQYH(WeChatSms weChatSms){
328 452 try{
329   - smsMapper.insertWeChat(weChatSms);
  453 + smsService.insertWeChat(weChatSms);
330 454 }catch (Exception e){
331 455 logger.info(e.toString());
332 456 }
333 457 }
  458 +
  459 + private void alarmPush(int schoolId){
  460 + String msg = "【考勤异动】" ;
  461 + try{
  462 + SchoolDto schoolDto = scFeign.selectSchoolBySchoolId(schoolId);
  463 + msg += schoolDto.getSchoolName() + "考勤有异动,请关注!" ;
  464 + sendMessage(schoolDto.getSchoolId(),opexList.get(0),msg);
  465 + sendMessage(schoolDto.getSchoolId(),opexList.get(1),msg);
  466 + sendMessage(schoolDto.getSchoolId(),integration,msg);
  467 + sendMessage(schoolDto.getSchoolId(),managerService.selectManagerById(schoolDto.getManagerUserId()),msg);
  468 + }catch (Exception e){
  469 + e.printStackTrace();
  470 + }
  471 +
  472 + }
  473 +
  474 + private void sendMessage(int schoolId , String mobile , String msg){
  475 + String tableSuffix = DateUtils.date2String(new Date(), DateUtils.format);
  476 + ShortMsg shortMsg = new ShortMsg();
  477 + shortMsg.setTableName("smsNew"+tableSuffix);
  478 + shortMsg.setSchoolId(schoolId);
  479 + shortMsg.setMobile(mobile);
  480 + shortMsg.setMsg(msg);
  481 + smsService.insertSMS(shortMsg);
  482 + }
334 483 }
... ...
cloud/quartz/src/main/java/com/sincere/quartz/job/SyncJob.java
... ... @@ -20,11 +20,11 @@ public class SyncJob {
20 20 @Autowired
21 21 YXYReadService yxyReadService ;
22 22  
23   - @Scheduled(cron = "0 1-59 * * * ? ")
  23 + //@Scheduled(cron = "0/1 * * * * ? ")
24 24 //@Scheduled(cron = "0 0 23 * * ? ")
25 25 public void Sync(){
26 26 //翼校通的同步 之后还有钉钉的同步等等
27   - yxyWriteService.sync();
  27 + //yxyWriteService.sync();
28 28 yxyReadService.sync();
29 29 }
30 30 }
... ...
cloud/quartz/src/main/java/com/sincere/quartz/mapper/ManagerMapper.java 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +package com.sincere.quartz.mapper;
  2 +
  3 +public interface ManagerMapper {
  4 +
  5 + String selectManagerById(int id);
  6 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/service/ManagerService.java 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +package com.sincere.quartz.service;
  2 +
  3 +public interface ManagerService {
  4 +
  5 + String selectManagerById(int id);
  6 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/service/SmsService.java 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +package com.sincere.quartz.service;
  2 +
  3 +import com.sincere.quartz.model.DingSms;
  4 +import com.sincere.quartz.model.ShortMsg;
  5 +import com.sincere.quartz.model.WeChatSms;
  6 +
  7 +public interface SmsService {
  8 +
  9 + int insertDing(DingSms dingSms);
  10 +
  11 + int insertWeChat(WeChatSms weChatSms);
  12 +
  13 + int insertSMS(ShortMsg shortMsg);
  14 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/service/impl/ManagerServiceImpl.java 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +package com.sincere.quartz.service.impl;
  2 +
  3 +import com.sincere.quartz.datasource.DataSourceType;
  4 +import com.sincere.quartz.datasource.MyDataSource;
  5 +import com.sincere.quartz.mapper.ManagerMapper;
  6 +import com.sincere.quartz.service.ManagerService;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Service;
  9 +
  10 +@Service
  11 +public class ManagerServiceImpl implements ManagerService {
  12 +
  13 + @Autowired
  14 + ManagerMapper managerMapper ;
  15 +
  16 + @Override
  17 + @MyDataSource(DataSourceType.Master)
  18 + public String selectManagerById(int id) {
  19 + return managerMapper.selectManagerById(id);
  20 + }
  21 +}
... ...
cloud/quartz/src/main/java/com/sincere/quartz/service/impl/SmsServiceImpl.java 0 → 100644
... ... @@ -0,0 +1,36 @@
  1 +package com.sincere.quartz.service.impl;
  2 +
  3 +import com.sincere.quartz.datasource.DataSourceType;
  4 +import com.sincere.quartz.datasource.MyDataSource;
  5 +import com.sincere.quartz.mapper.SmsMapper;
  6 +import com.sincere.quartz.model.DingSms;
  7 +import com.sincere.quartz.model.ShortMsg;
  8 +import com.sincere.quartz.model.WeChatSms;
  9 +import com.sincere.quartz.service.SmsService;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +@Service
  14 +public class SmsServiceImpl implements SmsService {
  15 +
  16 + @Autowired
  17 + SmsMapper smsMapper;
  18 +
  19 + @Override
  20 + @MyDataSource(DataSourceType.Slave)
  21 + public int insertDing(DingSms dingSms) {
  22 + return smsMapper.insertDing(dingSms);
  23 + }
  24 +
  25 + @Override
  26 + @MyDataSource(DataSourceType.Slave)
  27 + public int insertWeChat(WeChatSms weChatSms) {
  28 + return smsMapper.insertWeChat(weChatSms);
  29 + }
  30 +
  31 + @Override
  32 + @MyDataSource(DataSourceType.Slave)
  33 + public int insertSMS(ShortMsg shortMsg) {
  34 + return smsMapper.insertSMS(shortMsg);
  35 + }
  36 +}
... ...
cloud/quartz/src/main/resources/application.yaml
... ... @@ -4,10 +4,17 @@ server:
4 4 spring:
5 5 application:
6 6 name: quartz-server
7   - datasource:
  7 +
  8 +datasource:
  9 + master: ## 查询
  10 + username: szjxtuser
  11 + password: RQminVCJota3H1u8bBYH
  12 + jdbcUrl: jdbc:sqlserver://116.62.155.137:33419;database=SmartAdmin
  13 + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  14 + slave: ## 短信
8 15 username: sa
9 16 password: qaz!@#0401
10   - url: jdbc:sqlserver://60.190.202.38:49469;database=XST
  17 + jdbcUrl: jdbc:sqlserver://60.190.202.38:49469;database=XST
11 18 driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
12 19 ##mybatis
13 20 mybatis:
... ...
cloud/quartz/src/main/resources/mapper/ManagerMapper.xml 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3 +<mapper namespace="com.sincere.quartz.mapper.ManagerMapper">
  4 +
  5 + <select id="selectManagerById" parameterType="java.lang.Integer" resultType="java.lang.String">
  6 + select phone from SZ_Manager where ID = #{id}
  7 + </select>
  8 +
  9 +</mapper>
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java
1 1 package com.sincere.smartSearch.controller;
2 2  
3 3 import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import com.sincere.common.util.DateUtils;
4 5 import com.sincere.smartSearch.service.AttendacenService;
  6 +import com.sincere.smartSearch.service.DeviceService;
5 7 import io.swagger.annotations.Api;
6 8 import io.swagger.annotations.ApiOperation;
7 9 import org.apache.ibatis.annotations.Param;
8 10 import org.springframework.beans.factory.annotation.Autowired;
9 11 import org.springframework.web.bind.annotation.*;
10 12  
  13 +import java.util.Date;
11 14 import java.util.List;
12 15  
13 16 @RestController
... ... @@ -18,6 +21,9 @@ public class AttendanceController {
18 21 @Autowired
19 22 AttendacenService attendacenService;
20 23  
  24 + @Autowired
  25 + DeviceService deviceService;
  26 +
21 27 @RequestMapping(method = RequestMethod.GET, value = "selectAttendaceWithId")
22 28 public SZ_AttendanceDto selectAttendaceWithId(@RequestParam("clint_id") String clint_id) {
23 29 return attendacenService.selectDevice(clint_id);
... ... @@ -45,4 +51,25 @@ public class AttendanceController {
45 51 List<String> selectRoomAttendance(@RequestParam("placeId") int placeId){
46 52 return attendacenService.selectRoomAttendance(placeId);
47 53 }
  54 +
  55 + @RequestMapping(value = "selectCloudAttendance", method = RequestMethod.GET)
  56 + List<Integer> selectCloudAttendance(){
  57 + return attendacenService.selectCloudAttendance();
  58 + }
  59 +
  60 + @RequestMapping(value = "selectCloudAttendanceBySchoolId", method = RequestMethod.GET)
  61 + List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(@RequestParam("schoolId") int schoolId){
  62 + return attendacenService.selectCloudAttendanceBySchoolId(schoolId);
  63 + }
  64 +
  65 +
  66 + @RequestMapping(value = "selectByDeviceNo", method = RequestMethod.GET)
  67 + String selectByDeviceNo(@RequestParam("deviceNo") String deviceNo){
  68 + Date date = deviceService.selectByDeviceNo(deviceNo) ;
  69 + if(date == null){
  70 + return null ;
  71 + }else {
  72 + return DateUtils.date2String(date,DateUtils.format2);
  73 + }
  74 + }
48 75 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/KqController.java
... ... @@ -36,6 +36,20 @@ public class KqController {
36 36 return templateDtos;
37 37 }
38 38  
  39 + @RequestMapping(value = "getAllTemplateAlarm",method = RequestMethod.GET)
  40 + public List<TemplateDto> getAllTemplateAlarm(){
  41 + List<KqTemplate> list = kqService.selectAllKqTemplate();
  42 + List<TemplateDto> templateDtos = new ArrayList<>();
  43 + for(KqTemplate kqTemplate : list){
  44 + TemplateDto templateDto = new TemplateDto();
  45 + templateDto.setId(kqTemplate.getId());
  46 + templateDto.setConfig(kqTemplate.getConfig());
  47 + templateDto.setSchoolId(kqTemplate.getSchoolId());
  48 + templateDtos.add(templateDto);
  49 + }
  50 + return templateDtos;
  51 + }
  52 +
39 53  
40 54 @RequestMapping(value = "getTeacherList",method = RequestMethod.GET)
41 55 public List<KqTeacherDto> getTeacherList(@RequestParam("schoolId")int schoolId){
... ... @@ -62,4 +76,9 @@ public class KqController {
62 76 map.put("type",type+"");
63 77 return kqService.selectThirdId(map);
64 78 }
  79 +
  80 + @RequestMapping(value = "selectClassBySchoolId",method = RequestMethod.GET)
  81 + List<Integer> selectClassBySchoolId(@RequestParam("schoolId") int schoolId){
  82 + return kqService.selectClassBySchoolId(schoolId);
  83 + }
65 84 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/WgController.java
... ... @@ -78,6 +78,7 @@ public class WgController {
78 78 if(school != null){
79 79 schoolDto.setSchoolId(school.getSchoolId());
80 80 schoolDto.setSchoolName(school.getSchoolName());
  81 + schoolDto.setManagerUserId(school.getManagerUserId());
81 82 }
82 83 return schoolDto;
83 84 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java
... ... @@ -19,4 +19,8 @@ public interface AttendaceMapper {
19 19  
20 20 List<String> selectRoomAttendance(int placeId);
21 21  
  22 + List<Integer> selectCloudAttendance();
  23 +
  24 + List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId);
  25 +
22 26 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/DeviceMapper.java
... ... @@ -3,6 +3,8 @@ package com.sincere.smartSearch.mapper;
3 3 import com.sincere.smartSearch.model.DeviceLink;
4 4 import com.sincere.smartSearch.model.DeviceOrder;
5 5  
  6 +import java.util.Date;
  7 +
6 8 /**
7 9 * @author chen
8 10 * @version 1.0
... ... @@ -15,4 +17,6 @@ public interface DeviceMapper {
15 17 int insertLink(DeviceLink deviceLink);
16 18  
17 19 String selectOutOrderId(DeviceOrder deviceOrder);
  20 +
  21 + Date selectByDeviceNo(String deviceNo);
18 22 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/KqTemplateMapper.java
... ... @@ -18,6 +18,8 @@ public interface KqTemplateMapper {
18 18  
19 19 List<KqTemplate> selectKqTemplate();
20 20  
  21 + List<KqTemplate> selectAllKqTemplate();
  22 +
21 23 List<KqTeacherDto> selectSchoolTeacher(int schoolId);
22 24  
23 25 List<KqTeacherDto> selectChamberTeacher(int schoolId);
... ... @@ -26,4 +28,6 @@ public interface KqTemplateMapper {
26 28  
27 29 String selectThirdId(Map<String,String> map);
28 30  
  31 + List<Integer> selectClassBySchoolId(int schoolId);
  32 +
29 33 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/model/School.java
... ... @@ -9,6 +9,15 @@ public class School {
9 9  
10 10 private int schoolId ;
11 11 private String schoolName ;
  12 + private int managerUserId ;
  13 +
  14 + public int getManagerUserId() {
  15 + return managerUserId;
  16 + }
  17 +
  18 + public void setManagerUserId(int managerUserId) {
  19 + this.managerUserId = managerUserId;
  20 + }
12 21  
13 22 public int getSchoolId() {
14 23 return schoolId;
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java
... ... @@ -18,4 +18,8 @@ public interface AttendacenService {
18 18 int updateAttendance(String client_id);
19 19  
20 20 List<String> selectRoomAttendance(int placeId);
  21 +
  22 + List<Integer> selectCloudAttendance();
  23 +
  24 + List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId);
21 25 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/DeviceService.java
1 1 package com.sincere.smartSearch.service;
2 2  
  3 +import java.util.Date;
  4 +
3 5 /**
4 6 * @author chen
5 7 * @version 1.0
... ... @@ -12,4 +14,6 @@ public interface DeviceService {
12 14  
13 15 String selectOutOrderId(int type, int insideOrderId);
14 16  
  17 +
  18 + Date selectByDeviceNo(String deviceNo);
15 19 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/KqService.java
... ... @@ -18,6 +18,8 @@ public interface KqService {
18 18  
19 19 List<KqTemplate> selectKqTemplate();
20 20  
  21 + List<KqTemplate> selectAllKqTemplate();
  22 +
21 23 List<KqTeacherDto> selectSchoolTeacher(int schoolId);
22 24  
23 25 List<KqTeacherDto> selectChamberTeacher(int schoolId);
... ... @@ -25,4 +27,6 @@ public interface KqService {
25 27 AppDto selectApp(Map<String,Integer> map);
26 28  
27 29 String selectThirdId(Map<String,String> map);
  30 +
  31 + List<Integer> selectClassBySchoolId(int schoolId);
28 32 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java
... ... @@ -39,4 +39,14 @@ public class AttendacenServiceImp implements AttendacenService {
39 39 public List<String> selectRoomAttendance(int placeId) {
40 40 return attendaceMapper.selectRoomAttendance(placeId);
41 41 }
  42 +
  43 + @Override
  44 + public List<Integer> selectCloudAttendance() {
  45 + return attendaceMapper.selectCloudAttendance();
  46 + }
  47 +
  48 + @Override
  49 + public List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId) {
  50 + return attendaceMapper.selectCloudAttendanceBySchoolId(schoolId);
  51 + }
42 52 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/DeviceServiceImpl.java
... ... @@ -40,4 +40,9 @@ public class DeviceServiceImpl implements DeviceService {
40 40 deviceOrder.setInsideOrderId(insideOrderId);
41 41 return deviceMapper.selectOutOrderId(deviceOrder);
42 42 }
  43 +
  44 + @Override
  45 + public Date selectByDeviceNo(String deviceNo) {
  46 + return deviceMapper.selectByDeviceNo(deviceNo);
  47 + }
43 48 }
... ...
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/KqServiceImpl.java
... ... @@ -31,6 +31,11 @@ public class KqServiceImpl implements KqService {
31 31 }
32 32  
33 33 @Override
  34 + public List<KqTemplate> selectAllKqTemplate() {
  35 + return kqTemplateMapper.selectAllKqTemplate();
  36 + }
  37 +
  38 + @Override
34 39 public List<KqTeacherDto> selectSchoolTeacher(int schoolId) {
35 40 return kqTemplateMapper.selectSchoolTeacher(schoolId);
36 41 }
... ... @@ -49,4 +54,9 @@ public class KqServiceImpl implements KqService {
49 54 public String selectThirdId(Map<String, String> map) {
50 55 return kqTemplateMapper.selectThirdId(map);
51 56 }
  57 +
  58 + @Override
  59 + public List<Integer> selectClassBySchoolId(int schoolId) {
  60 + return kqTemplateMapper.selectClassBySchoolId(schoolId);
  61 + }
52 62 }
... ...
cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml
... ... @@ -42,4 +42,11 @@
42 42 select KaoQinAttendance from XA_PlaceAttendance where PlaceId = #{placeId}
43 43 </select>
44 44  
  45 + <select id="selectCloudAttendance" resultType="java.lang.Integer">
  46 + select DISTINCT school_id from SZ_Attendance where school_id != -1 and ( clint_type = 18 or clint_type = 22 or clint_id like '253%' )
  47 + </select>
  48 +
  49 + <select id="selectCloudAttendanceBySchoolId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
  50 + select * from SZ_Attendance where school_id = #{schoolId} and ( clint_type = 18 or clint_type = 22 or clint_id like '253%' )
  51 + </select>
45 52 </mapper>
... ...
cloud/search_smartCampus/src/main/resources/mapper/DeviceMapper.xml
... ... @@ -14,4 +14,8 @@
14 14 <select id="selectOutOrderId" parameterType="com.sincere.smartSearch.model.DeviceOrder" resultType="java.lang.String">
15 15 select OutsideOrderID from AC_DeviceOrder where Type = #{type} and InsideOrderID = #{insideOrderId}
16 16 </select>
  17 +
  18 + <select id="selectByDeviceNo" parameterType="java.lang.String" resultType="java.util.Date">
  19 + select LastTime from AC_DeviceLink where DeviceNo = #{deviceNo}
  20 + </select>
17 21 </mapper>
18 22 \ No newline at end of file
... ...
cloud/search_smartCampus/src/main/resources/mapper/KqTemplateMapper.xml
... ... @@ -17,6 +17,11 @@
17 17 and SZ_School.IsPush =1
18 18 </select>
19 19  
  20 + <select id="selectAllKqTemplate" resultMap="TemplateMap">
  21 + select XA_KqTemplate.Id , XA_KqTemplate.config , XA_KqTemplate.SchoolId from XA_KqTemplate
  22 + where XA_KqTemplate.State = 1 and XA_KqTemplate.TType = 1
  23 + </select>
  24 +
20 25 <resultMap id="TeacherMap" type="com.sincere.common.dto.smartCampus.KqTeacherDto">
21 26 <result column="user_id" property="userId"/>
22 27 <result column="school_id" property="schoolId"/>
... ... @@ -55,4 +60,8 @@
55 60 <select id="selectThirdId" parameterType="java.util.Map" resultType="java.lang.String">
56 61 select top 1 DQuserId from EM_QyDingUser where HxyUserId = #{userId} and State = 1 and QyType = #{type}
57 62 </select>
  63 +
  64 + <select id="selectClassBySchoolId" parameterType="java.lang.Integer" resultType="java.lang.Integer">
  65 + select class_id from SZ_Class where school_id = #{schoolId} and state=1 and is_finish=0
  66 + </select>
58 67 </mapper>
... ...
cloud/search_smartCampus/src/main/resources/mapper/WgUserSearchMapper.xml
... ... @@ -10,11 +10,12 @@
10 10  
11 11 <resultMap id="School" type="com.sincere.smartSearch.model.School" >
12 12 <result column="school_id" property="schoolId" jdbcType="INTEGER" />
  13 + <result column="manageuser_id" property="managerUserId" jdbcType="INTEGER" />
13 14 <result column="school_name" property="schoolName" jdbcType="VARCHAR" />
14 15 </resultMap>
15 16  
16 17 <select id="selectSchoolBySchoolId" parameterType="java.lang.Integer" resultMap="School">
17   - select school_id , school_name from SZ_School where school_id = #{schoolId}
  18 + select school_id , school_name , manageuser_id from SZ_School where school_id = #{schoolId}
18 19 </select>
19 20  
20 21  
... ...
cloud/search_xiaoan/src/main/java/com/sincere/xiaoanSearch/controller/WgController.java
... ... @@ -96,4 +96,14 @@ public class WgController {
96 96 }
97 97 return sendMessageDto ;
98 98 }
  99 +
  100 + @RequestMapping(value = "selectCountByDeviceNo",method = RequestMethod.GET)
  101 + int selectCountByDeviceNo(@RequestParam("deviceId") String deviceId){
  102 + return wgService.selectCountByDeviceNo(deviceId);
  103 + }
  104 +
  105 + @RequestMapping(value = "selectCountByDaceDeviceNo",method = RequestMethod.GET)
  106 + int selectCountByDaceDeviceNo(@RequestParam("deviceId") String deviceId){
  107 + return wgService.selectCountByDaceDeviceNo(deviceId);
  108 + }
99 109 }
... ...
cloud/search_xiaoan/src/main/java/com/sincere/xiaoanSearch/mapper/WgResultMapper.java
... ... @@ -21,4 +21,8 @@ public interface WgResultMapper {
21 21 int deleteSendFail(SendFail sendFail);
22 22  
23 23 int updateSendSuccess(SendSuccess sendSuccess);
  24 +
  25 + int selectCountByDeviceNo(String deviceId);
  26 +
  27 + int selectCountByDaceDeviceNo(String deviceId);
24 28 }
... ...
cloud/search_xiaoan/src/main/java/com/sincere/xiaoanSearch/service/WgService.java
... ... @@ -30,4 +30,9 @@ public interface WgService {
30 30 int deleteSendFail(SendFail sendFail);
31 31  
32 32 int updateSendSuccess(SendSuccess sendSuccess);
  33 +
  34 + int selectCountByDeviceNo(String deviceId);
  35 +
  36 + int selectCountByDaceDeviceNo(String deviceId);
  37 +
33 38 }
... ...
cloud/search_xiaoan/src/main/java/com/sincere/xiaoanSearch/service/impl/WgServiceImpl.java
... ... @@ -98,4 +98,14 @@ public class WgServiceImpl implements WgService {
98 98 public int updateSendSuccess(SendSuccess sendSuccess) {
99 99 return wgResultMapper.updateSendSuccess(sendSuccess);
100 100 }
  101 +
  102 + @Override
  103 + public int selectCountByDeviceNo(String deviceId) {
  104 + return wgResultMapper.selectCountByDeviceNo(deviceId);
  105 + }
  106 +
  107 + @Override
  108 + public int selectCountByDaceDeviceNo(String deviceId) {
  109 + return wgResultMapper.selectCountByDaceDeviceNo(deviceId);
  110 + }
101 111 }
... ...
cloud/search_xiaoan/src/main/resources/mapper/WgResultMapper.xml
... ... @@ -35,4 +35,12 @@
35 35 <delete id="deleteSendFail" parameterType="com.sincere.xiaoanSearch.model.SendFail">
36 36 delete WG_SendFail where deviceID = #{deviceId} and cardNum = #{cardNum} and shiduan=#{shiduan}
37 37 </delete>
  38 +
  39 + <select id="selectCountByDeviceNo" parameterType="java.lang.String" resultType="java.lang.Integer">
  40 + select count(DISTINCT cardNum) from WG_SendSuccess where deviceID = #{deviceId}
  41 + </select>
  42 +
  43 + <select id="selectCountByDaceDeviceNo" parameterType="java.lang.String" resultType="java.lang.Integer">
  44 + select count(DISTINCT Num) from Face_SendSuccess where deviceID = #{deviceId}
  45 + </select>
38 46 </mapper>
39 47 \ No newline at end of file
... ...
cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java
... ... @@ -14,6 +14,8 @@ import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
14 14 import com.sincere.common.dto.xiaoan.FingerDto;
15 15 import com.sincere.common.util.DateUtils;
16 16 import com.sincere.common.util.HttpClientUtils;
  17 +import io.swagger.annotations.Api;
  18 +import io.swagger.annotations.ApiOperation;
17 19 import org.apache.commons.lang3.StringUtils;
18 20 import org.slf4j.Logger;
19 21 import org.springframework.beans.factory.annotation.Autowired;
... ...