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;
/**
*
* 剧本管理 服务实现类
*
*
* @author xiaochen
* @since 2024-02-29
*/
@Service
public class TScriptServiceImpl extends ServiceImpl implements TScriptService {
@Autowired
private TOrderMapper orderMapper;
@Resource
private PayMoneyUtil payMoneyUtil;
@Override
public PageInfo pageList(TScriptQuery query,List ids) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.pageList(query,pageInfo,ids);
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public ApiResult pay(ScriptPayDto scriptPayDto,Long userId) throws Exception {
//判断当前用户是否购买
List 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