HouseInfoServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. package com.izouma.awesomeadmin.service.impl;
  2. import java.math.BigDecimal;
  3. import java.util.*;
  4. import com.izouma.awesomeadmin.dao.BonusRecordMapper;
  5. import com.izouma.awesomeadmin.dao.CompetitionSeasonMapper;
  6. import com.izouma.awesomeadmin.dto.Result;
  7. import com.izouma.awesomeadmin.model.*;
  8. import com.izouma.awesomeadmin.service.*;
  9. import com.izouma.awesomeadmin.util.DateTimeTool;
  10. import com.izouma.awesomeadmin.util.MbappUtil;
  11. import com.izouma.awesomeadmin.util.PushUtil;
  12. import org.apache.commons.collections.CollectionUtils;
  13. import org.apache.log4j.Logger;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import com.izouma.awesomeadmin.constant.AppConstant;
  17. import com.izouma.awesomeadmin.dto.Page;
  18. import com.izouma.awesomeadmin.dao.HouseInfoMapper;
  19. /**
  20. * service接口实现类
  21. */
  22. @Service
  23. public class HouseInfoServiceImpl implements HouseInfoService {
  24. private static Logger logger = Logger.getLogger(HouseInfoServiceImpl.class);
  25. @Autowired
  26. private HouseInfoMapper houseInfoMapper;
  27. @Autowired
  28. private CompetitionSeasonMapper competitionSeasonMapper;
  29. @Autowired
  30. private UserInfoService userInfoService;
  31. @Autowired
  32. private MemberCoinService memberCoinService;
  33. @Autowired
  34. private PlayerInfoService playerInfoService;
  35. @Autowired
  36. private SystemNoticeService systemNoticeService;
  37. @Autowired
  38. private BonusRecordService bonusRecordService;
  39. @Override
  40. public List<HouseInfo> getHouseInfoList(HouseInfo record) {
  41. logger.info("getHouseInfoList");
  42. try {
  43. return houseInfoMapper.queryAllHouseInfo(record);
  44. } catch (Exception e) {
  45. logger.error("getHouseInfoList", e);
  46. }
  47. return null;
  48. }
  49. @Override
  50. public List<HouseInfo> getHouseInfoByPage(Page page, HouseInfo record) {
  51. logger.info("getHouseInfoByPage");
  52. try {
  53. Map<String, Object> parameter = new HashMap<String, Object>();
  54. parameter.put("record", record);
  55. parameter.put(AppConstant.PAGE, page);
  56. return houseInfoMapper.queryHouseInfoByPage(parameter);
  57. } catch (Exception e) {
  58. logger.error("getHouseInfoByPage", e);
  59. }
  60. return null;
  61. }
  62. @Override
  63. public HouseInfo getHouseInfoById(String id) {
  64. logger.info("getHouseInfoyId");
  65. try {
  66. return houseInfoMapper.selectByPrimaryKey(Integer.valueOf(id));
  67. } catch (Exception e) {
  68. logger.error("getHouseInfoById", e);
  69. }
  70. return null;
  71. }
  72. @Override
  73. public HouseInfo getHouseInfoPlayerNum(String id) {
  74. logger.info("getHouseInfoPlayerNum");
  75. try {
  76. return houseInfoMapper.getHouseInfoPlayerNum(Integer.valueOf(id));
  77. } catch (Exception e) {
  78. logger.error("getHouseInfoPlayerNum", e);
  79. }
  80. return null;
  81. }
  82. @Override
  83. public HouseInfo getHouseInfo(HouseInfo record) {
  84. logger.info("getHouseInfo");
  85. try {
  86. return houseInfoMapper.queryHouseInfo(record);
  87. } catch (Exception e) {
  88. logger.error("getHouseInfo", e);
  89. }
  90. return null;
  91. }
  92. @Override
  93. public boolean createHouseInfo(HouseInfo record) {
  94. logger.info("createHouseInfo");
  95. try {
  96. record.setHouseCode(MbappUtil.getCodeByUUId());
  97. CompetitionSeason competitionSeason = new CompetitionSeason();
  98. competitionSeason.setGameId(record.getGameId());
  99. competitionSeason.setStatusFlag(AppConstant.SeasonStatus.START);
  100. competitionSeason = competitionSeasonMapper.queryCompetitionSeason(competitionSeason);
  101. if (competitionSeason != null) {
  102. record.setSeasonId(competitionSeason.getId());
  103. }
  104. int updates = houseInfoMapper.insertSelective(record);
  105. if (updates > 0) {
  106. return true;
  107. }
  108. } catch (Exception e) {
  109. logger.error("createHouseInfo", e);
  110. }
  111. return false;
  112. }
  113. @Override
  114. public boolean deleteHouseInfo(HouseInfo record) {
  115. logger.info("deleteHouseInfo");
  116. try {
  117. int updates = houseInfoMapper.delete(record);
  118. if (updates > 0) {
  119. return true;
  120. }
  121. } catch (Exception e) {
  122. logger.error("deleteHouseInfo", e);
  123. }
  124. return false;
  125. }
  126. @Override
  127. public boolean updateHouseInfo(HouseInfo record) {
  128. logger.info("updateHouseInfo");
  129. try {
  130. int updates = houseInfoMapper.updateByPrimaryKeySelective(record);
  131. if (updates > 0) {
  132. return true;
  133. }
  134. } catch (Exception e) {
  135. logger.error("updateHouseInfo", e);
  136. }
  137. return false;
  138. }
  139. /**
  140. * 房间比赛结果结算。
  141. *
  142. * @param record
  143. * @return
  144. */
  145. @Override
  146. public boolean settlementHouse(HouseInfo record) {
  147. logger.info("settlementHouse");
  148. try {
  149. HouseInfo houseInfo = new HouseInfo();
  150. houseInfo.setId(record.getId());
  151. houseInfo = houseInfoMapper.queryHouseInfo(houseInfo);
  152. if (houseInfo != null) {
  153. if (houseInfo.getStatusFlag() == AppConstant.HouseStatus.ANALYSIS) {//只有结束比赛的才能结算
  154. HouseLevel houseLevel = houseInfo.getHouseLevelInfo();
  155. BigDecimal firstRatio = houseLevel.getFirstRatio();
  156. BigDecimal secondRatio = houseLevel.getSecondRatio();
  157. BigDecimal thirdRatio = houseLevel.getThirdRatio();
  158. BigDecimal poolRatio = houseLevel.getPoolRatio();
  159. PlayerInfo param = new PlayerInfo();
  160. param.setHouseId(record.getId());
  161. List<PlayerInfo> playerInfoList = playerInfoService.getSettlementPlayer(param);
  162. if (CollectionUtils.isNotEmpty(playerInfoList)) {
  163. for (int i = 0; i < playerInfoList.size(); i++) {
  164. PlayerInfo playerInfo = playerInfoList.get(i);
  165. playerInfo.setHouseRank(i + 1);
  166. BigDecimal bonus = BigDecimal.ZERO;
  167. String content = "";
  168. int typeFlag = AppConstant.NoticeType.RECEIVE;
  169. if (playerInfo.getRanking() != null && 1 == playerInfo.getRanking()) {//只有吃鸡才能获得奖励
  170. if (i == 0) {//第一名
  171. bonus = BigDecimal.valueOf((firstRatio.doubleValue() / 100) * houseInfo.getBonus().doubleValue());
  172. }
  173. if (i == 1) {//第二名
  174. bonus = BigDecimal.valueOf((secondRatio.doubleValue() / 100) * houseInfo.getBonus().doubleValue());
  175. }
  176. if (i == 2) {//第三名
  177. bonus = BigDecimal.valueOf((thirdRatio.doubleValue() / 100) * houseInfo.getBonus().doubleValue());
  178. }
  179. content = "恭喜你,在" + DateTimeTool.dateTimeToTimeYYYYHHmmStr(houseInfo.getBeginTime())
  180. + "开始的游戏竞赛 " + houseInfo.getHouseName() + "获得了第" + playerInfo.getHouseRank()
  181. + "名,获得" + bonus + "积分,赶快领取你的奖励吧。";
  182. } else {
  183. content = "恭喜你,在" + DateTimeTool.dateTimeToTimeYYYYHHmmStr(houseInfo.getBeginTime())
  184. + "开始的游戏竞赛 " + houseInfo.getHouseName() + "获得了第" + playerInfo.getHouseRank()
  185. + "名,但未能吃鸡。";
  186. typeFlag = AppConstant.NoticeType.RESULT;
  187. }
  188. playerInfo.setBonus(bonus);
  189. if (AppConstant.PlayerStatus.PROCESSED == playerInfo.getStatusFlag()) {//如果是正常结束且解析完成的则更新为结束完成
  190. playerInfo.setStatusFlag(AppConstant.PlayerStatus.SETTLEMENT);
  191. SystemNotice systemNotice = new SystemNotice();
  192. systemNotice.setGameId(playerInfo.getGameId());
  193. systemNotice.setHouseId(playerInfo.getHouseId());
  194. systemNotice.setUserId(playerInfo.getUserId());
  195. systemNotice.setSeasonId(playerInfo.getSeasonId());
  196. systemNotice.setPlayerId(playerInfo.getId());
  197. systemNotice.setRemark("定时任务");
  198. systemNotice.setContent(content);
  199. systemNotice.setTypeFlag(typeFlag);
  200. systemNoticeService.createSystemNotice(systemNotice);
  201. //推送
  202. try {
  203. UserInfo userInfo = new UserInfo();
  204. userInfo.setId(playerInfo.getUserId());
  205. userInfo = userInfoService.getSingleUserInfo(userInfo);
  206. if (userInfo != null) {
  207. if ("Y".equals(userInfo.getNoticeFlag())) {
  208. String[] ids = new String[]{userInfo.getId().toString()};
  209. PushUtil.pushMsg(ids, content);
  210. }
  211. }
  212. } catch (Exception e) {
  213. logger.error("结算推送消息异常。", e);
  214. }
  215. }
  216. playerInfoService.updatePlayerInfo(playerInfo);
  217. }
  218. }
  219. if (poolRatio.doubleValue() > 0) {
  220. //加入到赛季奖金池中
  221. try {
  222. BigDecimal pool = BigDecimal.valueOf((poolRatio.doubleValue() / 100) * houseInfo.getBonus().doubleValue());
  223. CompetitionSeason competitionSeason = competitionSeasonMapper.selectByPrimaryKey(houseInfo.getSeasonId());
  224. if (competitionSeason != null) {
  225. double balance = competitionSeason.getBonus().doubleValue();
  226. double moneyCoin = balance + pool.doubleValue();
  227. BonusRecord bonusRecord = new BonusRecord();
  228. bonusRecord.setMoney(pool);
  229. bonusRecord.setBonus(BigDecimal.valueOf(moneyCoin));
  230. bonusRecord.setSeasonId(houseInfo.getSeasonId());
  231. bonusRecord.setGameId(houseInfo.getGameId());
  232. bonusRecord.setHouseId(houseInfo.getId());
  233. bonusRecord.setTypeFlag(0);
  234. bonusRecord.setRemark(houseInfo.getHouseName() + "比赛结算," + pool.doubleValue() + " 积分");
  235. bonusRecordService.createBonusRecord(bonusRecord);
  236. CompetitionSeason addBonus = new CompetitionSeason();
  237. addBonus.setId(houseInfo.getId());
  238. addBonus.setBonus(pool);
  239. competitionSeasonMapper.addBonus(addBonus);
  240. }
  241. } catch (Exception e) {
  242. logger.error("赛季奖金池添加奖金异常!", e);
  243. }
  244. }
  245. //更新为结算完成状态。
  246. houseInfo.setStatusFlag(AppConstant.HouseStatus.SETTLEMENT);
  247. houseInfoMapper.updateByPrimaryKeySelective(houseInfo);
  248. return true;
  249. }
  250. }
  251. } catch (Exception e) {
  252. logger.error("settlementHouse", e);
  253. }
  254. return false;
  255. }
  256. /**
  257. * 加入房间
  258. *
  259. * @param record
  260. * @return
  261. */
  262. @Override
  263. public Result joinHouseInfo(PlayerInfo record) {
  264. logger.info("joinHouseInfo");
  265. try {
  266. if (record.getUserId() == null) {
  267. return new Result(false, "加入失败,用户不存在!");
  268. }
  269. if (record.getHouseId() == null) {
  270. return new Result(false, "加入失败,房间不存在!");
  271. }
  272. UserInfo userInfo = new UserInfo();
  273. userInfo.setId(record.getUserId());
  274. userInfo = userInfoService.getSingleUserInfo(userInfo);
  275. if (userInfo == null) {
  276. return new Result(false, "加入失败,用户不存在!");
  277. }
  278. HouseInfo houseInfo = new HouseInfo();
  279. houseInfo.setId(record.getHouseId());
  280. houseInfo = houseInfoMapper.queryHouseInfo(houseInfo);
  281. if (houseInfo == null) {
  282. return new Result(false, "加入失败,房间不存在!");
  283. }
  284. if (houseInfo.getStatusFlag() > AppConstant.HouseStatus.READY) {
  285. return new Result(false, "加入失败,游戏已开始!");
  286. }
  287. //检查是否重复加入
  288. PlayerInfo playerInfo = playerInfoService.getPlayerInfo(record);
  289. if (playerInfo != null) {
  290. return new Result(false, "加入失败,不能重复加入");
  291. }
  292. double entryCoin = 50;
  293. HouseLevel houseLevel = houseInfo.getHouseLevelInfo();
  294. if (houseLevel != null) {
  295. entryCoin = houseLevel.getEntryCoin().doubleValue();
  296. }
  297. /**
  298. * 余额
  299. */
  300. double moneyCoin = userInfo.getMoneyCoin();
  301. if (entryCoin > moneyCoin) {
  302. return new Result(false, "加入失败,余额不足");
  303. }
  304. record.setGameId(houseInfo.getGameId());
  305. record.setHouseId(houseInfo.getId());
  306. record.setJoinTime(new Date());
  307. record.setPrincipal(BigDecimal.valueOf(entryCoin));
  308. record.setSeasonId(houseInfo.getSeasonId());
  309. playerInfoService.createPlayerInfo(record);
  310. // 只能用余额支付
  311. if (entryCoin > 0) {
  312. MemberCoin memberCoin = new MemberCoin();
  313. memberCoin.setCreateUser("系统");
  314. memberCoin.setHouseId(houseInfo.getId());
  315. memberCoin.setUserId(userInfo.getId());
  316. memberCoin.setGameId(houseInfo.getGameId());
  317. memberCoin.setSeasonId(houseInfo.getSeasonId());
  318. memberCoin.setPlayerId(record.getId());
  319. memberCoin.setMoney(BigDecimal.valueOf(-entryCoin));
  320. memberCoin.setBalance(BigDecimal.valueOf(moneyCoin - entryCoin));
  321. memberCoin.setTypeFlag(AppConstant.CoinType.CONSUMPTION);
  322. memberCoin.setRemark("加入房间:" + houseInfo.getHouseCode());
  323. memberCoinService.createMemberCoin(memberCoin);
  324. }
  325. UserInfo updateUser = new UserInfo();
  326. updateUser.setId(userInfo.getId());
  327. updateUser.setMoneyCoin(moneyCoin - entryCoin);
  328. userInfoService.updateUserInfo(updateUser);
  329. HouseInfo joinHouseInfo = new HouseInfo();
  330. joinHouseInfo.setId(houseInfo.getId());
  331. joinHouseInfo.setPlayerNumber(1);
  332. joinHouseInfo.setBonus(BigDecimal.valueOf(entryCoin));
  333. houseInfoMapper.joinHouseInfo(joinHouseInfo);
  334. return new Result(true, "加入成功");
  335. } catch (Exception e) {
  336. logger.error("joinHouseInfo", e);
  337. }
  338. return new Result(false, "加入失败");
  339. }
  340. @Override
  341. public Result autoBegin(HouseInfo record) {
  342. logger.info("autoBegin");
  343. try {
  344. List<HouseInfo> houseInfoList = houseInfoMapper.autoBeginHouseInfo(record);
  345. for (HouseInfo houseInfo : houseInfoList) {
  346. houseInfo.setStatusFlag(AppConstant.HouseStatus.START);
  347. houseInfo.setBeginTime(new Date());
  348. houseInfoMapper.updateByPrimaryKeySelective(houseInfo);
  349. }
  350. return new Result(true, "开始成功");
  351. } catch (Exception e) {
  352. logger.error("autoBegin", e);
  353. }
  354. return new Result(false, "开始失败");
  355. }
  356. @Override
  357. public Result handBegin(HouseInfo record) {
  358. logger.info("handBegin");
  359. try {
  360. HouseInfo houseInfo = houseInfoMapper.queryHouseInfo(record);
  361. if (houseInfo != null) {
  362. if (AppConstant.HouseStatus.START > houseInfo.getStatusFlag()) {//房间为未开始状态
  363. houseInfo.setStatusFlag(AppConstant.HouseStatus.START);
  364. houseInfo.setBeginTime(new Date());
  365. houseInfoMapper.updateByPrimaryKeySelective(houseInfo);
  366. return new Result(true, "开始成功");
  367. }
  368. }
  369. } catch (Exception e) {
  370. logger.error("handBegin", e);
  371. }
  372. return new Result(false, "开始失败");
  373. }
  374. @Override
  375. public Result autoEnd(HouseInfo record) {
  376. logger.info("autoEnd");
  377. try {
  378. List<HouseInfo> houseInfoList = houseInfoMapper.autoEndHouseInfo(record);
  379. for (HouseInfo houseInfo : houseInfoList) {
  380. houseInfo.setStatusFlag(AppConstant.HouseStatus.END);
  381. houseInfo.setEndTime(new Date());
  382. houseInfoMapper.updateByPrimaryKeySelective(houseInfo);
  383. //更新比赛超时的
  384. PlayerInfo playerInfo = new PlayerInfo();
  385. playerInfo.setHouseId(houseInfo.getId());
  386. playerInfoService.overTimePlayer(playerInfo);
  387. //settlementHouse(houseInfo);//比赛结果结算。
  388. }
  389. return new Result(true, "结束成功");
  390. } catch (Exception e) {
  391. logger.error("autoEnd", e);
  392. }
  393. return new Result(false, "结束失败");
  394. }
  395. /**
  396. * 自动结算
  397. *
  398. * @param record
  399. * @return
  400. */
  401. @Override
  402. public Result autoSettlement(HouseInfo record) {
  403. logger.info("autoSettlement");
  404. try {
  405. record.setStatusFlag(AppConstant.HouseStatus.ANALYSIS);//获取解析完成带结算的房间。
  406. List<HouseInfo> houseInfoList = houseInfoMapper.queryAllHouseInfo(record);
  407. for (HouseInfo houseInfo : houseInfoList) {
  408. settlementHouse(houseInfo);//比赛结果结算。
  409. }
  410. return new Result(true, "结束成功");
  411. } catch (Exception e) {
  412. logger.error("autoSettlement", e);
  413. }
  414. return new Result(false, "结束失败");
  415. }
  416. @Override
  417. public Result updateToAnalysis(HouseInfo record) {
  418. logger.info("updateToAnalysis");
  419. try {
  420. int updates = houseInfoMapper.updateToAnalysis(record);
  421. if (updates > 0) {
  422. return new Result(true, "更新成功");
  423. }
  424. } catch (Exception e) {
  425. logger.error("updateToAnalysis", e);
  426. }
  427. return new Result(false, "更新失败");
  428. }
  429. @Override
  430. public Result handEnd(HouseInfo record) {
  431. logger.info("handEnd");
  432. try {
  433. HouseInfo houseInfo = houseInfoMapper.queryHouseInfo(record);
  434. if (houseInfo != null) {
  435. if (AppConstant.HouseStatus.START == houseInfo.getStatusFlag()) {//房间为开始状态
  436. houseInfo.setStatusFlag(AppConstant.HouseStatus.END);
  437. houseInfo.setEndTime(new Date());
  438. houseInfoMapper.updateByPrimaryKeySelective(houseInfo);
  439. //更新比赛超时的
  440. PlayerInfo playerInfo = new PlayerInfo();
  441. playerInfo.setHouseId(houseInfo.getId());
  442. playerInfoService.overTimePlayer(playerInfo);
  443. //settlementHouse(houseInfo);//比赛结果结算。
  444. return new Result(true, "结束成功");
  445. }
  446. }
  447. } catch (Exception e) {
  448. logger.error("handEnd", e);
  449. }
  450. return new Result(false, "结束失败");
  451. }
  452. @Override
  453. public Result autoNoStartPlay(HouseInfo record) {
  454. logger.info("autoNoStartPlay");
  455. try {
  456. List<PlayerInfo> playerInfoList = playerInfoService.getNoStartPlayer(record);
  457. for (PlayerInfo playerInfo : playerInfoList) {
  458. playerInfo.setStatusFlag(AppConstant.PlayerStatus.NO_MATCH);
  459. playerInfo.setExamineUser("系统定时任务");
  460. playerInfo.setExamineTime(new Date());
  461. playerInfo.setExamineType(AppConstant.ExamineType.NO_MATCH);
  462. playerInfoService.updatePlayerInfo(playerInfo);
  463. SystemNotice systemNotice = new SystemNotice();
  464. systemNotice.setGameId(playerInfo.getGameId());
  465. systemNotice.setHouseId(playerInfo.getHouseId());
  466. systemNotice.setUserId(playerInfo.getUserId());
  467. systemNotice.setSeasonId(playerInfo.getSeasonId());
  468. systemNotice.setPlayerId(playerInfo.getId());
  469. systemNotice.setRemark("定时任务");
  470. systemNotice.setContent("房间比赛开始未按规定时间开始游戏,未参赛!");
  471. systemNotice.setTypeFlag(AppConstant.NoticeType.NO_MATCH);
  472. systemNoticeService.createSystemNotice(systemNotice);
  473. //推送
  474. try {
  475. UserInfo userInfo = new UserInfo();
  476. userInfo.setId(playerInfo.getUserId());
  477. userInfo = userInfoService.getSingleUserInfo(userInfo);
  478. if (userInfo != null) {
  479. if ("Y".equals(userInfo.getNoticeFlag())) {
  480. String[] ids = new String[]{userInfo.getId().toString()};
  481. PushUtil.pushMsg(ids, "房间比赛开始未按规定时间开始游戏,未参赛!");
  482. }
  483. }
  484. } catch (Exception e) {
  485. logger.error("推送消息异常。", e);
  486. }
  487. }
  488. return new Result(true, "开始成功");
  489. } catch (Exception e) {
  490. logger.error("autoNoStartPlay", e);
  491. }
  492. return new Result(false, "开始失败");
  493. }
  494. }