feat(role): 新增根据角色键获取角色信息接口

新增getByRoleKey方法用于通过roleKey查询角色信息,并在QywxScheduleJob中使用该方法为新增用户设置默认角色
```

```msg
feat(user): 重构用户余额统计返回数据结构

将selectTotalBalance方法返回类型从BigDecimal改为QyUserStatsDTO,包含余额和已使用余额字段,便于前端展示
```

```msg
feat(role): 新增获取全部角色列表接口

在RoleApplicationService中新增getRoleAll方法,并添加对应的控制器接口,用于获取所有角色列表
```

```msg
fix(shop): 为首页数据接口添加权限校验

在ShopController的stats方法上添加@PreAuthorize权限校验,确保只有拥有welcome:info权限的用户可以访问
This commit is contained in:
dzq 2025-05-29 10:03:55 +08:00
parent 66d1fcd026
commit 12fa1dce42
13 changed files with 63 additions and 22 deletions

View File

@ -18,6 +18,7 @@ import com.agileboot.domain.qywx.user.command.AddQyUserCommand;
import com.agileboot.domain.qywx.user.command.UpdateQyUserCommand;
import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.dto.QyUserDTO;
import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO;
import com.agileboot.domain.qywx.user.query.SearchQyUserQuery;
import io.swagger.v3.oas.annotations.Operation;
@ -105,8 +106,8 @@ public class QyUserController extends BaseController {
}
@GetMapping("/getTotalBalance")
public ResponseDTO<BigDecimal> getTotalBalance(@RequestParam(required = false) String corpid) {
BigDecimal totalBalance = qyUserApplicationService.selectTotalBalance(corpid);
return ResponseDTO.ok(totalBalance);
public ResponseDTO<QyUserStatsDTO> getTotalBalance(@RequestParam(required = false) String corpid) {
QyUserStatsDTO statsDTO = qyUserApplicationService.selectTotalBalance(corpid);
return ResponseDTO.ok(statsDTO);
}
}

View File

@ -26,6 +26,7 @@ import java.math.BigDecimal;
import java.util.List;
import javax.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@ -50,6 +51,7 @@ public class ShopController extends BaseController {
private final MqttService mqttService;
@Operation(summary = "首页数据")
@PreAuthorize("@permission.has('welcome:info')")
@GetMapping("/Stats")
public ResponseDTO<StatsDTO> stats() {
// 创建统计数据DTO对象

View File

@ -55,6 +55,14 @@ public class SysRoleController extends BaseController {
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "全部角色")
@PreAuthorize("@permission.has('system:role:list')")
@GetMapping("/all")
public ResponseDTO<List<RoleDTO>> all(RoleQuery query) {
List<RoleDTO> pageDTO = roleApplicationService.getRoleAll(query);
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "角色列表导出")
@AccessLog(title = "角色管理", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('system:role:export')")

View File

@ -38,6 +38,8 @@ import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService;
import com.agileboot.domain.qywx.userQySys.command.AddSysUserQyUserCommand;
import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserEntity;
import com.agileboot.domain.system.role.db.SysRoleEntity;
import com.agileboot.domain.system.role.db.SysRoleService;
import com.agileboot.domain.system.user.UserApplicationService;
import com.agileboot.domain.system.user.command.AddUserCommand;
@ -70,6 +72,7 @@ public class QywxScheduleJob {
private final QyUserApplicationService qyUserApplicationService;
private final SysUserQyUserApplicationService sysUserQyUserApplicationService;
private final UserModelFactory userModelFactory;
private final SysRoleService sysRoleService;
// private static final String appid = "QYTONG_YS_WXSHOP";
/**
@ -693,6 +696,7 @@ public class QywxScheduleJob {
}
});
SysRoleEntity role = sysRoleService.getByRoleKey("base");
for (AddSysUserQyUserCommand binding : toAdd) {
AddUserCommand command = new AddUserCommand();
command.setUsername("qywx" + binding.getQyUserId());
@ -707,7 +711,7 @@ public class QywxScheduleJob {
command.setEmail(phoneNumber + "@qywx.com");
command.setPassword("123456");
command.setStatus(1);
UserModel userModel = addUser(command);
UserModel userModel = addUser(command, role != null ? role.getRoleId() : 0L);
binding.setSysUserId(userModel.getUserId());
sysUserQyUserApplicationService.addSysUserQyUser(binding);
@ -717,8 +721,9 @@ public class QywxScheduleJob {
}
}
private UserModel addUser(AddUserCommand command) {
private UserModel addUser(AddUserCommand command, Long roleId) {
UserModel model = userModelFactory.create();
model.setRoleId(roleId);
model.loadAddUserCommand(command);
model.checkUsernameIsUnique();
model.checkPhoneNumberIsUnique();

View File

@ -10,6 +10,7 @@ import com.agileboot.domain.qywx.user.command.UpdateQyUserCommand;
import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.db.QyUserService;
import com.agileboot.domain.qywx.user.dto.QyUserDTO;
import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO;
import com.agileboot.domain.qywx.user.model.UserModel;
import com.agileboot.domain.qywx.user.model.QyUserModelFactory;
import com.agileboot.domain.qywx.user.query.SearchQyUserQuery;
@ -136,7 +137,7 @@ public class QyUserApplicationService {
}
}
public BigDecimal selectTotalBalance(String corpid) {
public QyUserStatsDTO selectTotalBalance(String corpid) {
return userService.selectTotalBalance(corpid);
}
}

View File

@ -1,11 +1,11 @@
package com.agileboot.domain.qywx.user.db;
import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.math.BigDecimal;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@ -45,14 +45,14 @@ public interface QyUserMapper extends BaseMapper<QyUserEntity> {
"AND sr.role_key = 'admin'")
List<String> selectAdminUserIds();
@Select("SELECT SUM(balance) " +
@Select("SELECT SUM(balance) AS balance, SUM(use_balance) AS useBalance " +
"FROM qy_user " +
"WHERE deleted = 0")
BigDecimal selectTotalBalance();
QyUserStatsDTO selectTotalBalance();
@Select("SELECT SUM(balance) " +
@Select("SELECT SUM(balance) AS balance, SUM(use_balance) AS useBalance " +
"FROM qy_user " +
"WHERE deleted = 0 AND corpid = #{corpid}")
BigDecimal selectTotalBalanceByCorpid(@Param("corpid") String corpid);
QyUserStatsDTO selectTotalBalanceByCorpid(@Param("corpid") String corpid);
}

View File

@ -1,6 +1,7 @@
package com.agileboot.domain.qywx.user.db;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@ -25,5 +26,5 @@ public interface QyUserService extends IService<QyUserEntity> {
List<String> selectAdminUserIds();
BigDecimal selectTotalBalance(String corpid);
QyUserStatsDTO selectTotalBalance(String corpid);
}

View File

@ -1,5 +1,6 @@
package com.agileboot.domain.qywx.user.db;
import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
@ -16,7 +17,6 @@ import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.math.BigDecimal;
import java.util.List;
@Service
@ -48,7 +48,7 @@ public class QyUserServiceImpl extends ServiceImpl<QyUserMapper, QyUserEntity> i
}
@Override
public BigDecimal selectTotalBalance(String corpid) {
public QyUserStatsDTO selectTotalBalance(String corpid) {
if (StringUtils.isBlank(corpid)) {
return baseMapper.selectTotalBalance();
} else {

View File

@ -0,0 +1,17 @@
package com.agileboot.domain.qywx.user.dto;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
public class QyUserStatsDTO {
// 用户余额
private BigDecimal balance;
// 已使用余额
private BigDecimal useBalance;
}

View File

@ -10,8 +10,6 @@ import com.agileboot.domain.cabinet.cell.db.CabinetCellEntity;
import com.agileboot.domain.cabinet.cell.db.CabinetCellService;
import com.agileboot.domain.cabinet.mainboard.db.CabinetMainboardEntity;
import com.agileboot.domain.cabinet.mainboard.db.CabinetMainboardService;
import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModel;
import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModelFactory;
import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModelFactory;
@ -21,7 +19,6 @@ import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.mqtt.MqttService;
import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.db.QyUserService;
import com.agileboot.domain.qywx.user.model.QyUserModelFactory;
import com.agileboot.domain.shop.goods.db.ShopGoodsEntity;
import com.agileboot.domain.shop.goods.db.ShopGoodsService;
import com.agileboot.domain.shop.order.command.SubmitOrderCommand;
@ -29,7 +26,6 @@ import com.agileboot.domain.shop.order.db.*;
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
import com.agileboot.domain.shop.order.dto.CreateOrderResult;
import com.agileboot.domain.shop.order.dto.GetOrdersByOpenIdDTO;
import com.agileboot.domain.shop.order.dto.ShopOrderDTO;
import com.agileboot.domain.shop.order.dto.TopGoodsDTO;
import com.agileboot.domain.shop.order.model.OrderModel;
import com.agileboot.domain.shop.order.model.OrderModelFactory;
@ -54,8 +50,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.checkerframework.checker.units.qual.s;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -74,7 +68,6 @@ public class OrderApplicationService {
private final SmartCabinetService smartCabinetService;
private final MqttService mqttService;
private final QyUserService userService;
private final QyUserModelFactory qyUserModelFactory;
private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory;
private final PaymentOperationLogApplicationService paymentOperationLogApplicationService;
private final CabinetMainboardService cabinetMainboardService;

View File

@ -53,6 +53,11 @@ public class RoleApplicationService {
return new PageDTO<>(records, page.getTotal());
}
public List<RoleDTO> getRoleAll(RoleQuery query) {
return roleService.list(query.toQueryWrapper())
.stream().map(RoleDTO::new).collect(Collectors.toList());
}
public RoleDTO getRoleInfo(Long roleId) {
SysRoleEntity byId = roleService.getById(roleId);
RoleDTO roleDTO = new RoleDTO(byId);

View File

@ -48,5 +48,5 @@ public interface SysRoleService extends IService<SysRoleEntity> {
*/
List<SysMenuEntity> getMenuListByRoleId(Long roleId);
SysRoleEntity getByRoleKey(String roleKey);
}

View File

@ -51,5 +51,13 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRoleEntity
return baseMapper.getMenuListByRoleId(roleId);
}
@Override
public SysRoleEntity getByRoleKey(String roleKey) {
QueryWrapper<SysRoleEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("role_key", roleKey)
.eq("deleted", 0);
return this.getOne(queryWrapper);
}
}