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