Merge remote-tracking branch 'origin/master'

This commit is contained in:
GYJ 2024-12-04 15:57:32 +08:00
commit 149eec4363
15 changed files with 457 additions and 2 deletions

View File

@ -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
<br>

View File

@ -178,6 +178,11 @@
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.4</version>
</dependency>
<!-- 集成支付宝sdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>

View File

@ -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 日期

View File

@ -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<DiscSpinning> prizes = discSpinningService.list(new QueryWrapper<DiscSpinning>().orderByAsc("type","id"));
BigDecimal number = BigDecimal.ZERO;
List<DiscSpinning> 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<DiscSpinning>().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<DiscSpinning> 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;
}
}

View File

@ -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<DiscSpinningRecord>().orderByAsc("create_time")));
}
}

View File

@ -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<DiscSpinning> {
}

View File

@ -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<DiscSpinningRecord> {
int countDraw(@Param("userId")Long userId);
}

View File

@ -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<DiscSpinning> {
//主键
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;
}
}

View File

@ -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<DiscSpinningRecord> {
//主键
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;
}
}

View File

@ -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<DiscSpinningRecord> {
Integer countDraw(Long userId);
}

View File

@ -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<DiscSpinning> {
}

View File

@ -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<DiscSpinningRecordDao, DiscSpinningRecord> implements DiscSpinningRecordService {
@Autowired
private DiscSpinningRecordDao discSpinningRecordDao;
@Override
public Integer countDraw(Long userId) {
return discSpinningRecordDao.countDraw(userId);
}
}

View File

@ -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<DiscSpinningDao, DiscSpinning> implements DiscSpinningService {
@Autowired
private DiscSpinningDao discSpinningDao;
}

View File

@ -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

View File

@ -0,0 +1,9 @@
<?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.discSpinning.dao.DiscSpinningRecordDao">
<select id="countDraw" resultType="int">
SELECT count(1) FROM `disc_spinning_record` where user_id = 99 and draw_day = DATE_FORMAT(CURDATE(), '%Y-%m-%d');;
</select>
</mapper>