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> resultUtil = payMoneyUtil.queryWXOrder(code, ""); if(resultUtil.getCode() == 200 && order1.getIsPay() == 1){ /** * SUCCESS—支付成功, * REFUND—转入退款, * NOTPAY—未支付, * CLOSED—已关闭, * REVOKED—已撤销(刷卡支付), * USERPAYING--用户支付中, * PAYERROR--支付失败(其他原因,如银行返回失败) */ Map 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; } }