Commit ab576aa9e124831fad494677356f8b278081a586

Authored by 王通
1 parent faa4e685

1.计算排班接口中加入明天的数据

src/main/java/com/bsth/redis/PlanScheduleRedisService.java
1 -package com.bsth.redis;  
2 -  
3 -import com.bsth.Application;  
4 -import com.bsth.entity.SchedulePlanInfo;  
5 -import com.bsth.redis.util.DateUtils;  
6 -import com.bsth.redis.util.RedisUtils;  
7 -import com.bsth.repository.SchedulePlanInfoRepository;  
8 -import com.bsth.server_rs.base_info.line.Line;  
9 -import com.bsth.server_rs.base_info.line.buffer.LineBufferData;  
10 -import com.bsth.util.ConfigUtil;  
11 -import com.bsth.util.ConvertUtil;  
12 -import com.google.common.collect.ArrayListMultimap;  
13 -import org.joda.time.DateTime;  
14 -import org.slf4j.Logger;  
15 -import org.slf4j.LoggerFactory;  
16 -import org.springframework.beans.factory.annotation.Autowired;  
17 -import org.springframework.boot.CommandLineRunner;  
18 -import org.springframework.core.annotation.Order;  
19 -import org.springframework.data.redis.core.ListOperations;  
20 -import org.springframework.data.redis.core.RedisTemplate;  
21 -import org.springframework.data.redis.serializer.StringRedisSerializer;  
22 -import org.springframework.stereotype.Component;  
23 -import org.springframework.stereotype.Service;  
24 -  
25 -import java.util.ArrayList;  
26 -import java.util.Date;  
27 -import java.util.Iterator;  
28 -import java.util.List;  
29 -import java.util.concurrent.TimeUnit;  
30 -  
31 -/**  
32 - * 计调的 计划排班redis缓存  
33 - * Created by panzhao on 2017/3/27.  
34 - */  
35 -@Service  
36 -@Order(6)  
37 -public class PlanScheduleRedisService implements CommandLineRunner {  
38 -  
39 - @Autowired  
40 - private RedisTemplate redisTemplate;  
41 -  
42 - @Autowired  
43 - SchedulePlanInfoRepository planInfoRepository;  
44 -  
45 - @Autowired  
46 - RedisUtils redisUtils;  
47 -  
48 - static Logger logger = LoggerFactory.getLogger(PlanScheduleRedisService.class);  
49 -  
50 - private final static String REDIS_KEY_PREFIX = "plan:";  
51 -  
52 - /**  
53 - * 将一批计划写入redis  
54 - *  
55 - * @param list  
56 - */  
57 - public void wirte(List<SchedulePlanInfo> list) {  
58 - ArrayListMultimap<String, SchedulePlanInfo> multimap;  
59 - try {  
60 - if (list.size() == 0)  
61 - return;  
62 - //按日期和线路分组数据  
63 - Class clazz = SchedulePlanInfo.class;  
64 - multimap = new ConvertUtil().groupMultiList(list, ":", clazz.getDeclaredField("xlBm"), clazz.getDeclaredField("scheduleDate"));  
65 -  
66 - //写入redis  
67 - Iterator<String> iterator = multimap.keySet().iterator();  
68 - String key;  
69 - while (iterator.hasNext()) {  
70 - key = iterator.next();  
71 - replace(key, multimap.get(key));  
72 - }  
73 - } catch (Exception e) {  
74 - logger.error("", e);  
75 - }  
76 - }  
77 -  
78 - /**  
79 - * 将 list 与redis里的数据合并  
80 - *  
81 - * @param key  
82 - * @param list  
83 - */  
84 - public void mergeData(String key, List<SchedulePlanInfo> list) {  
85 - key = REDIS_KEY_PREFIX + key.replaceAll("-", "");  
86 -  
87 - ListOperations<String, SchedulePlanInfo> ops = redisTemplate.opsForList();  
88 - List<SchedulePlanInfo> cacheList = ops.range(key, 0, -1);  
89 -  
90 - for (SchedulePlanInfo plan : cacheList) {  
91 - if (!list.contains(plan))  
92 - list.add(plan);  
93 - }  
94 -  
95 - //更新  
96 - redisTemplate.execute(redisUtils.getUpdateCallback(key, list));  
97 - }  
98 -  
99 - /**  
100 - * 覆盖数据  
101 - *  
102 - * @param key  
103 - * @param list  
104 - */  
105 - public void replace(String key, List<SchedulePlanInfo> list) {  
106 - key = REDIS_KEY_PREFIX + key.replaceAll("-", "");  
107 - redisTemplate.execute(redisUtils.getUpdateCallback(key, list));  
108 - }  
109 -  
110 - /**  
111 - * 根据日期和线路编码从redis获取计划  
112 - *  
113 - * @param dateStr  
114 - * @param lineCode  
115 - * @return  
116 - */  
117 - public List<SchedulePlanInfo> read(String dateStr, String lineCode) {  
118 - return redisTemplate.opsForList().range(REDIS_KEY_PREFIX + lineCode + ":" + dateStr, 0, -1);  
119 - }  
120 -  
121 -  
122 - @Autowired  
123 - PlanClearThread planClearThread;  
124 -  
125 - @Override  
126 - public void run(String... strings) throws Exception {  
127 - Application.mainServices.schedule(new Runnable() {  
128 - @Override  
129 - public void run() {  
130 - int cacheDays = Integer.parseInt(ConfigUtil.get("cache.days"));  
131 - //设置key 序列化器  
132 - redisTemplate.setKeySerializer(new StringRedisSerializer());  
133 -  
134 - DateTime dt = new DateTime();  
135 - dt = dt.minusDays(cacheDays);  
136 - dt = dt.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).minusDays(cacheDays);  
137 - List<SchedulePlanInfo> list = planInfoRepository.findByDateRange(dt.toDate(), new Date());  
138 - //写入redis  
139 - wirte(list);  
140 - }  
141 - }, 60 * 5, TimeUnit.SECONDS);  
142 -  
143 -  
144 - //定时 00:05 分清理计划,并加载当天的计划  
145 - long diff = (DateUtils.getTimestamp() + 1000 * 60 * 5) - System.currentTimeMillis();  
146 - if (diff < 0)  
147 - diff += (1000 * 60 * 60 * 24);  
148 - Application.mainServices.scheduleAtFixedRate(planClearThread, diff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);  
149 - }  
150 -  
151 - public List<SchedulePlanInfo> findByMultiLine(List<String> lineArray, String rq) {  
152 - rq = rq.replaceAll("-", "");  
153 - List<SchedulePlanInfo> rs = new ArrayList<>();  
154 - for (String lineCode : lineArray) {  
155 - rs.addAll(read(rq, lineCode));  
156 - }  
157 - return rs;  
158 - }  
159 -  
160 - @Component  
161 - public static class PlanClearThread extends Thread {  
162 -  
163 - @Autowired  
164 - PlanScheduleRedisService planRedisService;  
165 - @Autowired  
166 - SchedulePlanInfoRepository planInfoRepository;  
167 -  
168 - @Override  
169 - public void run() {  
170 - try {  
171 - logger.info("redis -清理计划排班");  
172 -  
173 - int cacheDays = Integer.parseInt(ConfigUtil.get("cache.days"));  
174 - DateTime dt = new DateTime();  
175 - dt = dt.minusDays(cacheDays);  
176 - String rq = dt.toString("yyyy-MM-dd");  
177 -  
178 - List<Line> lines = LineBufferData.findAll();  
179 - for (Line line : lines) {  
180 - planRedisService.delete(line.getLineCode(), rq);  
181 - }  
182 -  
183 - //加载当天的计划  
184 - Date d = new Date();  
185 - Date s = new Date(d.getTime() - 1000 * 60 * 60 * 24);  
186 - List<SchedulePlanInfo> list = planInfoRepository.findByDateRange(s, d);  
187 - //写入redis  
188 - planRedisService.wirte(list);  
189 - } catch (Exception e) {  
190 - logger.error("", e);  
191 - }  
192 - }  
193 - }  
194 -  
195 - private void delete(String lineCode, String rq) {  
196 - String key = REDIS_KEY_PREFIX + (lineCode + ":" + rq).replaceAll("-", "");  
197 - redisTemplate.delete(key);  
198 - }  
199 -} 1 +package com.bsth.redis;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.entity.SchedulePlanInfo;
  5 +import com.bsth.redis.util.DateUtils;
  6 +import com.bsth.redis.util.RedisUtils;
  7 +import com.bsth.repository.SchedulePlanInfoRepository;
  8 +import com.bsth.server_rs.base_info.line.Line;
  9 +import com.bsth.server_rs.base_info.line.buffer.LineBufferData;
  10 +import com.bsth.util.ConfigUtil;
  11 +import com.bsth.util.ConvertUtil;
  12 +import com.google.common.collect.ArrayListMultimap;
  13 +import org.joda.time.DateTime;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +import org.springframework.beans.factory.annotation.Autowired;
  17 +import org.springframework.boot.CommandLineRunner;
  18 +import org.springframework.core.annotation.Order;
  19 +import org.springframework.data.redis.core.ListOperations;
  20 +import org.springframework.data.redis.core.RedisTemplate;
  21 +import org.springframework.data.redis.serializer.StringRedisSerializer;
  22 +import org.springframework.stereotype.Component;
  23 +import org.springframework.stereotype.Service;
  24 +
  25 +import java.util.ArrayList;
  26 +import java.util.Date;
  27 +import java.util.Iterator;
  28 +import java.util.List;
  29 +import java.util.concurrent.TimeUnit;
  30 +
  31 +/**
  32 + * 计调的 计划排班redis缓存
  33 + * Created by panzhao on 2017/3/27.
  34 + */
  35 +@Service
  36 +@Order(6)
  37 +public class PlanScheduleRedisService implements CommandLineRunner {
  38 +
  39 + @Autowired
  40 + private RedisTemplate redisTemplate;
  41 +
  42 + @Autowired
  43 + SchedulePlanInfoRepository planInfoRepository;
  44 +
  45 + @Autowired
  46 + RedisUtils redisUtils;
  47 +
  48 + static Logger logger = LoggerFactory.getLogger(PlanScheduleRedisService.class);
  49 +
  50 + private final static String REDIS_KEY_PREFIX = "plan:";
  51 +
  52 + /**
  53 + * 将一批计划写入redis
  54 + *
  55 + * @param list
  56 + */
  57 + public void wirte(List<SchedulePlanInfo> list) {
  58 + ArrayListMultimap<String, SchedulePlanInfo> multimap;
  59 + try {
  60 + if (list.size() == 0)
  61 + return;
  62 + //按日期和线路分组数据
  63 + Class clazz = SchedulePlanInfo.class;
  64 + multimap = new ConvertUtil().groupMultiList(list, ":", clazz.getDeclaredField("xlBm"), clazz.getDeclaredField("scheduleDate"));
  65 +
  66 + //写入redis
  67 + Iterator<String> iterator = multimap.keySet().iterator();
  68 + String key;
  69 + while (iterator.hasNext()) {
  70 + key = iterator.next();
  71 + replace(key, multimap.get(key));
  72 + }
  73 + } catch (Exception e) {
  74 + logger.error("", e);
  75 + }
  76 + }
  77 +
  78 + /**
  79 + * 将 list 与redis里的数据合并
  80 + *
  81 + * @param key
  82 + * @param list
  83 + */
  84 + public void mergeData(String key, List<SchedulePlanInfo> list) {
  85 + key = REDIS_KEY_PREFIX + key.replaceAll("-", "");
  86 +
  87 + ListOperations<String, SchedulePlanInfo> ops = redisTemplate.opsForList();
  88 + List<SchedulePlanInfo> cacheList = ops.range(key, 0, -1);
  89 +
  90 + for (SchedulePlanInfo plan : cacheList) {
  91 + if (!list.contains(plan))
  92 + list.add(plan);
  93 + }
  94 +
  95 + //更新
  96 + redisTemplate.execute(redisUtils.getUpdateCallback(key, list));
  97 + }
  98 +
  99 + /**
  100 + * 覆盖数据
  101 + *
  102 + * @param key
  103 + * @param list
  104 + */
  105 + public void replace(String key, List<SchedulePlanInfo> list) {
  106 + key = REDIS_KEY_PREFIX + key.replaceAll("-", "");
  107 + redisTemplate.execute(redisUtils.getUpdateCallback(key, list));
  108 + }
  109 +
  110 + /**
  111 + * 根据日期和线路编码从redis获取计划
  112 + *
  113 + * @param dateStr
  114 + * @param lineCode
  115 + * @return
  116 + */
  117 + public List<SchedulePlanInfo> read(String dateStr, String lineCode) {
  118 + return redisTemplate.opsForList().range(REDIS_KEY_PREFIX + lineCode + ":" + dateStr, 0, -1);
  119 + }
  120 +
  121 +
  122 + @Autowired
  123 + PlanClearThread planClearThread;
  124 +
  125 + @Override
  126 + public void run(String... strings) throws Exception {
  127 + Application.mainServices.schedule(new Runnable() {
  128 + @Override
  129 + public void run() {
  130 + int cacheDays = Integer.parseInt(ConfigUtil.get("cache.days"));
  131 + //设置key 序列化器
  132 + redisTemplate.setKeySerializer(new StringRedisSerializer());
  133 +
  134 + DateTime dt = new DateTime();
  135 + dt = dt.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
  136 + List<SchedulePlanInfo> list = planInfoRepository.findByDateRange(dt.minusDays(cacheDays).toDate(), dt.plusDays(1).toDate());
  137 + //写入redis
  138 + wirte(list);
  139 + }
  140 + }, 20, TimeUnit.SECONDS);
  141 +
  142 +
  143 + //定时 00:05 分清理计划,并加载当天的计划
  144 + long diff = (DateUtils.getTimestamp() + 1000 * 60 * 5) - System.currentTimeMillis();
  145 + if (diff < 0)
  146 + diff += (1000 * 60 * 60 * 24);
  147 + Application.mainServices.scheduleAtFixedRate(planClearThread, diff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
  148 + }
  149 +
  150 + public List<SchedulePlanInfo> findByMultiLine(List<String> lineArray, String rq) {
  151 + rq = rq.replaceAll("-", "");
  152 + List<SchedulePlanInfo> rs = new ArrayList<>();
  153 + for (String lineCode : lineArray) {
  154 + rs.addAll(read(rq, lineCode));
  155 + }
  156 + return rs;
  157 + }
  158 +
  159 + @Component
  160 + public static class PlanClearThread extends Thread {
  161 +
  162 + @Autowired
  163 + PlanScheduleRedisService planRedisService;
  164 + @Autowired
  165 + SchedulePlanInfoRepository planInfoRepository;
  166 +
  167 + @Override
  168 + public void run() {
  169 + try {
  170 + logger.info("redis -清理计划排班");
  171 +
  172 + int cacheDays = Integer.parseInt(ConfigUtil.get("cache.days"));
  173 + DateTime dt = new DateTime();
  174 + dt = dt.minusDays(cacheDays);
  175 + String rq = dt.toString("yyyy-MM-dd");
  176 +
  177 + List<Line> lines = LineBufferData.findAll();
  178 + for (Line line : lines) {
  179 + planRedisService.delete(line.getLineCode(), rq);
  180 + }
  181 +
  182 + //加载明天的计划
  183 + DateTime d = new DateTime();
  184 + d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
  185 + List<SchedulePlanInfo> list = planInfoRepository.findByDateRange(d.toDate(), d.plusDays(1).toDate());
  186 + //写入redis
  187 + planRedisService.wirte(list);
  188 + } catch (Exception e) {
  189 + logger.error("", e);
  190 + }
  191 + }
  192 + }
  193 +
  194 + private void delete(String lineCode, String rq) {
  195 + String key = REDIS_KEY_PREFIX + (lineCode + ":" + rq).replaceAll("-", "");
  196 + redisTemplate.delete(key);
  197 + }
  198 +}