UserConfigServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. package com.api.games.service.impl;
  2. import cn.jpush.api.schedule.ScheduleResult;
  3. import com.api.base.dao.UserMapper;
  4. import com.api.base.dao.UserRoleMapper;
  5. import com.api.base.model.User;
  6. import com.api.base.model.UserRole;
  7. import com.api.common.GeneratorSnowflakeId;
  8. import com.api.common.JSONUtils;
  9. import com.api.common.UtilFun;
  10. import com.api.common.jpush.JpushService;
  11. import com.api.config.ConstUser;
  12. import com.api.core.config.AuthUser;
  13. import com.api.core.response.Result;
  14. import com.api.core.response.ResultGenerator;
  15. import com.api.core.service.AbstractService;
  16. import com.api.games.dao.*;
  17. import com.api.games.model.*;
  18. import com.api.games.service.UserConfigService;
  19. import com.github.pagehelper.PageHelper;
  20. import com.github.pagehelper.PageInfo;
  21. import org.apache.http.client.utils.DateUtils;
  22. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import javax.annotation.Resource;
  26. import java.text.ParseException;
  27. import java.text.SimpleDateFormat;
  28. import java.util.*;
  29. import static com.api.core.response.ResultEnum.DELAY_MAX;
  30. import static com.api.core.response.ResultEnum.USER_ING;
  31. /**
  32. * Created by wanghuiwen on 2020/02/23.
  33. */
  34. @Service
  35. @Transactional
  36. public class UserConfigServiceImpl extends AbstractService<UserConfig> implements UserConfigService {
  37. @Resource
  38. private UserConfigMapper userConfigMapper;
  39. @Resource
  40. private UserMapper userMapper;
  41. @Resource
  42. private UserRoleMapper userRoleMapper;
  43. @Resource
  44. private JpushService jpushService;
  45. @Resource
  46. private GameConfigMapper gameConfigMapper;
  47. @Resource
  48. private GameLogMapper gameLogMapper;
  49. @Resource
  50. private GamePlayTimeMapper gamePlayTimeMapper;
  51. @Resource
  52. private ScaleLogMapper scaleLogMapper;
  53. @Resource
  54. private GameAnswerMapper gameAnswerMapper;
  55. @Resource
  56. private PushLogMapper pushLogMapper;
  57. private SimpleDateFormat sdfScaleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  58. private SimpleDateFormat sdfScaleTime = new SimpleDateFormat("HH:mm:ss");
  59. private SimpleDateFormat sdfGameTime = new SimpleDateFormat("HH:mm");
  60. @Override
  61. public Result list(String search, String ordermap, Integer page, Integer size) {
  62. Map<String, Object> params = JSONUtils.json2map(search);
  63. Map<String, Object> order = JSONUtils.json2map(ordermap);
  64. for (String key : order.keySet()) {
  65. if (order.get(key) != null && order.get(key).equals("ascending")) order.put(key, "asc");
  66. if (order.get(key) != null && order.get(key).equals("descending")) order.put(key, "desc");
  67. }
  68. PageHelper.startPage(page, size);
  69. List<Map<String, Object>> list = userConfigMapper.list(params, order);
  70. for(Map<String, Object> item : list){
  71. String scaleStart = item.get("scaleStart") == null ? null : (String) item.get("scaleStart");
  72. String scaleEnd = item.get("scaleEnd") == null ? null : (String) item.get("scaleEnd");
  73. if (scaleStart != null && scaleEnd != null){
  74. Calendar current = Calendar.getInstance();
  75. Calendar calendarStart = Calendar.getInstance();
  76. calendarStart.setTime(UtilFun.StringToDate(scaleStart, UtilFun.YYYYMMDDHHMMSS));
  77. Calendar calendarEnd = Calendar.getInstance();
  78. calendarEnd.setTime(UtilFun.StringToDate(scaleEnd, UtilFun.YYYYMMDDHHMMSS));
  79. if (current.before(calendarStart)){
  80. item.put("status", 0);
  81. } else if (current.after(calendarEnd)){
  82. item.put("status", 2);
  83. } else if(current.after(calendarStart) && current.before(calendarEnd)){
  84. item.put("status", 1);
  85. }
  86. }
  87. }
  88. PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
  89. return ResultGenerator.genSuccessResult(pageInfo);
  90. }
  91. @Override
  92. public Result add(User user, UserConfig config, String configs) {
  93. List<GameConfig> gameConfigs = JSONUtils.json2list(configs, GameConfig.class);
  94. user.setType(ConstUser.USER_NORMAL);
  95. user.setCreateTime(new Date());
  96. user.setUsername(user.getNickname());
  97. user.setAlias(String.valueOf(GeneratorSnowflakeId.nextId()));
  98. //加密密碼
  99. user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
  100. if (user.getOpenid() != null && user.getOpenid().equals("")) {
  101. user.setOpenid(null);
  102. }
  103. userMapper.insertSelective(user);
  104. UserRole role = new UserRole();
  105. role.setUserId(user.getId());
  106. role.setRoleId(2L);
  107. userRoleMapper.insert(role);
  108. for (GameConfig c : gameConfigs) {
  109. gamePlayTimeMapper.insertList(generateGamePlayTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), c.getStartTime(), c.getEndTime()));
  110. c.setUid(user.getId());
  111. }
  112. gamePlayTimeMapper.insertList(generateScaleTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime()));
  113. gameConfigMapper.insertList(gameConfigs);
  114. config.setUserId(user.getId());
  115. config.setGameCount(gameConfigs.size());
  116. String end = config.getScaleEnd();
  117. Calendar calendar = Calendar.getInstance();
  118. calendar.setTime(UtilFun.StringToDate(end, UtilFun.YYYYMMDDHHMMSS));
  119. calendar.set(Calendar.HOUR_OF_DAY, 23);
  120. calendar.set(Calendar.MINUTE, 59);
  121. calendar.set(Calendar.SECOND, 59);
  122. calendar.set(Calendar.MILLISECOND, 999);
  123. config.setScaleEnd(UtilFun.DateToString(calendar.getTime(), UtilFun.YYYYMMDDHHMMSS));
  124. save(config);
  125. return ResultGenerator.genSuccessResult();
  126. }
  127. @Override
  128. public Result delete(Long id) {
  129. List<GameLog> gameLogs = gameLogMapper.listUid(id);
  130. for (GameLog log : gameLogs){
  131. List<GameAnswer> gameAnswers = gameAnswerMapper.listByGameIdNew(log.getId().intValue());
  132. for (GameAnswer gameAnswer : gameAnswers)
  133. gameAnswerMapper.deleteByPrimaryKey(gameAnswer.getId());
  134. gameLogMapper.deleteByPrimaryKey(log.getId());
  135. }
  136. List<ScaleLog> scaleLogList = scaleLogMapper.listByUid(id);
  137. for (ScaleLog log : scaleLogList)
  138. scaleLogMapper.deleteByPrimaryKey(log.getId());
  139. pushLogMapper.deleteByUid(id);
  140. gameConfigMapper.deleteUid(id);
  141. userConfigMapper.deleteByUid(id);
  142. userMapper.deleteByPrimaryKey(id);
  143. userRoleMapper.deleteByUid(id);
  144. return ResultGenerator.genSuccessResult();
  145. }
  146. @Override
  147. public Result update(User user, UserConfig config, Long configId, String configs) {
  148. User oldUser = userMapper.selectByPrimaryKey(user.getId());
  149. UserConfig oldConfig = userConfigMapper.findByUid(user.getId());
  150. //用戶開始測試後無法再修改用戶信息
  151. Calendar current = Calendar.getInstance();
  152. Calendar calendarStart = Calendar.getInstance();
  153. calendarStart.setTime(UtilFun.StringToDate(oldConfig.getScaleStart(), UtilFun.YYYYMMDDHHMMSS));
  154. Calendar calendarEnd = Calendar.getInstance();
  155. calendarEnd.setTime(UtilFun.StringToDate(oldConfig.getScaleEnd(), UtilFun.YYYYMMDDHHMMSS));
  156. if(current.after(calendarStart) && current.before(calendarEnd)){
  157. return ResultGenerator.genResult(USER_ING);
  158. }
  159. // if (oldUser.getStatus() != ConstUser.STATUS_NORMAL) {
  160. // return ResultGenerator.genResult(USER_ING);
  161. // }
  162. if (user.getOpenid() != null && user.getOpenid().equals("")) user.setOpenid(null);
  163. //判斷嗎密碼是否發生變化,無變化不修改
  164. if (!oldUser.getPassword().equals(user.getPassword())) {
  165. BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
  166. user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
  167. } else {
  168. user.setPassword(null);
  169. }
  170. user.setUsername(user.getNickname());
  171. userMapper.updateByPrimaryKeySelective(user);
  172. gamePlayTimeMapper.deleteUid(user.getId());
  173. //scale start end YYYY-MM-DD HH:mm:ss
  174. //scale time HH:mm:ss
  175. //game time HH:mm
  176. List<GameConfig> gameConfigs = JSONUtils.json2list(configs, GameConfig.class);
  177. for (GameConfig c : gameConfigs) {
  178. gamePlayTimeMapper.insertList(generateGamePlayTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), c.getStartTime(), c.getEndTime()));
  179. c.setUid(user.getId());
  180. }
  181. gameConfigMapper.deleteUid(user.getId());
  182. gameConfigMapper.insertList(gameConfigs);
  183. gamePlayTimeMapper.insertList(generateScaleTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime()));
  184. config.setId(configId);
  185. config.setGameCount(gameConfigs.size());
  186. update(config);
  187. //修改推送設置
  188. if (user.getOpenid() != null && !user.getOpenid().equals("")) {
  189. jpushService.updateScheduleTrigger(user.getOpenid(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime());
  190. }
  191. return ResultGenerator.genSuccessResult();
  192. }
  193. /**
  194. * 綁定設備 設置推送
  195. * 9:00-13:00
  196. * 13:00-17:00
  197. * 17:00-21:00
  198. */
  199. @Override
  200. public Result bind(AuthUser authUser) {
  201. if(authUser.getType() == ConstUser.USER_ADMIN) return ResultGenerator.genSuccessResult();
  202. UserConfig config = findBy("userId", authUser.getId());
  203. User user = userMapper.selectByPrimaryKey(authUser.getId());
  204. if(user.getOpenid() !=null) return ResultGenerator.genSuccessResult();
  205. List<GameConfig> gameConfigs = gameConfigMapper.listUid(authUser.getId());
  206. Map<String, String> scaleExtras = new HashMap<>();
  207. scaleExtras.put("type", ConstUser.PUSH_SCALE);
  208. //第一次推送
  209. scaleExtras.put("num", "1");
  210. //設置用戶量表填寫推送
  211. ScheduleResult result = jpushService.createDailySchedule("量表填寫", "你好,填寫量表時間已到,請及時填寫",
  212. config.getScaleStart(),
  213. config.getScaleEnd(),
  214. config.getScaleTime(),
  215. scaleExtras,
  216. user.getAlias());
  217. for (GameConfig c : gameConfigs) {
  218. Map<String, String> extras = new HashMap<>();
  219. extras.put("version", config.getVersion());
  220. extras.put("type", ConstUser.PUSH_GAME);
  221. extras.put("start", c.getStartTime());
  222. extras.put("end", c.getEndTime());
  223. //早上的推送
  224. ScheduleResult scheduleResult = jpushService.createDailySchedule("測試遊戲", "您好,測試時間已到,請及時進行測試",
  225. config.getScaleStart(),
  226. config.getScaleEnd(),
  227. c.getStartTime(),
  228. extras,
  229. user.getAlias());
  230. c.setMessageId(scheduleResult.getSchedule_id());
  231. gameConfigMapper.updateByPrimaryKey(c);
  232. }
  233. user.setOpenid(result.getSchedule_id());
  234. userMapper.updateByPrimaryKeySelective(user);
  235. return ResultGenerator.genSuccessResult();
  236. }
  237. @Override
  238. public Result expired() {
  239. userConfigMapper.expired();
  240. userConfigMapper.start();
  241. return ResultGenerator.genSuccessResult();
  242. }
  243. @Override
  244. public List<Map<String, Object>> download(String search, String ordermap) {
  245. Map<String, Object> params = JSONUtils.json2map(search);
  246. Map<String, Object> order = JSONUtils.json2map(ordermap);
  247. for (String key : order.keySet()) {
  248. if (order.get(key) != null && order.get(key).equals("ascending")) order.put(key, "asc");
  249. if (order.get(key) != null && order.get(key).equals("descending")) order.put(key, "desc");
  250. }
  251. return userConfigMapper.list(params, order);
  252. }
  253. public Result getVersion(AuthUser authUser, Long msgId) {
  254. //修改推送记录状态
  255. if (msgId != null) {
  256. PushLog pushLog = pushLogMapper.selectByPrimaryKey(msgId);
  257. if (pushLog != null) {
  258. pushLog.setStatus(ConstUser.PUSH_ING);
  259. pushLogMapper.updateByPrimaryKeySelective(pushLog);
  260. }
  261. }
  262. UserConfig config = findBy("userId", authUser.getId());
  263. String[] configVersion = config.getVersion() != null ? config.getVersion().split(",") : new String[0];
  264. List<GameLog> gameLogs = gameLogMapper.listUidDate(authUser.getId(), UtilFun.DateToString(new Date(), UtilFun.YMD));
  265. List<String> version = new ArrayList<>();
  266. if (configVersion.length > 1 && config.getGameCount() > 1 && gameLogs != null && gameLogs.size() > 0) {
  267. //新的一轮规则进行了几次
  268. int oi = gameLogs.size() % configVersion.length;
  269. for (int i = 1; i < oi + 1; i++) {
  270. //从后往前取
  271. version.add(gameLogs.get(gameLogs.size() - i).getVersion());
  272. }
  273. } else {
  274. version.addAll(Arrays.asList(configVersion));
  275. }
  276. Map<String, Object> res = new HashMap<>();
  277. res.put("config", config);
  278. res.put("version", version);
  279. return ResultGenerator.genSuccessResult(res);
  280. }
  281. @Override
  282. public Result delay(AuthUser user, Date date, Long pushId, Integer num, String type, String start, String end) {
  283. if (num != null && num > 3) return ResultGenerator.genResult(DELAY_MAX);
  284. UserConfig config = findBy("userId", user.getId());
  285. Map<String, String> extras = new HashMap<>();
  286. extras.put("version", config.getVersion());
  287. extras.put("type", type);
  288. //修改推送记录状态
  289. if (pushId != null) {
  290. PushLog pushLog = pushLogMapper.selectByPrimaryKey(pushId);
  291. if (pushLog != null) {
  292. pushLog.setStatus(ConstUser.PUSH_DELAY);
  293. pushLogMapper.updateByPrimaryKeySelective(pushLog);
  294. }
  295. }
  296. if (num != null) {
  297. extras.put("num", String.valueOf(num += 1));
  298. }
  299. if (start != null) extras.put("start", start);
  300. if (end != null) extras.put("end", start);
  301. if(type.equals(ConstUser.PUSH_GAME)){
  302. jpushService.createSingleSchedule("測試遊戲", "您好,測試時間已到,請及時進行測試",
  303. extras,
  304. UtilFun.DateToString(date, UtilFun.YYYYMMDDHHMMSS),
  305. user.getAlias());
  306. }
  307. if(type.equals(ConstUser.PUSH_SCALE)) {
  308. jpushService.createSingleSchedule("量表填寫", "你好,填寫量表時間已到,請及時填寫",
  309. extras,
  310. UtilFun.DateToString(date, UtilFun.YYYYMMDDHHMMSS),
  311. user.getAlias());
  312. }
  313. return ResultGenerator.genSuccessResult();
  314. }
  315. private List<GamePlayTime> generateGamePlayTime(long uid, String scaleStart, String scaleEnd, String startTime, String endTime){
  316. List<GamePlayTime> result = new ArrayList<>();
  317. try {
  318. Calendar scaleStartCalendar = Calendar.getInstance();
  319. scaleStartCalendar.setTime(sdfScaleDate.parse(scaleStart));
  320. Calendar scaleEndCalendar = Calendar.getInstance();
  321. scaleEndCalendar.setTime(sdfScaleDate.parse(scaleEnd));
  322. if (scaleStartCalendar.equals(scaleEndCalendar))
  323. result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, getRandomTime(sdfGameTime.parse(startTime), sdfGameTime.parse(endTime))).getTime()), GamePlayTime.TYPE_GAME));
  324. else
  325. while (before(scaleStartCalendar, scaleEndCalendar)){
  326. result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, getRandomTime(sdfGameTime.parse(startTime), sdfGameTime.parse(endTime))).getTime()), GamePlayTime.TYPE_GAME));
  327. scaleStartCalendar.add(Calendar.DATE, 1);
  328. }
  329. } catch (Exception e){
  330. e.printStackTrace();
  331. }
  332. return result;
  333. }
  334. private List<GamePlayTime> generateScaleTime(long uid, String scaleStart, String scaleEnd, String scaleTime){
  335. List<GamePlayTime> result = new ArrayList<>();
  336. try {
  337. Calendar scaleStartCalendar = Calendar.getInstance();
  338. scaleStartCalendar.setTime(sdfScaleDate.parse(scaleStart));
  339. scaleStartCalendar.add(Calendar.DATE, 1);
  340. Calendar scaleEndCalendar = Calendar.getInstance();
  341. scaleEndCalendar.setTime(sdfScaleDate.parse(scaleEnd));
  342. scaleEndCalendar.add(Calendar.DATE, 1);
  343. if (scaleStartCalendar.equals(scaleEndCalendar))
  344. result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, sdfScaleTime.parse(scaleTime)).getTime()), GamePlayTime.TYPE_SCALE));
  345. else
  346. while (before(scaleStartCalendar, scaleEndCalendar)){
  347. result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, sdfScaleTime.parse(scaleTime)).getTime()), GamePlayTime.TYPE_SCALE));
  348. scaleStartCalendar.add(Calendar.DATE, 1);
  349. }
  350. } catch (Exception e){
  351. e.printStackTrace();
  352. }
  353. return result;
  354. }
  355. private Calendar mergeDate(Calendar calendar, Date date){
  356. Calendar temp = Calendar.getInstance();
  357. temp.setTime(date);
  358. calendar.set(Calendar.HOUR_OF_DAY, temp.get(Calendar.HOUR_OF_DAY));
  359. calendar.set(Calendar.MINUTE, temp.get(Calendar.MINUTE));
  360. calendar.set(Calendar.SECOND, temp.get(Calendar.SECOND));
  361. return calendar;
  362. }
  363. private boolean before(Calendar left, Calendar right){
  364. return left.get(Calendar.YEAR) <= right.get(Calendar.YEAR)
  365. && left.get(Calendar.MONTH) <= right.get(Calendar.MONTH)
  366. && left.get(Calendar.DAY_OF_MONTH) <= right.get(Calendar.DAY_OF_MONTH);
  367. }
  368. private Date getRandomTime(Date startTime, Date endTime){
  369. Long startL = startTime.getTime();
  370. Long endL = endTime.getTime();
  371. Date middle;
  372. if (startL.longValue() != endL.longValue()) {
  373. long middleL = (long) (startL + (endL - startL) * Math.random());
  374. middle = new Date(middleL);
  375. }else
  376. middle = startTime;
  377. return middle;
  378. }
  379. }