package com.stylefeng.guns.modular.api;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.stylefeng.guns.core.util.MD5Util;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.system.model.SettlementRecord;
|
import com.stylefeng.guns.modular.system.service.IDriverService;
|
import com.stylefeng.guns.modular.system.service.ISettlementRecordService;
|
import com.stylefeng.guns.modular.system.util.RedisUtil;
|
import com.stylefeng.guns.modular.system.util.ResultUtil;
|
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackRequest;
|
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackResponse;
|
import com.stylefeng.guns.modular.system.util.Tingg.model.Payments;
|
import com.stylefeng.guns.modular.system.util.UUIDUtil;
|
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
|
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmount;
|
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2023/8/17 9:39
|
*/
|
@Slf4j
|
@RestController
|
@RequestMapping("")
|
public class SettlementRecordController {
|
|
@Autowired
|
private ISettlementRecordService settlementRecordService;
|
|
@Autowired
|
private IDriverService driverService;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
|
|
|
|
@ResponseBody
|
@PostMapping("/api/settlementRecord/querySettlementAmount")
|
@ApiOperation(value = "获取个人中心待结算金额和明细", tags = {"司机端-个人中心"}, notes = "")
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
|
})
|
public ResultUtil<QuerySettlementAmount> querySettlementAmount(Integer language, HttpServletRequest request){
|
try {
|
Integer uid = driverService.getUserIdFormRedis(request);
|
if(null == uid){
|
return ResultUtil.tokenErr();
|
}
|
QuerySettlementAmount querySettlementAmount = settlementRecordService.querySettlementAmount(language, uid);
|
return ResultUtil.success(querySettlementAmount);
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
}
|
|
|
|
@ResponseBody
|
@PostMapping("/api/settlementRecord/paymentSettlementAmount")
|
@ApiOperation(value = "支付结算费用", tags = {"司机端-个人中心"}, notes = "")
|
@ApiImplicitParams({
|
@ApiImplicitParam(value = "支付方式(1=手机支付,2=银行卡支付,3=余额)", name = "payType", required = true, dataType = "int"),
|
@ApiImplicitParam(value = "银行卡id", name = "bankCardId", required = false, dataType = "int"),
|
@ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
|
})
|
public ResultUtil paymentSettlementAmount(Integer payType, Integer bankCardId, Integer language, HttpServletRequest request){
|
try {
|
Integer uid = driverService.getUserIdFormRedis(request);
|
if(null == uid){
|
return ResultUtil.tokenErr();
|
}
|
String format = String.format("uid=%s&payType=%s&language=%s", uid, payType, language);
|
String key = MD5Util.encrypt(format);
|
String value = redisUtil.getValue(key);
|
if(ToolUtil.isNotEmpty(value) && (System.currentTimeMillis() - Long.valueOf(value)) <= 1000){
|
return ResultUtil.error(language == 1 ? "请勿重复操作" : language == 2 ? "Don't repeat the operation" : "Ne répétez pas l’opération");
|
}
|
redisUtil.setStrValue(key, System.currentTimeMillis() + "", 5);
|
return settlementRecordService.paymentSettlementAmount(uid, payType, bankCardId, language);
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
}
|
|
|
|
@ResponseBody
|
@PostMapping("/api/settlementRecord/queryHistoricalSettlement")
|
@ApiOperation(value = "获取结算历史记录【2.0】", tags = {"司机端-个人中心"}, notes = "")
|
@ApiImplicitParams({
|
@ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
|
@ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
|
@ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
|
})
|
public ResultUtil<List<QueryHistoricalSettlement>> queryHistoricalSettlement(Integer language, Integer pageNum, Integer size, HttpServletRequest request){
|
try {
|
Integer uid = driverService.getUserIdFormRedis(request);
|
if(null == uid){
|
return ResultUtil.tokenErr();
|
}
|
List<QueryHistoricalSettlement> queryHistoricalSettlements = settlementRecordService.queryHistoricalSettlement(language, uid, pageNum, size);
|
return ResultUtil.success(queryHistoricalSettlements);
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
}
|
|
|
|
@ResponseBody
|
@PostMapping("/api/settlementRecord/needToSettle")
|
@ApiOperation(value = "判断司机是否需要结算费用", tags = {"司机端-首页"}, notes = "")
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
|
})
|
public ResultUtil<Boolean> needToSettle(HttpServletRequest request){
|
try {
|
Integer uid = driverService.getUserIdFormRedis(request);
|
if(null == uid){
|
return ResultUtil.tokenErr();
|
}
|
boolean b = settlementRecordService.needToSettle(uid);
|
return ResultUtil.success(b);
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
}
|
|
|
|
|
|
|
|
/**
|
* 结算线上支付回调
|
* @param callbackRequest
|
* @return
|
*/
|
@ResponseBody
|
@PostMapping("/base/settlementRecord/paymentSettlementAmountCallback")
|
public CallbackResponse paymentSettlementAmountCallback(@RequestBody CallbackRequest callbackRequest){
|
log.info("结算支付回调结果:{}", JSON.toJSONString(callbackRequest));
|
CallbackResponse callbackResponse = new CallbackResponse();
|
try {
|
/**
|
* 指示服务是否成功或付费的总体请求代码。。
|
* 177-部分付费请求
|
* 178-表明请求已全额支付
|
* 179-表示请求已部分支付但已过期。
|
* 129-请求已过期,未付款。
|
* 180.商户拒绝请求
|
* 183-商户接受请求,我们可以结算资金
|
* 188-商户收到请求。
|
*/
|
String request_status_code = callbackRequest.getRequest_status_code();
|
String out_trade_no = callbackRequest.getMerchant_transaction_id();
|
if("177".equals(request_status_code) || "178".equals(request_status_code)){
|
Payments payments = callbackRequest.getPayments().get(0);
|
String order_id = payments.getPayer_transaction_id();
|
if(ToolUtil.isNotEmpty(out_trade_no)){
|
Integer language = Integer.valueOf(out_trade_no.substring(17, 18));
|
Integer payType = Integer.valueOf(out_trade_no.substring(18, 19));
|
Integer id = Integer.valueOf(out_trade_no.substring(19));
|
|
List<SettlementRecord> settlementRecords = settlementRecordService.selectList(new EntityWrapper<SettlementRecord>().eq("driverId", id).eq("paymentStatus", 1));
|
for (SettlementRecord settlementRecord : settlementRecords) {
|
settlementRecord.setPayType(payType);
|
settlementRecord.setPaymentStatus(2);
|
settlementRecord.setPayTime(new Date());
|
settlementRecord.setCode(order_id);
|
settlementRecordService.updateById(settlementRecord);
|
}
|
|
callbackResponse.setCheckout_request_id(order_id);
|
callbackResponse.setMerchant_transaction_id(out_trade_no);
|
callbackResponse.setStatus_code("183");
|
callbackResponse.setStatus_description("Payment processed successfully");
|
callbackResponse.setReceipt_number(UUIDUtil.getRandomCode(16));
|
}
|
}else{
|
callbackResponse.setCheckout_request_id(UUIDUtil.getRandomCode(16));
|
callbackResponse.setMerchant_transaction_id(out_trade_no);
|
callbackResponse.setStatus_code("180");
|
callbackResponse.setStatus_description("means payment rejected.");
|
callbackResponse.setReceipt_number(UUIDUtil.getRandomCode(16));
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
|
log.info("结算支付回调结果处理结束:{}", JSON.toJSONString(callbackResponse));
|
return callbackResponse;
|
}
|
}
|