dcs 2 months ago
parent
commit
78027e1255

+ 2 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/Application.java

@@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @EnableFeignClients
@@ -13,6 +14,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @EnableTransactionManagement
 @MapperScan("com.bosshand.virgo.core.dao,com.bosshand.virgo.api.dao,com.bosshand.virgo.api.operate.dao,com.bosshand.virgo.api.test.dao,com.bosshand.virgo.api.workark.dao")
 @ComponentScan(basePackages = {"com.bosshand"})
+@EnableScheduling
 public class Application {
 	public static void main(String[] args) {
 		SpringApplication.run(Application.class, args);

+ 8 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/controller/ProceController.java

@@ -55,4 +55,12 @@ public class ProceController {
         return Response.ok();
     }
 
+    @ApiOperation(value = "修改状态", notes = "修改状态")
+    @RequestMapping(value = "/updateStatus/{status}/{ids}", method = RequestMethod.GET)
+    public Response updateStatus(@PathVariable int status, @PathVariable String ids) {
+        proceService.updateStatus(status, ids);
+        return Response.ok();
+    }
+
+
 }

+ 2 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/dao/ProceDao.java

@@ -14,6 +14,8 @@ public interface ProceDao {
 
     public int update(Proce proce);
 
+    public int updateStatus(Integer status, List<Long> ids);
+
     public int delete(long id);
 
     List<Proce> getList(long orderId);

+ 14 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/OrderInfo.java

@@ -59,6 +59,12 @@ public class OrderInfo {
      */
     private String codeUrl;
 
+    /**
+     * 订单二维码过期时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date codeUrlFailureTime;
+
     /**
      * 订单支付状态
      */
@@ -174,6 +180,14 @@ public class OrderInfo {
         this.codeUrl = codeUrl;
     }
 
+    public Date getCodeUrlFailureTime() {
+        return codeUrlFailureTime;
+    }
+
+    public void setCodeUrlFailureTime(Date codeUrlFailureTime) {
+        this.codeUrlFailureTime = codeUrlFailureTime;
+    }
+
     public String getOrderStatus() {
         return orderStatus;
     }

+ 13 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/Proce.java

@@ -63,6 +63,11 @@ public class Proce {
      */
     private String attachmentContent;
 
+    /**
+     * 状态
+     */
+    private Integer status;
+
     public long getId() {
         return id;
     }
@@ -166,4 +171,12 @@ public class Proce {
     public void setAttachmentContent(String attachmentContent) {
         this.attachmentContent = attachmentContent;
     }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
 }

+ 7 - 13
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/OrderInfoService.java

@@ -156,6 +156,11 @@ public class OrderInfoService {
     public void saveCodeUrl(String orderNo, String codeUrl) {
         OrderInfo orderInfo = orderInfoDao.getOrderNo(orderNo);
         orderInfo.setCodeUrl(codeUrl);
+        // 设置110分钟过期
+        Instant instant = Instant.now().minus(Duration.ofMinutes(110));
+        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
+        Date date = Date.from(zonedDateTime.toInstant());
+        orderInfo.setCodeUrlFailureTime(date);
         orderInfoDao.update(orderInfo);
     }
 
@@ -188,23 +193,12 @@ public class OrderInfoService {
     }
 
     /**
-     * 查询创建超过minutes分钟并且未支付的订单
-     * @param minutes
-     * @return
+     * 查询支付二维码到达过期时间未支付的订单
      */
-    public List<OrderInfo> getNoPayOrderByDuration(int minutes) {
-
-        Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));
-
-        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
-        Date date = Date.from(zonedDateTime.toInstant());
-
+    public List<OrderInfo> getNoPayOrderByDuration() {
         OrderInfo orderInfo = new OrderInfo();
         orderInfo.setOrderStatus(OrderStatus.NOTPAY.getType());
-        orderInfo.setCreateTime(date);
-
         List<OrderInfo> orderInfoList = orderInfoDao.selectList(orderInfo);
-
         return orderInfoList;
     }
 

+ 11 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/ProceService.java

@@ -38,6 +38,17 @@ public class ProceService {
         return proceDao.update(proce);
     }
 
+    public void updateStatus(Integer status, String ids) {
+        String[] split = ids.split(",");
+        List<Long> list = new ArrayList<>();
+        for (String id : split) {
+            list.add(Long.parseLong(id));
+        }
+        if (list.size() > 0) {
+            proceDao.updateStatus(status, list);
+        }
+    }
+
     public int delete(long id) {
         return proceDao.delete(id);
     }

+ 9 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/WxPayService.java

@@ -109,6 +109,7 @@ public class WxPayService {
             //返回二维码
             Map<String, Object> map = new HashMap<>();
             map.put("codeUrl", codeUrl);
+            map.put("codeUrlFailureTime", orderInfo.getCodeUrlFailureTime());
             map.put("orderNo", orderInfo.getOrderNo());
             map.put("base64", QrRcodeGenUtil.jumpToQRcodeGen(codeUrl));
             return map;
@@ -148,6 +149,7 @@ public class WxPayService {
         //返回二维码
         Map<String, Object> map = new HashMap<>();
         map.put("codeUrl", codeUrl);
+        map.put("codeUrlFailureTime", orderInfo.getCodeUrlFailureTime());
         map.put("orderNo", orderInfo.getOrderNo());
         map.put("base64", QrRcodeGenUtil.jumpToQRcodeGen(codeUrl));
         return map;
@@ -343,6 +345,13 @@ public class WxPayService {
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void checkOrderClosed(String orderNo) throws Exception {
+        this.closeOrder(orderNo);
+        //更新本地订单状态
+        orderInfoService.updateStatusByOrderNo(orderNo, OrderStatus.CLOSED);
+    }
+
     /**
      * 根据订单号查询微信支付查单接口,核实订单状态
      * 如果订单已支付,则更新商户端订单状态,并记录支付日志

+ 83 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/task/WxPayTask.java

@@ -0,0 +1,83 @@
+package com.bosshand.virgo.api.workark.task;
+
+import com.bosshand.virgo.api.workark.model.OrderInfo;
+import com.bosshand.virgo.api.workark.model.RefundInfo;
+import com.bosshand.virgo.api.workark.service.OrderInfoService;
+import com.bosshand.virgo.api.workark.service.RefundInfoService;
+import com.bosshand.virgo.api.workark.service.WxPayService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class WxPayTask {
+
+    private final static Log log = LogFactory.getLog(WxPayTask.class);
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private RefundInfoService refundInfoService;
+
+    /**
+     * 秒 分 时 日 月 周
+     * 以秒为例
+     * *:每秒都执行
+     * 1-3:从第1秒开始执行,到第3秒结束执行
+     * 0/3:从第0秒开始,每隔3秒执行1次
+     * 1,2,3:在指定的第1、2、3秒执行
+     * ?:不指定
+     * 日和周不能同时制定,指定其中之一,则另一个设置为?
+     */
+    //@Scheduled(cron = "0/3 * * * * ?")
+    public void task1(){
+        log.info("task1 被执行......");
+    }
+
+    /**
+     * 从第0秒开始每隔30秒执行1次,查询到二维码过期时间,并且未支付的订单
+     */
+    @Scheduled(cron = "0/30 * * * * ?")
+    public void orderConfirm() throws Exception {
+        log.info("orderConfirm 被执行......");
+
+        List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration();
+
+        for (OrderInfo orderInfo : orderInfoList) {
+            String orderNo = orderInfo.getOrderNo();
+            log.warn("超时订单 ===>"+orderNo);
+
+            //核实订单状态:调用微信支付查单接口
+            wxPayService.checkOrderClosed(orderNo);
+        }
+    }
+
+
+    /**
+     * 从第0秒开始每隔30秒执行1次,查询创建超过5分钟,并且未成功的退款单
+     */
+    //@Scheduled(cron = "0/30 * * * * ?")
+    public void refundConfirm() throws Exception {
+        log.info("refundConfirm 被执行......");
+
+        //找出申请退款超过5分钟并且未成功的退款单
+        List<RefundInfo> refundInfoList = refundInfoService.getNoRefundOrderByDuration(1);
+
+        for (RefundInfo refundInfo : refundInfoList) {
+            String refundNo = refundInfo.getRefundNo();
+            log.warn("超时未退款的退款单号 ===>"+ refundNo);
+
+            //核实订单状态:调用微信支付查询退款接口
+            wxPayService.checkRefundStatus(refundNo);
+        }
+    }
+
+}

+ 3 - 1
virgo.api/src/main/resources/mapper/OrderInfoMapper.xml

@@ -14,6 +14,7 @@
         <result column="productId" property="productId"/>
         <result column="totalFee" property="totalFee"/>
         <result column="codeUrl" property="codeUrl"/>
+        <result column="codeUrlFailureTime" property="codeUrlFailureTime"/>
         <result column="orderStatus" property="orderStatus"/>
         <result column="status" property="status"/>
         <result column="paymentType" property="paymentType"/>
@@ -37,7 +38,7 @@
     </select>
 
     <select id="selectList" resultMap="result">
-        select * from workark_orderInfo where where orderStatus = #{orderStatus} and createTime &lt; #{createTime}
+        select * from workark_orderInfo where codeUrl IS NOT NULL and orderStatus = #{orderStatus} and codeUrlFailureTime &lt; now()
     </select>
 
     <select id="getList" resultMap="result">
@@ -159,6 +160,7 @@
         <trim prefix="set" suffixOverrides=",">
             <if test="title!=null">title=#{title},</if>
             <if test="codeUrl!=null">codeUrl=#{codeUrl},</if>
+            <if test="codeUrlFailureTime!=null">codeUrlFailureTime=#{codeUrlFailureTime},</if>
             <if test="orderStatus!=null">orderStatus=#{orderStatus},</if>
             <if test="paymentType!=null">paymentType=#{paymentType},</if>
             <if test="updateTime==null">updateTime=now(),</if>

+ 8 - 0
virgo.api/src/main/resources/mapper/ProceMapper.xml

@@ -16,6 +16,7 @@
         <result column="attachmentNumber" property="attachmentNumber"/>
         <result column="roleId" property="roleId"/>
         <result column="remark" property="remark"/>
+        <result column="status" property="status"/>
     </resultMap>
 
     <select id="get" resultMap="result">
@@ -56,6 +57,13 @@
         WHERE id=#{id}
     </update>
 
+    <update id="updateStatus" parameterType="com.bosshand.virgo.api.workark.model.ProceModel">
+        UPDATE workark_proce set status = #{status} WHERE id in
+        <foreach collection="ids" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </update>
+
     <delete id="delete">
         DELETE FROM workark_proce where id = #{id}
     </delete>