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<String> 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<List<TGameConfig>> queryGameList(Integer siteId, Integer storeId) {
|
try {
|
|
Integer uid = tokenUtil.getUserIdFormRedis();
|
AppUser appUser = appUserClient.queryAppUser(uid);
|
List<TGameConfig> tGameConfigs = new ArrayList<>();
|
|
if (appUser.getAddUserId() == null) {
|
|
|
List<SiteLock> lock = lockService.list(new QueryWrapper<SiteLock>().eq("siteId", siteId));
|
|
Date now = new Date();
|
for (SiteLock siteLock : lock) {
|
if (now.after(siteLock.getStartTime()) && now.before(siteLock.getEndTime())) {
|
return ResultUtil.error("当前场地已被锁定");
|
}
|
}
|
|
}
|
|
List<TGame> list = gameService.list(new LambdaQueryWrapper<TGame>().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<TGameConfig> 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<Integer> 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<User>().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<SiteBooking>()
|
.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<User>().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<TGameRecord> list = gameRecordService.list(new QueryWrapper<TGameRecord>().eq("code", code).eq("payType", 2));
|
TGameRecord one = list.get(0);
|
|
if (one.getStatus() == 1) {
|
break;
|
}
|
ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
|
if (resultUtil.getCode() == 200 && one.getStatus() == 0) {
|
/**
|
* SUCCESS—支付成功,
|
* REFUND—转入退款,
|
* NOTPAY—未支付,
|
* CLOSED—已关闭,
|
* REVOKED—已撤销(刷卡支付),
|
* USERPAYING--用户支付中,
|
* PAYERROR--支付失败(其他原因,如银行返回失败)
|
*/
|
Map<String, String> 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<TGameRecord> list = gameRecordService.list(new QueryWrapper<TGameRecord>().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<String, String> 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;
|
}
|
}
|
|
|
}
|