123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- package com.api.games.service.impl;
- import cn.jpush.api.schedule.ScheduleResult;
- import com.api.base.dao.UserMapper;
- import com.api.base.dao.UserRoleMapper;
- import com.api.base.model.User;
- import com.api.base.model.UserRole;
- import com.api.common.GeneratorSnowflakeId;
- import com.api.common.JSONUtils;
- import com.api.common.UtilFun;
- import com.api.common.jpush.JpushService;
- import com.api.config.ConstUser;
- import com.api.core.config.AuthUser;
- import com.api.core.response.Result;
- import com.api.core.response.ResultGenerator;
- import com.api.core.service.AbstractService;
- import com.api.games.dao.*;
- import com.api.games.model.*;
- import com.api.games.service.UserConfigService;
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import org.apache.http.client.utils.DateUtils;
- import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import javax.annotation.Resource;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.*;
- import static com.api.core.response.ResultEnum.DELAY_MAX;
- import static com.api.core.response.ResultEnum.USER_ING;
- /**
- * Created by wanghuiwen on 2020/02/23.
- */
- @Service
- @Transactional
- public class UserConfigServiceImpl extends AbstractService<UserConfig> implements UserConfigService {
- @Resource
- private UserConfigMapper userConfigMapper;
- @Resource
- private UserMapper userMapper;
- @Resource
- private UserRoleMapper userRoleMapper;
- @Resource
- private JpushService jpushService;
- @Resource
- private GameConfigMapper gameConfigMapper;
- @Resource
- private GameLogMapper gameLogMapper;
- @Resource
- private GamePlayTimeMapper gamePlayTimeMapper;
- @Resource
- private ScaleLogMapper scaleLogMapper;
- @Resource
- private GameAnswerMapper gameAnswerMapper;
- @Resource
- private PushLogMapper pushLogMapper;
- private SimpleDateFormat sdfScaleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- private SimpleDateFormat sdfScaleTime = new SimpleDateFormat("HH:mm:ss");
- private SimpleDateFormat sdfGameTime = new SimpleDateFormat("HH:mm");
- @Override
- public Result list(String search, String ordermap, Integer page, Integer size) {
- Map<String, Object> params = JSONUtils.json2map(search);
- Map<String, Object> order = JSONUtils.json2map(ordermap);
- for (String key : order.keySet()) {
- if (order.get(key) != null && order.get(key).equals("ascending")) order.put(key, "asc");
- if (order.get(key) != null && order.get(key).equals("descending")) order.put(key, "desc");
- }
- PageHelper.startPage(page, size);
- List<Map<String, Object>> list = userConfigMapper.list(params, order);
- for(Map<String, Object> item : list){
- String scaleStart = item.get("scaleStart") == null ? null : (String) item.get("scaleStart");
- String scaleEnd = item.get("scaleEnd") == null ? null : (String) item.get("scaleEnd");
- if (scaleStart != null && scaleEnd != null){
- Calendar current = Calendar.getInstance();
- Calendar calendarStart = Calendar.getInstance();
- calendarStart.setTime(UtilFun.StringToDate(scaleStart, UtilFun.YYYYMMDDHHMMSS));
- Calendar calendarEnd = Calendar.getInstance();
- calendarEnd.setTime(UtilFun.StringToDate(scaleEnd, UtilFun.YYYYMMDDHHMMSS));
- if (current.before(calendarStart)){
- item.put("status", 0);
- } else if (current.after(calendarEnd)){
- item.put("status", 2);
- } else if(current.after(calendarStart) && current.before(calendarEnd)){
- item.put("status", 1);
- }
- }
- }
- PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
- return ResultGenerator.genSuccessResult(pageInfo);
- }
- @Override
- public Result add(User user, UserConfig config, String configs) {
- List<GameConfig> gameConfigs = JSONUtils.json2list(configs, GameConfig.class);
- user.setType(ConstUser.USER_NORMAL);
- user.setCreateTime(new Date());
- user.setUsername(user.getNickname());
- user.setAlias(String.valueOf(GeneratorSnowflakeId.nextId()));
- //加密密碼
- user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
- if (user.getOpenid() != null && user.getOpenid().equals("")) {
- user.setOpenid(null);
- }
- userMapper.insertSelective(user);
- UserRole role = new UserRole();
- role.setUserId(user.getId());
- role.setRoleId(2L);
- userRoleMapper.insert(role);
- for (GameConfig c : gameConfigs) {
- gamePlayTimeMapper.insertList(generateGamePlayTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), c.getStartTime(), c.getEndTime()));
- c.setUid(user.getId());
- }
- gamePlayTimeMapper.insertList(generateScaleTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime()));
- gameConfigMapper.insertList(gameConfigs);
- config.setUserId(user.getId());
- config.setGameCount(gameConfigs.size());
- String end = config.getScaleEnd();
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(UtilFun.StringToDate(end, UtilFun.YYYYMMDDHHMMSS));
- calendar.set(Calendar.HOUR_OF_DAY, 23);
- calendar.set(Calendar.MINUTE, 59);
- calendar.set(Calendar.SECOND, 59);
- calendar.set(Calendar.MILLISECOND, 999);
- config.setScaleEnd(UtilFun.DateToString(calendar.getTime(), UtilFun.YYYYMMDDHHMMSS));
- save(config);
- return ResultGenerator.genSuccessResult();
- }
- @Override
- public Result delete(Long id) {
- List<GameLog> gameLogs = gameLogMapper.listUid(id);
- for (GameLog log : gameLogs){
- List<GameAnswer> gameAnswers = gameAnswerMapper.listByGameIdNew(log.getId().intValue());
- for (GameAnswer gameAnswer : gameAnswers)
- gameAnswerMapper.deleteByPrimaryKey(gameAnswer.getId());
- gameLogMapper.deleteByPrimaryKey(log.getId());
- }
- List<ScaleLog> scaleLogList = scaleLogMapper.listByUid(id);
- for (ScaleLog log : scaleLogList)
- scaleLogMapper.deleteByPrimaryKey(log.getId());
- pushLogMapper.deleteByUid(id);
- gameConfigMapper.deleteUid(id);
- userConfigMapper.deleteByUid(id);
- userMapper.deleteByPrimaryKey(id);
- userRoleMapper.deleteByUid(id);
- return ResultGenerator.genSuccessResult();
- }
- @Override
- public Result update(User user, UserConfig config, Long configId, String configs) {
- User oldUser = userMapper.selectByPrimaryKey(user.getId());
- UserConfig oldConfig = userConfigMapper.findByUid(user.getId());
- //用戶開始測試後無法再修改用戶信息
- Calendar current = Calendar.getInstance();
- Calendar calendarStart = Calendar.getInstance();
- calendarStart.setTime(UtilFun.StringToDate(oldConfig.getScaleStart(), UtilFun.YYYYMMDDHHMMSS));
- Calendar calendarEnd = Calendar.getInstance();
- calendarEnd.setTime(UtilFun.StringToDate(oldConfig.getScaleEnd(), UtilFun.YYYYMMDDHHMMSS));
- if(current.after(calendarStart) && current.before(calendarEnd)){
- return ResultGenerator.genResult(USER_ING);
- }
- // if (oldUser.getStatus() != ConstUser.STATUS_NORMAL) {
- // return ResultGenerator.genResult(USER_ING);
- // }
- if (user.getOpenid() != null && user.getOpenid().equals("")) user.setOpenid(null);
- //判斷嗎密碼是否發生變化,無變化不修改
- if (!oldUser.getPassword().equals(user.getPassword())) {
- BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
- user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
- } else {
- user.setPassword(null);
- }
- user.setUsername(user.getNickname());
- userMapper.updateByPrimaryKeySelective(user);
- gamePlayTimeMapper.deleteUid(user.getId());
- //scale start end YYYY-MM-DD HH:mm:ss
- //scale time HH:mm:ss
- //game time HH:mm
- List<GameConfig> gameConfigs = JSONUtils.json2list(configs, GameConfig.class);
- for (GameConfig c : gameConfigs) {
- gamePlayTimeMapper.insertList(generateGamePlayTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), c.getStartTime(), c.getEndTime()));
- c.setUid(user.getId());
- }
- gameConfigMapper.deleteUid(user.getId());
- gameConfigMapper.insertList(gameConfigs);
- gamePlayTimeMapper.insertList(generateScaleTime(user.getId(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime()));
- config.setId(configId);
- config.setGameCount(gameConfigs.size());
- update(config);
- //修改推送設置
- if (user.getOpenid() != null && !user.getOpenid().equals("")) {
- jpushService.updateScheduleTrigger(user.getOpenid(), config.getScaleStart(), config.getScaleEnd(), config.getScaleTime());
- }
- return ResultGenerator.genSuccessResult();
- }
- /**
- * 綁定設備 設置推送
- * 9:00-13:00
- * 13:00-17:00
- * 17:00-21:00
- */
- @Override
- public Result bind(AuthUser authUser) {
- if(authUser.getType() == ConstUser.USER_ADMIN) return ResultGenerator.genSuccessResult();
- UserConfig config = findBy("userId", authUser.getId());
- User user = userMapper.selectByPrimaryKey(authUser.getId());
- if(user.getOpenid() !=null) return ResultGenerator.genSuccessResult();
- List<GameConfig> gameConfigs = gameConfigMapper.listUid(authUser.getId());
- Map<String, String> scaleExtras = new HashMap<>();
- scaleExtras.put("type", ConstUser.PUSH_SCALE);
- //第一次推送
- scaleExtras.put("num", "1");
- //設置用戶量表填寫推送
- ScheduleResult result = jpushService.createDailySchedule("量表填寫", "你好,填寫量表時間已到,請及時填寫",
- config.getScaleStart(),
- config.getScaleEnd(),
- config.getScaleTime(),
- scaleExtras,
- user.getAlias());
- for (GameConfig c : gameConfigs) {
- Map<String, String> extras = new HashMap<>();
- extras.put("version", config.getVersion());
- extras.put("type", ConstUser.PUSH_GAME);
- extras.put("start", c.getStartTime());
- extras.put("end", c.getEndTime());
- //早上的推送
- ScheduleResult scheduleResult = jpushService.createDailySchedule("測試遊戲", "您好,測試時間已到,請及時進行測試",
- config.getScaleStart(),
- config.getScaleEnd(),
- c.getStartTime(),
- extras,
- user.getAlias());
- c.setMessageId(scheduleResult.getSchedule_id());
- gameConfigMapper.updateByPrimaryKey(c);
- }
- user.setOpenid(result.getSchedule_id());
- userMapper.updateByPrimaryKeySelective(user);
- return ResultGenerator.genSuccessResult();
- }
- @Override
- public Result expired() {
- userConfigMapper.expired();
- userConfigMapper.start();
- return ResultGenerator.genSuccessResult();
- }
- @Override
- public List<Map<String, Object>> download(String search, String ordermap) {
- Map<String, Object> params = JSONUtils.json2map(search);
- Map<String, Object> order = JSONUtils.json2map(ordermap);
- for (String key : order.keySet()) {
- if (order.get(key) != null && order.get(key).equals("ascending")) order.put(key, "asc");
- if (order.get(key) != null && order.get(key).equals("descending")) order.put(key, "desc");
- }
- return userConfigMapper.list(params, order);
- }
- public Result getVersion(AuthUser authUser, Long msgId) {
- //修改推送记录状态
- if (msgId != null) {
- PushLog pushLog = pushLogMapper.selectByPrimaryKey(msgId);
- if (pushLog != null) {
- pushLog.setStatus(ConstUser.PUSH_ING);
- pushLogMapper.updateByPrimaryKeySelective(pushLog);
- }
- }
- UserConfig config = findBy("userId", authUser.getId());
- String[] configVersion = config.getVersion() != null ? config.getVersion().split(",") : new String[0];
- List<GameLog> gameLogs = gameLogMapper.listUidDate(authUser.getId(), UtilFun.DateToString(new Date(), UtilFun.YMD));
- List<String> version = new ArrayList<>();
- if (configVersion.length > 1 && config.getGameCount() > 1 && gameLogs != null && gameLogs.size() > 0) {
- //新的一轮规则进行了几次
- int oi = gameLogs.size() % configVersion.length;
- for (int i = 1; i < oi + 1; i++) {
- //从后往前取
- version.add(gameLogs.get(gameLogs.size() - i).getVersion());
- }
- } else {
- version.addAll(Arrays.asList(configVersion));
- }
- Map<String, Object> res = new HashMap<>();
- res.put("config", config);
- res.put("version", version);
- return ResultGenerator.genSuccessResult(res);
- }
- @Override
- public Result delay(AuthUser user, Date date, Long pushId, Integer num, String type, String start, String end) {
- if (num != null && num > 3) return ResultGenerator.genResult(DELAY_MAX);
- UserConfig config = findBy("userId", user.getId());
- Map<String, String> extras = new HashMap<>();
- extras.put("version", config.getVersion());
- extras.put("type", type);
- //修改推送记录状态
- if (pushId != null) {
- PushLog pushLog = pushLogMapper.selectByPrimaryKey(pushId);
- if (pushLog != null) {
- pushLog.setStatus(ConstUser.PUSH_DELAY);
- pushLogMapper.updateByPrimaryKeySelective(pushLog);
- }
- }
- if (num != null) {
- extras.put("num", String.valueOf(num += 1));
- }
- if (start != null) extras.put("start", start);
- if (end != null) extras.put("end", start);
- if(type.equals(ConstUser.PUSH_GAME)){
- jpushService.createSingleSchedule("測試遊戲", "您好,測試時間已到,請及時進行測試",
- extras,
- UtilFun.DateToString(date, UtilFun.YYYYMMDDHHMMSS),
- user.getAlias());
- }
- if(type.equals(ConstUser.PUSH_SCALE)) {
- jpushService.createSingleSchedule("量表填寫", "你好,填寫量表時間已到,請及時填寫",
- extras,
- UtilFun.DateToString(date, UtilFun.YYYYMMDDHHMMSS),
- user.getAlias());
- }
- return ResultGenerator.genSuccessResult();
- }
- private List<GamePlayTime> generateGamePlayTime(long uid, String scaleStart, String scaleEnd, String startTime, String endTime){
- List<GamePlayTime> result = new ArrayList<>();
- try {
- Calendar scaleStartCalendar = Calendar.getInstance();
- scaleStartCalendar.setTime(sdfScaleDate.parse(scaleStart));
- Calendar scaleEndCalendar = Calendar.getInstance();
- scaleEndCalendar.setTime(sdfScaleDate.parse(scaleEnd));
- if (scaleStartCalendar.equals(scaleEndCalendar))
- result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, getRandomTime(sdfGameTime.parse(startTime), sdfGameTime.parse(endTime))).getTime()), GamePlayTime.TYPE_GAME));
- else
- while (before(scaleStartCalendar, scaleEndCalendar)){
- result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, getRandomTime(sdfGameTime.parse(startTime), sdfGameTime.parse(endTime))).getTime()), GamePlayTime.TYPE_GAME));
- scaleStartCalendar.add(Calendar.DATE, 1);
- }
- } catch (Exception e){
- e.printStackTrace();
- }
- return result;
- }
- private List<GamePlayTime> generateScaleTime(long uid, String scaleStart, String scaleEnd, String scaleTime){
- List<GamePlayTime> result = new ArrayList<>();
- try {
- Calendar scaleStartCalendar = Calendar.getInstance();
- scaleStartCalendar.setTime(sdfScaleDate.parse(scaleStart));
- scaleStartCalendar.add(Calendar.DATE, 1);
- Calendar scaleEndCalendar = Calendar.getInstance();
- scaleEndCalendar.setTime(sdfScaleDate.parse(scaleEnd));
- scaleEndCalendar.add(Calendar.DATE, 1);
- if (scaleStartCalendar.equals(scaleEndCalendar))
- result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, sdfScaleTime.parse(scaleTime)).getTime()), GamePlayTime.TYPE_SCALE));
- else
- while (before(scaleStartCalendar, scaleEndCalendar)){
- result.add(new GamePlayTime(uid, sdfScaleDate.format(mergeDate(scaleStartCalendar, sdfScaleTime.parse(scaleTime)).getTime()), GamePlayTime.TYPE_SCALE));
- scaleStartCalendar.add(Calendar.DATE, 1);
- }
- } catch (Exception e){
- e.printStackTrace();
- }
- return result;
- }
- private Calendar mergeDate(Calendar calendar, Date date){
- Calendar temp = Calendar.getInstance();
- temp.setTime(date);
- calendar.set(Calendar.HOUR_OF_DAY, temp.get(Calendar.HOUR_OF_DAY));
- calendar.set(Calendar.MINUTE, temp.get(Calendar.MINUTE));
- calendar.set(Calendar.SECOND, temp.get(Calendar.SECOND));
- return calendar;
- }
- private boolean before(Calendar left, Calendar right){
- return left.get(Calendar.YEAR) <= right.get(Calendar.YEAR)
- && left.get(Calendar.MONTH) <= right.get(Calendar.MONTH)
- && left.get(Calendar.DAY_OF_MONTH) <= right.get(Calendar.DAY_OF_MONTH);
- }
- private Date getRandomTime(Date startTime, Date endTime){
- Long startL = startTime.getTime();
- Long endL = endTime.getTime();
- Date middle;
- if (startL.longValue() != endL.longValue()) {
- long middleL = (long) (startL + (endL - startL) * Math.random());
- middle = new Date(middleL);
- }else
- middle = startTime;
- return middle;
- }
- }
|