From 4184193ee6dafaf7ef94b6a0cdb214e863f56f51 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 15:01:53 +0800 Subject: [PATCH 01/35] =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=B9=B3=E5=8F=B0=20?= =?UTF-8?q?=E6=8F=90=E7=8E=B0=E6=89=A3=E6=AC=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqx/modules/pay/service/impl/CashOutServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java index ffe36b03..dea53833 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java @@ -483,7 +483,11 @@ public class CashOutServiceImpl extends ServiceImpl impleme userMoneyDetailsService.save(userMoneyDetails); baseMapper.insert(cashOut); - userMoneyService.updateAmount(2, userId, money); + if (isSys) { + userMoneyService.updateSysAmount(2, userId, money); + } else { + userMoneyService.updateAmount(2, userId, money); + } return Result.success("提现成功,将在三个工作日内到账,请耐心等待!"); } From 5a10f03a4ab7954d6b95d46bb6a320ddee6ea2e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 18 Dec 2024 17:07:13 +0800 Subject: [PATCH 02/35] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=B4=AF?= =?UTF-8?q?=E8=AE=A1=E5=85=85=E5=80=BC=E5=8F=AF=E5=BE=97=E5=85=8D=E8=B4=B9?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=85=A8=E9=9B=86=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sqx/common/utils/RedisKeys.java | 12 +++++ .../java/com/sqx/common/utils/RedisUtils.java | 14 ++++++ .../impl/CourseDetailsServiceImpl.java | 50 ++++++++++++++++++- .../com/sqx/modules/orders/dao/OrdersDao.java | 2 + .../modules/redisService/RedisService.java | 4 ++ .../redisService/impl/RedisServiceImpl.java | 25 ++++++++++ .../resources/mapper/orders/OrdersDao.xml | 8 +++ 7 files changed, 114 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sqx/common/utils/RedisKeys.java b/src/main/java/com/sqx/common/utils/RedisKeys.java index 6d568f41..e336f71e 100644 --- a/src/main/java/com/sqx/common/utils/RedisKeys.java +++ b/src/main/java/com/sqx/common/utils/RedisKeys.java @@ -1,11 +1,15 @@ package com.sqx.common.utils; +import cn.hutool.core.date.DateUtil; + /** * Redis所有Keys * */ public class RedisKeys { + public static final String PAY_FREE_WATCH_KEY = "pay:free:watch:"; + public static String getSysConfigKey(String key){ return "sys:config:" + key; } @@ -13,4 +17,12 @@ public class RedisKeys { public static String getDateKey(String key){ return "date:" + key; } + + public static String getPayFreeWatchKey(Long userId) { + return PAY_FREE_WATCH_KEY + DateUtil.today() + ":" + userId; + } + + public static void main(String[] args) { + System.out.println(DateUtil.today()); + } } diff --git a/src/main/java/com/sqx/common/utils/RedisUtils.java b/src/main/java/com/sqx/common/utils/RedisUtils.java index 3b90d246..6a7914c1 100644 --- a/src/main/java/com/sqx/common/utils/RedisUtils.java +++ b/src/main/java/com/sqx/common/utils/RedisUtils.java @@ -98,6 +98,20 @@ public class RedisUtils { if(expire != NOT_EXPIRE){ redisTemplate.expire(key, expire, TimeUnit.SECONDS); } + + } + + public boolean setIfAbsent(String key, Object value, long expire){ + Boolean absent = valueOperations.setIfAbsent(key, toJson(value)); + if (Boolean.FALSE.equals(absent)) { + return false; + } + if(expire != NOT_EXPIRE){ + redisTemplate.expire(key, expire, TimeUnit.SECONDS); + } + + return true; + } public void set(String key, Object value){ diff --git a/src/main/java/com/sqx/modules/course/service/impl/CourseDetailsServiceImpl.java b/src/main/java/com/sqx/modules/course/service/impl/CourseDetailsServiceImpl.java index 08dff28b..3ae16729 100644 --- a/src/main/java/com/sqx/modules/course/service/impl/CourseDetailsServiceImpl.java +++ b/src/main/java/com/sqx/modules/course/service/impl/CourseDetailsServiceImpl.java @@ -1,6 +1,8 @@ package com.sqx.modules.course.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -12,6 +14,8 @@ import com.sqx.common.utils.Result; import com.sqx.modules.app.entity.UserEntity; import com.sqx.modules.app.service.UserService; import com.sqx.modules.app.utils.JwtUtils; +import com.sqx.modules.common.dao.CommonInfoDao; +import com.sqx.modules.common.entity.CommonInfo; import com.sqx.modules.course.dao.CourseCollectDao; import com.sqx.modules.course.dao.CourseDao; import com.sqx.modules.course.dao.CourseDetailsDao; @@ -22,11 +26,15 @@ import com.sqx.modules.course.entity.CourseDetails; import com.sqx.modules.course.entity.CourseUser; import com.sqx.modules.course.service.CourseDetailsService; import com.sqx.modules.course.vo.CourseDetailsIn; +import com.sqx.modules.orders.dao.OrdersDao; +import com.sqx.modules.orders.entity.Orders; import com.sqx.modules.orders.service.OrdersService; +import com.sqx.modules.redisService.impl.RedisServiceImpl; import com.sqx.modules.utils.EasyPoi.ExcelUtils; import com.sqx.modules.utils.HttpClientUtil; import com.sqx.modules.utils.SenInfoCheckUtil; import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +47,7 @@ import java.util.Date; import java.util.List; @Service +@Slf4j public class CourseDetailsServiceImpl extends ServiceImpl implements CourseDetailsService { @Autowired @@ -53,6 +62,12 @@ public class CourseDetailsServiceImpl extends ServiceImpl() + .eq(CommonInfo::getType, 916)); + CommonInfo freeTimeCommonInfo = commonInfoDao.selectOne(new LambdaQueryWrapper() + .eq(CommonInfo::getType, 917)); + if (needCountCommonInfo == null || freeTimeCommonInfo == null + || StrUtil.isBlank(needCountCommonInfo.getValue()) || StrUtil.isBlank(freeTimeCommonInfo.getValue())) { + log.warn("系统未配置全免次数或时间"); + return false; + } + + // 购买次数超过,设置redis标识 + if (count >= Integer.parseInt(needCountCommonInfo.getValue())) { + redisServiceImpl.setPayFreeWatchTime(userId, Integer.parseInt(freeTimeCommonInfo.getValue())); + isExpire = false; + }else { + isExpire = true; + } + } + return !isExpire; + + } + @Override public Result selectCourseDetailsById(Long id, String token, String courseDetailsId) { Course bean = courseDao.selectById(id); @@ -99,7 +145,9 @@ public class CourseDetailsServiceImpl extends ServiceImpl { Integer selectOrdersCountStatisticsByDay(Long userId); Orders selectOrdersByDay(Long userId); + Integer countPayOrderByDay(Long userId); + Integer countOrderNum(Long userId, String time); diff --git a/src/main/java/com/sqx/modules/redisService/RedisService.java b/src/main/java/com/sqx/modules/redisService/RedisService.java index a7f27e9f..9652816b 100644 --- a/src/main/java/com/sqx/modules/redisService/RedisService.java +++ b/src/main/java/com/sqx/modules/redisService/RedisService.java @@ -8,4 +8,8 @@ public interface RedisService { void setDiscSpinningAmounts(String key); + + void setPayFreeWatchTime(Long userId, Integer time); + + Boolean getPayFreeWatchTimeIsExpire(Long userId); } diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index 69b0e7b2..44cbc099 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -1,6 +1,10 @@ package com.sqx.modules.redisService.impl; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.sqx.common.utils.RedisKeys; import com.sqx.common.utils.RedisUtils; import com.sqx.modules.discSpinning.entity.DiscSpinningAmount; import com.sqx.modules.discSpinning.service.DiscSpinningAmountService; @@ -9,6 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; import java.util.List; @Service public class RedisServiceImpl implements RedisService { @@ -23,4 +29,23 @@ public class RedisServiceImpl implements RedisService { List amounts = amountService.list(new QueryWrapper().eq("status", 1).orderByAsc("max_amount")); redisUtils.set(key, amounts); } + + @Override + public void setPayFreeWatchTime(Long userId, Integer minute) { + Date now = DateUtil.date(); + Date tomorrow = DateUtil.beginOfDay(DateUtil.offsetDay(now, 1)); + long seconds = DateUtil.between(now, tomorrow, DateUnit.SECOND); + redisUtils.setIfAbsent(RedisKeys.getPayFreeWatchKey(userId), DateUtil.offsetMinute(now, minute).getTime(), seconds + 300); + } + + @Override + public Boolean getPayFreeWatchTimeIsExpire(Long userId) { + String data = redisUtils.get(RedisKeys.getPayFreeWatchKey(userId)); + if (data == null) { + return null; + } + + long expireTime = Long.parseLong(data); + return DateUtil.current() > expireTime; + } } diff --git a/src/main/resources/mapper/orders/OrdersDao.xml b/src/main/resources/mapper/orders/OrdersDao.xml index ebbebcbb..e6f811ee 100644 --- a/src/main/resources/mapper/orders/OrdersDao.xml +++ b/src/main/resources/mapper/orders/OrdersDao.xml @@ -319,4 +319,12 @@ and create_time > #{time} + From c9242db8050d4bb607d663a17a0ed872b22e1689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 18 Dec 2024 17:25:52 +0800 Subject: [PATCH 03/35] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=B4=AF?= =?UTF-8?q?=E8=AE=A1=E5=85=85=E5=80=BC=E5=8F=AF=E5=BE=97=E5=85=8D=E8=B4=B9?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=85=A8=E9=9B=86=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sqx/modules/redisService/impl/RedisServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index 44cbc099..6378726b 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -35,7 +35,7 @@ public class RedisServiceImpl implements RedisService { Date now = DateUtil.date(); Date tomorrow = DateUtil.beginOfDay(DateUtil.offsetDay(now, 1)); long seconds = DateUtil.between(now, tomorrow, DateUnit.SECOND); - redisUtils.setIfAbsent(RedisKeys.getPayFreeWatchKey(userId), DateUtil.offsetMinute(now, minute).getTime(), seconds + 300); + redisUtils.setIfAbsent(RedisKeys.getPayFreeWatchKey(userId), DateUtil.offsetMinute(now, minute).getTime(), seconds); } @Override From 297c028985206bcd25fb45c8b8c6e291183844ff Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 16:37:42 +0800 Subject: [PATCH 04/35] =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=95=86=20=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sys/controller/SysLoginController.java | 166 +++++++++------- .../sys/service/impl/SysUserServiceImpl.java | 181 +++++++++--------- .../sqx/modules/utils/InvitationCodeUtil.java | 110 +++++++---- 3 files changed, 269 insertions(+), 188 deletions(-) diff --git a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java index b65cbcfa..2e07c0ea 100644 --- a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java +++ b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java @@ -1,12 +1,19 @@ package com.sqx.modules.sys.controller; import com.sqx.common.utils.Result; +import com.sqx.common.validator.ValidatorUtils; +import com.sqx.common.validator.group.AddGroup; +import com.sqx.modules.app.dao.MsgDao; +import com.sqx.modules.app.entity.Msg; import com.sqx.modules.sys.entity.SysUserEntity; import com.sqx.modules.sys.form.SysLoginForm; import com.sqx.modules.sys.service.SysCaptchaService; import com.sqx.modules.sys.service.SysUserService; import com.sqx.modules.sys.service.SysUserTokenService; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.apache.shiro.crypto.hash.Sha256Hash; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -19,80 +26,111 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.Map; /** * 登录相关 - * */ @RestController public class SysLoginController extends AbstractController { - @Autowired - private SysUserService sysUserService; - @Autowired - private SysUserTokenService sysUserTokenService; - @Autowired - private SysCaptchaService sysCaptchaService; + @Autowired + private SysUserService sysUserService; + @Autowired + private SysUserTokenService sysUserTokenService; + @Autowired + private SysCaptchaService sysCaptchaService; + @Autowired + private MsgDao msgDao; - /** - * 验证码 - */ - @GetMapping("captcha.jpg") - public void captcha(HttpServletResponse response, String uuid)throws IOException { - response.setHeader("Cache-Control", "no-store, no-cache"); - response.setContentType("image/jpeg"); + /** + * 验证码 + */ + @GetMapping("captcha.jpg") + public void captcha(HttpServletResponse response, String uuid) throws IOException { + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); - //获取图片验证码 - BufferedImage image = sysCaptchaService.getCaptcha(uuid); + //获取图片验证码 + BufferedImage image = sysCaptchaService.getCaptcha(uuid); - ServletOutputStream out = response.getOutputStream(); - ImageIO.write(image, "jpg", out); - IOUtils.closeQuietly(out); - } - - /** - * 登录 - */ - @PostMapping("/sys/login") - public Map login(@RequestBody SysLoginForm form)throws IOException { - boolean captcha = sysCaptchaService.validate(form.getUuid(), form.getCaptcha()); - if(!captcha){ - return Result.error("验证码不正确"); - } - - //用户信息 - SysUserEntity user = sysUserService.queryByUserName(form.getUsername()); - - //账号不存在、密码错误 - if(user == null || !user.getPassword().equals(new Sha256Hash(form.getPassword(), user.getSalt()).toHex())) { - return Result.error("账号或密码不正确"); - } - - //账号锁定 - if(user.getStatus() == 0){ - return Result.error("账号已被锁定,请联系管理员"); - } - - //判断角色类型 - if(form.getAdminType()==1 && user.getIsChannel()!=null && user.getIsChannel()==1){ - return Result.error("代理账号请登录代理端!"); - }else if(form.getAdminType()==2 && user.getIsChannel()==null){ - return Result.error("管理员请登录管理端!"); - } - - //生成token,并保存到数据库 - Result r = sysUserTokenService.createToken(user.getUserId()); - return r; - } + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + IOUtils.closeQuietly(out); + } - /** - * 退出 - */ - @PostMapping("/sys/logout") - public Result logout() { - sysUserTokenService.logout(getUserId()); - return Result.success(); - } - + @PostMapping("/registered") + @ApiImplicitParams({ + @ApiImplicitParam(name = "msg", value = "验证码", dataTypeClass = String.class, paramType = "param"), + }) + public Result registered(@RequestBody SysUserEntity user, String msg) { + if(StringUtils.isBlank(user.getMobile())){ + return Result.error("注册失败,请输入手机号"); + } + if(StringUtils.isBlank(msg)){ + return Result.error("注册失败,请输入验证码"); + } + Msg msg1 = msgDao.findByPhoneAndCode(user.getMobile(), msg); + if (msg1 == null) { + return Result.error("验证码不正确!"); + } + user.setIsChannel(1); + user.setQdRate(new BigDecimal("0.01")); + user.setStatus(1); + user.setRoleIdList(Collections.singletonList(4L)); + ValidatorUtils.validateEntity(user, AddGroup.class); + sysUserService.saveUser(user); + return Result.success(); + } + + + /** + * 登录 + */ + @PostMapping("/sys/login") + public Map login(@RequestBody SysLoginForm form) throws IOException { + boolean captcha = sysCaptchaService.validate(form.getUuid(), form.getCaptcha()); + if (!captcha) { + return Result.error("验证码不正确"); + } + + //用户信息 + SysUserEntity user = sysUserService.queryByUserName(form.getUsername()); + + //账号不存在、密码错误 + if (user == null || !user.getPassword().equals(new Sha256Hash(form.getPassword(), user.getSalt()).toHex())) { + return Result.error("账号或密码不正确"); + } + + //账号锁定 + if (user.getStatus() == 0) { + return Result.error("账号已被锁定,请联系管理员"); + } + + //判断角色类型 + if (form.getAdminType() == 1 && user.getIsChannel() != null && user.getIsChannel() == 1) { + return Result.error("代理账号请登录代理端!"); + } else if (form.getAdminType() == 2 && user.getIsChannel() == null) { + return Result.error("管理员请登录管理端!"); + } + + //生成token,并保存到数据库 + Result r = sysUserTokenService.createToken(user.getUserId()); + return r; + } + + + /** + * 退出 + */ + @PostMapping("/sys/logout") + public Result logout() { + sysUserTokenService.logout(getUserId()); + return Result.success(); + } + } diff --git a/src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java b/src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java index 1e247583..153be868 100644 --- a/src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java @@ -10,6 +10,7 @@ import com.sqx.modules.sys.entity.SysUserEntity; import com.sqx.modules.sys.service.SysRoleService; import com.sqx.modules.sys.service.SysUserRoleService; import com.sqx.modules.sys.service.SysUserService; +import com.sqx.modules.utils.InvitationCodeUtil; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.apache.shiro.crypto.hash.Sha256Hash; @@ -25,103 +26,105 @@ import java.util.Map; /** * 系统用户 - * */ @SuppressWarnings("ALL") @Service("sysUserService") public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - @Autowired - private SysUserRoleService sysUserRoleService; - @Autowired - private SysRoleService sysRoleService; + @Autowired + private SysUserRoleService sysUserRoleService; + @Autowired + private SysRoleService sysRoleService; - @Override - public PageUtils queryPage(Map params) { - String username = (String)params.get("username"); - Long createUserId = (Long)params.get("createUserId"); - Object isChannel = params.get("isChannel"); - Object sysUserId = params.get("sysUserId"); - IPage page = this.page( - new Query().getPage(params), - new QueryWrapper() - .like(StringUtils.isNotBlank(username),"username", username) - .eq(createUserId != null,"create_user_id", createUserId) - .eq(isChannel!=null,"is_channel",isChannel) - .eq(sysUserId!=null,"sys_user_id",sysUserId) - .isNull(sysUserId==null,"sys_user_id") - .isNull(isChannel==null,"is_channel") - ); + @Override + public PageUtils queryPage(Map params) { + String username = (String) params.get("username"); + Long createUserId = (Long) params.get("createUserId"); + Object isChannel = params.get("isChannel"); + Object sysUserId = params.get("sysUserId"); + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + .like(StringUtils.isNotBlank(username), "username", username) + .eq(createUserId != null, "create_user_id", createUserId) + .eq(isChannel != null, "is_channel", isChannel) + .eq(sysUserId != null, "sys_user_id", sysUserId) + .isNull(sysUserId == null, "sys_user_id") + .isNull(isChannel == null, "is_channel") + ); - return new PageUtils(page); - } + return new PageUtils(page); + } - @Override - public List queryAllPerms(Long userId) { - return baseMapper.queryAllPerms(userId); - } + @Override + public List queryAllPerms(Long userId) { + return baseMapper.queryAllPerms(userId); + } - @Override - public List queryAllMenuId(Long userId) { - return baseMapper.queryAllMenuId(userId); - } + @Override + public List queryAllMenuId(Long userId) { + return baseMapper.queryAllMenuId(userId); + } - @Override - public SysUserEntity queryByUserName(String username) { - return baseMapper.queryByUserName(username); - } + @Override + public SysUserEntity queryByUserName(String username) { + return baseMapper.queryByUserName(username); + } - @SuppressWarnings("AlibabaTransactionMustHaveRollback") - @Override - @Transactional - public void saveUser(SysUserEntity user) { - user.setCreateTime(new Date()); - //sha256加密 - String salt = RandomStringUtils.randomAlphanumeric(20); - user.setPassword(new Sha256Hash(user.getPassword(), salt).toHex()); - user.setSalt(salt); - this.save(user); - - //检查角色是否越权 - checkRole(user); - - //保存用户与角色关系 - sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList()); - } + @SuppressWarnings("AlibabaTransactionMustHaveRollback") + @Override + @Transactional + public void saveUser(SysUserEntity user) { + user.setCreateTime(new Date()); + //sha256加密 + String salt = RandomStringUtils.randomAlphanumeric(20); + user.setPassword(new Sha256Hash(user.getPassword(), salt).toHex()); + user.setSalt(salt); + this.save(user); + if (user.getIsChannel() != null && user.getIsChannel().equals(1) && StringUtils.isBlank(user.getQdCode())) { + user.setQdCode(InvitationCodeUtil.toRegisteredCode(user.getUserId())); + this.save(user); + } + //检查角色是否越权 + checkRole(user); - @Override - @Transactional - public void update(SysUserEntity user) { - if(StringUtils.isBlank(user.getPassword())){ - user.setPassword(null); - }else{ - user.setPassword(new Sha256Hash(user.getPassword(), user.getSalt()).toHex()); - } - this.updateById(user); - - //检查角色是否越权 - checkRole(user); - - //保存用户与角色关系 - sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList()); - } + //保存用户与角色关系 + sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList()); + } - @Override - public void deleteBatch(Long[] userId) { - this.removeByIds(Arrays.asList(userId)); - } + @Override + @Transactional + public void update(SysUserEntity user) { + if (StringUtils.isBlank(user.getPassword())) { + user.setPassword(null); + } else { + user.setPassword(new Sha256Hash(user.getPassword(), user.getSalt()).toHex()); + } + this.updateById(user); - @Override - public boolean updatePassword(Long userId, String password, String newPassword) { - SysUserEntity userEntity = new SysUserEntity(); - userEntity.setPassword(newPassword); - return this.update(userEntity, - new QueryWrapper().eq("user_id", userId).eq("password", password)); - } - - /** - * 检查角色是否越权 - */ - private void checkRole(SysUserEntity user){ + //检查角色是否越权 + checkRole(user); + + //保存用户与角色关系 + sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList()); + } + + @Override + public void deleteBatch(Long[] userId) { + this.removeByIds(Arrays.asList(userId)); + } + + @Override + public boolean updatePassword(Long userId, String password, String newPassword) { + SysUserEntity userEntity = new SysUserEntity(); + userEntity.setPassword(newPassword); + return this.update(userEntity, + new QueryWrapper().eq("user_id", userId).eq("password", password)); + } + + /** + * 检查角色是否越权 + */ + private void checkRole(SysUserEntity user) { /*if(user.getRoleIdList() == null || user.getRoleIdList().size() == 0){ return; } @@ -137,11 +140,11 @@ public class SysUserServiceImpl extends ServiceImpl i if(!roleIdList.containsAll(user.getRoleIdList())){ throw new SqxException("新增用户所选角色,不是本人创建"); }*/ - } + } - @Override - public SysUserEntity selectSysUserByQdCode(String qdCode){ - return baseMapper.selectOne(new QueryWrapper().isNull("sys_user_id").eq("qd_code", qdCode)); - } + @Override + public SysUserEntity selectSysUserByQdCode(String qdCode) { + return baseMapper.selectOne(new QueryWrapper().isNull("sys_user_id").eq("qd_code", qdCode)); + } } \ No newline at end of file diff --git a/src/main/java/com/sqx/modules/utils/InvitationCodeUtil.java b/src/main/java/com/sqx/modules/utils/InvitationCodeUtil.java index 2313064d..aa71722b 100644 --- a/src/main/java/com/sqx/modules/utils/InvitationCodeUtil.java +++ b/src/main/java/com/sqx/modules/utils/InvitationCodeUtil.java @@ -2,85 +2,125 @@ package com.sqx.modules.utils; /** * 邀请码生成解密工具类 + * * @author fang * @date 2020/7/8 */ public class InvitationCodeUtil { - /** 自定义进制(选择你想要的进制数,不能重复且最好不要0、1这些容易混淆的字符) */ - private static final char[] r=new char[]{ 'M', 'J', 'U', 'D', 'Z', 'X', '9', 'C', '7', 'P','E', '8', '6', 'B', 'G', 'H', 'S', '2', '5', 'F', 'R', '4','Q', 'W', 'K', '3', 'V', 'Y', 'T', 'N'}; + /** + * 自定义进制(选择你想要的进制数,不能重复且最好不要0、1这些容易混淆的字符) + */ + private static final char[] r = new char[]{'M', 'J', 'U', 'D', 'Z', 'X', '9', 'C', '7', 'P', 'E', '8', '6', 'B', 'G', 'H', 'S', '2', '5', 'F', 'R', '4', 'Q', 'W', 'K', '3', 'V', 'Y', 'T', 'N'}; - /** 定义一个字符用来补全邀请码长度(该字符前面是计算出来的邀请码,后面是用来补全用的) */ - private static final char b='A'; + /** + * 定义一个字符用来补全邀请码长度(该字符前面是计算出来的邀请码,后面是用来补全用的) + */ + private static final char b = 'A'; - /** 进制长度 */ - private static final int binLen=r.length; + /** + * 进制长度 + */ + private static final int binLen = r.length; - /** 邀请码长度 */ - private static final int s=6; + /** + * 邀请码长度 + */ + private static final int s = 6; - /** 补位字符串 */ - private static final String e="KSLFXFR"; + /** + * 补位字符串 + */ + private static final String e = "KSLFXFR"; + + /** + * 代理注册 补位字符串 + */ + private static final String re = "REGISTER"; /** * 根据ID生成六位随机码 + * + * @param id ID + * @return 随机码 + */ + public static String toRegisteredCode(long id) { + char[] buf = new char[32]; + int charPos = 32; + + while ((id / binLen) > 0) { + int ind = (int) (id % binLen); + buf[--charPos] = r[ind]; + id /= binLen; + } + buf[--charPos] = r[(int) (id % binLen)]; + String str = new String(buf, charPos, (32 - charPos)); + // 不够长度的自动补全 + if (str.length() < s) { + StringBuilder sb = new StringBuilder(); + sb.append(re.subSequence(0, s - str.length())); + str += sb.toString(); + } + return str; + } + + /** + * 根据ID生成六位随机码 + * * @param id ID * @return 随机码 */ public static String toSerialCode(long id) { - char[] buf=new char[32]; - int charPos=32; + char[] buf = new char[32]; + int charPos = 32; - while((id / binLen) > 0) { - int ind=(int)(id % binLen); - buf[--charPos]=r[ind]; + while ((id / binLen) > 0) { + int ind = (int) (id % binLen); + buf[--charPos] = r[ind]; id /= binLen; } - buf[--charPos]=r[(int)(id % binLen)]; - String str=new String(buf, charPos, (32 - charPos)); + buf[--charPos] = r[(int) (id % binLen)]; + String str = new String(buf, charPos, (32 - charPos)); // 不够长度的自动补全 - if(str.length() < s) { - StringBuilder sb=new StringBuilder(); - sb.append(e.subSequence(0, s-str.length())); - str+=sb.toString(); + if (str.length() < s) { + StringBuilder sb = new StringBuilder(); + sb.append(e.subSequence(0, s - str.length())); + str += sb.toString(); } return str; } /** * 根据随机码生成ID + * * @param code 随机码 * @return ID */ public static long codeToId(String code) { char[] chs; chs = code.toCharArray(); - long res=0L; - for(int i=0; i < chs.length; i++) { - int ind=0; - for(int j=0; j < binLen; j++) { - if(chs[i] == r[j]) { - ind=j; + long res = 0L; + for (int i = 0; i < chs.length; i++) { + int ind = 0; + for (int j = 0; j < binLen; j++) { + if (chs[i] == r[j]) { + ind = j; break; } } - if(chs[i] == b) { + if (chs[i] == b) { break; } - if(i > 0) { - res=res * binLen + ind; + if (i > 0) { + res = res * binLen + ind; } else { - res=ind; + res = ind; } } return res; } - - - - } \ No newline at end of file From 38decaa8f14caa18e8583baa1b426c81814737b6 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 16:44:59 +0800 Subject: [PATCH 05/35] =?UTF-8?q?=E6=8F=90=E7=8E=B0=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqx/modules/pay/controller/CashController.java | 14 ++++++++++++-- .../pay/controller/app/AppCashController.java | 2 +- .../sqx/modules/pay/service/CashOutService.java | 7 +++---- .../pay/service/impl/CashOutServiceImpl.java | 10 +++++++++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sqx/modules/pay/controller/CashController.java b/src/main/java/com/sqx/modules/pay/controller/CashController.java index 69a9bf96..9029252f 100644 --- a/src/main/java/com/sqx/modules/pay/controller/CashController.java +++ b/src/main/java/com/sqx/modules/pay/controller/CashController.java @@ -32,6 +32,8 @@ import com.sqx.modules.utils.AmountCalUtils; import com.sqx.modules.utils.excel.ExcelData; import com.sqx.modules.utils.excel.ExportExcelUtils; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -484,8 +486,16 @@ public class CashController { @Login @GetMapping(value = "/withdraw") @ApiOperation("发起提现 余额 金钱") - public Result withdraw(Long userId, Double money) { - return cashOutService.withdraw(userId, money, true); + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "提现人员Id", dataTypeClass = String.class, paramType = "param"), + @ApiImplicitParam(name = "money", value = "提现金额", dataTypeClass = Double.class, paramType = "param"), + @ApiImplicitParam(name = "msg", value = "验证码", dataTypeClass = String.class, paramType = "param"), + }) + public Result withdraw(Long userId, Double money, String msg) { + if (StringUtils.isBlank(msg)) { + return Result.error("请输入验证码"); + } + return cashOutService.withdraw(userId, money, msg, true); } diff --git a/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java b/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java index 0174b4ae..8feee5d0 100644 --- a/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java +++ b/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java @@ -48,7 +48,7 @@ public class AppCashController { @Debounce(interval = 3000, value = "#userId") @ApiOperation("发起提现 余额 金钱") public Result withdraw(@RequestAttribute("userId") Long userId, Double amount) { - return cashOutService.withdraw(userId, amount, false); + return cashOutService.withdraw(userId, amount, null, false); } @Login diff --git a/src/main/java/com/sqx/modules/pay/service/CashOutService.java b/src/main/java/com/sqx/modules/pay/service/CashOutService.java index e9c2cb6d..03898cd0 100644 --- a/src/main/java/com/sqx/modules/pay/service/CashOutService.java +++ b/src/main/java/com/sqx/modules/pay/service/CashOutService.java @@ -12,7 +12,7 @@ import java.util.List; public interface CashOutService { - PageUtils selectCashOutList(Integer page,Integer limit,CashOut cashOut); + PageUtils selectCashOutList(Integer page, Integer limit, CashOut cashOut); ExcelData excelPayDetails(CashOut cashOut); @@ -43,11 +43,10 @@ public interface CashOutService { Result sysCashMoney(Long userId, Double money); /** - * * @param userId 用户Id tb_user的id * @param money 提现金额 - * @param isSys 是否是系统用户提现 + * @param isSys 是否是系统用户提现 */ - Result withdraw(Long userId, Double money, boolean isSys); + Result withdraw(Long userId, Double money, String msg, boolean isSys); } diff --git a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java index dea53833..63aaefa4 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java @@ -5,6 +5,8 @@ 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.app.dao.MsgDao; +import com.sqx.modules.app.entity.Msg; import com.sqx.modules.app.entity.UserEntity; import com.sqx.modules.app.entity.UserMoney; import com.sqx.modules.app.entity.UserMoneyDetails; @@ -76,6 +78,8 @@ public class CashOutServiceImpl extends ServiceImpl impleme private InviteMoneyService inviteMoneyService; @Autowired private SysUserService sysUserService; + @Autowired + private MsgDao msgDao; @Override public PageUtils selectCashOutList(Integer page, Integer limit, CashOut cashOut) { @@ -402,7 +406,7 @@ public class CashOutServiceImpl extends ServiceImpl impleme @Override @Transactional - public Result withdraw(Long userId, Double money, boolean isSys) { + public Result withdraw(Long userId, Double money, String msg, boolean isSys) { if (money == null || money <= 0.00) { return Result.error("请不要输入小于0的数字,请输入正确的提现金额!"); } @@ -412,6 +416,10 @@ public class CashOutServiceImpl extends ServiceImpl impleme if (isSys) { SysUserEntity sysUserEntity = sysUserService.getById(userId); + Msg msg1 = msgDao.findByPhoneAndCode(sysUserEntity.getMobile(), msg); + if (msg1 == null) { + return Result.error("验证码不正确!"); + } if (StringUtils.isBlank(sysUserEntity.getZhiFuBao()) || StringUtils.isBlank(sysUserEntity.getZhiFuBaoName())) { return Result.error(9999, "请先绑定支付宝账号!"); } From 48ed1e3d7ac9043773fbc08ddc2357a60a943750 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 17:49:34 +0800 Subject: [PATCH 06/35] =?UTF-8?q?=E6=8A=BD=E5=A5=963=E6=AC=A1=E5=90=8E=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A6=82=E7=8E=87=20redis=20=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=20=E6=96=B0=E5=A2=9E=E8=BF=94=E5=9B=9E=20map?= =?UTF-8?q?>=20=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sqx/common/utils/RedisUtils.java | 84 +++++++++++++------ .../app/controller/app/AppController.java | 2 +- .../controller/DiscSpinningController.java | 4 +- .../entity/DiscSpinningAmount.java | 2 + .../service/DiscSpinningService.java | 2 +- .../service/impl/DiscSpinningServiceImpl.java | 20 +++-- .../redisService/impl/RedisServiceImpl.java | 11 ++- 7 files changed, 85 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/sqx/common/utils/RedisUtils.java b/src/main/java/com/sqx/common/utils/RedisUtils.java index 6a7914c1..6761c2e6 100644 --- a/src/main/java/com/sqx/common/utils/RedisUtils.java +++ b/src/main/java/com/sqx/common/utils/RedisUtils.java @@ -1,5 +1,6 @@ package com.sqx.common.utils; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.sqx.modules.redisService.RedisService; @@ -10,12 +11,14 @@ import org.springframework.stereotype.Component; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; /** * Redis工具类 - * */ @Component public class RedisUtils { @@ -33,19 +36,31 @@ public class RedisUtils { private SetOperations setOperations; @Autowired private ZSetOperations zSetOperations; - /** 默认过期时长,单位:秒 */ + /** + * 默认过期时长,单位:秒 + */ public final static long DEFAULT_EXPIRE = 60 * 60 * 24; - /** 不设置过期时长 */ + /** + * 不设置过期时长 + */ public final static long NOT_EXPIRE = -1; private final static Gson Gson = new Gson(); - /** - * 获取缓存里的数据 如果不存在 则插入 并返回 - * @param key redis Key - * @param clazz 返回类型 - * @param method RedisService调用的方法名 如果数据不存在会执行该调用方法 - */ - public List getListData(String key, Class clazz,String method) { + + public Map> getMapData(String key, String method, Class clazz) { + String jsonStr = getDate(key, method); + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonNode = objectMapper.readTree(jsonStr); + + return jsonNodeToMap(jsonNode, clazz); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public List getListData(String key, Class clazz, String method) { String jsonStr = getDate(key, method); ObjectMapper objectMapper = new ObjectMapper(); try { @@ -59,26 +74,27 @@ public class RedisUtils { /** * 获取缓存里的数据 如果不存在 则插入 并返回 - * @param key redis Key - * @param clazz 返回类型 + * + * @param key redis Key + * @param clazz 返回类型 * @param method RedisService调用的方法名 如果数据不存在会执行该调用方法 */ - public T getObjectDate(String key, Class clazz,String method) { + public T getObjectDate(String key, Class clazz, String method) { String jsonStr = getDate(key, method); return this.fromJson(jsonStr, clazz); } - public String getDate(String key, String method) { + public String getDate(String key, String method) { if (!this.hasKey(key)) { try { // 获取Lookup对象 MethodHandles.Lookup lookup = MethodHandles.lookup(); // 构建方法类型(这里假设方法无参数,返回类型为void) - MethodType methodType = MethodType.methodType(void.class , String.class); + MethodType methodType = MethodType.methodType(void.class, String.class); // 获取方法句柄 MethodHandle methodHandle = lookup.findVirtual(redisService.getClass(), method, methodType); // 调用方法句柄 - methodHandle.invoke(redisService,key); + methodHandle.invoke(redisService, key); } catch (Exception e) { e.printStackTrace(); return null; @@ -93,9 +109,9 @@ public class RedisUtils { return redisTemplate.hasKey(key); } - public void set(String key, Object value, long expire){ + public void set(String key, Object value, long expire) { valueOperations.set(key, toJson(value)); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } @@ -114,13 +130,13 @@ public class RedisUtils { } - public void set(String key, Object value){ + public void set(String key, Object value) { set(key, value, DEFAULT_EXPIRE); } public T get(String key, Class clazz, long expire) { String value = valueOperations.get(key); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } return value == null ? null : fromJson(value, clazz); @@ -132,7 +148,7 @@ public class RedisUtils { public String get(String key, long expire) { String value = valueOperations.get(key); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } return value; @@ -164,9 +180,9 @@ public class RedisUtils { /** * Object转成JSON数据 */ - private String toJson(Object object){ - if(object instanceof Integer || object instanceof Long || object instanceof Float || - object instanceof Double || object instanceof Boolean || object instanceof String){ + private String toJson(Object object) { + if (object instanceof Integer || object instanceof Long || object instanceof Float || + object instanceof Double || object instanceof Boolean || object instanceof String) { return String.valueOf(object); } return Gson.toJson(object); @@ -175,7 +191,25 @@ public class RedisUtils { /** * JSON数据,转成Object */ - private T fromJson(String json, Class clazz){ + private T fromJson(String json, Class clazz) { return Gson.fromJson(json, clazz); } + + + public Map> jsonNodeToMap(JsonNode jsonNode, Class clazz) { + Map> resultMap = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); + + if (jsonNode.isObject()) { + // 获取字段名(也就是键)的迭代器 + Iterator fieldNames = jsonNode.fieldNames(); + while (fieldNames.hasNext()) { + String key = fieldNames.next(); + JsonNode elementNode = jsonNode.get(key); + resultMap.put(key, objectMapper.convertValue(elementNode, + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz))); + } + } + return resultMap; + } } diff --git a/src/main/java/com/sqx/modules/app/controller/app/AppController.java b/src/main/java/com/sqx/modules/app/controller/app/AppController.java index 1dd37c5f..7ff8f36d 100644 --- a/src/main/java/com/sqx/modules/app/controller/app/AppController.java +++ b/src/main/java/com/sqx/modules/app/controller/app/AppController.java @@ -81,7 +81,7 @@ public class AppController { .eq("zhi_fu_bao", zhiFuBao)); if (count > 0) { - return Result.error("一个支付宝账号仅可绑定一个支付宝用户"); + return Result.error("一个支付宝账号仅可绑定一个用户"); } if (!ApiAccessLimitUtil.isAccessAllowed(userId.toString(), "updateZFB", 3, "month")) { return Result.error("每月仅支持修改三次,请联系管理员"); diff --git a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java index 17a246d8..320a10ed 100644 --- a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java +++ b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java @@ -151,10 +151,10 @@ public class DiscSpinningController { public Result draw(@ApiIgnore @RequestAttribute("userId") Long userId, @Nullable @ApiIgnore @RequestBody Map maps) { double amount = 0; Long orderId = null; + Integer i = recordService.countDraw(userId); if (maps == null || !maps.containsKey("source") || !"task".equals(maps.get("source"))) { //任务抽奖 int drawCount = Integer.parseInt(commonRepository.findOne(901).getValue()); - Integer i = recordService.countDraw(userId); if (i != null && i >= drawCount) { return Result.error("当日可抽奖次数已超限"); } @@ -166,7 +166,7 @@ public class DiscSpinningController { } } return new Result().put("data", - discSpinningService.draws(amount, orderId, userId, maps == null || maps.get("source") == null ? "order" : maps.get("source").toString())); + discSpinningService.draws(i == null ? 1 : i + 1, amount, orderId, userId, maps == null || maps.get("source") == null ? "order" : maps.get("source").toString())); } @ApiOperation("大转盘奖项领取") diff --git a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java index 2c1ea319..12ada871 100644 --- a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java +++ b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java @@ -18,6 +18,8 @@ import lombok.Data; public class DiscSpinningAmount extends Model { @ApiModelProperty("主键id") private Long id; + @ApiModelProperty("从第几次开始变化") + private Integer num; @ApiModelProperty("描述") private String name; @ApiModelProperty("0-1 小于 多少为该奖励") diff --git a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java index 00475220..0823efc6 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java @@ -8,7 +8,7 @@ import com.sqx.modules.discSpinning.entity.DiscSpinningRecord; public interface DiscSpinningService extends IService { //抽奖 - DiscSpinningRecord draws(double orderAmount, Long orderId, Long userId, String source); + DiscSpinningRecord draws(int drawCount, double orderAmount, Long orderId, Long userId, String source); //领奖 void receiveAsync(DiscSpinningRecord receive); 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 index 23b075e2..ec8d1f9d 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java @@ -33,10 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Random; +import java.util.*; @Service public class DiscSpinningServiceImpl extends ServiceImpl implements DiscSpinningService { @@ -125,11 +122,11 @@ public class DiscSpinningServiceImpl extends ServiceImpl prizes = baseMapper.selectList(new QueryWrapper().eq("disc_type", "order".equals(source) ? 1 : 2).orderByAsc("odds")); @@ -153,7 +150,14 @@ public class DiscSpinningServiceImpl extends ServiceImpl amounts = redisUtils.getListData(RedisKeys.getDateKey("spinning:amount"), DiscSpinningAmount.class, "setDiscSpinningAmounts"); + List amounts = new ArrayList<>(); + Map> amountMaps = redisUtils.getMapData(RedisKeys.getDateKey("spinning:amount"), "setDiscSpinningAmounts", DiscSpinningAmount.class); + for (int i = drawCount; i >= 0; i--) { + if (amountMaps.containsKey(i + "")) { + amounts = amountMaps.get(i + ""); + break; + } + } for (DiscSpinning prize : prizes) { if (randomNum.compareTo(prize.getNumber()) < 0) { if (prize.getType() == 2) { diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index 6378726b..c25b7b8f 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -2,7 +2,6 @@ package com.sqx.modules.redisService.impl; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sqx.common.utils.RedisKeys; import com.sqx.common.utils.RedisUtils; @@ -14,8 +13,10 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.Date; -import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service public class RedisServiceImpl implements RedisService { @Lazy @@ -27,7 +28,11 @@ public class RedisServiceImpl implements RedisService { @Override public void setDiscSpinningAmounts(String key) { List amounts = amountService.list(new QueryWrapper().eq("status", 1).orderByAsc("max_amount")); - redisUtils.set(key, amounts); + Map> map = + amounts.stream().collect(Collectors.groupingBy( + disc -> disc.getNum() == null ? 0 : disc.getNum() + )); + redisUtils.set(key, map); } @Override From c510a32e7183b8b9c138bbfa97ef5f49f946b14b Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 17:59:30 +0800 Subject: [PATCH 07/35] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sqx/modules/sys/controller/SysLoginController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java index 2e07c0ea..3e3e9ebb 100644 --- a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java +++ b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java @@ -10,6 +10,7 @@ import com.sqx.modules.sys.form.SysLoginForm; import com.sqx.modules.sys.service.SysCaptchaService; import com.sqx.modules.sys.service.SysUserService; import com.sqx.modules.sys.service.SysUserTokenService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import org.apache.commons.io.IOUtils; @@ -36,6 +37,7 @@ import java.util.Map; * 登录相关 */ @RestController +@Api(value = "登录接口", tags = {"登录接口"}) public class SysLoginController extends AbstractController { @Autowired private SysUserService sysUserService; From 9550e3d169c9c535661b33264c5c29a91f795e8c Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 18 Dec 2024 18:10:57 +0800 Subject: [PATCH 08/35] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sqx/modules/sys/controller/SysLoginController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java index 3e3e9ebb..b4e24eb7 100644 --- a/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java +++ b/src/main/java/com/sqx/modules/sys/controller/SysLoginController.java @@ -13,6 +13,7 @@ import com.sqx.modules.sys.service.SysUserTokenService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.shiro.crypto.hash.Sha256Hash; @@ -37,7 +38,7 @@ import java.util.Map; * 登录相关 */ @RestController -@Api(value = "登录接口", tags = {"登录接口"}) +@Api(value = "登录相关", tags = {"登录相关"}) public class SysLoginController extends AbstractController { @Autowired private SysUserService sysUserService; @@ -66,6 +67,7 @@ public class SysLoginController extends AbstractController { @PostMapping("/registered") + @ApiOperation("代理注册") @ApiImplicitParams({ @ApiImplicitParam(name = "msg", value = "验证码", dataTypeClass = String.class, paramType = "param"), }) From d6355e37ed3cb25442db8fe1ec95572303e9e9c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Thu, 19 Dec 2024 10:40:16 +0800 Subject: [PATCH 09/35] =?UTF-8?q?=E7=AD=BE=E5=88=B0=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserSignRecordController.java | 40 ++++-- .../sqx/modules/userSign/dto/UserSignDTO.java | 38 ++++++ .../userSign/dto/UserSignRecordDTO.java | 32 +++++ .../service/UserSignRecordService.java | 7 +- .../impl/UserSignRecordServiceImpl.java | 128 ++++++++++++++++++ 5 files changed, 229 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/sqx/modules/userSign/dto/UserSignDTO.java create mode 100644 src/main/java/com/sqx/modules/userSign/dto/UserSignRecordDTO.java diff --git a/src/main/java/com/sqx/modules/userSign/controller/UserSignRecordController.java b/src/main/java/com/sqx/modules/userSign/controller/UserSignRecordController.java index 9e5b9f9f..6c6ef4fa 100644 --- a/src/main/java/com/sqx/modules/userSign/controller/UserSignRecordController.java +++ b/src/main/java/com/sqx/modules/userSign/controller/UserSignRecordController.java @@ -1,35 +1,47 @@ package com.sqx.modules.userSign.controller; -import com.sqx.modules.userSign.entity.UserSignRecord; -import com.sqx.modules.userSign.service.UserSignRecordService; -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.sys.controller.AbstractController; +import com.sqx.modules.userSign.dto.UserSignDTO; +import com.sqx.modules.userSign.service.UserSignRecordService; 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; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @Api(value = "用户签到", tags = {"用户签到"}) @RequestMapping(value = "/userSignRecord") -public class UserSignRecordController { +public class UserSignRecordController extends AbstractController { /** * 服务对象 */ @Autowired private UserSignRecordService userSignRecordService; -// @GetMapping("/selectUserSignRecord") -// @ApiOperation("查询用户签到表") -// public Result selectUserSignRecord(Integer page, Integer limit,@RequestAttribute("userId") Long userId) { -// return Result.success().put("data", userSignRecordService.page(new Page<>(page, limit), new QueryWrapper().orderByAsc("create_time"))); -// } + /** + * 获取用户连续签到数据 + */ + @GetMapping("/getUserSignData") + @ApiOperation("获取用户连续签到数据") + public Result getUserSignData() { + UserSignDTO data = userSignRecordService.getUserSignData(); + return Result.success().put("data", data); + } + + /** + * 获取连续签到奖励配置 + */ + @GetMapping("/getUserSignAwardConfig") + @ApiOperation(value = "获取连续签到奖励配置", notes = "如:[7,7] = 连续签到7天奖励7元") + public Result getUserSignAwardConfig() { + String[] data = userSignRecordService.getUserSignAwardConfig(); + return Result.success().put("data", data); + } } diff --git a/src/main/java/com/sqx/modules/userSign/dto/UserSignDTO.java b/src/main/java/com/sqx/modules/userSign/dto/UserSignDTO.java new file mode 100644 index 00000000..969b4b74 --- /dev/null +++ b/src/main/java/com/sqx/modules/userSign/dto/UserSignDTO.java @@ -0,0 +1,38 @@ +package com.sqx.modules.userSign.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 用户签到数据 + * + * @author tankaikai + * @since 2024-12-18 17:34 + */ +@Data +@ApiModel(value = "用户签到数据") +public class UserSignDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "连续签到天数") + private Integer signDays; + + @ApiModelProperty(value = "该用户能否参加签到活动", example = "1-允许,0-不允许") + private Integer enable; + + @ApiModelProperty(value = "连续签到记录") + private List recordList; +} diff --git a/src/main/java/com/sqx/modules/userSign/dto/UserSignRecordDTO.java b/src/main/java/com/sqx/modules/userSign/dto/UserSignRecordDTO.java new file mode 100644 index 00000000..78801223 --- /dev/null +++ b/src/main/java/com/sqx/modules/userSign/dto/UserSignRecordDTO.java @@ -0,0 +1,32 @@ +package com.sqx.modules.userSign.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户连续签到记录 + * + * @author tankaikai + * @since 2024-12-18 17:34 + */ +@Data +@ApiModel(value = "用户连续签到记录") +public class UserSignRecordDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "签到日期", required = true, example = "2024-12-18") + private String signDay; + + @ApiModelProperty(value = "签到状态", required = true, example = "0-未签到, 1-已签到") + private String status; + + @ApiModelProperty(value = "展示文本", required = true, example = "未签到, 待签到, 已签到, 第x天") + private String showText; + + @ApiModelProperty(value = "签到时间", example = "2024-12-18 17:34:00") + private String signDate; + +} diff --git a/src/main/java/com/sqx/modules/userSign/service/UserSignRecordService.java b/src/main/java/com/sqx/modules/userSign/service/UserSignRecordService.java index 086f1249..cbd9b000 100644 --- a/src/main/java/com/sqx/modules/userSign/service/UserSignRecordService.java +++ b/src/main/java/com/sqx/modules/userSign/service/UserSignRecordService.java @@ -1,11 +1,14 @@ package com.sqx.modules.userSign.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.sqx.modules.userSign.dto.UserSignDTO; import com.sqx.modules.userSign.entity.UserSignRecord; -import java.util.Map; - public interface UserSignRecordService extends IService { + UserSignDTO getUserSignData(); + + String[] getUserSignAwardConfig(); + } diff --git a/src/main/java/com/sqx/modules/userSign/service/impl/UserSignRecordServiceImpl.java b/src/main/java/com/sqx/modules/userSign/service/impl/UserSignRecordServiceImpl.java index 7010a5fe..ecf66cc5 100644 --- a/src/main/java/com/sqx/modules/userSign/service/impl/UserSignRecordServiceImpl.java +++ b/src/main/java/com/sqx/modules/userSign/service/impl/UserSignRecordServiceImpl.java @@ -1,14 +1,142 @@ package com.sqx.modules.userSign.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sqx.common.exception.SqxException; +import com.sqx.modules.common.dao.CommonInfoDao; +import com.sqx.modules.common.entity.CommonInfo; +import com.sqx.modules.sys.entity.SysUserEntity; import com.sqx.modules.userSign.dao.UserSignRecordDao; +import com.sqx.modules.userSign.dto.UserSignDTO; +import com.sqx.modules.userSign.dto.UserSignRecordDTO; import com.sqx.modules.userSign.entity.UserSignRecord; import com.sqx.modules.userSign.service.UserSignRecordService; +import org.apache.shiro.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service public class UserSignRecordServiceImpl extends ServiceImpl implements UserSignRecordService { + @Autowired + private CommonInfoDao commonInfoDao; + + @Override + public UserSignDTO getUserSignData() { + SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); + UserSignDTO dto = new UserSignDTO(); + dto.setUserId(currentUser.getUserId()); + dto.setUsername(currentUser.getUsername()); + dto.setMobile(currentUser.getMobile()); + dto.setSignDays(0); + dto.setEnable(1); + CommonInfo config = commonInfoDao.findOne(918); + if (config == null) { + throw new SqxException("签到活动配置不存在"); + } + // 活动天数 + int activeDays = Convert.toInt(config.getValue().split(",")[0]); + // 当前日期 + LocalDate beginDay = LocalDate.now(); + // 签到记录 + List recordList = new ArrayList<>(); + // 连续签到日期 + List flowDays = buildFlowDays(beginDay, activeDays); + // 实际签到记录 + List list = baseMapper.selectList(Wrappers.lambdaQuery().eq(UserSignRecord::getUserId, currentUser.getUserId()).orderByAsc(UserSignRecord::getCreateTime)); + // 第x天 + int index = 1; + // 连续签到天数 + int signDays = 0; + if (CollUtil.isEmpty(list)) { + for (String day : flowDays) { + UserSignRecordDTO record = new UserSignRecordDTO(); + record.setSignDay(day); + record.setStatus("0"); + record.setShowText(StrUtil.format("第{}天", index)); + record.setSignDate(""); + recordList.add(record); + index++; + } + dto.setRecordList(recordList); + dto.setSignDays(signDays); + return dto; + } + String beginSignDay = list.stream().findFirst().get().getSignDay(); + flowDays = buildFlowDays(LocalDate.parse(beginSignDay, DateTimeFormatter.ofPattern("yyyy-MM-dd")), activeDays); + index = 1; + Map signMap = list.stream().collect(Collectors.toMap(UserSignRecord::getSignDay, UserSignRecord::getCreateTime)); + for (String day : flowDays) { + Date date = signMap.get(day); + UserSignRecordDTO record = new UserSignRecordDTO(); + if (date != null) { + String signDay = DateUtil.formatDateTime(signMap.get(day)); + record.setSignDay(day); + record.setStatus("1"); + record.setSignDate(signDay); + record.setShowText("已签到"); + signDays++; + } else { + record.setSignDay(day); + record.setStatus("0"); + record.setSignDate(""); + LocalDate thisDay = LocalDate.parse(day); + LocalDate currentDay = LocalDate.now(); + long daysBetween = ChronoUnit.DAYS.between(thisDay, currentDay); + if (daysBetween > 0) { + signDays = 0; + record.setShowText("未签到"); + } else if (daysBetween == 0) { + record.setShowText("待签到"); + } else { + record.setShowText(StrUtil.format("第{}天", index)); + } + } + recordList.add(record); + index++; + } + dto.setRecordList(recordList); + dto.setSignDays(signDays); + // 该用户是否可以继续签到 + UserSignRecordDTO last = recordList.get(recordList.size() - 1); + LocalDate lastDay = LocalDate.parse(last.getSignDay()); + LocalDate currentDay = LocalDate.now(); + long daysBetween = ChronoUnit.DAYS.between(currentDay, lastDay); + if (daysBetween < 0 || "1".equals(last.getStatus())) { + dto.setEnable(0); + } + return dto; + } + + @Override + public String[] getUserSignAwardConfig() { + CommonInfo config = commonInfoDao.findOne(918); + if (config == null) { + throw new SqxException("签到活动配置不存在"); + } + return config.getValue().split(","); + } + + private List buildFlowDays(LocalDate beginDay, int activeDays) { + List flowDays = new ArrayList<>(); + for (int i = 0; i < activeDays; i++) { + flowDays.add(beginDay.plusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + } + return flowDays; + } } From 59dd621bab2465667cc269c1a444a09220f3d52e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Thu, 19 Dec 2024 10:08:37 +0800 Subject: [PATCH 10/35] =?UTF-8?q?=E6=8F=90=E7=8E=B0=E6=80=BB=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=20=E6=8F=90=E7=8E=B0=E6=80=BB=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/controller/OrdersController.java | 176 ++++++++++-------- .../com/sqx/modules/pay/dao/CashOutDao.java | 1 + src/main/resources/mapper/pay/CashDao.xml | 4 + 3 files changed, 105 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/sqx/modules/orders/controller/OrdersController.java b/src/main/java/com/sqx/modules/orders/controller/OrdersController.java index 07cb5bfc..3c6d5511 100644 --- a/src/main/java/com/sqx/modules/orders/controller/OrdersController.java +++ b/src/main/java/com/sqx/modules/orders/controller/OrdersController.java @@ -1,8 +1,15 @@ package com.sqx.modules.orders.controller; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sqx.common.utils.DateUtils; import com.sqx.common.utils.Result; +import com.sqx.modules.course.entity.CourseCollect; import com.sqx.modules.orders.service.OrdersService; +import com.sqx.modules.pay.dao.CashOutDao; +import com.sqx.modules.pay.entity.CashOut; +import com.sqx.modules.pay.service.CashOutService; import com.sqx.modules.sys.controller.AbstractController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -14,6 +21,8 @@ import org.springframework.web.bind.annotation.RestController; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; @RestController @@ -22,19 +31,21 @@ import java.util.*; public class OrdersController extends AbstractController { @Autowired private OrdersService ordersService; + @Autowired + private CashOutDao cashOutDao; @GetMapping("/selectOrders") @ApiOperation("订单信息列表") - public Result selectOrders(Integer page,Integer limit,String ordersNo,Integer status,Long userId, - Long courseId,Integer flag,String time,String userName,Integer ordersType, - String startTime,String endTime,Long sysUserId,String qdCode,String sysUserName){ - return ordersService.selectOrders(page,limit,ordersNo,status,userId,courseId,flag,time,userName,ordersType, - startTime,endTime,sysUserId,qdCode,sysUserName); + public Result selectOrders(Integer page, Integer limit, String ordersNo, Integer status, Long userId, + Long courseId, Integer flag, String time, String userName, Integer ordersType, + String startTime, String endTime, Long sysUserId, String qdCode, String sysUserName) { + return ordersService.selectOrders(page, limit, ordersNo, status, userId, courseId, flag, time, userName, ordersType, + startTime, endTime, sysUserId, qdCode, sysUserName); } @GetMapping("/deleteOrders") @ApiOperation("删除订单") - public Result deleteOrders(String ids){ + public Result deleteOrders(String ids) { return ordersService.deleteOrders(ids); } @@ -46,75 +57,93 @@ public class OrdersController extends AbstractController { @GetMapping("/selectOrdersMoneyList") @ApiOperation("订单收入分析") - public Result selectOrdersMoneyList(Integer page,Integer limit,Integer flag,String time){ + public Result selectOrdersMoneyList(Integer page, Integer limit, Integer flag, String time) { return ordersService.selectOrdersMoneyList(page, limit, flag, time); } @PostMapping("/refundOrders") @ApiOperation("退款订单") - public Result refundOrders(Long ordersId){ - return ordersService.refundOrder(ordersId,"系统退款"); + public Result refundOrders(Long ordersId) { + return ordersService.refundOrder(ordersId, "系统退款"); } @GetMapping("/selectOrdersCount") @ApiOperation("订单统计") - public Result selectOrdersCount(Integer flag,String time,Long sysUserId){ + public Result selectOrdersCount(Integer flag, String time, Long sysUserId) { //短剧订单 总 待 完 退 - Integer sumCourseOrdersCount = ordersService.selectOrdersCount(null, 1, flag, time,sysUserId); - Integer daiCourseKeOrdersCount = ordersService.selectOrdersCount(0, 1, flag, time,sysUserId); - Integer wanCourseKeOrdersCount = ordersService.selectOrdersCount(1, 1, flag, time,sysUserId); - Integer tuiCourseOrdersCount = ordersService.selectOrdersCount(2, 1, flag, time,sysUserId); + Integer sumCourseOrdersCount = ordersService.selectOrdersCount(null, 1, flag, time, sysUserId); + Integer daiCourseKeOrdersCount = ordersService.selectOrdersCount(0, 1, flag, time, sysUserId); + Integer wanCourseKeOrdersCount = ordersService.selectOrdersCount(1, 1, flag, time, sysUserId); + Integer tuiCourseOrdersCount = ordersService.selectOrdersCount(2, 1, flag, time, sysUserId); //短剧钱 - Double sumCourseOrdersMoney = ordersService.selectOrdersMoney(null, 1, flag, time,null,sysUserId); - Double daiCourseOrdersMoney = ordersService.selectOrdersMoney(0, 1, flag, time,null,sysUserId); - Double wanCourseOrdersMoney = ordersService.selectOrdersMoney(1, 1, flag, time,null,sysUserId); - Double tuiCourseOrdersMoney = ordersService.selectOrdersMoney(2, 1, flag, time,null,sysUserId); + Double sumCourseOrdersMoney = ordersService.selectOrdersMoney(null, 1, flag, time, null, sysUserId); + Double daiCourseOrdersMoney = ordersService.selectOrdersMoney(0, 1, flag, time, null, sysUserId); + Double wanCourseOrdersMoney = ordersService.selectOrdersMoney(1, 1, flag, time, null, sysUserId); + Double tuiCourseOrdersMoney = ordersService.selectOrdersMoney(2, 1, flag, time, null, sysUserId); //会员订单 总 待 完 退 - Integer sumMemberOrdersCount = ordersService.selectOrdersCount(null, 2, flag, time,sysUserId); - Integer daiMemberKeOrdersCount = ordersService.selectOrdersCount(0, 2, flag, time,sysUserId); - Integer wanMemberKeOrdersCount = ordersService.selectOrdersCount(1, 2, flag, time,sysUserId); - Integer tuiMemberOrdersCount = ordersService.selectOrdersCount(2, 2, flag, time,sysUserId); + Integer sumMemberOrdersCount = ordersService.selectOrdersCount(null, 2, flag, time, sysUserId); + Integer daiMemberKeOrdersCount = ordersService.selectOrdersCount(0, 2, flag, time, sysUserId); + Integer wanMemberKeOrdersCount = ordersService.selectOrdersCount(1, 2, flag, time, sysUserId); + Integer tuiMemberOrdersCount = ordersService.selectOrdersCount(2, 2, flag, time, sysUserId); //会员钱 - Double sumMemberOrdersMoney = ordersService.selectOrdersMoney(null, 2, flag, time,null,sysUserId); - Double daiMemberOrdersMoney = ordersService.selectOrdersMoney(0, 2, flag, time,null,sysUserId); - Double wanMemberOrdersMoney = ordersService.selectOrdersMoney(1, 2, flag, time,null,sysUserId); - Double tuiMemberOrdersMoney = ordersService.selectOrdersMoney(2, 2, flag, time,null,sysUserId); - Map result=new HashMap<>(); - result.put("sumCourseOrdersCount",sumCourseOrdersCount);result.put("daiCourseKeOrdersCount",daiCourseKeOrdersCount); - result.put("wanCourseKeOrdersCount",wanCourseKeOrdersCount);result.put("tuiCourseOrdersCount",tuiCourseOrdersCount); - result.put("sumCourseOrdersMoney",sumCourseOrdersMoney);result.put("daiCourseOrdersMoney",daiCourseOrdersMoney); - result.put("wanCourseOrdersMoney",wanCourseOrdersMoney);result.put("tuiCourseOrdersMoney",tuiCourseOrdersMoney); - result.put("sumMemberOrdersCount",sumMemberOrdersCount);result.put("daiMemberKeOrdersCount",daiMemberKeOrdersCount); - result.put("wanMemberKeOrdersCount",wanMemberKeOrdersCount);result.put("tuiMemberOrdersCount",tuiMemberOrdersCount); - result.put("sumMemberOrdersMoney",sumMemberOrdersMoney);result.put("daiMemberOrdersMoney",daiMemberOrdersMoney); - result.put("wanMemberOrdersMoney",wanMemberOrdersMoney);result.put("tuiMemberOrdersMoney",tuiMemberOrdersMoney); - return Result.success().put("data",result); + Double sumMemberOrdersMoney = ordersService.selectOrdersMoney(null, 2, flag, time, null, sysUserId); + Double daiMemberOrdersMoney = ordersService.selectOrdersMoney(0, 2, flag, time, null, sysUserId); + Double wanMemberOrdersMoney = ordersService.selectOrdersMoney(1, 2, flag, time, null, sysUserId); + Double tuiMemberOrdersMoney = ordersService.selectOrdersMoney(2, 2, flag, time, null, sysUserId); + //提现 + Integer cashCount = cashOutDao.selectCount(new QueryWrapper() + .eq("sys_user_id", sysUserId) + .eq("state", 1) + .gt("create_at", DateUtil.format(DateUtil.parse(time, "yyyy-MM-dd"), "yyyy-MM-dd HH:mm:ss"))); + Double cashSum = cashOutDao.selectSysUserCashOutSum(sysUserId, DateUtil.format(DateUtil.parse(time, "yyyy-MM-dd"), "yyyy-MM-dd HH:mm:ss")); + + Map result = new HashMap<>(); + + result.put("sumCourseOrdersCount", sumCourseOrdersCount); + result.put("daiCourseKeOrdersCount", daiCourseKeOrdersCount); + result.put("wanCourseKeOrdersCount", wanCourseKeOrdersCount); + result.put("tuiCourseOrdersCount", tuiCourseOrdersCount); + result.put("sumCourseOrdersMoney", sumCourseOrdersMoney); + result.put("daiCourseOrdersMoney", daiCourseOrdersMoney); + result.put("wanCourseOrdersMoney", wanCourseOrdersMoney); + result.put("tuiCourseOrdersMoney", tuiCourseOrdersMoney); + result.put("sumMemberOrdersCount", sumMemberOrdersCount); + result.put("daiMemberKeOrdersCount", daiMemberKeOrdersCount); + result.put("wanMemberKeOrdersCount", wanMemberKeOrdersCount); + result.put("tuiMemberOrdersCount", tuiMemberOrdersCount); + result.put("sumMemberOrdersMoney", sumMemberOrdersMoney); + result.put("daiMemberOrdersMoney", daiMemberOrdersMoney); + result.put("wanMemberOrdersMoney", wanMemberOrdersMoney); + result.put("tuiMemberOrdersMoney", tuiMemberOrdersMoney); + result.put("cashCount", cashCount == null ? 0 : cashCount); + result.put("cashSum", cashSum); + return Result.success().put("data", result); } @GetMapping("/selectCourseOrdersMoneyCount") @ApiOperation("统计具体剧的收益") - public Result selectCourseOrdersMoneyCount(Long courseId,Long sysUserId){ + public Result selectCourseOrdersMoneyCount(Long courseId, Long sysUserId) { //总收益 - Double sumMoney = ordersService.selectOrdersMoney(1, 1, null, null,courseId,sysUserId); + Double sumMoney = ordersService.selectOrdersMoney(1, 1, null, null, courseId, sysUserId); String dateTime = DateUtils.format(new Date()); //年 - Double yearMoney = ordersService.selectOrdersMoney(1, 1, 3, dateTime,courseId,sysUserId); + Double yearMoney = ordersService.selectOrdersMoney(1, 1, 3, dateTime, courseId, sysUserId); //月 - Double monthMoney = ordersService.selectOrdersMoney(1, 1, 2, dateTime,courseId,sysUserId); + Double monthMoney = ordersService.selectOrdersMoney(1, 1, 2, dateTime, courseId, sysUserId); //日 - Double dayMoney = ordersService.selectOrdersMoney(1, 1, 1, dateTime,courseId,sysUserId); - Map result=new HashMap<>(); - result.put("sumMoney",sumMoney); - result.put("yearMoney",yearMoney); - result.put("monthMoney",monthMoney); - result.put("dayMoney",dayMoney); - return Result.success().put("data",result); + Double dayMoney = ordersService.selectOrdersMoney(1, 1, 1, dateTime, courseId, sysUserId); + Map result = new HashMap<>(); + result.put("sumMoney", sumMoney); + result.put("yearMoney", yearMoney); + result.put("monthMoney", monthMoney); + result.put("dayMoney", dayMoney); + return Result.success().put("data", result); } @GetMapping("/selectFenXiaoMoney") @ApiOperation("统计分销金币") - public Result selectFenXiaoMoney(Long sysUserId,Integer flag,String time){ + public Result selectFenXiaoMoney(Long sysUserId, Integer flag, String time) { //一级 Double oneMoney = ordersService.selectFenXiaoMoney(1, sysUserId, flag, time); //二级 @@ -123,25 +152,25 @@ public class OrdersController extends AbstractController { Double qdMoney = ordersService.selectFenXiaoMoney(3, sysUserId, flag, time); //总分销 Double sumMoney = ordersService.selectFenXiaoMoney(4, sysUserId, flag, time); - Map result=new HashMap<>(); - result.put("oneMoney",oneMoney); - result.put("twoMoney",twoMoney); - result.put("qdMoney",qdMoney); - result.put("sumMoney",sumMoney); - return Result.success().put("data",result); + Map result = new HashMap<>(); + result.put("oneMoney", oneMoney); + result.put("twoMoney", twoMoney); + result.put("qdMoney", qdMoney); + result.put("sumMoney", sumMoney); + return Result.success().put("data", result); } @GetMapping("/selectOrdersCountStatisticsByYear") @ApiOperation("订单数量统计") - public Result selectOrdersCountStatisticsByYear(String startTime,String endTime){ + public Result selectOrdersCountStatisticsByYear(String startTime, String endTime) { //总数量 0待支付 1已支付 2已退款 - List ordersCountList=new ArrayList<>(); - List ordersDaiFuKuanCountList=new ArrayList<>(); - List ordersYiZhiFuCountList=new ArrayList<>(); - List ordersYiTuiKuanLunCountList=new ArrayList<>(); - List year=new ArrayList<>(); + List ordersCountList = new ArrayList<>(); + List ordersDaiFuKuanCountList = new ArrayList<>(); + List ordersYiZhiFuCountList = new ArrayList<>(); + List ordersYiTuiKuanLunCountList = new ArrayList<>(); + List year = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - Calendar calendar=Calendar.getInstance(); + Calendar calendar = Calendar.getInstance(); Date parse = null; try { parse = simpleDateFormat.parse(startTime); @@ -149,7 +178,7 @@ public class OrdersController extends AbstractController { e.printStackTrace(); } calendar.setTime(parse); - while (true){ + while (true) { String dateTime = simpleDateFormat.format(calendar.getTime()); //状态 0待支付 1已支付 2已退款 //总订单数 @@ -165,22 +194,17 @@ public class OrdersController extends AbstractController { Integer ordersQuXiaoCount = ordersService.selectOrdersCountStatisticsByYear(1, dateTime, 2); ordersYiTuiKuanLunCountList.add(ordersQuXiaoCount); year.add(dateTime); - if(dateTime.equals(endTime)){ + if (dateTime.equals(endTime)) { break; } - calendar.add(Calendar.DATE,1); + calendar.add(Calendar.DATE, 1); } - Map result=new HashMap<>(); - result.put("ordersCountList",ordersCountList); - result.put("ordersDaiFuKuanCountList",ordersDaiFuKuanCountList); - result.put("ordersYiZhiFuCountList",ordersYiZhiFuCountList); - result.put("ordersYiTuiKuanLunCountList",ordersYiTuiKuanLunCountList); - result.put("year",year); - return Result.success().put("data",result); + Map result = new HashMap<>(); + result.put("ordersCountList", ordersCountList); + result.put("ordersDaiFuKuanCountList", ordersDaiFuKuanCountList); + result.put("ordersYiZhiFuCountList", ordersYiZhiFuCountList); + result.put("ordersYiTuiKuanLunCountList", ordersYiTuiKuanLunCountList); + result.put("year", year); + return Result.success().put("data", result); } - - - - - } diff --git a/src/main/java/com/sqx/modules/pay/dao/CashOutDao.java b/src/main/java/com/sqx/modules/pay/dao/CashOutDao.java index 7561dbbd..40b5738e 100644 --- a/src/main/java/com/sqx/modules/pay/dao/CashOutDao.java +++ b/src/main/java/com/sqx/modules/pay/dao/CashOutDao.java @@ -22,6 +22,7 @@ public interface CashOutDao extends BaseMapper { List selectYesterday(); Double selectCashOutSum(@Param("userId") Long userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + Double selectSysUserCashOutSum(@Param("sysUserId") Long sysUserId, @Param("time") String time); Double sumMoney(@Param("time") String time, @Param("flag") Integer flag); diff --git a/src/main/resources/mapper/pay/CashDao.xml b/src/main/resources/mapper/pay/CashDao.xml index 75073d42..373d81c4 100644 --- a/src/main/resources/mapper/pay/CashDao.xml +++ b/src/main/resources/mapper/pay/CashDao.xml @@ -19,6 +19,10 @@ select sum(money) from cash_out where state in (0,1) and user_id=#{userId} and date_format(create_at,'%Y-%m-%d') between #{startTime} and #{endTime} + + \ No newline at end of file From 9dff41383ff30ad5bcbd35492a78a609ca8b04e5 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Mon, 23 Dec 2024 09:39:34 +0800 Subject: [PATCH 35/35] =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discSpinning/service/impl/DiscSpinningServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 index cb261368..4d7256dc 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java @@ -154,6 +154,7 @@ public class DiscSpinningServiceImpl extends ServiceImpl