|
|
@@ -0,0 +1,273 @@
|
|
|
+package com.jeesite.modules.report.service;
|
|
|
+
|
|
|
+import com.jeesite.common.constant.Constants;
|
|
|
+import com.jeesite.common.entity.Page;
|
|
|
+import com.jeesite.common.lang.DateUtils;
|
|
|
+import com.jeesite.common.lang.StringUtils;
|
|
|
+import com.jeesite.common.service.CrudService;
|
|
|
+import com.jeesite.modules.report.dao.ResearchReportDao;
|
|
|
+import com.jeesite.modules.report.dao.WebsiteUserResearchOrderDao;
|
|
|
+import com.jeesite.modules.report.entity.ResearchReport;
|
|
|
+import com.jeesite.modules.report.entity.WebsiteUserResearchOrder;
|
|
|
+import com.jeesite.modules.report.exception.CommonExceptionEnum;
|
|
|
+import com.jeesite.modules.sys.utils.R;
|
|
|
+import com.jeesite.modules.sys.utils.RedisUtil;
|
|
|
+import com.paypal.orders.Order;
|
|
|
+import org.springframework.scheduling.annotation.Scheduled;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Random;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 研究报告订单Service
|
|
|
+ * @author gmj
|
|
|
+ * @version 2025-05-26
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class WebsiteUserResearchOrderService extends CrudService<WebsiteUserResearchOrderDao, WebsiteUserResearchOrder> {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private PaypalPayService paypalPayService;
|
|
|
+ @Resource
|
|
|
+ private RedisUtil redisUtil;
|
|
|
+ @Resource
|
|
|
+ private ResearchReportDao researchReportDao;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取单条数据
|
|
|
+ * @param websiteUserResearchOrder
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public WebsiteUserResearchOrder get(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ return super.get(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询分页数据
|
|
|
+ * @param websiteUserResearchOrder 查询条件
|
|
|
+ * @param websiteUserResearchOrder.page 分页对象
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Page<WebsiteUserResearchOrder> findPage(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ int pageSize = websiteUserResearchOrder.getPageSize();
|
|
|
+ Page<WebsiteUserResearchOrder> page = super.findPage(websiteUserResearchOrder);
|
|
|
+ page.setList(page.getList().stream().map(w -> convert(w)).collect(Collectors.toList()));
|
|
|
+ long total = super.findCount(websiteUserResearchOrder);
|
|
|
+ long count = total / pageSize;
|
|
|
+ if(total % pageSize > 0){
|
|
|
+ count = count +1;
|
|
|
+ }
|
|
|
+ page.setCount(count);
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ private WebsiteUserResearchOrder convert(WebsiteUserResearchOrder w) {
|
|
|
+ if (StringUtils.isEmpty(w.getResearchReportId())) {
|
|
|
+ return w;
|
|
|
+ }
|
|
|
+ ResearchReport researchReport = researchReportDao.findTitleById(w.getResearchReportId());
|
|
|
+ if (researchReport != null) {
|
|
|
+ w.setResearchReportTitle(researchReport.getTitle());
|
|
|
+ w.setResearchReportFileName(researchReport.getFileName());
|
|
|
+ }
|
|
|
+ if (w.getPayStatus().equals(Constants.orderPayStatus.WAIT)) {
|
|
|
+ w.setOrderPayUrl((String)redisUtil.get(Constants.WEBSITE_RESEARCH_ORDER_URL + w.getId()));
|
|
|
+ }
|
|
|
+ return w;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询列表数据
|
|
|
+ * @param websiteUserResearchOrder
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<WebsiteUserResearchOrder> findList(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ return super.findList(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存数据(插入或更新)
|
|
|
+ * @param websiteUserResearchOrder
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void save(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ super.save(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新状态
|
|
|
+ * @param websiteUserResearchOrder
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void updateStatus(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ super.updateStatus(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除数据
|
|
|
+ * @param websiteUserResearchOrder
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void delete(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ super.delete(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ public WebsiteUserResearchOrder getOne(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ return dao.getByEntity(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ public R<WebsiteUserResearchOrder> saveAndPay(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ websiteUserResearchOrder.setOrderNumber(generateOrderNumber());
|
|
|
+ websiteUserResearchOrder.setPayStatus(Constants.orderPayStatus.WAIT);
|
|
|
+ //查询订单号是否重复
|
|
|
+ WebsiteUserResearchOrder findOrder = dao.findByOrderNumber(websiteUserResearchOrder.getOrderNumber());
|
|
|
+ if (findOrder != null) {
|
|
|
+ return R.fail(CommonExceptionEnum.SYSTEM_ERROR.getCode(), CommonExceptionEnum.SYSTEM_ERROR.getMsg());
|
|
|
+ }
|
|
|
+ String payResult = null;
|
|
|
+ try {
|
|
|
+ payResult = paypalPayService.pay(websiteUserResearchOrder);
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("paypal saveAndPay error", e);
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(payResult)) {
|
|
|
+ return R.fail(CommonExceptionEnum.PAY_ERROR.getCode(), CommonExceptionEnum.PAY_ERROR.getMsg());
|
|
|
+ }
|
|
|
+ super.save(websiteUserResearchOrder);
|
|
|
+ redisUtil.set(Constants.WEBSITE_RESEARCH_ORDER_URL + websiteUserResearchOrder.getId(), payResult);
|
|
|
+ redisUtil.expire(Constants.WEBSITE_RESEARCH_ORDER_URL + websiteUserResearchOrder.getId(), 1800);
|
|
|
+ websiteUserResearchOrder.setOrderPayUrl(payResult);
|
|
|
+ return R.ok(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ public String payAsyncNotify(String thirdTraceId) {
|
|
|
+ try {
|
|
|
+ WebsiteUserResearchOrder where = new WebsiteUserResearchOrder();
|
|
|
+ where.setThirdTraceId(thirdTraceId);
|
|
|
+ where.setPayStatus(Constants.orderPayStatus.WAIT);
|
|
|
+ WebsiteUserResearchOrder websiteUserResearchOrder = dao.getByEntity(where);
|
|
|
+ if (websiteUserResearchOrder == null) {
|
|
|
+ logger.error("payAsyncNotify error {}订单不存在未支付", thirdTraceId);
|
|
|
+ } else {
|
|
|
+ return capturePayment(websiteUserResearchOrder);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("payAsyncNotify error {}", e);
|
|
|
+ }
|
|
|
+ return "failure";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String capturePayment(WebsiteUserResearchOrder websiteUserResearchOrder) throws Exception {
|
|
|
+ //执行扣款
|
|
|
+ BigDecimal total_amount = paypalPayService.capturePayment(websiteUserResearchOrder.getThirdTraceId());
|
|
|
+ if (total_amount.compareTo(websiteUserResearchOrder.getPayPrice()) != 0) {
|
|
|
+ logger.error("payAsyncNotify amount不相等 {} {}", total_amount, websiteUserResearchOrder.getPayPrice().toString());
|
|
|
+ return "failure";
|
|
|
+ }
|
|
|
+ websiteUserResearchOrder.setPayStatus(Constants.orderPayStatus.PAY_SUCCESS);
|
|
|
+ websiteUserResearchOrder.setPayDate(new Date());
|
|
|
+ super.update(websiteUserResearchOrder);
|
|
|
+ return "success";
|
|
|
+ }
|
|
|
+
|
|
|
+ //定时任务会调用此方法
|
|
|
+ @Scheduled(cron ="0 0/5 * * * ?")
|
|
|
+ public void payPalPayQuery() {
|
|
|
+ WebsiteUserResearchOrder where = new WebsiteUserResearchOrder();
|
|
|
+ where.setPayMethodList(Arrays.asList(Constants.researchOrderPayMethod.PAYPAL));
|
|
|
+ where.setPayStatus(Constants.orderPayStatus.WAIT);
|
|
|
+ List<WebsiteUserResearchOrder> list = dao.findOrderList(where);
|
|
|
+ for (WebsiteUserResearchOrder order : list) {
|
|
|
+ //查订单状态
|
|
|
+ try {
|
|
|
+ Order payQuery = paypalPayService.payQuery(order.getThirdTraceId());
|
|
|
+ if (payQuery != null && "APPROVED".equals(payQuery.status())) {
|
|
|
+ //批准但是未执行扣款
|
|
|
+ capturePayment(order);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //查是否超时
|
|
|
+ if (DateUtils.getMinDistanceOfTwoDate(order.getCreateDate(), new Date()) > 30) {
|
|
|
+ order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
|
|
|
+ super.update(order);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("payPalPayQuery payQuery error", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void refundOrder(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ WebsiteUserResearchOrder order = get(websiteUserResearchOrder);
|
|
|
+ logger.info("refundOrder ===>{}", websiteUserResearchOrder.getId());
|
|
|
+ if (!websiteUserResearchOrder.getOrderPayUrl().equals(Constants.WEBSITE_RESEARCH_ORDER_URL)) {
|
|
|
+ logger.error("refundOrder not ===>{}", websiteUserResearchOrder.getOrderPayUrl());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!order.getPayStatus().equals(Constants.orderPayStatus.PAY_SUCCESS)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ paypalPayService.refund(order.getThirdTraceId(), order.getPayPrice());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("paypal refund error", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public String generateOrderNumber() {
|
|
|
+ String random = String.valueOf(new Random().nextInt(9000) + 1000);
|
|
|
+ return "WURO" + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + random;
|
|
|
+ }
|
|
|
+
|
|
|
+ public R<String> cancelOrder(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ if (websiteUserResearchOrder.getId() == null) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NULL.getCode(), CommonExceptionEnum.ORDER_NULL.getMsg());
|
|
|
+ }
|
|
|
+ WebsiteUserResearchOrder order = get(websiteUserResearchOrder);
|
|
|
+ if (order == null) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NULL.getCode(), CommonExceptionEnum.ORDER_NULL.getMsg());
|
|
|
+ }
|
|
|
+ if (!order.getPayStatus().equals(Constants.orderPayStatus.WAIT)) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NOT_UNPAID.getCode(), CommonExceptionEnum.ORDER_NOT_UNPAID.getMsg());
|
|
|
+ }
|
|
|
+ //订单关闭成功
|
|
|
+ order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
|
|
|
+ super.update(order);
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ public R<String> updateEmail(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ if (websiteUserResearchOrder.getId() == null) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NULL.getCode(), CommonExceptionEnum.ORDER_NULL.getMsg());
|
|
|
+ }
|
|
|
+ WebsiteUserResearchOrder order = get(websiteUserResearchOrder);
|
|
|
+ if (order == null) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NULL.getCode(), CommonExceptionEnum.ORDER_NULL.getMsg());
|
|
|
+ }
|
|
|
+ if (!order.getPayStatus().equals(Constants.orderPayStatus.PAY_SUCCESS)) {
|
|
|
+ return R.fail(CommonExceptionEnum.ORDER_NOT_PAID.getCode(), CommonExceptionEnum.ORDER_NOT_PAID.getMsg());
|
|
|
+ }
|
|
|
+ order.setEmail(websiteUserResearchOrder.getEmail());
|
|
|
+ super.update(order);
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ public Page<WebsiteUserResearchOrder> findOrderPage(WebsiteUserResearchOrder websiteUserResearchOrder) {
|
|
|
+ Page<WebsiteUserResearchOrder> page = super.findPage(websiteUserResearchOrder);
|
|
|
+ page.setList(page.getList().stream().map(w -> convert(w)).collect(Collectors.toList()));
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+}
|