package com.dsh.other.controller;
|
|
import cn.hutool.http.HttpRequest;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alipay.api.AlipayClient;
|
import com.alipay.api.DefaultAlipayClient;
|
import com.alipay.api.request.AlipayTradeOrderSettleRequest;
|
import com.alipay.api.response.AlipayTradeOrderSettleResponse;
|
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.StoreClient;
|
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.math.RoundingMode;
|
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 == null || operationId==0 ){
|
// 是平台的不冻结资金 不做分账处理
|
smid2 = smid;
|
payMoneyUtil.confirm1(smid2,code,tradeNo,config.getCash().toString());
|
}else{
|
String smidByOperatorId = siteService.getSMIDByOperatorId(operationId);
|
smid2 = smidByOperatorId;
|
payMoneyUtil.confirm(smid2,code,tradeNo,config.getCash().toString());
|
extracted(operationId, config.getCash(), tradeNo);
|
}
|
|
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();
|
}
|
}
|
@Autowired
|
private IOperatorUserService operatorUserService;
|
@Autowired
|
private StoreClient storeClient;
|
private void extracted(Integer operatorId, BigDecimal coursePackageOrder1, String tradeNo) throws Exception {
|
// 分账
|
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
|
"2021004105665036",
|
"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==",
|
"json", "GBK",
|
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB",
|
"RSA2");
|
AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest();
|
String randomCode = UUIDUtil.getRandomCode(16);
|
|
String proportionByOperatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>()
|
.eq("operatorId",operatorId)).getAlipayProportion();
|
// 支付宝分账比例
|
String s1 = proportionByOperatorId.split(",")[1];
|
double i = Double.parseDouble(s1);
|
double v = i * 0.01;
|
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v));
|
// 分账金额
|
BigDecimal bigDecimal2 = coursePackageOrder1.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN);
|
request.setBizContent("{" +
|
" \"out_request_no\":\"" + randomCode + "\"," +
|
" \"trade_no\":\"" + tradeNo + "\"," +
|
" \"royalty_parameters\":[" +
|
" {" +
|
" \"royalty_type\":\"transfer\"," +
|
" \"trans_out\":\"" + storeClient.getSMIDByOperatorId(operatorId)+ "\"," +
|
" \"trans_out_type\":\"userId\"," +
|
" \"trans_in_type\":\"userId\"," +
|
" \"trans_in\":\"" + smid + "\"," +
|
" \"amount\":" + bigDecimal2 + "," +
|
" \"desc\":\"平台服务费\"," +
|
" \"royalty_scene\":\"平台服务费\"," +
|
" }" +
|
" ]," +
|
" \"extend_params\":{" +
|
" \"royalty_finish\":\"true\"" +
|
" }," +
|
" \"royalty_mode\":\"async\"" +
|
"}");
|
AlipayTradeOrderSettleResponse response = alipayClient.execute(request);
|
if (response.isSuccess()) {
|
System.out.println("调用成功");
|
} else {
|
System.out.println("调用失败");
|
}
|
}
|
|
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;
|
}
|
}
|
|
|
}
|