浏览代码

简报功能修改

guomengjiao 9 月之前
父节点
当前提交
80bdb89dd4

+ 25 - 21
.idea/workspace.xml

@@ -28,19 +28,11 @@
     </select>
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="fc9366aa-6566-4981-8149-d75e02f8e884" name="默认的" comment="报告支付">
+    <list default="true" id="fc9366aa-6566-4981-8149-d75e02f8e884" name="默认的" comment="简报功能修改">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" 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/report/src/main/java/com/jeesite/modules/report/dao/ResearchBriefReportDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/dao/ResearchBriefReportDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/dao/ResearchBriefReportLabelDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/dao/ResearchBriefReportLabelDao.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/ResearchBriefReportLabel.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/entity/ResearchBriefReportLabel.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportLabelService.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportLabelService.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/web/ResearchBriefReportController.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportLabelController.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportLabelController.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" />
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportLabelDao.xml" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportLabelDao.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/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/java/com/jeesite/modules/report/util/AlipayUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/util/AlipayUtil.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -102,7 +94,7 @@
     <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../maintenance-support/maintenance-support-java" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../yicangzongtai/api" />
     <property name="project.structure.last.edited" value="Project" />
     <property name="project.structure.proportion" value="0.15" />
     <property name="project.structure.side.proportion" value="0.25287357" />
@@ -143,12 +135,12 @@
     </myKeys>
   </component>
   <component name="RunManager" selected="Spring Boot.Application">
-    <configuration name="AuthorizingRealm" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
-      <option name="MAIN_CLASS_NAME" value="com.jeesite.common.shiro.realm.AuthorizingRealm" />
-      <module name="jeesite-module-core" />
+    <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" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.jeesite.common.shiro.realm.*" />
+          <option name="PATTERN" value="com.jeesite.common.lang.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
@@ -229,6 +221,11 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.DateUtils" />
+      </list>
+    </recent_temporary>
   </component>
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
   <component name="TaskManager">
@@ -459,7 +456,7 @@
       <workItem from="1734268366747" duration="59000" />
       <workItem from="1734579234738" duration="258000" />
       <workItem from="1734579502121" duration="1272000" />
-      <workItem from="1734658594781" duration="113674000" />
+      <workItem from="1734658594781" duration="121906000" />
     </task>
     <task id="LOCAL-00001" summary="1">
       <created>1676368709673</created>
@@ -755,7 +752,14 @@
       <option name="project" value="LOCAL" />
       <updated>1735112174030</updated>
     </task>
-    <option name="localTasksCounter" value="43" />
+    <task id="LOCAL-00043" summary="简报功能修改">
+      <created>1735118500869</created>
+      <option name="number" value="00043" />
+      <option name="presentableId" value="LOCAL-00043" />
+      <option name="project" value="LOCAL" />
+      <updated>1735118500869</updated>
+    </task>
+    <option name="localTasksCounter" value="44" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -810,7 +814,6 @@
     </option>
   </component>
   <component name="VcsManagerConfiguration">
-    <MESSAGE value="用户信息优化" />
     <MESSAGE value="添加销量单位,价格单位" />
     <MESSAGE value="更新报告附件" />
     <MESSAGE value="更新模板配置" />
@@ -835,7 +838,8 @@
     <MESSAGE value="简报下载" />
     <MESSAGE value="报告下载" />
     <MESSAGE value="报告支付" />
-    <option name="LAST_COMMIT_MESSAGE" value="报告支付" />
+    <MESSAGE value="简报功能修改" />
+    <option name="LAST_COMMIT_MESSAGE" value="简报功能修改" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>

+ 15 - 8
common/src/main/java/com/jeesite/common/lang/DateUtils.java

@@ -208,7 +208,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 		long afterTime = after.getTime();
 		return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
 	}
-	
+
+	/**
+	 * 获取两个日期之间的分钟
+	 *
+	 * @param before
+	 * @param after
+	 * @return
+	 */
+	public static long getMinDistanceOfTwoDate(Date before, Date after) {
+		long beforeTime = before.getTime();
+		long afterTime = after.getTime();
+		return (afterTime - beforeTime) / (1000 * 60);
+	}
+
 	/**
 	 * 获取某月有几天
 	 * @param date 日期
@@ -333,13 +346,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 	}
 	
 //	public static void main(String[] args) throws ParseException {
-//		System.out.println(formatDate(parseDate("2010/3/6")));
-//		System.out.println(getDate("yyyy年MM月dd日 E"));
-//		long time = new Date().getTime()-parseDate("2012-11-19").getTime();
-//		System.out.println(time/(24*60*60*1000));
-//		System.out.println(getWeekOfYear(new Date()));
-//		System.out.println(formatDate(getOfDayFirst(parseDate("2015/3/6")),"yyyy-MM-dd HH:mm:ss.sss"));
-//		System.out.println(formatDate(getOfDayLast(parseDate("2015/6/6")),"yyyy-MM-dd HH:mm:ss.sss"));
+//		System.out.println(getMinDistanceOfTwoDate(parseDate("2024-11-12 10:00:00"), parseDate("2024-11-12 10:30:00")) > 29);
 //	}
 	
 }

+ 41 - 0
modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java

@@ -18,6 +18,7 @@ import com.jeesite.modules.report.util.AlipayUtil;
 import com.jeesite.modules.sys.utils.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -197,4 +198,44 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 		}
 		return "failure";
 	}
+
+	//定时任务会调用此方法
+	@Scheduled(cron ="0 0/5 * * * ? *")
+	public void zfbPayQuery() {
+		WebsiteUserOrder where = new WebsiteUserOrder();
+		where.setPayMethod(Constants.orderPayMethod.ZFB);
+		where.setPayStatus(Constants.orderPayStatus.WAIT);
+		List<WebsiteUserOrder> list = dao.findList(where);
+		for (WebsiteUserOrder order : list) {
+			//查订单状态
+			try {
+				String body = alipayUtil.payQuery(order.getOrderNumber());
+				if (StringUtils.isNotEmpty(body)) {
+					JSONObject jo = JSONObject.parseObject(body);
+					String trade_status = jo.getString("trade_status");
+					if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)) {
+						order.setPayStatus(Constants.orderPayStatus.PAY_SUCCESS);
+						order.setPayDate(DateUtils.parseDateByFormat(jo.getString("send_pay_date"), "yyyy-MM-dd HH:mm:ss"));
+						super.update(order);
+						continue;
+					} else if ("TRADE_CLOSED".equals(trade_status)) {
+						order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
+						super.update(order);
+						continue;
+					}
+				}
+				//查是否超时
+				if (DateUtils.getMinDistanceOfTwoDate(order.getCreateDate(), new Date()) > 30){
+					if (alipayUtil.payClose(order.getOrderNumber())) {
+						//支付宝订单关闭成功
+						order.setPayStatus(Constants.orderPayStatus.PAY_ERROR);
+						super.update(order);
+					}
+				}
+			} catch (Exception e) {
+				logger.error("zfbPayQuery payQuery error", e);
+			}
+		}
+	}
+
 }

+ 47 - 1
modules/report/src/main/java/com/jeesite/modules/report/util/AlipayUtil.java

@@ -5,8 +5,12 @@ import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.domain.AlipayTradePagePayModel;
+import com.alipay.api.request.AlipayTradeCloseRequest;
 import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.response.AlipayTradeCloseResponse;
 import com.alipay.api.response.AlipayTradePagePayResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.jeesite.modules.report.entity.WebsiteUserOrder;
 import lombok.Data;
 import org.slf4j.Logger;
@@ -90,7 +94,7 @@ public class AlipayUtil {
         alipayRequest.setBizModel(model);
         AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
         // 收到支付宝的响应,响应一个页面,浏览器显示这个页面,就会自动到支付宝的收银台页面
-        logger.info("支付宝响应:{}", JSONObject.toJSONString(response));
+        logger.info("支付宝 pay 响应:{}", JSONObject.toJSONString(response));
         if (response.isSuccess()) {
             return response.getBody();
         } else {
@@ -98,6 +102,48 @@ public class AlipayUtil {
         }
     }
 
+    public String payQuery(String outTradeNo) throws AlipayApiException {
+        // 根据支付宝的配置生成一个支付客户端
+        AlipayClient alipayClient = getAlipayClient();
+
+        // 创建一个支付请求
+        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
+        JSONObject bizContent = new JSONObject();
+        // 订单支付时传入的商户订单号,和支付宝交易号不能同时为空。trade_no,out_trade_no如果同时存在优先取trade_no
+        bizContent.put("out_trade_no", outTradeNo);
+        // 支付宝交易号,和商户订单号不能同时为空
+        //bizContent.put("trade_no", "2014112611001004680073956707");
+        alipayRequest.setBizContent(bizContent.toString());
+        AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
+        logger.info("支付宝 payQuery 响应:{}", JSONObject.toJSONString(response));
+        if (response.isSuccess()) {
+            return response.getBody();
+        } else {
+            return null;
+        }
+    }
+
+    public boolean payClose(String outTradeNo) throws AlipayApiException {
+        // 根据支付宝的配置生成一个支付客户端
+        AlipayClient alipayClient = getAlipayClient();
+
+        // 创建一个支付请求
+        AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();
+        JSONObject bizContent = new JSONObject();
+        // 该交易在支付宝系统中的交易流水号。最短 16 位,最长 64 位。和out_trade_no不能同时为空,如果同时传了 out_trade_no和 trade_no,则以 trade_no为准。
+//        bizContent.put("trade_no", "2013112611001004680073956707");
+        // 	订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 trade_no,out_trade_no如果同时存在优先取trade_no
+        bizContent.put("out_trade_no", outTradeNo);
+        alipayRequest.setBizContent(bizContent.toString());
+        AlipayTradeCloseResponse response = alipayClient.execute(alipayRequest);
+        logger.info("支付宝 payClose 响应:{}", JSONObject.toJSONString(response));
+        if(response.isSuccess()){
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     private AlipayClient getAlipayClient() {
         return new DefaultAlipayClient(gatewayUrl, app_id, app_private_key, "json", charset, alipay_public_key, sign_type);
     }

+ 2 - 0
web/src/main/java/com/jeesite/modules/Application.java

@@ -9,6 +9,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * Application
@@ -17,6 +18,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
  */
 @SpringBootApplication
 @EnableAsync
+@EnableScheduling
 public class Application extends SpringBootServletInitializer {
 
 	public static void main(String[] args) {