package com.dsh.other.controller; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSONObject; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.other.entity.*; import com.dsh.other.feignclient.CourseRecordClient; import com.dsh.other.feignclient.account.AppUserClient; import com.dsh.other.feignclient.account.model.AppUser; import com.dsh.other.model.QueryMySiteVo; import com.dsh.other.model.User; import com.dsh.other.service.*; import com.dsh.other.util.*; import com.dsh.other.util.httpClinet.HttpResult; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping("/api/game") public class GameController { @Autowired private TGameRecordService gameRecordService; @Autowired private TGameService gameService; @Autowired private TGameConfigService gameConfigService; @Autowired private TokenUtil tokenUtil; @Resource private AppUserClient appUserClient; @Autowired private PayMoneyUtil payMoneyUtil; @Resource private CourseRecordClient courseRecordClient; @Autowired private IUserService userService; @Autowired private ISiteBookingService siteBookingService; @ResponseBody @PostMapping("/getIntro") @ApiOperation(value = "获取步骤说明", tags = {"用户—游戏"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public ResultUtil getIntro() { try { return ResultUtil.success(gameService.getIntro()); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } @Autowired private ISiteLockService lockService; @ResponseBody @PostMapping("/queryGameList") @ApiOperation(value = "获取当前场地的游戏列表配置", tags = {"用户—游戏"}) @ApiImplicitParams({ @ApiImplicitParam(value = "siteId", name = "siteId", dataType = "int", required = true), @ApiImplicitParam(value = "storeId", name = "storeId", dataType = "int", required = true), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public ResultUtil> queryGameList(Integer siteId, Integer storeId) { try { Integer uid = tokenUtil.getUserIdFormRedis(); AppUser appUser = appUserClient.queryAppUser(uid); List tGameConfigs = new ArrayList<>(); if (appUser.getAddUserId() == null) { List lock = lockService.list(new QueryWrapper().eq("siteId", siteId)); Date now = new Date(); for (SiteLock siteLock : lock) { if (now.after(siteLock.getStartTime()) && now.before(siteLock.getEndTime())) { return ResultUtil.error("当前场地已被锁定"); } } } List list = gameService.list(new LambdaQueryWrapper().eq(TGame::getSiteId, siteId).eq(TGame::getStoreId, storeId).eq(TGame::getState, 0)); if (list.size() > 0) { Integer id = list.get(0).getId(); tGameConfigs = gameConfigService.listJs(id); } List filteredList = tGameConfigs.stream() .filter(gameConfig -> !gameConfig.getImg().isEmpty()) .collect(Collectors.toList()); return ResultUtil.success(filteredList); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } @ResponseBody @PostMapping("/gameStartupCheck") @ApiOperation(value = "扫码启动游戏前的校验(0=不通过,1=通过)", tags = {"用户—游戏"}) @ApiImplicitParams({ @ApiImplicitParam(value = "三方游戏id", name = "gameId", dataType = "int", required = true), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public ResultUtil gameStartupCheck(Integer gameId){ try { Integer uid = tokenUtil.getUserIdFormRedis(); if (null == uid) { return ResultUtil.tokenErr(); } //判断当前用户是否是员工 AppUser appUser1 = appUserClient.queryAppUser(uid); User one = userService.getOne(new QueryWrapper().eq("phone", appUser1.getPhone()).eq("status", 1)); if (null != one) { return ResultUtil.success(1); } //普通用户校验当前时间是否在预约时间段内 TGame game = gameService.getById(gameId); Integer siteId = game.getSiteId(); SiteBooking siteBooking = siteBookingService.getOne(new QueryWrapper() .eq("state", 1) .in("status", Arrays.asList(1, 2)) .eq("appUserId", uid) .eq("siteId", siteId) .last(" and now() between startTime and endTime") ); return ResultUtil.success(null == siteBooking ? 0 : 1); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } private String smid = "2088330203191220";//平台支付宝商户号 @Autowired private ISiteService siteService; @ResponseBody @PostMapping("/payGame") @ApiOperation(value = "支付游戏", tags = {"用户—游戏"}) @ApiImplicitParams({ @ApiImplicitParam(value = "三方游戏id", name = "gameId", dataType = "int", required = true), @ApiImplicitParam(value = "游戏配置id", name = "configId", dataType = "int", required = true), @ApiImplicitParam(value = "sutuId", name = "sutuId", dataType = "int", required = true), @ApiImplicitParam(value = "spaceId", name = "spaceId", dataType = "int", required = true), @ApiImplicitParam(value = "1微信 2支付宝 3玩湃币 5积分", name = "type", dataType = "int", required = true), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public ResultUtil payGame(Integer gameId, Integer configId, Integer type, Integer sutuId, Integer spaceId) { try { Integer uid = tokenUtil.getUserIdFormRedis(); if (null == uid) { return ResultUtil.tokenErr(); } //判断当前用户是否是员工 AppUser appUser1 = appUserClient.queryAppUser(uid); User one = userService.getOne(new QueryWrapper().eq("phone", appUser1.getPhone()).eq("status", 1)); if (null != one) { Integer integer = startGame(uid, gameId, spaceId, sutuId); return ResultUtil.success(); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); TGameConfig config = gameConfigService.getById(configId); TGameRecord tGameRecord = new TGameRecord(); tGameRecord.setGameId(gameId); tGameRecord.setPayType(type); tGameRecord.setUserId(uid); tGameRecord.setNumber(code); tGameRecord.setTime(new Date()); gameRecordService.save(tGameRecord); if (type == 1) { ResultUtil weixinpay = payMoneyUtil.weixinpay("游戏支付", "", code, config.getCash().toString(), "/base/course/weChatPaymentCourseCallback", "APP", ""); if (weixinpay.getCode() == 200) { new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10) { int min = 5000; wait += (min * num); Thread.sleep(wait); List list = gameRecordService.list(new QueryWrapper().eq("code", code).eq("payType", 2)); TGameRecord one = list.get(0); if (one.getStatus() == 1) { break; } ResultUtil> resultUtil = payMoneyUtil.queryWXOrder(code, ""); if (resultUtil.getCode() == 200 && one.getStatus() == 0) { /** * SUCCESS—支付成功, * REFUND—转入退款, * NOTPAY—未支付, * CLOSED—已关闭, * REVOKED—已撤销(刷卡支付), * USERPAYING--用户支付中, * PAYERROR--支付失败(其他原因,如银行返回失败) */ Map data1 = resultUtil.getData(); String s = data1.get("trade_state"); String transaction_id = data1.get("transaction_id"); if ("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10) { break; } if ("SUCCESS".equals(s)) { for (TGameRecord coursePackagePayment : list) { coursePackagePayment.setStatus(1); coursePackagePayment.setMoney(config.getCash()); coursePackagePayment.setOrderNo(transaction_id); } gameRecordService.updateBatchById(list); Integer integer = startGame(uid, gameId, spaceId, sutuId); break; } if ("USERPAYING".equals(s)) { num++; } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } return weixinpay; } else if (type == 2) { String smid1=""; String params = uid + "_" + gameId + "_" + spaceId + "_" + sutuId+"_"+code+"_"+configId; // 判断这个课包属于哪个门店 属于哪个运营商 根据运营商 id 获取对应的商户号 TGame game = gameService.getById(gameId); Integer operationId = game.getOperationId(); if (operationId==0){ // 是平台的 smid1 = smid; }else{ String smidByOperatorId = siteService.getSMIDByOperatorId(operationId); smid1 = smidByOperatorId; } ResultUtil alipay = payMoneyUtil.alipay(smid1,"游戏支付", "游戏支付", params, code, config.getCash().toString(), "/base/site/gameCallback"); if (alipay.getCode() == 200) { new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10) { int min = 5000; wait += (min * num); Thread.sleep(wait); List list = gameRecordService.list(new QueryWrapper().eq("number", code).eq("payType", 2)); TGameRecord one = list.get(0); if (one.getStatus() == 1) { break; } AlipayTradeQueryResponse resultUtil = payMoneyUtil.queryALIOrder(code); if (resultUtil.getCode().equals("10000") && one.getStatus() == 0) { /** * WAIT_BUYER_PAY(交易创建,等待买家付款)、 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、 * TRADE_SUCCESS(交易支付成功)、 * TRADE_FINISHED(交易结束,不可退款) */ String tradeNo = resultUtil.getTradeNo(); String s = resultUtil.getTradeStatus(); if ("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10) { break; } if ("TRADE_SUCCESS".equals(s)) { for (TGameRecord coursePackagePayment : list) { coursePackagePayment.setStatus(1); coursePackagePayment.setMoney(config.getCash()); coursePackagePayment.setOrderNo(tradeNo); CourseCounsum courseCounsum = new CourseCounsum(); courseCounsum.setChangeType(3); courseCounsum.setInsertTime(new Date()); courseCounsum.setReason("智慧球场;" + config.getCash()); courseCounsum.setAppUserId(uid); courseRecordClient.save(courseCounsum); } gameRecordService.updateBatchById(list); Integer integer = startGame(uid, gameId, spaceId, sutuId); // 判断这个课包属于哪个门店 属于哪个运营商 根据运营商 id 获取对应的商户号 TGame game = gameService.getById(gameId); String smid2=""; Integer operationId = game.getOperationId(); if (operationId==0){ // 是平台的 smid2 = smid; }else{ String smidByOperatorId = siteService.getSMIDByOperatorId(operationId); smid2 = smidByOperatorId; } payMoneyUtil.confirm(smid2,code,tradeNo,config.getCash().toString()); break; } if ("WAIT_BUYER_PAY".equals(s)) { num++; } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } return alipay; } else if (type == 3) { tGameRecord.setMoney(config.getPlayCoin()); gameRecordService.updateById(tGameRecord); AppUser appUser = appUserClient.queryAppUser(uid); Integer playPaiCoins = appUser.getPlayPaiCoins(); BigDecimal playCoin = config.getPlayCoin(); int i = playCoin.intValue(); if (playPaiCoins < i) { return ResultUtil.error("玩湃币不足"); } int i1 = playPaiCoins - i; appUser.setPlayPaiCoins(i1); appUserClient.updateAppUser(appUser); startGame(uid, gameId, spaceId, sutuId); return ResultUtil.success(); } else if (type == 5) { AppUser appUser = appUserClient.queryAppUser(uid); Integer playPaiCoins = appUser.getIntegral(); BigDecimal playCoin = config.getIntegral(); int i = playCoin.intValue(); if (playPaiCoins < i) { return ResultUtil.error("积分不足"); } int i1 = playPaiCoins - i; appUser.setIntegral(i1); appUser.setPoints(playCoin.intValue()); appUserClient.updateAppUser(appUser); startGame(uid, gameId, spaceId, sutuId); return ResultUtil.success(); } else { return ResultUtil.error("支付方式错误"); } } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } private static Integer startGame(Integer uid, Integer gameId, Integer spaceId, Integer sutuId) { HashMap map = new HashMap<>(); map.put("sign", "0DB011836143EEE2C2E072967C9F4E4B"); map.put("app_user_id", uid + ""); map.put("game_id", gameId + ""); map.put("space_id", spaceId + ""); map.put("sutu_id", sutuId + ""); String s = HttpRequestUtil.postRequest("https://try.daowepark.com/v7/user_api/general/gameStart", map); JSONObject jsonObject = JSONObject.parseObject(s); Object code = jsonObject.get("code"); if (String.valueOf(code) != null && "200".equals(String.valueOf(code))) { System.err.println("--------------启动了一次游戏"); return 200; } else { return 500; } } }