Kaynağa Gözat

微信支付 监听订单状态

zhs 3 yıl önce
ebeveyn
işleme
9db1d9090e

+ 11 - 0
src/main/java/com/travel/controller/ReleaseTravelController.java

@@ -86,6 +86,8 @@ public class ReleaseTravelController {
     public Map<String ,Object> getTravelAll(Travel travel, HttpServletRequest request){
         Map<String, Object> map = new HashMap<>();
         try{
+            Map<String, Object> userMap = ParsingToken.tokenParsing(request);
+            travel.setCode((String) userMap.get("code"));
             List<Travel> list = releaseTravelService.getTravelAll(travel);
             Map<String, Object> mapVal = new HashMap<>();
             mapVal.put("list", list);
@@ -343,4 +345,13 @@ public class ReleaseTravelController {
         }
         return map;
     }
+
+    /**
+     * 查询供应商路线
+     * @return 返回结果
+     */
+    @GetMapping("getRoute")
+    public Map<String, Object> getRoute(){
+        return releaseTravelService.getRoute();
+    }
 }

+ 54 - 0
src/main/java/com/travel/controller/WxRefundController.java

@@ -0,0 +1,54 @@
+package com.travel.controller;
+
+import com.travel.model.WxRefund;
+import com.travel.service.WxRefundService;
+import com.travel.util.SnowflakeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * 退款申请
+ */
+@RestController
+@RequestMapping("wxRefund")
+public class WxRefundController {
+    @Autowired
+    private WxRefundService wxRefundService;
+    //雪花算法 生成id
+    private SnowflakeUtil snowflakeUtil = new SnowflakeUtil(1,1,1);
+
+    /**
+     * 新增退款订单
+     * @param wxRefund 参数
+     * @param request 参数
+     * @return 返回结果
+     */
+    @PostMapping("addRefund")
+    public Map<String, Object> addRefund(@RequestBody WxRefund wxRefund, HttpServletRequest request){
+        return wxRefundService.addRefund(wxRefund, request);
+    }
+
+    /**
+     * 修改退款申请
+     * @param wxRefund 参数
+     * @param request 参数
+     * @return 返回结果
+     */
+    @PutMapping("updateRefund")
+    public Map<String, Object> updateRefund(@RequestBody WxRefund wxRefund, HttpServletRequest request){
+        return wxRefundService.updateRefund(wxRefund, request);
+    }
+
+    /**
+     * 取消退款
+     * @param wxRefund 参数
+     * @param request 参数
+     * @return 返回结果
+     */
+    @DeleteMapping("delRefund")
+    public Map<String, Object> delRefund(@RequestBody WxRefund wxRefund, HttpServletRequest request){
+        return wxRefundService.delRefund(wxRefund, request);
+    }
+}

+ 3 - 0
src/main/java/com/travel/mapper/ReleaseTravelMapper.java

@@ -7,6 +7,7 @@ import com.travel.model.TravelGive;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface ReleaseTravelMapper {
@@ -49,4 +50,6 @@ public interface ReleaseTravelMapper {
     List<PrivateOrder> getTravelRelese(PrivateOrder privateOrder);
 
     PrivateOrder getTravelVal(String id);
+
+    List<Map<String, Object>> getRoute();
 }

+ 13 - 0
src/main/java/com/travel/mapper/WxRefundMapper.java

@@ -0,0 +1,13 @@
+package com.travel.mapper;
+
+import com.travel.model.WxRefund;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WxRefundMapper {
+    void addRefund(WxRefund wxRefund);
+
+    void updateRefund(WxRefund wxRefund);
+
+    void delRefund(WxRefund wxRefund);
+}

+ 51 - 0
src/main/java/com/travel/model/WxRefund.java

@@ -0,0 +1,51 @@
+package com.travel.model;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 微信退款申请
+ */
+@Data
+@Accessors(chain = true)
+@SuppressWarnings("serial")
+public class WxRefund implements Serializable {
+    /**
+     * 主键编号
+     */
+    private String id;
+    /**
+     * 退款编号
+     */
+    private String uuid;
+    /**
+     * 建档日期
+     */
+    private String jdrq;
+    /**
+     * 退款类型
+     */
+    private String refundType;
+    /**
+     * 退款原因
+     */
+    private String refundReason;
+    /**
+     * 退款金额
+     */
+    private String refundFee;
+    /**
+     * 退款状态
+     */
+    private String refundState;
+    /**
+     * 报价单编号
+     */
+    private String releaseUuid;
+    /**
+     * 退款申请人
+     */
+    private String code;
+}

+ 3 - 0
src/main/java/com/travel/service/ReleaseTravelService.java

@@ -6,6 +6,7 @@ import com.travel.model.TravelExperience;
 import com.travel.model.TravelGive;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ReleaseTravelService {
     void travelInsterExper(TravelExperience travelExperience);
@@ -47,4 +48,6 @@ public interface ReleaseTravelService {
     List<PrivateOrder> getTravelRelese(PrivateOrder privateOrder);
 
     PrivateOrder getTravelVal(String id);
+
+    Map<String, Object> getRoute();
 }

+ 14 - 0
src/main/java/com/travel/service/WxRefundService.java

@@ -0,0 +1,14 @@
+package com.travel.service;
+
+import com.travel.model.WxRefund;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+public interface WxRefundService {
+    Map<String, Object> addRefund(WxRefund wxRefund, HttpServletRequest request);
+
+    Map<String, Object> updateRefund(WxRefund wxRefund, HttpServletRequest request);
+
+    Map<String, Object> delRefund(WxRefund wxRefund, HttpServletRequest request);
+}

+ 16 - 0
src/main/java/com/travel/service/impl/ReleaseTravelServiceImpl.java

@@ -10,7 +10,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class ReleaseTravelServiceImpl implements ReleaseTravelService {
@@ -126,4 +128,18 @@ public class ReleaseTravelServiceImpl implements ReleaseTravelService {
     public PrivateOrder getTravelVal(String id) {
         return releaseTravelMapperl.getTravelVal(id);
     }
+
+    @Override
+    public Map<String, Object> getRoute() {
+        Map<String, Object> map = new HashMap<>();
+        try{
+            map.put("data", releaseTravelMapperl.getRoute());
+            map.put("msg", "200");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("msg", "500");
+            map.put("errMsg", "服务器请求异常,请稍后再试");
+        }
+        return map;
+    }
 }

+ 103 - 0
src/main/java/com/travel/service/impl/WxRefundServiceImpl.java

@@ -0,0 +1,103 @@
+package com.travel.service.impl;
+
+import com.travel.mapper.WxPayMapper;
+import com.travel.mapper.WxRefundMapper;
+import com.travel.model.WxRefund;
+import com.travel.service.WxPayService;
+import com.travel.service.WxRefundService;
+import com.travel.util.ParsingToken;
+import com.travel.util.SnowflakeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class WxRefundServiceImpl implements WxRefundService {
+    @Autowired
+    private WxRefundMapper wxRefundMapper;
+    @Autowired
+    private WxPayMapper wxPayMapper;
+
+    //雪花算法 生成id
+    private SnowflakeUtil snowflakeUtil = new SnowflakeUtil(1,1,1);
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> addRefund(WxRefund wxRefund, HttpServletRequest request) {
+        Map<String, Object> map = new HashMap<>();
+        try{
+            //判断该报价单是否存在退款申请
+            Map<String, Object> mapRefund = wxPayMapper.getRefund(wxRefund.getReleaseUuid());
+            if(!mapRefund.isEmpty()){
+                map.put("msg", "500");
+                map.put("errMsg", "该订单已存在退款申请!");
+                return map;
+            }
+            //获取token
+            Map<String, Object> userMap = ParsingToken.tokenParsing(request);
+            wxRefund.setCode((String) userMap.get("code"));
+            wxRefund.setUuid(snowflakeUtil.nextId() + "");
+            wxRefundMapper.addRefund(wxRefund);
+            map.put("msg", "200");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("msg", "500");
+            map.put("errMsg", "服务器请求异常,请稍后再试");
+        }
+        return map;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> updateRefund(WxRefund wxRefund, HttpServletRequest request) {
+        Map<String, Object> map = new HashMap<>();
+        try{
+            //判断该报价单的退款状态
+            Map<String, Object> mapRefund = wxPayMapper.getRefund(wxRefund.getReleaseUuid());
+            if(mapRefund.get("refundState").equals("0")){
+                map.put("msg", "500");
+                map.put("errMsg", "该订单已通过退款申请无法修改!");
+                return map;
+            }
+            //获取token
+            Map<String, Object> userMap = ParsingToken.tokenParsing(request);
+            wxRefund.setCode((String) userMap.get("code"));
+            wxRefundMapper.updateRefund(wxRefund);
+            map.put("msg", "200");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("msg", "500");
+            map.put("errMsg", "服务器请求异常,请稍后再试");
+        }
+        return map;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> delRefund(WxRefund wxRefund, HttpServletRequest request) {
+        Map<String, Object> map = new HashMap<>();
+        try{
+            //判断该报价单的退款状态
+            Map<String, Object> mapRefund = wxPayMapper.getRefund(wxRefund.getReleaseUuid());
+            if(mapRefund.get("refundState").equals("0")){
+                map.put("msg", "500");
+                map.put("errMsg", "该订单已通过退款申请无法取消!");
+                return map;
+            }
+            //获取token
+            Map<String, Object> userMap = ParsingToken.tokenParsing(request);
+            wxRefund.setCode((String) userMap.get("code"));
+            wxRefundMapper.delRefund(wxRefund);
+            map.put("msg", "200");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("msg", "500");
+            map.put("errMsg", "服务器请求异常,请稍后再试");
+        }
+        return map;
+    }
+}

+ 135 - 0
src/main/java/com/travel/util/SnowflakeUtil.java

@@ -0,0 +1,135 @@
+package com.travel.util;
+/**
+ * 雪花算法
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ * @author curry
+ */
+public class SnowflakeUtil {
+//因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
+
+    //机器ID  2进制5位  32位减掉1位 31个
+    private long workerId;
+    //机房ID 2进制5位  32位减掉1位 31个
+    private long datacenterId;
+    //代表一毫秒内生成的多个id的最新序号  12位 4096 -1 = 4095 个
+    private long sequence;
+    //设置一个时间初始值    2^41 - 1   差不多可以用69年
+    private long twepoch = 1585644268888L;
+    //5位的机器id
+    private long workerIdBits = 5L;
+    //5位的机房id
+    private long datacenterIdBits = 5L;
+    //每毫秒内产生的id数 2 的 12次方
+    private long sequenceBits = 12L;
+    // 这个是二进制运算,就是5 bit最多只能有31个数字,也就是说机器id最多只能是32以内
+    private long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    // 这个是一个意思,就是5 bit最多只能有31个数字,机房id最多只能是32以内
+    private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    private long workerIdShift = sequenceBits;
+    private long datacenterIdShift = sequenceBits + workerIdBits;
+    private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private long sequenceMask = -1L ^ (-1L << sequenceBits);
+    //记录产生时间毫秒数,判断是否是同1毫秒
+    private long lastTimestamp = -1L;
+
+    public long getWorkerId(){
+        return workerId;
+    }
+    public long getDatacenterId() {
+        return datacenterId;
+    }
+    public long getTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+
+
+    public SnowflakeUtil(long workerId, long datacenterId, long sequence) {
+
+        // 检查机房id和机器id是否超过31 不能小于0
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(
+                    String.format("worker Id can't be greater than %d or less than 0",maxWorkerId));
+        }
+
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+
+            throw new IllegalArgumentException(
+                    String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+        this.sequence = sequence;
+    }
+
+    /**
+     * 这个是核心方法,通过调用nextId()方法,让当前这台机器上的snowflake算法程序生成一个全局唯一的id
+      */
+    public synchronized long nextId() {
+        // 这儿就是获取当前时间戳,单位是毫秒
+        long timestamp = timeGen();
+        if (timestamp < lastTimestamp) {
+
+            System.err.printf(
+                    "clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
+            throw new RuntimeException(
+                    String.format("Clock moved backwards. Refusing to generate id for %d milliseconds",
+                            lastTimestamp - timestamp));
+        }
+
+        // 下面是说假设在同一个毫秒内,又发送了一个请求生成一个id
+        // 这个时候就得把seqence序号给递增1,最多就是4096
+        if (lastTimestamp == timestamp) {
+
+            // 这个意思是说一个毫秒内最多只能有4096个数字,无论你传递多少进来,
+            //这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围
+            sequence = (sequence + 1) & sequenceMask;
+            //当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+
+        } else {
+            sequence = 0;
+        }
+        // 这儿记录一下最近一次生成id的时间戳,单位是毫秒
+        lastTimestamp = timestamp;
+        // 这儿就是最核心的二进制位运算操作,生成一个64bit的id
+        // 先将当前时间戳左移,放到41 bit那儿;将机房id左移放到5 bit那儿;将机器id左移放到5 bit那儿;将序号放最后12 bit
+        // 最后拼接起来成一个64 bit的二进制数字,转换成10进制就是个long型
+        return ((timestamp - twepoch) << timestampLeftShift) |
+                (datacenterId << datacenterIdShift) |
+                (workerId << workerIdShift) | sequence;
+    }
+
+    /**
+     * 当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID
+     * @param lastTimestamp
+     * @return
+     */
+    private long tilNextMillis(long lastTimestamp) {
+
+        long timestamp = timeGen();
+
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+    /**
+     *  获取当前时间戳
+     */
+    private long timeGen(){
+        return System.currentTimeMillis();
+    }
+}

+ 17 - 0
src/main/resources/config/mapping/ReleaseTravelMapper.xml

@@ -410,4 +410,21 @@
         WHERE
             a.uuid = #{id}
     </select>
+    <!-- 查询供应商路线 -->
+    <select id="getRoute" resultType="Map">
+        SELECT
+            a.destination,
+            a.title_img,
+            a.uuid,
+            a.jdrq,
+            a.look_num,
+            a.offer_name,
+            b.name,
+            b.headpir,
+            c.routeNum
+        FROM
+            bus_supplier_route a
+            LEFT JOIN sys_supplier b ON a.code = b.code
+            LEFT JOIN (SELECT count(*) AS routeNum,code FROM bus_supplier_route GROUP BY code) c ON a.code = c.code
+    </select>
 </mapper>

+ 32 - 0
src/main/resources/config/mapping/WxRefundMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.travel.mapper.WxRefundMapper">
+    <!-- 新增微信退款信息 -->
+    <insert id="addRefund" parameterType="WxRefund">
+        insert into bus_refund(uuid,jdrq,refund_type,refund_reason,refund_fee,refund_state,release_uuid,code)
+        values(#{uuid},SYSDATETIME(),#{refundType},#{refundReason},#{refundFee},'0',#{releaseUuid},#{code})
+    </insert>
+    <!-- 修改退款申请 -->
+    <update id="updateRefund" parameterType="WxRefund">
+        update bus_refund
+        <set>
+            <trim suffixOverrides=",">
+                <if test="refundType != null and refundType != ''">
+                    refund_type = #{refundType},
+                </if>
+                <if test="refundReason != null and refundReason != ''">
+                    refund_reason = #{refundReason},
+                </if>
+                <if test="refundFee != null and refundFee != ''">
+                    refund_fee = #{refundFee},
+                </if>
+            </trim>
+            where code = #{code} and release_uuid = #{releaseUuid}
+        </set>
+    </update>
+    <!-- 取消退款申请 -->
+    <delete id="delRefund">
+        delete from bus_refund where code = #{code} and release_uuid = #{releaseUuid}
+    </delete>
+</mapper>