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 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 params = JSONUtils.json2map(search); Map 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> list = userConfigMapper.list(params, order); for(Map 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> pageInfo = new PageInfo<>(list); return ResultGenerator.genSuccessResult(pageInfo); } @Override public Result add(User user, UserConfig config, String configs) { List 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 gameLogs = gameLogMapper.listUid(id); for (GameLog log : gameLogs){ List gameAnswers = gameAnswerMapper.listByGameIdNew(log.getId().intValue()); for (GameAnswer gameAnswer : gameAnswers) gameAnswerMapper.deleteByPrimaryKey(gameAnswer.getId()); gameLogMapper.deleteByPrimaryKey(log.getId()); } List 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 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 gameConfigs = gameConfigMapper.listUid(authUser.getId()); Map 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 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> download(String search, String ordermap) { Map params = JSONUtils.json2map(search); Map 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 gameLogs = gameLogMapper.listUidDate(authUser.getId(), UtilFun.DateToString(new Date(), UtilFun.YMD)); List 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 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 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 generateGamePlayTime(long uid, String scaleStart, String scaleEnd, String startTime, String endTime){ List 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 generateScaleTime(long uid, String scaleStart, String scaleEnd, String scaleTime){ List 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; } }