Prechádzať zdrojové kódy

新增商城兑换-使用兑换码接口
新增抖音对接/抖音解密工具类
新增管理端-兑换码增删改查接口

hjp 1 týždeň pred
rodič
commit
3afa3e5514

+ 10 - 0
pom.xml

@@ -441,6 +441,12 @@
 			<artifactId>tencentcloud-sdk-java</artifactId>
 			<version>3.1.766</version>
 		</dependency>
+		<!--  抖音  -->
+		<dependency>
+			<groupId>com.douyin.openapi</groupId>
+			<artifactId>sdk</artifactId>
+			<version>1.0.0</version>
+		</dependency>
 
 	</dependencies>
 
@@ -525,6 +531,10 @@
 				<enabled>true</enabled>
 			</releases>
 		</repository>
+		<repository>
+			<id>douyin-openapi-repo</id>
+			<url>https://artifacts-cn-beijing.volces.com/repository/douyin-openapi/</url>
+		</repository>
 	</repositories>
 	<pluginRepositories>
 		<pluginRepository>

+ 1 - 1
src/main/java/com/sqx/modules/passenger/entity/Passenger.java

@@ -14,7 +14,7 @@ public class Passenger implements Serializable {
 
     @TableId(type = IdType.AUTO)
     /**
-     * 订单id
+     * id
      */
     private Long id;
 

+ 91 - 0
src/main/java/com/sqx/modules/redemmCode/controller/RedeemCodeController.java

@@ -0,0 +1,91 @@
+package com.sqx.modules.redemmCode.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.app.annotation.Login;
+import com.sqx.modules.redemmCode.entity.RedeemCode;
+import com.sqx.modules.redemmCode.service.RedeemCodeService;
+import com.sqx.modules.utils.DouYinSignUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@Api(value = "兑换码", tags = {"兑换码"})
+@RequestMapping("/app/redeemCode")
+public class RedeemCodeController {
+
+    @Resource
+    private RedeemCodeService redeemCodeService;
+
+    @GetMapping("/selectRedeemCodeByPage")
+    @ApiOperation("查询兑换码")
+    public Result selectRedeemCodeByPage(Integer page,Integer limit,Integer platform,Integer type,String startTime,String endTime){
+        return redeemCodeService.selectRedeemCodeByPage(page,limit,platform,type,startTime,endTime);
+    }
+
+    @PostMapping("/insertRedeemCode")
+    @ApiOperation("添加兑换码")
+    public Result insertRedeemCode(RedeemCode redeemCode){
+        if (null != redeemCode.getCdk() && redeemCode.getCdk() != ""){
+            if (cdkOnly(redeemCode.getCdk())){
+                return redeemCodeService.insertRedeemCode(redeemCode);
+            }else {
+                return Result.error(1001,"该兑换码已存在");
+            }
+        }
+        return redeemCodeService.insertRedeemCode(redeemCode);
+    }
+
+    @PostMapping("/updateRedeemCode")
+    @ApiOperation("修改兑换码")
+    public Result updateRedeemCode(RedeemCode redeemCode){
+        return redeemCodeService.updateRedeemCode(redeemCode);
+    }
+
+    @GetMapping("/decryptAES")
+    @ApiOperation("解密")
+    public Result decryptAES(String encryptedData){
+        String decrypt = "";
+        try {
+            decrypt = DouYinSignUtil.decryptAES(encryptedData,"");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // FIXME: 2025/5/28 0028 
+//        return Result.success().put("data",decrypt);
+        return Result.success().put("data","ljalkdsjldsk#$%^%");
+    }
+
+    @Login
+    @GetMapping("/useRedeemCode")
+    @ApiOperation("使用兑换码")
+    public Result useRedeemCode(@RequestAttribute("userId")Long userId,String cdk,Integer platform,String encryptedData){
+        List<RedeemCode> list = redeemCodeService.list(new QueryWrapper<RedeemCode>().eq("cdk", cdk));
+        if (list.size() == 0){
+            return Result.error(1002,"该兑换码不存在");
+        }else if (list.size() == 1 && list.get(0).getType() == 1){
+            return Result.error(1003,"该兑换码已使用");
+        }
+        list.get(0).setUserId(userId);
+        list.get(0).setType(1);
+        return redeemCodeService.useRedeemCode(list.get(0),platform);
+    }
+
+    /**
+     * 唯一值查询
+     * @param cdk
+     * @return
+     */
+    private Boolean cdkOnly(String cdk){
+        List<RedeemCode> list = redeemCodeService.list(new QueryWrapper<RedeemCode>().eq("cdk", cdk));
+        if (list.size() == 0){
+            return true; // 不存在该兑换码,可以插入
+        }else {
+            return false;
+        }
+    }
+}

+ 14 - 0
src/main/java/com/sqx/modules/redemmCode/dao/RedeemCodeDao.java

@@ -0,0 +1,14 @@
+package com.sqx.modules.redemmCode.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sqx.modules.redemmCode.entity.RedeemCode;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface RedeemCodeDao extends BaseMapper<RedeemCode> {
+
+    IPage<RedeemCode> selectRedeemCodeByPage(Page<RedeemCode> page, @Param("platform") Integer platform, @Param("type") Integer type, @Param("startTime") String startTime, @Param("endTime") String endTime);
+}

+ 34 - 0
src/main/java/com/sqx/modules/redemmCode/entity/RedeemCode.java

@@ -0,0 +1,34 @@
+package com.sqx.modules.redemmCode.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class RedeemCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    /**
+     * id
+     */
+    private Long id;
+
+    private String cdk;
+
+    private String encryptedData;
+
+    private Integer platform;
+
+    private Integer type;
+
+    private Date createTime;
+
+    private Long userId;
+
+    private Long couponId;
+}

+ 16 - 0
src/main/java/com/sqx/modules/redemmCode/service/RedeemCodeService.java

@@ -0,0 +1,16 @@
+package com.sqx.modules.redemmCode.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.redemmCode.entity.RedeemCode;
+
+public interface RedeemCodeService extends IService<RedeemCode> {
+
+    Result selectRedeemCodeByPage(Integer page, Integer limit,Integer platform,Integer type,String startTime,String endTime);
+
+    Result insertRedeemCode(RedeemCode redeemCode);
+
+    Result updateRedeemCode(RedeemCode redeemCode);
+
+    Result useRedeemCode(RedeemCode redeemCode,Integer platform);
+}

+ 73 - 0
src/main/java/com/sqx/modules/redemmCode/service/impl/RedeemCodeServiceImpl.java

@@ -0,0 +1,73 @@
+package com.sqx.modules.redemmCode.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.redemmCode.dao.RedeemCodeDao;
+import com.sqx.modules.redemmCode.entity.RedeemCode;
+import com.sqx.modules.redemmCode.service.RedeemCodeService;
+import com.sqx.modules.tbCoupon.dao.TbCouponDao;
+import com.sqx.modules.tbCoupon.entity.TbCoupon;
+import com.sqx.modules.tbCoupon.entity.TbCouponUser;
+import com.sqx.modules.tbCoupon.service.TbCouponService;
+import com.sqx.modules.tbCoupon.service.TbCouponUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Slf4j
+@Service
+public class RedeemCodeServiceImpl extends ServiceImpl<RedeemCodeDao, RedeemCode> implements RedeemCodeService {
+
+    @Resource
+    private RedeemCodeDao redeemCodeDao;
+    @Resource
+    private TbCouponUserService tbCouponUserService;
+    @Resource
+    private CommonInfoService commonInfoService;
+
+    @Override
+    public Result selectRedeemCodeByPage(Integer page, Integer limit,Integer platform,Integer type,String startTime,String endTime){
+        IPage<RedeemCode> redeemCodeIPage = redeemCodeDao.selectRedeemCodeByPage(new Page<>(page, limit),platform,type,startTime,endTime);
+        return Result.success().put("data",new PageUtils(redeemCodeIPage));
+    }
+
+    @Override
+    public Result insertRedeemCode(RedeemCode redeemCode) {
+        return Result.success().put("data",baseMapper.insert(redeemCode));
+    }
+
+    @Override
+    public Result updateRedeemCode(RedeemCode redeemCode) {
+        return Result.success().put("data",baseMapper.updateById(redeemCode));
+    }
+
+    @Override
+    public Result useRedeemCode(RedeemCode redeemCode,Integer platform) {
+        //调用抖音/快手接口验券
+        if (platform == 1){//抖音
+
+        }else { // 2 快手
+
+        }
+        // FIXME: 2025/5/28 0028
+        long couponId = Long.parseLong(commonInfoService.findOne(820).getValue());
+        //更新优惠券 tb_coupon_user
+        Result result = tbCouponUserService.receiveActivity(redeemCode.getUserId(), couponId);
+        if (result.get("code").toString().equals("500")){
+            return Result.error(1004,result.get("msg").toString());
+        }
+        redeemCode.setCouponId(Long.parseLong(result.get("couponUserId").toString()));
+        //更新兑换码 type
+        baseMapper.updateById(redeemCode);
+        return Result.success();
+    }
+
+}

+ 1 - 1
src/main/java/com/sqx/modules/tbCoupon/service/TbCouponUserService.java

@@ -23,7 +23,7 @@ public interface TbCouponUserService extends IService<TbCouponUser> {
     Result receiveActivity(Long userId, Long couponId);
 
 
-    void giveCoupon(TbCoupon tbCoupon, Long userId);
+    Long giveCoupon(TbCoupon tbCoupon, Long userId);
 
     Result giveUserCoupon(String userIds, Long couponId, Integer num);
 

+ 4 - 3
src/main/java/com/sqx/modules/tbCoupon/service/impl/TbCouponUserServiceImpl.java

@@ -74,10 +74,10 @@ public class TbCouponUserServiceImpl extends ServiceImpl<TbCouponUserDao, TbCoup
                         return Result.error("您已领取过!");
                     }
                 }
-                giveCoupon(tbCoupon, userId);
+                Long couponUserId = giveCoupon(tbCoupon, userId);
                 tbCoupon.setCouponNum(tbCoupon.getCouponNum() - 1);
                 tbCouponService.updateById(tbCoupon);
-                return Result.success();
+                return Result.success().put("couponUserId",couponUserId);
             }else {
                 return Result.error("当前优惠券已被领完!");
             }
@@ -98,7 +98,7 @@ public class TbCouponUserServiceImpl extends ServiceImpl<TbCouponUserDao, TbCoup
      * @param userId
      */
     @Override
-    public void giveCoupon(TbCoupon tbCoupon, Long userId) {
+    public Long giveCoupon(TbCoupon tbCoupon, Long userId) {
         TbCouponUser couponUser = new TbCouponUser();
         //copy对象
         BeanUtils.copyProperties(tbCoupon, couponUser);
@@ -117,6 +117,7 @@ public class TbCouponUserServiceImpl extends ServiceImpl<TbCouponUserDao, TbCoup
         }
         couponUser.setStatus(0);
         couponUserDao.insert(couponUser);
+        return couponUser.getId();
     }
 
     @Override

+ 126 - 0
src/main/java/com/sqx/modules/utils/DouYinSignUtil.java

@@ -0,0 +1,126 @@
+package com.sqx.modules.utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * 抖音密文解密
+ */
+public class DouYinSignUtil {
+    /*
+     * appid/client_key对应的client_secret TODO 这里换成服务商的appsecret
+     */
+    private static final String secret = "12345678901234566543210987654321";
+    private static final String key;
+
+    private static final String iv;
+
+    static {
+        key = parseSecret(secret);
+        iv = secret.substring(16);
+    }
+
+    /**
+     * @param data base64后的密文
+     * @return 明文
+     * @Description AES解密
+     */
+    public static String decryptAES(String data) throws Exception {
+        try {
+            byte[] encrypted1 = decode(data);//先用base64解密
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+
+            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
+
+            byte[] original = cipher.doFinal(encrypted1);
+            String originalString = new String(original);
+            return originalString.trim();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     *
+     * @param data base64后的密文
+     * @param secret 服务商的appsecret
+     * @return 明文
+     * @throws Exception AES解密
+     */
+    public static String decryptAES(String data,String secret) throws Exception {
+
+        String key = parseSecret(secret);
+        String iv = secret.substring(16);
+        try {
+            byte[] encrypted1 = decode(data);//先用base64解密
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+
+            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
+
+            byte[] original = cipher.doFinal(encrypted1);
+            String originalString = new String(original);
+            return originalString.trim();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * base64编码
+     */
+    public static String encode(byte[] byteArray) {
+        return new String(Base64.getEncoder().encode(byteArray));
+    }
+
+    /**
+     * base64解码
+     */
+    public static byte[] decode(String base64EncodedString) {
+        return Base64.getDecoder().decode(base64EncodedString);
+    }
+
+    private static String parseSecret(String secret) {
+        secret = fillSecret(secret);
+        secret = cutSecret(secret);
+        return secret;
+    }
+
+    private static String cutSecret(String secret) {
+        if (secret.length() <= 32) {
+            return secret;
+        }
+
+        int rightCnt = (secret.length() - 32) / 2;
+        int leftCnt = secret.length() - 32 - rightCnt;
+
+        return secret.substring(leftCnt, 32 + leftCnt);
+    }
+
+    private static String fillSecret(String secret) {
+        if (secret.length() >= 32) {
+            return secret;
+        }
+        int rightCnt = (32 - secret.length()) / 2;
+        int leftCnt = 32 - secret.length() - rightCnt;
+
+        StringBuilder sb = new StringBuilder("");
+        for (int i = 0; i < leftCnt; i++) {
+            sb.append('#');
+        }
+        sb.append(secret);
+        for (int i = 0; i < rightCnt; i++) {
+            sb.append('#');
+        }
+        return sb.toString();
+    }
+}

+ 245 - 0
src/main/java/com/sqx/modules/utils/DouyinUtils.java

@@ -0,0 +1,245 @@
+package com.sqx.modules.utils;
+
+
+import com.aliyun.tea.TeaException;
+import com.douyin.openapi.client.Client;
+import com.douyin.openapi.client.models.*;
+import com.douyin.openapi.credential.models.Config;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.apache.http.impl.client.HttpClients;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Slf4j
+public class DouyinUtils {
+
+    /**
+     * 获取抖音token
+     * token 2小时有效 使用定时任务每2小时获取一次
+     * @param appId
+     * @param appSecret
+     * @return
+     */
+    public static String getDouYinToken(String appId, String appSecret) {
+        try {
+            Config config = new Config().setClientKey(appId).setClientSecret(appSecret); // 改成自己的app_id跟secret
+
+            Client client = new Client(config);
+            /* 构建请求参数,该代码示例中只给出部分参数,请用户根据需要自行构建参数值
+                token:
+                   1.若用户自行维护token,将用户维护的token赋值给该参数即可
+                   2.SDK包中有获取token的函数,请根据接口path在《OpenAPI SDK 总览》文档中查找获取token函数的名字
+                     在使用过程中,请注意token互刷问题
+                header:
+                   sdk中默认填充content-type请求头,若不需要填充除content-type之外的请求头,删除该参数即可
+            */
+            OauthClientTokenRequest sdkRequest = new OauthClientTokenRequest();
+            sdkRequest.setClientKey(appId);
+            sdkRequest.setClientSecret(appSecret);
+            sdkRequest.setGrantType("client_credential");
+            OauthClientTokenResponse sdkResponse = client.OauthClientToken(sdkRequest);
+            String accessToken = sdkResponse.getData().getAccessToken();
+            return accessToken;
+        } catch (TeaException e) {
+            log.error(e.getMessage());
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        } finally {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) throws Exception{
+        String url = "https://open.douyin.com/api/apps/trade/v2/fulfillment/delivery_prepare";
+
+        // 替换为你实际获取到的 client_token(无需用户授权)
+        String accessToken = "clt.xxxxxxxx";
+
+        // 构造请求体参数(明文密文二选一)
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("code", "your_order_id_here");  // 明文
+        requestBody.put("encrypted_data", "your_code_here"); // 密文
+
+        // 创建 HttpClient
+        CloseableHttpClient client = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(url);
+
+        // 设置请求头
+        httpPost.setHeader("Content-Type", "application/json");
+        httpPost.setHeader("access-token", accessToken);
+
+        // 请求体
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonBody = objectMapper.writeValueAsString(requestBody);
+        httpPost.setEntity(new StringEntity(jsonBody, "UTF-8"));
+
+        // 执行请求
+        HttpResponse response = client.execute(httpPost);
+        String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
+
+        // 输出结果
+        System.out.println("响应内容:");
+        System.out.println(responseString);
+
+        client.close();
+        /*正常示例:{
+  "data": {
+    "error_code": 0,
+    "description": "success",
+    "verify_token": "xxx",
+    "out_order_no": "out123456",
+    "order_id": "ot123456",
+    "certificates": [
+      {
+        "encrypted_code": "xxx",
+        "certificate_id": "123456",
+        "item_order_id": "ot123"
+      }
+    ]
+  },
+  "extra": {
+    "sub_error_code": 0,
+    "sub_description": "success",
+    "logid": "2022092115392201020812109511046",
+    "now": 1663745962686,
+    "error_code": 0,
+    "description": "success"
+  }
+}*//*异常示例:{
+  "data": {
+    "error_code": 2190004,
+    "description": "应用未获得该能力, 请去https://open.douyin.com/申请"
+  },
+  "extra": {
+    "sub_error_code": 0,
+    "sub_description": "",
+    "logid": "2022092115392201020812109511046",
+    "now": 1663745962686,
+    "error_code": 2190004,
+    "description": "应用未获得该能力, 请去https://open.douyin.com/申请"
+  }
+}*/
+    }
+
+    /**
+     * 核验(明文密文二选一)
+     * @param token
+     * @param code 明文
+     * @param encryptedData
+     * @throws Exception
+     */
+    public static void verify(String token,String code,String encryptedData) throws Exception{
+        String url = "https://open.douyin.com/api/apps/trade/v2/fulfillment/delivery_prepare";
+
+        // 替换为你实际获取到的 client_token(无需用户授权)
+        String accessToken = token;
+
+        // 构造请求体参数(明文密文二选一)
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("code", code);  // 明文
+        requestBody.put("encrypted_data", encryptedData); // 密文
+
+        // 创建 HttpClient
+        CloseableHttpClient client = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(url);
+
+        // 设置请求头
+        httpPost.setHeader("Content-Type", "application/json");
+        httpPost.setHeader("access-token", accessToken);
+
+        // 请求体
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonBody = objectMapper.writeValueAsString(requestBody);
+        httpPost.setEntity(new StringEntity(jsonBody, "UTF-8"));
+
+        // 执行请求
+        HttpResponse response = client.execute(httpPost);
+        String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
+
+        // 输出结果
+        System.out.println("响应内容:");
+        System.out.println(responseString);
+
+        client.close();
+    }
+
+    /**
+     * 撤销核验
+     * @param token
+     * @param certificateId  代表一张券码的标识(验券时返回)
+     * @param orderId 需要撤销的certificate_id所属的订单id(用户提供)
+     * @param verifyId 代表券码一次核销的唯一标识(验券时返回)
+     * @throws Exception
+     */
+    public static void verifyCancel(String token, String certificateId,String orderId,String verifyId) throws Exception{
+        String url = "https://open.douyin.com/api/trade/v2/fulfillment/verify_cancel/";
+
+        // 替换为你实际获取到的 client_token(无需用户授权)
+        String accessToken = token;
+
+        // 构造请求体参数(明文密文二选一)
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("certificate_id", certificateId);
+        requestBody.put("order_id", orderId);
+        requestBody.put("verify_id",verifyId);
+
+        // 创建 HttpClient
+        CloseableHttpClient client = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(url);
+
+        // 设置请求头
+        httpPost.setHeader("Content-Type", "application/json");
+        httpPost.setHeader("access-token", accessToken);
+
+        // 请求体
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonBody = objectMapper.writeValueAsString(requestBody);
+        httpPost.setEntity(new StringEntity(jsonBody, "UTF-8"));
+
+        // 执行请求
+        HttpResponse response = client.execute(httpPost);
+        String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
+
+        // 输出结果
+        System.out.println("响应内容:");
+        System.out.println(responseString);
+
+        client.close();
+    }
+
+
+    /*public static void main(String[] args) {
+        try {
+            Config config = new Config().setClientKey("tt******").setClientSecret("cbs***"); // 改成自己的app_id跟secret
+            Client client = new Client(config);
+        *//* 构建请求参数,该代码示例中只给出部分参数,请用户根据需要自行构建参数值
+            token:
+               1.若用户自行维护token,将用户维护的token赋值给该参数即可
+               2.SDK包中有获取token的函数,请根据接口path在《OpenAPI SDK 总览》文档中查找获取token函数的名字
+                 在使用过程中,请注意token互刷问题
+            header:
+               sdk中默认填充content-type请求头,若不需要填充除content-type之外的请求头,删除该参数即可
+        *//*
+            CouponBatchConsumeCouponRequest sdkRequest = new CouponBatchConsumeCouponRequest();
+            sdkRequest.setAccessToken("k23cd*****");  //token
+            sdkRequest.setAppId("6CI1eVeyPQ"); //
+            sdkRequest.setConsumeOutNo("sYCkFmcYFa");
+            sdkRequest.setConsumeTime(1l);
+            sdkRequest.setOpenId("kbJyRUxJCH");
+            sdkRequest.setOrderId("kMrlcAi3dE");
+            CouponBatchConsumeCouponResponse sdkResponse = client.CouponBatchConsumeCoupon(sdkRequest);
+        } catch (TeaException e) {
+            System.out.println(e.getMessage());
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }*/
+}

+ 23 - 0
src/main/resources/mapper/redeemCode/RedeemCodeDao.xml

@@ -0,0 +1,23 @@
+<?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.sqx.modules.redemmCode.dao.RedeemCodeDao">
+
+    <select id="selectRedeemCodeByPage" resultType="com.sqx.modules.redemmCode.entity.RedeemCode">
+        select
+            *
+        from redeem_code
+        where 1=1
+        <if test="platform != null">
+            and platform = #{platform}
+        </if>
+        <if test="type != null">
+            and platform = #{type}
+        </if>
+        <if test="startTime!=null and startTime!=''and endTime!=null and endTime!='' ">
+            and str_to_date(create_time, '%Y-%m-%d') between str_to_date(#{startTime}, '%Y-%m-%d') AND
+            str_to_date(#{endTime}, '%Y-%m-%d')
+        </if>
+        order by create_time desc
+    </select>
+</mapper>