diff --git a/README.md b/README.md
index cbe2ebf2..f1eba456 100644
--- a/README.md
+++ b/README.md
@@ -32,8 +32,8 @@
- 执行db/mysql.sql文件,初始化数据
- 修改application-dev.yml,更新MySQL账号和密码
- Eclipse、IDEA运行sqxApplication.java,则可启动项目
-- Swagger文档路径:http://localhost:8080/sqx_fast/swagger/index.html
-- Swagger注解路径:http://localhost:8080/sqx_fast/swagger-ui.html
+- Swagger文档路径:http://localhost:8100/sqx_fast/swagger/index.html
+- Swagger注解路径:http://localhost:8100/sqx_fast/swagger-ui.html
diff --git a/pom.xml b/pom.xml
index 0df137d1..57b71c2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -178,6 +178,11 @@
aliyun-sdk-oss
3.4.0
+
+ com.aliyun
+ sts20150401
+ 1.1.4
+
com.alipay.sdk
diff --git a/src/main/java/com/sqx/common/utils/DateUtils.java b/src/main/java/com/sqx/common/utils/DateUtils.java
index 9d51649a..dcfc6203 100644
--- a/src/main/java/com/sqx/common/utils/DateUtils.java
+++ b/src/main/java/com/sqx/common/utils/DateUtils.java
@@ -19,6 +19,11 @@ public class DateUtils {
/** 时间格式(yyyy-MM-dd HH:mm:ss) */
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+ public static String formatYMD(Date date) {
+ return format(date, DATE_PATTERN);
+ }
+
/**
* 日期格式化 日期格式为:yyyy-MM-dd
* @param date 日期
diff --git a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java
new file mode 100644
index 00000000..fe3c6661
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java
@@ -0,0 +1,163 @@
+package com.sqx.modules.discSpinning.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sqx.common.utils.DateUtils;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.discSpinning.entity.DiscSpinning;
+import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
+import com.sqx.modules.discSpinning.service.DiscSpinningRecordService;
+import com.sqx.modules.discSpinning.service.DiscSpinningService;
+import com.sqx.modules.orders.entity.Orders;
+import com.sqx.modules.orders.service.OrdersService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+@Slf4j
+@RestController
+@Api(value = "大转盘", tags = {"大转盘"})
+@RequestMapping(value = "/discSpinning")
+public class DiscSpinningController {
+
+ private final DiscSpinningService discSpinningService;
+ private final CommonInfoService commonRepository;
+ private final OrdersService ordersService;
+ private final DiscSpinningRecordService recordService;
+
+ @Autowired
+ public DiscSpinningController(CommonInfoService commonRepository, DiscSpinningService discSpinningService,OrdersService ordersService,DiscSpinningRecordService recordService) {
+ this.commonRepository = commonRepository;
+ this.discSpinningService = discSpinningService;
+ this.ordersService = ordersService;
+ this.recordService = recordService;
+
+ }
+
+ @PostMapping("/insertDiscSpinning")
+ @ApiOperation("添加大转盘")
+ public Result insertDiscSpinning(@RequestBody DiscSpinning discSpinning) {
+ discSpinning.setCreateTime(DateUtils.format(new Date()));
+ discSpinningService.save(discSpinning);
+ return Result.success();
+ }
+
+ @GetMapping("/{id}")
+ @ApiOperation("通过Id查询详情")
+ public Result selectOne(@PathVariable Integer id) {
+ return Result.success().put("data", discSpinningService.getById(id));
+ }
+
+ @PostMapping("/updateDiscSpinning")
+ @ApiOperation("修改大转盘")
+ public Result updateDiscSpinning(@RequestBody DiscSpinning discSpinning) {
+ List prizes = discSpinningService.list(new QueryWrapper().orderByAsc("type","id"));
+ BigDecimal number = BigDecimal.ZERO;
+ List prizesResult = new ArrayList<>();
+ for (DiscSpinning prize : prizes) {
+ if (discSpinning.getId().equals(prize.getId())) {
+ number = prize.getNumber().add(discSpinning.getOdds().subtract(prize.getOdds()));
+ discSpinning.setNumber(number);
+ prize.setOdds(discSpinning.getOdds());
+ prizesResult.add(discSpinning);
+ }else if (number.compareTo(BigDecimal.ZERO) > 0) {
+ number = number.add(prize.getOdds());
+ prize.setNumber(number);
+ prizesResult.add(prize);
+ }
+ }
+ BigDecimal totalOdds = prizes.stream()
+ .map(DiscSpinning::getOdds)
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ if (totalOdds.compareTo(new BigDecimal(100)) > 0) {
+ return Result.error("中奖概率总和 不可超过100");
+ }
+ discSpinningService.updateBatchById(prizesResult);
+ return Result.success();
+ }
+
+ @PostMapping("/deleteDiscSpinning")
+ @ApiOperation("删除大转盘")
+ public Result deleteDiscSpinning(Long id) {
+ discSpinningService.removeById(id);
+ return Result.success();
+ }
+
+ @GetMapping("/selectDiscSpinning")
+ @ApiOperation("查询大转盘")
+ public Result selectDiscSpinning() {
+ return Result.success().put("data", discSpinningService.page(new Page<>(0, 8), new QueryWrapper().orderByAsc("odds")));
+ }
+
+ @PostMapping("/draw")
+ @ApiOperation("抽取大转盘")
+ public Result draw(Long orderId, @RequestAttribute("userId") Long userId) {
+ int drawCount = Integer.parseInt(commonRepository.findOne(901).getValue());
+ Integer i = recordService.countDraw(userId);
+ if (i != null && i > drawCount) {
+ return Result.error("当日可抽奖次数已超限");
+ }
+ Orders order = ordersService.selectOrderById(orderId);
+ return new Result().put("data", draws(order.getPayMoney().doubleValue(),order.getOrdersId(), userId));
+ }
+
+
+ public DiscSpinning draws(double orderAmount,Long orderId,Long userId) {
+ DiscSpinning result = new DiscSpinning("谢谢惠顾",1,null);
+ List prizes = discSpinningService.list();
+ Random random = new Random();
+ double randomDouble;
+ do {
+ randomDouble = random.nextDouble();
+ } while (randomDouble == 0);
+ BigDecimal randomNum = new BigDecimal(randomDouble).multiply(new BigDecimal(10000)).divide(new BigDecimal(100));
+ for (DiscSpinning prize : prizes) {
+ if (randomNum.compareTo(prize.getNumber()) < 0) {
+ if (prize.getType() == 2) {
+ int maxAmount = Integer.parseInt(commonRepository.findOne(900).getValue());
+ double resultAmount = 0;
+ //从0 到 80-amount 直接 取 多个区间 数值越小 概率越大
+ if (prize.getType() == 2) {
+ double baseRandom = random.nextDouble();
+ if (baseRandom < 0.8) {
+ // 0.8到0.82范围内概率最大(这里示例以当前订单金额为基础,模拟类似0.8的情况)
+ resultAmount = orderAmount + (random.nextDouble() * 0.02);
+ } else if (baseRandom < 0.9) {
+ // 0.82 - 0.85范围概率小一些
+ resultAmount = orderAmount + (0.02 + (random.nextDouble() * 0.03));
+ } else if (baseRandom < 0.95) {
+ // 0.85 - 0.9概率更小
+ resultAmount = orderAmount + (0.05 + (random.nextDouble() * 0.05));
+ } else if (baseRandom < 0.99) {
+ // 0.9 - 1概率更小
+ resultAmount = orderAmount + (0.1 + (random.nextDouble() * 0.1));
+ } else {
+ // 1 - 20概率依次递减
+ // 控制最大金额为80
+ resultAmount = 1 + (random.nextDouble() * (maxAmount - 1));
+ }
+ }
+ if (resultAmount > maxAmount) {
+ resultAmount = maxAmount;
+ }
+ result = new DiscSpinning(prize.getName(),2,new BigDecimal(resultAmount).setScale(2, RoundingMode.HALF_UP));
+ }else {
+ result = prize;
+ }
+ }
+ }
+ recordService.save(new DiscSpinningRecord(result.getName(),orderId,userId,result.getType(),
+ result.getNumber(),DateUtils.formatYMD(new Date()),DateUtils.format(new Date())));
+ return result;
+ }
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningRecordController.java b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningRecordController.java
new file mode 100644
index 00000000..fe0fa7c8
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningRecordController.java
@@ -0,0 +1,41 @@
+package com.sqx.modules.discSpinning.controller;
+
+
+import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
+import com.sqx.modules.discSpinning.service.DiscSpinningRecordService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sqx.common.utils.DateUtils;
+import com.sqx.common.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@Slf4j
+@RestController
+@Api(value = "大转盘抽奖记录", tags = {"大转盘抽奖记录"})
+@RequestMapping(value = "/discSpinningRecord")
+public class DiscSpinningRecordController {
+ /**
+ * 服务对象
+ */
+ @Autowired
+ private DiscSpinningRecordService discSpinningRecordService;
+
+ @GetMapping("/{id}")
+ @ApiOperation("通过Id查询详情")
+ public Result selectOne(@PathVariable Integer id) {
+ return Result.success().put("data", discSpinningRecordService.getById(id));
+ }
+
+ @GetMapping("/selectDiscSpinningRecord")
+ @ApiOperation("查询大转盘抽奖记录")
+ public Result selectDiscSpinningRecord(Integer page, Integer limit) {
+ return Result.success().put("data", discSpinningRecordService.page(new Page<>(page, limit), new QueryWrapper().orderByAsc("create_time")));
+ }
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningDao.java b/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningDao.java
new file mode 100644
index 00000000..b5fda0f7
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningDao.java
@@ -0,0 +1,11 @@
+package com.sqx.modules.discSpinning.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.discSpinning.entity.DiscSpinning;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DiscSpinningDao extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningRecordDao.java b/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningRecordDao.java
new file mode 100644
index 00000000..e9b03aed
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/dao/DiscSpinningRecordDao.java
@@ -0,0 +1,13 @@
+package com.sqx.modules.discSpinning.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DiscSpinningRecordDao extends BaseMapper {
+
+ int countDraw(@Param("userId")Long userId);
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinning.java b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinning.java
new file mode 100644
index 00000000..695eda18
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinning.java
@@ -0,0 +1,44 @@
+package com.sqx.modules.discSpinning.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 大转盘(DiscSpinning)表实体类
+ *
+ * @author ww
+ * @since 2024-12-03 15:18:43
+ */
+@Data
+@TableName("disc_spinning")
+public class DiscSpinning extends Model {
+ //主键
+ private Long id;
+ //图标
+ private String url;
+ //描述
+ private String name;
+ //类型 1谢谢惠顾 2 红包 9 其它
+ private Integer type;
+ //数值
+ private BigDecimal number;
+ //红包金额比例
+ private BigDecimal ratio;
+ //中奖概率
+ private BigDecimal odds;
+ //创建时间
+ private String createTime;
+
+ public DiscSpinning() {
+ }
+
+ public DiscSpinning(String name, Integer type, BigDecimal number) {
+ this.name = name;
+ this.type = type;
+ this.number = number;
+ }
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningRecord.java b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningRecord.java
new file mode 100644
index 00000000..bffbe195
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningRecord.java
@@ -0,0 +1,53 @@
+package com.sqx.modules.discSpinning.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+/**
+ * 大转盘抽奖记录(DiscSpinningRecord)表实体类
+ *
+ * @author ww
+ * @since 2024-12-04 11:37:36
+ */
+@Data
+@TableName("disc_spinning_record")
+public class DiscSpinningRecord extends Model {
+ //主键
+ private Long id;
+
+ private Long orderId;
+
+ private Long userId;
+ //描述
+ private String name;
+ //类型 1谢谢惠顾 2 红包 9 其它
+ private Integer type;
+ //金额
+ private BigDecimal number;
+ //流向 1 提现 2 存入余额
+ private String target;
+
+ private Long targetId;
+ //抽奖日期
+ private String drawDay;
+ //创建时间
+ private String createTime;
+
+ public DiscSpinningRecord(String name,Long orderId, Long userId, Integer type, BigDecimal number, String drawDay, String createTime) {
+ this.name = name;
+ this.userId = userId;
+ this.orderId = orderId;
+ this.type = type;
+ this.number = number;
+ this.drawDay = drawDay;
+ this.createTime = createTime;
+ }
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningRecordService.java b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningRecordService.java
new file mode 100644
index 00000000..4aa53bcc
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningRecordService.java
@@ -0,0 +1,12 @@
+package com.sqx.modules.discSpinning.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
+
+import java.util.Map;
+
+public interface DiscSpinningRecordService extends IService {
+
+ Integer countDraw(Long userId);
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java
new file mode 100644
index 00000000..958bf794
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java
@@ -0,0 +1,11 @@
+package com.sqx.modules.discSpinning.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.discSpinning.entity.DiscSpinning;
+
+import java.util.Map;
+
+public interface DiscSpinningService extends IService {
+
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningRecordServiceImpl.java b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningRecordServiceImpl.java
new file mode 100644
index 00000000..9dfd0324
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningRecordServiceImpl.java
@@ -0,0 +1,25 @@
+package com.sqx.modules.discSpinning.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.modules.discSpinning.dao.DiscSpinningRecordDao;
+import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
+import com.sqx.modules.discSpinning.service.DiscSpinningRecordService;
+import org.springframework.stereotype.Service;
+import org.apache.commons.lang3.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Map;
+
+@Service
+public class DiscSpinningRecordServiceImpl extends ServiceImpl implements DiscSpinningRecordService {
+
+ @Autowired
+ private DiscSpinningRecordDao discSpinningRecordDao;
+
+ @Override
+ public Integer countDraw(Long userId) {
+ return discSpinningRecordDao.countDraw(userId);
+ }
+}
+
diff --git a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java
new file mode 100644
index 00000000..eb36975e
--- /dev/null
+++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java
@@ -0,0 +1,21 @@
+package com.sqx.modules.discSpinning.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.modules.discSpinning.dao.DiscSpinningDao;
+import com.sqx.modules.discSpinning.entity.DiscSpinning;
+import com.sqx.modules.discSpinning.service.DiscSpinningService;
+import org.springframework.stereotype.Service;
+import org.apache.commons.lang3.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Map;
+
+@Service
+public class DiscSpinningServiceImpl extends ServiceImpl implements DiscSpinningService {
+
+ @Autowired
+ private DiscSpinningDao discSpinningDao;
+
+}
+
diff --git a/src/main/java/com/sqx/modules/file/AliFileUploadController.java b/src/main/java/com/sqx/modules/file/AliFileUploadController.java
index 2128527e..b7be7cb2 100644
--- a/src/main/java/com/sqx/modules/file/AliFileUploadController.java
+++ b/src/main/java/com/sqx/modules/file/AliFileUploadController.java
@@ -3,6 +3,7 @@ package com.sqx.modules.file;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.tea.TeaException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
@@ -27,6 +28,9 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import com.aliyun.sts20150401.models.AssumeRoleResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -60,6 +64,44 @@ public class AliFileUploadController {
this.amazonS3 = amazonS3;
}
+ @GetMapping(value = "/getCredentials")
+ @ApiOperation("获取上传临时凭证")
+ public Result getCredentials() {
+ try {
+ com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+ .setAccessKeyId("LTAI5tMmymNJatAoci3N5PVz")
+// .setAccessKeyId(commonRepository.findOne(68).getValue())
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+// .setAccessKeySecret(commonRepository.findOne(69).getValue());
+ .setAccessKeySecret("WnJ2Dng7zxSagKj0NmhjfiHgIFyOEy");
+ // Endpoint 请参考 https://api.aliyun.com/product/Sts
+ config.endpoint = "sts.cn-shanghai.aliyuncs.com";
+
+ com.aliyun.sts20150401.Client client = new com.aliyun.sts20150401.Client(config);
+ com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest();
+ assumeRoleRequest.setRoleArn("acs:ram::1266409170752412:role/linshi");
+ assumeRoleRequest.setRoleSessionName("test");
+ com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+ // 复制代码运行请自行打印 API 的返回值
+ AssumeRoleResponse response = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
+ return new Result().put("data",response.getBody().getCredentials());
+ } catch (TeaException error) {
+ return Result.error(error.getMessage());
+ // 诊断地址
+// System.out.println(error.getData().get("Recommend"));
+// com.aliyun.teautil.Common.assertAsString(error.message);
+ } catch (Exception _error) {
+ return Result.error(_error.getMessage());
+// TeaException error = new TeaException(_error.getMessage(), _error);
+// // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+// // 诊断地址
+// System.out.println(error.getData().get("Recommend"));
+// com.aliyun.teautil.Common.assertAsString(error.message);
+ }
+ }
+
+
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ApiOperation("文件上传")
@ResponseBody
diff --git a/src/main/resources/mapper/discSpinning/DiscSpinningRecordDao.xml b/src/main/resources/mapper/discSpinning/DiscSpinningRecordDao.xml
new file mode 100644
index 00000000..4e7d7246
--- /dev/null
+++ b/src/main/resources/mapper/discSpinning/DiscSpinningRecordDao.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file