package com.ruoyi.web.controller.api;
import cn.hutool.http.HttpException;
import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.query.GeneratedQuery;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.TAppUserService;
import com.ruoyi.system.service.TGeneratedRecordsService;
import com.ruoyi.system.service.TOrderService;
import com.ruoyi.system.service.impl.SysConfigServiceImpl;
import com.ruoyi.system.vx.WeChatConfig;
import com.ruoyi.system.vx.WeChatUtil;
import com.ruoyi.web.controller.query.PayDto;
import com.ruoyi.web.controller.tool.AlipayTradePagePay;
import com.ruoyi.web.controller.tool.AlipayTradeQuery;
import com.ruoyi.web.controller.tool.WordUtil;
import com.wechat.pay.java.core.exception.MalformedMessageException;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.service.partnerpayments.app.model.PrepayResponse;
import com.wechat.pay.java.service.payments.nativepay.NativePayService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.util.*;
/**
*
* 用户生成记录 前端控制器
*
*
* @author luodangjia
* @since 2024-09-19
*/
@RestController
@RequestMapping("/t-generated-records")
public class TGeneratedRecordsController {
@Resource
private TGeneratedRecordsService generatedRecordsService;
@Resource
private WordUtil wordUtil;
@Resource
private TokenService tokenService;
@Resource
private TOrderService orderService;
@Resource
private WeChatConfig weChatConfig;
@Resource
private NativePayService nativePayService;
@Resource
private SysConfigMapper sysConfigMapper;
@Resource
private TAppUserService appUserService;
//列表
@ApiOperation(value = "查询",tags = "后台-用户生成数据")
@PostMapping("/list")
public R> list(@RequestBody GeneratedQuery generatedQuery, HttpServletResponse response){
return generatedRecordsService.pageQuery(generatedQuery);
}
//详情
@ApiOperation(value = "详情",tags = "后台-用户生成数据")
@PostMapping("/detail")
public R detail(Long id){
TGeneratedRecords generatedRecords = generatedRecordsService.getById(id);
TAppUser appUser = appUserService.getById(generatedRecords.getUserId());
if(Objects.nonNull(appUser)){
generatedRecords.setAvatar(appUser.getAvatar());
generatedRecords.setUserPhone(appUser.getPhone());
generatedRecords.setUserName(appUser.getName());
}
return R.ok(generatedRecords);
}
@ApiOperation(value = "检查当前用户是否付费",tags = {"web-职称工作总结"})
@PostMapping("/pay/check")
public R check() {
Long userId = tokenService.getLoginUser().getUserId();
List list = orderService.lambdaQuery().eq(TOrder::getGoodType, 3).eq(TOrder::getPaymentStatus,2).eq(TOrder::getUserId, userId).list();
if (list.isEmpty()){
return R.ok(false);
}else {
return R.ok(true);
}
}
@ApiOperation(value = "删除",tags = "后台-用户生成数据")
@PostMapping("/delete")
public R delete(String id){
String[] split = id.split(",");
for (String s : split) {
generatedRecordsService.removeById(s);
}
return R.ok();
}
@ApiOperation(value = "设置价格",tags = "后台-用户生成数据")
@PostMapping("/price/set")
public R priceset(String payMoney){
SysConfig sysConfig = sysConfigMapper.selectConfigById(6L);
sysConfig.setConfigValue(payMoney);
sysConfigMapper.updateConfig(sysConfig);
return R.ok();
}
@ApiOperation(value = "获取当前价格",tags = "后台-用户生成数据")
@PostMapping("/price/get")
public R priceget(){
SysConfig sysConfig = sysConfigMapper.selectConfigById(6L);
return R.ok(sysConfig.getConfigValue());
}
@ApiOperation(value = "生成订单",tags = {"web-职称工作总结"})
@PostMapping(value = "/create")
public R buy() throws AlipayApiException {
Long userId = tokenService.getLoginUser().getUserId();
SysConfig sysConfig = sysConfigMapper.selectConfigById(6L);
BigDecimal payMoney = new BigDecimal(sysConfig.getConfigValue());
String code = "SC" + WeChatUtil.generateTradeNumber();
TOrder order = new TOrder();
order.setCode(code);
order.setUserId(userId);
order.setGoodType(3);
// order.setGoodId(id);
order.setOrderAmount(payMoney);
order.setPaymentAmount(payMoney);
order.setPaymentStatus(1);
orderService.save(order);
return R.ok(order.getId());
}
@ApiOperation(value = "购买",tags = {"web-职称工作总结"})
@PostMapping(value = "/buy")
public R buy(@RequestParam Integer type, @RequestParam Long orderId) throws AlipayApiException {
TOrder byId = orderService.getById(orderId);
SysConfig sysConfig = sysConfigMapper.selectConfigById(6L);
BigDecimal payMoney = new BigDecimal(sysConfig.getConfigValue());
if (type == 1) {
Long userId = tokenService.getLoginUser().getUserId();
com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest prepayRequest = new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest();
prepayRequest.setAppid(weChatConfig.appId);
prepayRequest.setMchid(weChatConfig.merchantId);
prepayRequest.setOutTradeNo(byId.getCode());
prepayRequest.setDescription("生成工作总结");
prepayRequest.setNotifyUrl("https://0ifzoxq2516g.guyubao.com/call-back/buy");
com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
amount.setTotal(payMoney.multiply(BigDecimal.valueOf(100)).intValue());
prepayRequest.setAmount(amount);
// 调用下单方法,得到应答
PrepayResponse response;
try {
com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse prepay = nativePayService.prepay(prepayRequest);
//预支付成功,创建预支付订单
PayDto payDto = new PayDto();
payDto.setOrderId(orderId);
payDto.setQrCode(prepay.getCodeUrl());
return R.ok(payDto);
} catch (HttpException e) { // 发送HTTP请求失败
// log.error("发送HTTP请求失败: {}", e.getHttpRequest());
} catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
// log.error("服务返回状态异常: {}", e.getResponseBody());
} catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败
// log.error("返回体类型不合法: {}", e.getMessage());
} catch (Exception e) {
// log.error("预下单异常: {}", e.getMessage());
}
return null;
} else {
String qrCode = AlipayTradePagePay.pay("生成工作总结",byId.getCode(),payMoney.toString());
//预支付成功,创建预支付订单
PayDto payDto = new PayDto();
payDto.setOrderId(orderId);
payDto.setQrCode(qrCode);
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);
Boolean check = AlipayTradeQuery.check(byId.getCode());
if (check){
byId.setPaymentStatus(2);
byId.setPaymentType(2);
byId.setPayTime(LocalDateTime.now());
orderService.updateById(byId);
}else {
num++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return R.ok(payDto);
}
}
@ApiOperation(value = "生成",tags = {"后台-用户生成数据","web-职称工作总结"})
@PostMapping("/set")
public R set(@RequestBody TGeneratedRecords generatedRecords,HttpServletResponse response){
Long userId = tokenService.getLoginUser().getUserId();
Map templateParam = new HashMap<>(5);
templateParam.put("name", generatedRecords.getGenerateName());
templateParam.put("age", calculateAge(generatedRecords.getGenerateBirthday()));
templateParam.put("generateEducation", generatedRecords.getGenerateEducation());
templateParam.put("generateUniversity", generatedRecords.getGenerateUniversity());
templateParam.put("generateUniversityMajor", generatedRecords.getGenerateUniversityMajor());
templateParam.put("workUnit", generatedRecords.getWorkUnit());
templateParam.put("workContent", generatedRecords.getWorkContent());
templateParam.put("generateUniversityComplete", generatedRecords.getGenerateUniversityComplete());
templateParam.put("level", generatedRecords.getTechnicalName());
templateParam.put("technicalName", generatedRecords.getTechnicalName());
templateParam.put("majorName", generatedRecords.getMajorName());
templateParam.put("certificate", generatedRecords.getCertificate());
templateParam.put("mainWork", generatedRecords.getMainWork());
generatedRecords.setId(null);
generatedRecords.setUserId(userId);
generatedRecordsService.save(generatedRecords);
// wordUtil.generate(response, "/templates", "专业技术工作总结.xml", templateParam, "测试动态列表Word");
if (generatedRecords.getType()==1) {
String url = wordUtil.generate("/templates", "专业技术工作总结.xml", templateParam, "专业技术工作总结", "F:\\");
return R.ok(url);
}else {
String url = wordUtil.generatePdf("/templates", "专业技术工作总结.xml", templateParam, "专业技术工作总结", "F:\\");
return R.ok(url);
}
}
@ApiOperation(value = "后台生成",tags = {"后台-用户生成数据","web-职称工作总结"})
@PostMapping("/manage/set")
public R manageset(@RequestBody TGeneratedRecords generatedRecords,HttpServletResponse response){
Map templateParam = new HashMap<>(5);
templateParam.put("name", generatedRecords.getGenerateName());
templateParam.put("age", calculateAge(generatedRecords.getGenerateBirthday()));
templateParam.put("generateEducation", generatedRecords.getGenerateEducation());
templateParam.put("generateUniversity", generatedRecords.getGenerateUniversity());
templateParam.put("generateUniversityMajor", generatedRecords.getGenerateUniversityMajor());
templateParam.put("workUnit", generatedRecords.getWorkUnit());
templateParam.put("workContent", generatedRecords.getWorkContent());
templateParam.put("generateUniversityComplete", generatedRecords.getGenerateUniversityComplete());
templateParam.put("level", generatedRecords.getLevel());
templateParam.put("technicalName", generatedRecords.getTechnicalName());
templateParam.put("majorName", generatedRecords.getMajorName());
templateParam.put("certificate", generatedRecords.getCertificate());
templateParam.put("mainWork", generatedRecords.getMainWork());
// wordUtil.generate(response, "/templates", "专业技术工作总结.xml", templateParam, "测试动态列表Word");
if (generatedRecords.getType()==1) {
String url = wordUtil.generate("/templates", "专业技术工作总结.xml", templateParam, "专业技术工作总结", "F:\\");
return R.ok(url);
}else {
String url = wordUtil.generatePdf("/templates", "专业技术工作总结.xml", templateParam, "专业技术工作总结", "F:\\");
return R.ok(url);
}
}
public int calculateAge(LocalDate generateBirthday) {
if (generateBirthday == null) {
return 0;
}
LocalDate now = LocalDate.now();
return Period.between(generateBirthday, now).getYears();
}
}