package com.hollywood.applet.service.impl;
|
import java.io.PrintWriter;
|
import java.time.LocalDateTime;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.hollywood.applet.dto.ScriptPayDto;
|
import com.hollywood.applet.dto.TScriptQuery;
|
import com.hollywood.applet.dto.TScriptVO;
|
import com.hollywood.applet.mapper.TOrderMapper;
|
import com.hollywood.applet.mapper.TScriptMapper;
|
import com.hollywood.applet.mapper.TUserMapper;
|
import com.hollywood.applet.service.TOrderService;
|
import com.hollywood.applet.service.TScriptService;
|
import com.hollywood.common.basic.ApiResult;
|
import com.hollywood.common.basic.PageInfo;
|
import com.hollywood.common.exception.ServiceException;
|
import com.hollywood.common.model.TOrder;
|
import com.hollywood.common.model.TScript;
|
import com.hollywood.common.model.TUser;
|
import com.hollywood.common.utils.PayMoneyUtil;
|
import com.hollywood.common.utils.UUIDUtil;
|
import io.swagger.annotations.Api;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import sun.font.Script;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* <p>
|
* 剧本管理 服务实现类
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2024-02-29
|
*/
|
@Service
|
public class TScriptServiceImpl extends ServiceImpl<TScriptMapper, TScript> implements TScriptService {
|
|
@Autowired
|
private TOrderMapper orderMapper;
|
|
@Resource
|
private PayMoneyUtil payMoneyUtil;
|
@Override
|
public PageInfo<TScriptVO> pageList(TScriptQuery query,List<Long> ids) {
|
PageInfo<TScriptVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
|
List<TScriptVO> list = this.baseMapper.pageList(query,pageInfo,ids);
|
pageInfo.setRecords(list);
|
return pageInfo;
|
}
|
|
@Override
|
public ApiResult pay(ScriptPayDto scriptPayDto,Long userId) throws Exception {
|
//判断当前用户是否购买
|
List<TOrder> tOrders = orderMapper.selectList(Wrappers.lambdaQuery(TOrder.class).
|
eq(TOrder::getProductId, scriptPayDto.getScriptId())
|
.eq(TOrder::getProductType, 1)
|
.eq(TOrder::getIsPay, 1).eq(TOrder::getUserId,userId)
|
);
|
if (!tOrders.isEmpty()){
|
throw new ServiceException(-1,"您已购买该剧本");
|
}
|
TScript scrpt = this.baseMapper.selectById(scriptPayDto.getScriptId());
|
//进行支付操作
|
if(scriptPayDto.getPayType() == 1){//微信支付
|
return weChatPaymentScript(userId,scrpt);
|
}
|
if (scriptPayDto.getPayType()==2){
|
return aliPayScript(userId,scrpt);
|
}
|
return ApiResult.failed("请选择支付方式");
|
}
|
|
public ApiResult aliPayScript(Long userId, TScript script) throws Exception{
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
|
TOrder order = new TOrder();
|
order.setUserId(userId);
|
order.setProductType(1);
|
order.setProductName(script.getScriptName());
|
order.setProductId(script.getId());
|
order.setReleasePerson(script.getReleasePerson());
|
order.setReleasePhone(script.getReleasePhone());
|
order.setProductDeposit(script.getScriptDeposit());
|
order.setPayTime(LocalDateTime.now());
|
if (script.getScriptDeposit()==null|| script.getScriptDeposit().equals(new BigDecimal(0))){
|
order.setIsPay(1);
|
}else {
|
order.setIsPay(2);
|
}
|
order.setPayMoney(script.getScriptDeposit());
|
order.setCode(code);
|
orderMapper.insert(order);
|
ApiResult alipay = payMoneyUtil.alipay("购买剧本", "购买剧本", code, script.getScriptDeposit().toString(), "/base/script/alicallback");
|
return alipay;
|
}
|
|
@Override
|
public void wxcallback(String code, String transaction_id) {
|
try {
|
|
TOrder order = orderMapper.selectOne(Wrappers.lambdaQuery(TOrder.class).eq(TOrder::getCode, code));
|
if(order.getIsPay() == 1){
|
order.setIsPay(2);
|
order.setOrderNum(transaction_id);
|
orderMapper.updateById(order);
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
@Resource
|
private TUserMapper userMapper;
|
@Override
|
public void alicallback(String code, String tradeNo) {
|
try {
|
TOrder order = orderMapper.selectOne(Wrappers.lambdaQuery(TOrder.class).eq(TOrder::getCode, code));
|
if(order.getIsPay() == 2){
|
order.setIsPay(1);
|
order.setOrderNum(tradeNo);
|
orderMapper.updateById(order);
|
|
TUser byId = userMapper.selectById(order.getUserId());
|
byId.setHasPay(byId.getHasPay()==null? order.getPayMoney() :byId.getHasPay().add(order.getPayMoney()));
|
userMapper.updateById(byId);
|
|
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
|
public ApiResult weChatPaymentScript(Long userId, TScript script) throws Exception{
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
|
TOrder order = new TOrder();
|
order.setUserId(userId);
|
order.setProductType(1);
|
order.setProductName(script.getScriptName());
|
order.setProductId(script.getId());
|
order.setReleasePerson(script.getReleasePerson());
|
order.setReleasePhone(script.getReleasePhone());
|
order.setProductDeposit(script.getScriptDeposit());
|
order.setPayTime(LocalDateTime.now());
|
if (script.getScriptDeposit()==null|| script.getScriptDeposit().equals(new BigDecimal(0))){
|
order.setIsPay(2);
|
}else {
|
order.setIsPay(1);
|
}
|
|
order.setPayMoney(script.getScriptDeposit());
|
order.setCode(code);
|
orderMapper.insert(order);
|
|
|
ApiResult weixinpay = payMoneyUtil.weixinpay("购买剧本", "", code, script.getScriptDeposit().toString(), "/base/script/callback", "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);
|
TOrder order1 = orderMapper.selectById(order.getId());
|
|
if(order1.getIsPay() == 2){
|
break;
|
}
|
ApiResult<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
|
if(resultUtil.getCode() == 200 && order1.getIsPay() == 1){
|
/**
|
* 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)){
|
wxcallback(code,transaction_id);
|
break;
|
}
|
if("USERPAYING".equals(s)){
|
num++;
|
}
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
}).start();
|
}
|
return weixinpay;
|
}
|
}
|