guomengjiao месяцев назад: 5
Родитель
Сommit
51c6f6877a

+ 16 - 18
.idea/workspace.xml

@@ -29,19 +29,17 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="fc9366aa-6566-4981-8149-d75e02f8e884" name="默认的" comment="支付宝移动端支付">
-      <change afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WxPayService.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/util/WxPayUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WxPayH5Service.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/common/src/main/java/com/jeesite/common/lang/DateUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/common/src/main/java/com/jeesite/common/lang/DateUtils.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/dao/WebsiteUserOrderDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/dao/WebsiteUserOrderDao.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/entity/ResearchBriefReport.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/entity/ResearchBriefReport.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/entity/WebsiteUserOrder.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/entity/WebsiteUserOrder.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportService.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportService.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/WebsiteUserOrderDao.xml" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/WebsiteUserOrderDao.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/web/src/main/resources/config/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/main/resources/config/application.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WxPayService.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WxPayService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/util/WxPayUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/util/WxPayUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportDao.xml" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportDao.xml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -121,11 +119,11 @@
       <recent name="D:\Git\xiangxi\bjfl_web\modules\basedata\src\main\resources\mappings\modules\basedata" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.jeesite.modules.report.service" />
       <recent name="com.jeesite.modules.report.util" />
       <recent name="com.jeesite.modules.sys.utils" />
       <recent name="com.jeesite.modules.bjflapi.report" />
       <recent name="com.jeesite.modules.report.dto" />
-      <recent name="com.jeesite.modules.config.web.interceptor" />
     </key>
   </component>
   <component name="RunAnythingCache">
@@ -143,7 +141,7 @@
       <visibility group="运行配置" flag="true" />
     </myKeys>
   </component>
-  <component name="RunManager" selected="Spring Boot.Application">
+  <component name="RunManager" selected="Application.DateUtils">
     <configuration name="DateUtils" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <option name="MAIN_CLASS_NAME" value="com.jeesite.common.lang.DateUtils" />
       <module name="jeesite-common" />
@@ -466,14 +464,7 @@
       <workItem from="1734579234738" duration="258000" />
       <workItem from="1734579502121" duration="1272000" />
       <workItem from="1734658594781" duration="126472000" />
-      <workItem from="1735184825354" duration="32164000" />
-    </task>
-    <task id="LOCAL-00005" summary="1">
-      <created>1681120811577</created>
-      <option name="number" value="00005" />
-      <option name="presentableId" value="LOCAL-00005" />
-      <option name="project" value="LOCAL" />
-      <updated>1681120811577</updated>
+      <workItem from="1735184825354" duration="38941000" />
     </task>
     <task id="LOCAL-00006" summary="2">
       <created>1681120889544</created>
@@ -811,7 +802,14 @@
       <option name="project" value="LOCAL" />
       <updated>1735271679159</updated>
     </task>
-    <option name="localTasksCounter" value="54" />
+    <task id="LOCAL-00054" summary="支付宝移动端支付">
+      <created>1735287227064</created>
+      <option name="number" value="00054" />
+      <option name="presentableId" value="LOCAL-00054" />
+      <option name="project" value="LOCAL" />
+      <updated>1735287227064</updated>
+    </task>
+    <option name="localTasksCounter" value="55" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -903,7 +901,7 @@
         </line-breakpoint>
         <line-breakpoint enabled="true" type="java-line">
           <url>file://$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java</url>
-          <line>65</line>
+          <line>71</line>
           <option name="timeStamp" value="50" />
         </line-breakpoint>
       </breakpoints>

+ 22 - 0
common/src/main/java/com/jeesite/common/lang/DateUtils.java

@@ -9,6 +9,8 @@ import org.apache.commons.lang3.time.FastDateFormat;
 
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -345,7 +347,27 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 		return new Date[]{beginDate, endDate};
 	}
 
+	public static String addISOMinZoned(int min) {
+		// 获取当前时间
+		ZonedDateTime now = ZonedDateTime.now();
+		// 当前时间加分钟
+		ZonedDateTime plusTenMinutes = now.plusMinutes(min);
+		// 定义输出格式
+		DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+		// 按照格式输出
+		String formatted = plusTenMinutes.format(formatter);
+		return formatted;
+	}
+
+	public static Date parseDateISOByFormat(String str) {
+		DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+		ZonedDateTime zonedDateTime = ZonedDateTime.parse(str, formatter);
+		// 转换为 java.util.Date
+		return Date.from(zonedDateTime.toInstant());
+	}
+
 //	public static void main(String[] args) throws ParseException {
+//
 //	}
 	
 }

+ 2 - 2
modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java

@@ -44,9 +44,9 @@ public class ResearchBriefReportControllerApi {
      */
     @PostMapping(value = "/categoryList")
     @ApiOperation(value = "简报智库", notes = "简报智库类别")
-    public R<List<ResearchBriefReportLabel>> categoryList(String parentId) {
+    public R<List<ResearchBriefReportLabel>> categoryList(ResearchBriefReportLabel label) {
         // 分类
-        return R.ok(researchBriefReportService.marketTypeList(parentId));
+        return R.ok(researchBriefReportService.marketTypeList(label.getParentId()));
     }
 
     /**

+ 2 - 2
modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java

@@ -124,7 +124,7 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
 
     @WebsiteAuth
     @PostMapping(value = "payOrder")
-    public R<String> payOrder(WebsiteUserOrder websiteUserOrder) throws Exception {
+    public R<String> payOrder(HttpServletRequest request, WebsiteUserOrder websiteUserOrder) throws Exception {
         String userId = getUserIdByRequest();
         String reportId = websiteUserOrder.getResearchBriefReportId();
         if (StringUtils.isEmpty(reportId)) {
@@ -158,7 +158,7 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
                 return R.fail("简报存在支付订单,无法重复支付");
             }
         }
-        return websiteUserOrderService.saveAndPay(userId, payMethod, researchBriefReport);
+        return websiteUserOrderService.saveAndPay(userId, payMethod, researchBriefReport, request);
     }
 
     /**

+ 10 - 1
modules/report/src/main/java/com/jeesite/modules/report/entity/ResearchBriefReport.java

@@ -40,6 +40,7 @@ public class ResearchBriefReport extends DataEntity<ResearchBriefReport> {
 	private String outline;		// 概要
 	private String marketType;		// 所属分类
 	private String topLabelId;		// 一级标签id
+	private String secondLabelId;		// 二级标签id
 	private String useDownPay;		// 下载是否需要支付 0否 1是
 	private BigDecimal useDownPayPrice;		// 下载需要支付单价
 	private String useChoiceness; 	//是否精选 0否 1是
@@ -116,7 +117,15 @@ public class ResearchBriefReport extends DataEntity<ResearchBriefReport> {
 	public void setTopLabelId(String topLabelId) {
 		this.topLabelId = topLabelId;
 	}
-	
+
+	public String getSecondLabelId() {
+		return secondLabelId;
+	}
+
+	public void setSecondLabelId(String secondLabelId) {
+		this.secondLabelId = secondLabelId;
+	}
+
 	@Size(min=0, max=2, message="下载是否需要支付 0否 1是长度不能超过 2 个字符")
 	public String getUseDownPay() {
 		return useDownPay;

+ 1 - 0
modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportService.java

@@ -227,6 +227,7 @@ public class ResearchBriefReportService extends CrudService<ResearchBriefReportD
 			ResearchBriefReport fileObj = convertFile(r.getId(), Constants.briefReport.BRIEFING_INFO_IMAGE);
 			r.setImageFileName(fileObj.getFileName());
 			r.setFilePath(fileObj.getFilePath());
+			r.setTopLabelName(researchBriefReportLabelRelevancyDao.findNames(r.getId(), 1));
 			return r;
 		}).collect(Collectors.toList());
 	}

+ 67 - 1
modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java

@@ -16,12 +16,14 @@ import com.jeesite.modules.report.entity.WebsiteUserOrder;
 import com.jeesite.modules.report.entity.WebsiteUserOrderDown;
 import com.jeesite.modules.report.util.AlipayUtil;
 import com.jeesite.modules.sys.utils.R;
+import com.wechat.pay.java.service.payments.model.Transaction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -38,6 +40,10 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 	private WebsiteUserOrderDownDao websiteUserOrderDownDao;
 	@Resource
 	private AlipayUtil alipayUtil;
+	@Resource
+	private WxPayService wxPayService;
+	@Resource
+	private WxPayH5Service wxPayH5Service;
 
 	private static Logger logger = LoggerFactory.getLogger(WebsiteUserOrderService.class);
 	/**
@@ -122,7 +128,7 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 		super.delete(websiteUserOrder);
 	}
 
-	public R<String> saveAndPay(String userId, String payMethod, ResearchBriefReport researchBriefReport) {
+	public R<String> saveAndPay(String userId, String payMethod, ResearchBriefReport researchBriefReport, HttpServletRequest request) {
 		if (researchBriefReport == null) {
 			return R.fail("简报为空");
 		}
@@ -151,6 +157,18 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 			} catch (AlipayApiException e) {
 				return R.fail(e.getErrCode() + e.getErrMsg());
 			}
+		} else if (Constants.orderPayMethod.WX.equals(payMethod)) {
+			try {
+				payResult = wxPayService.pay(websiteUserOrder);
+			} catch (Exception e) {
+				return R.fail(e.getMessage());
+			}
+		} else if (Constants.orderPayMethod.WX_H5.equals(payMethod)) {
+			try {
+				payResult = wxPayH5Service.pay(request, websiteUserOrder);
+			} catch (Exception e) {
+				return R.fail(e.getMessage());
+			}
 		}
 		if (StringUtils.isEmpty(payResult)) {
 			return R.fail("支付调用第三方失败");
@@ -240,6 +258,54 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 		}
 	}
 
+	//定时任务会调用此方法
+//	@Scheduled(cron ="0 0/5 * * * ?")
+	public void wxPayQuery() {
+		WebsiteUserOrder where = new WebsiteUserOrder();
+		where.setPayMethodList(Arrays.asList(Constants.orderPayMethod.WX, Constants.orderPayMethod.WX_H5));
+		where.setPayStatus(Constants.orderPayStatus.WAIT);
+		List<WebsiteUserOrder> list = dao.findOrderList(where);
+		for (WebsiteUserOrder order : list) {
+			//查订单状态
+			try {
+				Transaction transaction = null;
+				if (order.getPayMethod().equals(Constants.orderPayMethod.WX)) {
+					transaction = wxPayService.payQuery(order.getOrderNumber());
+				} else if (order.getPayMethod().equals(Constants.orderPayMethod.WX_H5)) {
+					transaction = wxPayH5Service.payQuery(order.getOrderNumber());
+				}
+				if (transaction != null) {
+					if ("SUCCESS".equals(transaction.getTradeState())) {
+						order.setPayStatus(Constants.orderPayStatus.PAY_SUCCESS);
+						order.setPayDate(DateUtils.parseDateISOByFormat(transaction.getSuccessTime()));
+						super.update(order);
+						continue;
+					} else if ("CLOSED".equals(transaction.getTradeState())) {
+						order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
+						super.update(order);
+						continue;
+					}
+				}
+				//查是否超时
+				if (DateUtils.getMinDistanceOfTwoDate(order.getCreateDate(), new Date()) > 10){
+					boolean closeFlag = false;
+					if (order.getPayMethod().equals(Constants.orderPayMethod.WX)) {
+						closeFlag = wxPayService.payClose(order.getOrderNumber());
+					} else if (order.getPayMethod().equals(Constants.orderPayMethod.WX_H5)) {
+						closeFlag = wxPayH5Service.payClose(order.getOrderNumber());
+					}
+					if (closeFlag) {
+						//支付宝订单关闭成功
+						order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
+						super.update(order);
+					}
+				}
+			} catch (Exception e) {
+				logger.error("wxPayQuery payQuery error", e);
+			}
+		}
+	}
+
 	public WebsiteUserOrder getOne(WebsiteUserOrder orderWhere) {
 		return super.get(orderWhere);
 	}

+ 84 - 0
modules/report/src/main/java/com/jeesite/modules/report/service/WxPayH5Service.java

@@ -0,0 +1,84 @@
+package com.jeesite.modules.report.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.network.IpUtils;
+import com.jeesite.modules.report.entity.WebsiteUserOrder;
+import com.jeesite.modules.report.util.WxPayUtil;
+import com.wechat.pay.java.service.payments.h5.H5Service;
+import com.wechat.pay.java.service.payments.h5.model.*;
+import com.wechat.pay.java.service.payments.model.Transaction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+
+@Service
+public class WxPayH5Service {
+    private static Logger logger = LoggerFactory.getLogger(WxPayH5Service.class);
+    @Resource
+    private H5Service h5Service;
+    @Resource
+    private WxPayUtil wxPayUtil;
+
+    /**
+     * 发起支付请求
+     *
+     * @param userOrder 支付信息
+     * @return
+     */
+    public String pay(HttpServletRequest servletRequest, WebsiteUserOrder userOrder) {
+        PrepayRequest request = new PrepayRequest();
+        Amount amount = new Amount();
+        //单位为分
+        BigDecimal total = userOrder.getPayPrice().multiply(new BigDecimal("100"));
+        amount.setTotal(total.intValue());
+        request.setAmount(amount);
+        request.setAppid(wxPayUtil.appId);
+        request.setMchid(wxPayUtil.mchId);
+        request.setDescription("简报下载支付" + amount.getTotal() + "元");
+        request.setNotifyUrl(wxPayUtil.notifyUrl);
+        request.setOutTradeNo(userOrder.getOrderNumber());
+        request.setTimeExpire(DateUtils.addISOMinZoned(10));
+        //场景
+        SceneInfo sceneInfo = new SceneInfo();
+        sceneInfo.setPayerClientIp(IpUtils.getRemoteAddr(servletRequest));
+        H5Info h5Info = new H5Info();
+        h5Info.setType("Wap");
+        sceneInfo.setH5Info(h5Info);
+        request.setSceneInfo(sceneInfo);
+        // 调用下单方法,得到应答
+        PrepayResponse response = h5Service.prepay(request);
+        // 使用微信扫描 code_url 对应的二维码,即可体验Native支付
+        logger.info("微信h5 pay 响应:{}", JSONObject.toJSONString(response));
+        return response.getH5Url();
+    }
+
+    public Transaction payQuery(String outTradeNo) {
+        QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
+        request.setMchid(wxPayUtil.mchId);
+        request.setOutTradeNo(outTradeNo);
+        // 调用接口
+        Transaction transaction = h5Service.queryOrderByOutTradeNo(request);
+        logger.info("微信h5 payQuery 响应:{}", JSONObject.toJSONString(transaction));
+        return transaction;
+    }
+
+    public boolean payClose(String outTradeNo) {
+        try {
+            CloseOrderRequest request = new CloseOrderRequest();
+            request.setMchid(wxPayUtil.mchId);
+            request.setOutTradeNo(outTradeNo);
+            // 调用接口
+            h5Service.closeOrder(request);
+            return true;
+        } catch (Exception e) {
+            logger.error("微信h5 payClose error", e);
+        }
+        return false;
+    }
+
+}

+ 54 - 11
modules/report/src/main/java/com/jeesite/modules/report/service/WxPayService.java

@@ -1,12 +1,16 @@
 package com.jeesite.modules.report.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.jeesite.common.lang.DateUtils;
 import com.jeesite.modules.report.entity.WebsiteUserOrder;
 import com.jeesite.modules.report.util.WxPayUtil;
+import com.wechat.pay.java.service.payments.model.Transaction;
 import com.wechat.pay.java.service.payments.nativepay.NativePayService;
-import com.wechat.pay.java.service.payments.nativepay.model.Amount;
-import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest;
-import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse;
+import com.wechat.pay.java.service.payments.nativepay.model.*;
+import com.wechat.pay.java.service.refund.RefundService;
+import com.wechat.pay.java.service.refund.model.AmountReq;
+import com.wechat.pay.java.service.refund.model.CreateRequest;
+import com.wechat.pay.java.service.refund.model.Refund;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -17,10 +21,12 @@ import java.math.BigDecimal;
 @Service
 public class WxPayService {
     private static Logger logger = LoggerFactory.getLogger(WxPayService.class);
-//    @Resource
-//    private NativePayService nativePayService;
+    @Resource
+    private NativePayService nativePayService;
     @Resource
     private WxPayUtil wxPayUtil;
+    @Resource
+    private RefundService refundService;
 
     /**
      * 发起支付请求
@@ -40,12 +46,49 @@ public class WxPayService {
         request.setDescription("简报下载支付" + amount.getTotal() + "元");
         request.setNotifyUrl(wxPayUtil.notifyUrl);
         request.setOutTradeNo(userOrder.getOrderNumber());
-        //TODO
+        request.setTimeExpire(DateUtils.addISOMinZoned(10));
         // 调用下单方法,得到应答
-//        PrepayResponse response = nativePayService.prepay(request);
-//        // 使用微信扫描 code_url 对应的二维码,即可体验Native支付
-//        logger.info("微信 pay 响应:{}", JSONObject.toJSONString(response));
-//        return response.getCodeUrl();
-        return null;
+        PrepayResponse response = nativePayService.prepay(request);
+        // 使用微信扫描 code_url 对应的二维码,即可体验Native支付
+        logger.info("微信 pay 响应:{}", JSONObject.toJSONString(response));
+        return response.getCodeUrl();
+    }
+
+    public Transaction payQuery(String outTradeNo) {
+        QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
+        request.setMchid(wxPayUtil.mchId);
+        request.setOutTradeNo(outTradeNo);
+        // 调用接口
+        Transaction transaction = nativePayService.queryOrderByOutTradeNo(request);
+        logger.info("微信 payQuery 响应:{}", JSONObject.toJSONString(transaction));
+        return transaction;
+    }
+
+    public boolean payClose(String outTradeNo) {
+        try {
+            CloseOrderRequest request = new CloseOrderRequest();
+            request.setMchid(wxPayUtil.mchId);
+            request.setOutTradeNo(outTradeNo);
+            // 调用接口
+            nativePayService.closeOrder(request);
+            return true;
+        } catch (Exception e) {
+            logger.error("微信 payClose error", e);
+        }
+        return false;
+    }
+
+    public Refund refund(WebsiteUserOrder websiteUserOrder) {
+        CreateRequest request = new CreateRequest();
+        request.setOutTradeNo(websiteUserOrder.getOrderNumber());
+        AmountReq amount = new AmountReq();
+        //单位为分
+        BigDecimal total = websiteUserOrder.getPayPrice().multiply(new BigDecimal("100"));
+        amount.setTotal(total.longValue());
+        request.setAmount(amount);
+        // 调用接口
+        Refund refund = refundService.create(request);
+        logger.info("微信 refund 响应:{}", JSONObject.toJSONString(refund));
+        return refund;
     }
 }

+ 10 - 4
modules/report/src/main/java/com/jeesite/modules/report/util/WxPayUtil.java

@@ -1,11 +1,7 @@
 package com.jeesite.modules.report.util;
 
-import com.wechat.pay.java.core.Config;
-import com.wechat.pay.java.core.RSAAutoCertificateConfig;
-import com.wechat.pay.java.service.payments.nativepay.NativePayService;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 @ConfigurationProperties(prefix = "wxpay")
@@ -58,4 +54,14 @@ public class WxPayUtil {
 //    public NativePayService nativePayService(Config config) {
 //        return new NativePayService.Builder().config(config).build();
 //    }
+
+//    @Bean
+//    public RefundService refundService(Config config) {
+//        return new RefundService.Builder().config(config).build();
+//    }
+//
+//    @Bean
+//    public H5Service h5Service(Config config) {
+//        return new H5Service.Builder().config(config).build();
+//    }
 }

+ 7 - 1
modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportDao.xml

@@ -13,7 +13,7 @@
 	</select> -->
 
     <select id="findResearchBriefReportCount" resultType="java.lang.Long">
-        select count(1) from research_brief_report where status = '0'
+        select count(1) from research_brief_report br where status = '0'
         <include refid="researchBriefReport_where"/>
     </select>
 
@@ -31,6 +31,12 @@
             FROM research_brief_report_label_relevancy lr
             WHERE lr.research_brief_report_id = br.id AND lr.parent_lable_id = #{rr.topLabelId}))
         </if>
+        <if test="rr.secondLabelId != null and rr.secondLabelId != ''">
+            AND (EXISTS (
+            SELECT 1
+            FROM research_brief_report_label_relevancy lr
+            WHERE lr.research_brief_report_id = br.id AND lr.lable_id = #{rr.secondLabelId}))
+        </if>
         <if test="rr.useDownPay != null and rr.useDownPay != ''">and use_down_pay = #{rr.useDownPay}</if>
         <if test="rr.notId != null and rr.notId != ''">and id != #{rr.notId}</if>
         <if test="rr.useChoiceness != null and rr.useChoiceness != ''">and use_choiceness = #{rr.useChoiceness}</if>