Compare commits

...

8 Commits

Author SHA1 Message Date
dzq cae2822a5d feat(支付和智能柜): 新增余额相关字段和格口统计功能
- 在GetBalanceResponse中添加useBalance和balanceLimit字段
- 在SmartCabinet相关类中添加usedCells和availableCells字段用于统计格口使用情况
- 修改智能柜查询SQL以计算已用和可用格口数
- 新增商品管理控制器ManageGoodsController
2025-06-02 10:24:33 +08:00
dzq 0ea23e7309 fix(企业微信): 修复用户同步逻辑中的用户删除处理
将用户删除逻辑从物理删除改为逻辑删除,通过将用户状态设置为禁用(enable=0)来实现
修复了之前被注释掉的用户删除逻辑,确保数据一致性
2025-05-30 11:12:59 +08:00
dzq a6c12859e3 feat(企业微信): 为北流铜州医院用户设置默认余额
为符合业务需求,当新增用户的企业ID匹配北流铜州医院时,自动设置其账户余额和限额为1000元
2025-05-29 16:20:46 +08:00
dzq 1be43a1251 feat(用户模块): 添加用户余额额度字段及相关逻辑
在用户表中新增balance_limit字段用于记录用户余额额度,并同步更新DTO、Entity及相关查询逻辑
修改用户更新逻辑,当只更新额度时自动计算剩余余额
更新统计查询SQL以包含额度字段的汇总
2025-05-29 15:57:31 +08:00
dzq 12fa1dce42 feat(role): 新增根据角色键获取角色信息接口
新增getByRoleKey方法用于通过roleKey查询角色信息,并在QywxScheduleJob中使用该方法为新增用户设置默认角色
```

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

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

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

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

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

在ShopController的stats方法上添加@PreAuthorize权限校验,确保只有拥有welcome:info权限的用户可以访问
2025-05-29 10:03:55 +08:00
dzq 66d1fcd026 feat(用户): 添加已使用余额字段并实现订单和退款逻辑
在用户表中添加 use_balance 字段用于记录已使用余额
修改订单和退款审批服务,在扣款和退款时同步更新该字段
2025-05-28 11:41:53 +08:00
dzq 4f4c3f39cc feat(api): 添加智能柜和格口的API接口及数据对象
新增智能柜和格口的API接口,包括获取智能柜列表和格口列表功能
添加OpenApiConstants常量类用于签名验证
创建SmartCabinetDO和CabinetCellDO数据对象
实现相关服务层和Mapper层查询方法
添加单元测试验证接口功能
2025-05-27 09:42:13 +08:00
dzq d808f8b1eb refactor(controller): 移除菜单列表接口的权限注解
移除@PreAuthorize注解以简化权限控制逻辑,后续将通过统一拦截器处理权限校验
2025-05-26 10:37:42 +08:00
38 changed files with 579 additions and 161 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.command.UpdateQyUserCommand;
import com.agileboot.domain.qywx.user.db.QyUserEntity; import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.dto.QyUserDTO; 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 com.agileboot.domain.qywx.user.query.SearchQyUserQuery;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -105,8 +106,8 @@ public class QyUserController extends BaseController {
} }
@GetMapping("/getTotalBalance") @GetMapping("/getTotalBalance")
public ResponseDTO<BigDecimal> getTotalBalance(@RequestParam(required = false) String corpid) { public ResponseDTO<QyUserStatsDTO> getTotalBalance(@RequestParam(required = false) String corpid) {
BigDecimal totalBalance = qyUserApplicationService.selectTotalBalance(corpid); QyUserStatsDTO statsDTO = qyUserApplicationService.selectTotalBalance(corpid);
return ResponseDTO.ok(totalBalance); return ResponseDTO.ok(statsDTO);
} }
} }

View File

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

View File

@ -48,7 +48,6 @@ public class SysMenuController extends BaseController {
* 获取菜单列表 * 获取菜单列表
*/ */
@Operation(summary = "菜单列表") @Operation(summary = "菜单列表")
@PreAuthorize("@permission.has('system:menu:list')")
@GetMapping @GetMapping
public ResponseDTO<List<MenuDTO>> menuList(MenuQuery menuQuery) { public ResponseDTO<List<MenuDTO>> menuList(MenuQuery menuQuery) {
List<MenuDTO> menuList = menuApplicationService.getMenuList(menuQuery); List<MenuDTO> menuList = menuApplicationService.getMenuList(menuQuery);

View File

@ -55,6 +55,14 @@ public class SysRoleController extends BaseController {
return ResponseDTO.ok(pageDTO); 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 = "角色列表导出") @Operation(summary = "角色列表导出")
@AccessLog(title = "角色管理", businessType = BusinessTypeEnum.EXPORT) @AccessLog(title = "角色管理", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('system:role:export')") @PreAuthorize("@permission.has('system:role:export')")

View File

@ -2,6 +2,7 @@ package com.agileboot.admin.customize.service;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.agileboot.common.constant.WeixinConstants;
import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService; import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService;
import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity; import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity;
@ -23,6 +24,8 @@ import com.agileboot.domain.qywx.department.db.QyDepartmentEntity;
import com.agileboot.domain.qywx.template.TemplateApplicationService; import com.agileboot.domain.qywx.template.TemplateApplicationService;
import com.agileboot.domain.qywx.template.command.UpdateTemplateCommand; import com.agileboot.domain.qywx.template.command.UpdateTemplateCommand;
import com.agileboot.domain.qywx.template.db.QyTemplateEntity; import com.agileboot.domain.qywx.template.db.QyTemplateEntity;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -30,6 +33,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.agileboot.domain.qywx.user.QyUserApplicationService; import com.agileboot.domain.qywx.user.QyUserApplicationService;
import com.agileboot.domain.qywx.user.command.AddQyUserCommand; import com.agileboot.domain.qywx.user.command.AddQyUserCommand;
@ -38,6 +42,8 @@ import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService; import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService;
import com.agileboot.domain.qywx.userQySys.command.AddSysUserQyUserCommand; import com.agileboot.domain.qywx.userQySys.command.AddSysUserQyUserCommand;
import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserEntity; 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.UserApplicationService;
import com.agileboot.domain.system.user.command.AddUserCommand; import com.agileboot.domain.system.user.command.AddUserCommand;
@ -70,6 +76,7 @@ public class QywxScheduleJob {
private final QyUserApplicationService qyUserApplicationService; private final QyUserApplicationService qyUserApplicationService;
private final SysUserQyUserApplicationService sysUserQyUserApplicationService; private final SysUserQyUserApplicationService sysUserQyUserApplicationService;
private final UserModelFactory userModelFactory; private final UserModelFactory userModelFactory;
private final SysRoleService sysRoleService;
// private static final String appid = "QYTONG_YS_WXSHOP"; // private static final String appid = "QYTONG_YS_WXSHOP";
/** /**
@ -412,6 +419,7 @@ public class QywxScheduleJob {
.collect(Collectors.toList()); .collect(Collectors.toList());
List<UserListResponse.UserInfo> wxUsers = new ArrayList<>();
for (QyDepartmentEntity department : departmentList) { for (QyDepartmentEntity department : departmentList) {
// 获取部门用户列表 // 获取部门用户列表
UserListResponse userList = QywxApiUtil.getUserList(accessToken.getAccessToken(), department.getDepartmentId()); UserListResponse userList = QywxApiUtil.getUserList(accessToken.getAccessToken(), department.getDepartmentId());
@ -425,9 +433,10 @@ public class QywxScheduleJob {
} }
log.info("获取部门用户列表成功: {}", JSONUtil.toJsonStr(userList)); log.info("获取部门用户列表成功: {}", JSONUtil.toJsonStr(userList));
List<UserListResponse.UserInfo> wxUsers = userList.getUserlist(); List<UserListResponse.UserInfo> wxUsersList = userList.getUserlist();
if (wxUsers == null || wxUsers.isEmpty()) { if (wxUsersList != null) {
continue; wxUsers.addAll(wxUsersList);
}
} }
Map<String, UserListResponse.UserInfo> wxUserMap = wxUsers.stream() Map<String, UserListResponse.UserInfo> wxUserMap = wxUsers.stream()
@ -449,10 +458,10 @@ public class QywxScheduleJob {
log.info("syncUserInfo toAdd: {}", JSONUtil.toJsonStr(toAdd)); log.info("syncUserInfo toAdd: {}", JSONUtil.toJsonStr(toAdd));
// 识别需要删除的用户 // 识别需要删除的用户
/* List<QyUserEntity> toRemove = qyUserList.stream() List<QyUserEntity> toRemove = qyUserList.stream()
.filter(localUser -> !wxUserMap.containsKey(localUser.getUserid())) .filter(localUser -> !wxUserMap.containsKey(localUser.getUserid()))
.collect(Collectors.toList()); .collect(Collectors.toList());
log.info("syncUserInfo toRemove: {}", JSONUtil.toJsonStr(toRemove));*/ log.info("syncUserInfo toRemove: {}", JSONUtil.toJsonStr(toRemove));
// 识别需要更新的用户 // 识别需要更新的用户
List<UpdateQyUserCommand> toUpdate = qyUserList.stream() List<UpdateQyUserCommand> toUpdate = qyUserList.stream()
@ -543,6 +552,11 @@ public class QywxScheduleJob {
newUser.setCreateTime(new Date()); newUser.setCreateTime(new Date());
newUser.setUpdaterId(0L); newUser.setUpdaterId(0L);
newUser.setUpdateTime(new Date()); newUser.setUpdateTime(new Date());
// 北流铜州医院默认余额1000
if (WeixinConstants.corpid.equals(newUser.getCorpid())) {
newUser.setBalanceLimit(BigDecimal.valueOf(1000L));
newUser.setBalance(BigDecimal.valueOf(1000L));
}
qyUserApplicationService.addUser(newUser); qyUserApplicationService.addUser(newUser);
}); });
} }
@ -553,12 +567,19 @@ public class QywxScheduleJob {
} }
// 删除用户 // 删除用户
/*if (!toRemove.isEmpty()) { if (!toRemove.isEmpty()) {
BulkOperationCommand<Integer> command = new BulkOperationCommand<>( /*BulkOperationCommand<Integer> command = new BulkOperationCommand<>(
toRemove.stream().map(QyUserEntity::getId).collect(Collectors.toList()) toRemove.stream().map(QyUserEntity::getId).collect(Collectors.toList())
); );
qyUserApplicationService.deleteUser(command); qyUserApplicationService.deleteUser(command);*/
}*/ toRemove.stream()
.map(removeUser -> {
UpdateQyUserCommand deleteCommand = new UpdateQyUserCommand();
deleteCommand.setId(removeUser.getId());
deleteCommand.setEnable("0");
return deleteCommand;
})
.forEach(qyUserApplicationService::updateUser);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("syncUserInfo error", e); log.error("syncUserInfo error", e);
@ -693,6 +714,7 @@ public class QywxScheduleJob {
} }
}); });
SysRoleEntity role = sysRoleService.getByRoleKey("base");
for (AddSysUserQyUserCommand binding : toAdd) { for (AddSysUserQyUserCommand binding : toAdd) {
AddUserCommand command = new AddUserCommand(); AddUserCommand command = new AddUserCommand();
command.setUsername("qywx" + binding.getQyUserId()); command.setUsername("qywx" + binding.getQyUserId());
@ -707,7 +729,7 @@ public class QywxScheduleJob {
command.setEmail(phoneNumber + "@qywx.com"); command.setEmail(phoneNumber + "@qywx.com");
command.setPassword("123456"); command.setPassword("123456");
command.setStatus(1); command.setStatus(1);
UserModel userModel = addUser(command); UserModel userModel = addUser(command, role != null ? role.getRoleId() : 0L);
binding.setSysUserId(userModel.getUserId()); binding.setSysUserId(userModel.getUserId());
sysUserQyUserApplicationService.addSysUserQyUser(binding); sysUserQyUserApplicationService.addSysUserQyUser(binding);
@ -717,8 +739,9 @@ public class QywxScheduleJob {
} }
} }
private UserModel addUser(AddUserCommand command) { private UserModel addUser(AddUserCommand command, Long roleId) {
UserModel model = userModelFactory.create(); UserModel model = userModelFactory.create();
model.setRoleId(roleId);
model.loadAddUserCommand(command); model.loadAddUserCommand(command);
model.checkUsernameIsUnique(); model.checkUsernameIsUnique();
model.checkPhoneNumberIsUnique(); model.checkPhoneNumberIsUnique();

View File

@ -0,0 +1,59 @@
package com.agileboot.api.controller;
import com.agileboot.common.constant.OpenApiConstants;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.domain.cabinet.cell.CabinetCellApplicationService;
import com.agileboot.domain.cabinet.cell.db.CabinetCellDO;
import com.agileboot.domain.cabinet.smartCabinet.SmartCabinetApplicationService;
import com.agileboot.domain.cabinet.smartCabinet.db.SmartCabinetDO;
import com.agileboot.domain.cabinet.smartCabinet.dto.CabinetDetailDTO;
import com.agileboot.domain.cabinet.smartCabinet.dto.SmartCabinetDTO;
import com.agileboot.domain.cabinet.smartCabinet.vo.CabinetVO;
import com.agileboot.domain.shop.payment.SignUtils;
import com.agileboot.domain.shop.payment.dto.CommonRequest;
import com.agileboot.domain.shop.payment.dto.RefundVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequiredArgsConstructor
@RequestMapping("/api/cabinets")
public class CabinetController {
private final SmartCabinetApplicationService smartCabinetApplicationService;
private final CabinetCellApplicationService cabinetCellApplicationService;
@PostMapping("/list")
public ResponseDTO<List<SmartCabinetDO>> getConsumablesCabinetList(@RequestBody String body) {
CommonRequest<CabinetVO> notifyRequest = CommonRequest.build(body, CabinetVO.class);
if (notifyRequest == null) {
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "请求参数无效"));
}
log.info("getConsumablesCabinetList sign:{}, body:{}", notifyRequest.getSign(), body);
if (!SignUtils.checkOpenSign(OpenApiConstants.appKey, notifyRequest.getSign(), body)) {
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "sign校验失败"));
}
return ResponseDTO.ok(smartCabinetApplicationService.getConsumablesCabinetList());
}
@PostMapping("/cells")
public ResponseDTO<List<CabinetCellDO>> getConsumablesCabinetCellsList(@RequestBody String body) {
CommonRequest<CabinetVO> notifyRequest = CommonRequest.build(body, CabinetVO.class);
if (notifyRequest == null) {
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "请求参数无效"));
}
log.info("getConsumablesCabinetCellsList sign:{}, body:{}", notifyRequest.getSign(), body);
if (!SignUtils.checkOpenSign(OpenApiConstants.appKey, notifyRequest.getSign(), body)) {
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "sign校验失败"));
}
return ResponseDTO.ok(cabinetCellApplicationService.selectCabinetCellDOList(notifyRequest.getBizContent().getCabinetId()));
}
}

View File

@ -24,6 +24,8 @@ import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService;
import com.agileboot.domain.shop.order.OrderApplicationService; import com.agileboot.domain.shop.order.OrderApplicationService;
import com.agileboot.domain.shop.payment.PaymentApplicationService; import com.agileboot.domain.shop.payment.PaymentApplicationService;
import com.agileboot.domain.shop.payment.dto.PaymentCallbackRequest; import com.agileboot.domain.shop.payment.dto.PaymentCallbackRequest;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -264,7 +266,12 @@ public class PaymentController {
} }
// 创建响应对象假设GetBalanceResponse包含balance字段 // 创建响应对象假设GetBalanceResponse包含balance字段
GetBalanceResponse response = new GetBalanceResponse(maxBalanceUser.getUserid(), maxBalanceUser.getCorpid(), maxBalanceUser.getBalance()); GetBalanceResponse response = new GetBalanceResponse(
maxBalanceUser.getUserid(),
maxBalanceUser.getCorpid(),
BigDecimal.ZERO,
BigDecimal.ZERO,
BigDecimal.ZERO);
return ResponseDTO.ok(response); return ResponseDTO.ok(response);
} }
@ -279,7 +286,12 @@ public class PaymentController {
QyUserEntity qyUser = qyUserApplicationService.getUserByUserId(userid, corpid); QyUserEntity qyUser = qyUserApplicationService.getUserByUserId(userid, corpid);
// 创建响应对象假设GetBalanceResponse包含balance字段 // 创建响应对象假设GetBalanceResponse包含balance字段
GetBalanceResponse response = new GetBalanceResponse(qyUser.getUserid(), qyUser.getCorpid(), qyUser.getBalance()); GetBalanceResponse response = new GetBalanceResponse(
qyUser.getUserid(),
qyUser.getCorpid(),
qyUser.getBalance(),
qyUser.getUseBalance(),
qyUser.getBalanceLimit());
return ResponseDTO.ok(response); return ResponseDTO.ok(response);
} }

View File

@ -0,0 +1,71 @@
package com.agileboot.api.controller.manage;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.enums.common.BusinessTypeEnum;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.shop.goods.GoodsApplicationService;
import com.agileboot.domain.shop.goods.command.AddGoodsCommand;
import com.agileboot.domain.shop.goods.command.UpdateGoodsCommand;
import com.agileboot.domain.shop.goods.db.SearchGoodsDO;
import com.agileboot.domain.shop.goods.dto.ShopGoodsDTO;
import com.agileboot.domain.shop.goods.query.SearchShopGoodsQuery;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.List;
@Slf4j
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequiredArgsConstructor
@RequestMapping("/api/manage/goods")
public class ManageGoodsController {
private final GoodsApplicationService goodsApplicationService;
/**
* 获取商品列表
*/
@Operation(summary = "商品列表")
@GetMapping("/list")
public ResponseDTO<PageDTO<ShopGoodsDTO>> goodsList(SearchShopGoodsQuery<SearchGoodsDO> query) {
PageDTO<ShopGoodsDTO> page = goodsApplicationService.getGoodsList(query);
return ResponseDTO.ok(page);
}
@Operation(summary = "新增商品")
@PostMapping
public ResponseDTO<Void> add(@Validated @RequestBody AddGoodsCommand command) {
goodsApplicationService.addGoods(command);
return ResponseDTO.ok();
}
@Operation(summary = "删除商品")
@DeleteMapping("/{goodsIds}")
public ResponseDTO<Void> remove(@PathVariable @NotNull List<Long> goodsIds) {
BulkOperationCommand<Long> bulkDeleteCommand = new BulkOperationCommand<>(goodsIds);
goodsApplicationService.deleteGoods(bulkDeleteCommand);
return ResponseDTO.ok();
}
@Operation(summary = "修改商品")
@PutMapping("/{goodsId}")
public ResponseDTO<Void> edit(@PathVariable Long goodsId, @Validated @RequestBody UpdateGoodsCommand command) {
command.setGoodsId(goodsId);
goodsApplicationService.updateGoods(command);
return ResponseDTO.ok();
}
/**
* 获取单个商品信息
*/
@Operation(summary = "商品列表")
@GetMapping("/getGoodsInfo")
public ResponseDTO<ShopGoodsDTO> getGoodsInfo(@RequestParam Long goodsId) {
ShopGoodsDTO goodsInfo = goodsApplicationService.getGoodsInfo(goodsId);
return ResponseDTO.ok(goodsInfo);
}
}

View File

@ -11,4 +11,6 @@ public class GetBalanceResponse {
private String userid; private String userid;
private String corpid; private String corpid;
private BigDecimal balance; private BigDecimal balance;
private BigDecimal useBalance;
private BigDecimal balanceLimit;
} }

View File

@ -0,0 +1,47 @@
package com.agileboot.api.controller;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.agileboot.common.constant.OpenApiConstants;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.domain.shop.payment.SignUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class CabinetControllerTest {
@Test
public void testGetConsumablesCabinetList() {
// 1. 准备请求参数
Map<String, String> params = new HashMap<>();
params.put("timestamp", String.valueOf(new Date().getTime()));
// 2. 生成签名
String appKey = OpenApiConstants.appKey;
String sign = SignUtils.openSign(appKey, params);
params.put("sign", sign);
// 3. 构建请求体
StringBuilder sb = new StringBuilder();
for (String key : params.keySet()) {
if (sb.length() > 0) {
sb.append("&");
}
sb.append(key).append("=").append(params.get(key));
}
// 4. 发送请求
System.out.println("Request: " + sb.toString());
System.out.println("sign: " + sign);
String res = HttpUtil.post("http://localhost:8090/api/cabinets/list", sb.toString());
// 5. 验证响应
System.out.println("Response: " + res);
}
}

View File

@ -0,0 +1,5 @@
package com.agileboot.common.constant;
public class OpenApiConstants {
public static final String appKey = "wxshop202505270821";
}

View File

@ -1,6 +1,7 @@
package com.agileboot.domain.cabinet.cell; package com.agileboot.domain.cabinet.cell;
import com.agileboot.common.core.page.PageDTO; import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.cabinet.cell.db.CabinetCellDO;
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO; import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
import com.agileboot.domain.cabinet.cell.query.SearchCabinetCellWithOrdersQuery; import com.agileboot.domain.cabinet.cell.query.SearchCabinetCellWithOrdersQuery;
import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.common.command.BulkOperationCommand;
@ -95,4 +96,8 @@ public class CabinetCellApplicationService {
public Long countLinkedRecord() { public Long countLinkedRecord() {
return cabinetCellService.countLinkedRecord(); return cabinetCellService.countLinkedRecord();
} }
public List<CabinetCellDO> selectCabinetCellDOList(Long cabinetId) {
return cabinetCellService.selectCabinetCellDOList(cabinetId);
}
} }

View File

@ -0,0 +1,41 @@
package com.agileboot.domain.cabinet.cell.db;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@TableName("cabinet_cell")
@ApiModel(value = "CabinetCellDO对象", description = "柜机格口信息表")
public class CabinetCellDO {
@ApiModelProperty("格口唯一ID")
@TableId(value = "cell_id", type = IdType.AUTO)
private Long cellId;
@ApiModelProperty("关联柜机ID")
@TableField("cabinet_id")
private Long cabinetId;
@ApiModelProperty("格口号")
@TableField("cell_no")
private Integer cellNo;
@ApiModelProperty("格口类型1小格 2中格 3大格 4超大格")
@TableField("cell_type")
private Integer cellType;
@ApiModelProperty("使用状态1空闲 2已占用")
@TableField("usage_status")
private Integer usageStatus;
@ApiModelProperty("可用状态1正常 2故障")
@TableField("available_status")
private Integer availableStatus;
}

View File

@ -1,6 +1,7 @@
package com.agileboot.domain.cabinet.cell.db; package com.agileboot.domain.cabinet.cell.db;
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO; import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
import com.agileboot.domain.cabinet.smartCabinet.db.SmartCabinetDO;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
@ -67,4 +68,10 @@ public interface CabinetCellMapper extends BaseMapper<CabinetCellEntity> {
@Select("SELECT COUNT(1) FROM cabinet_cell WHERE deleted = 0 AND goods_id IS NOT NULL") @Select("SELECT COUNT(1) FROM cabinet_cell WHERE deleted = 0 AND goods_id IS NOT NULL")
Long countLinkedRecord(); Long countLinkedRecord();
@Select("SELECT * " +
"FROM cabinet_cell " +
"WHERE cabinet_id = #{cabinet_id} AND deleted = 0 " +
"ORDER BY cell_id ASC")
List<CabinetCellDO> selectCabinetCellDOList(@Param("cabinetId") Long cabinetId);
} }

View File

@ -35,4 +35,6 @@ public interface CabinetCellService extends IService<CabinetCellEntity> {
Long countAllRecord(); Long countAllRecord();
Long countLinkedRecord(); Long countLinkedRecord();
List<CabinetCellDO> selectCabinetCellDOList(Long cabinetId);
} }

View File

@ -56,4 +56,9 @@ public class CabinetCellServiceImpl extends ServiceImpl<CabinetCellMapper, Cabin
public Long countLinkedRecord() { public Long countLinkedRecord() {
return baseMapper.countLinkedRecord(); return baseMapper.countLinkedRecord();
} }
@Override
public List<CabinetCellDO> selectCabinetCellDOList(Long cabinetId) {
return baseMapper.selectCabinetCellDOList(cabinetId);
}
} }

View File

@ -9,6 +9,7 @@ import com.agileboot.domain.cabinet.cell.model.CabinetCellModelFactory;
import com.agileboot.domain.cabinet.mainboard.command.AddCabinetMainboardCommand; import com.agileboot.domain.cabinet.mainboard.command.AddCabinetMainboardCommand;
import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModel; import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModel;
import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModelFactory; import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModelFactory;
import com.agileboot.domain.cabinet.smartCabinet.db.SmartCabinetDO;
import com.agileboot.domain.cabinet.smartCabinet.dto.CabinetDetailDTO; import com.agileboot.domain.cabinet.smartCabinet.dto.CabinetDetailDTO;
import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.cabinet.smartCabinet.command.AddSmartCabinetCommand; import com.agileboot.domain.cabinet.smartCabinet.command.AddSmartCabinetCommand;
@ -23,6 +24,7 @@ import com.agileboot.domain.shop.goods.db.ShopGoodsEntity;
import com.agileboot.domain.shop.goods.db.ShopGoodsService; import com.agileboot.domain.shop.goods.db.ShopGoodsService;
import com.agileboot.domain.shop.shop.db.ShopEntity; import com.agileboot.domain.shop.shop.db.ShopEntity;
import com.agileboot.domain.shop.shop.db.ShopService; import com.agileboot.domain.shop.shop.db.ShopService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.ArrayList; import java.util.ArrayList;
@ -222,4 +224,8 @@ public class SmartCabinetApplicationService {
public Long countAllRecord() { public Long countAllRecord() {
return smartCabinetService.countAllRecord(); return smartCabinetService.countAllRecord();
} }
public List<SmartCabinetDO> getConsumablesCabinetList() {
return smartCabinetService.selectSmartCabinetDOList();
}
} }

View File

@ -0,0 +1,37 @@
package com.agileboot.domain.cabinet.smartCabinet.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@TableName("smart_cabinet")
@ApiModel(value = "SmartCabinetDO对象", description = "智能柜信息表")
public class SmartCabinetDO {
@ApiModelProperty("柜机唯一ID")
@TableId(value = "cabinet_id", type = IdType.AUTO)
private Long cabinetId;
@ApiModelProperty("柜机名称")
@TableField("cabinet_name")
private String cabinetName;
@ApiModelProperty("柜机模版编号")
@TableField("template_no")
private String templateNo;
@ApiModelProperty("格口数量")
@TableField(exist = false)
private Integer cellCount;
}

View File

@ -71,6 +71,11 @@ public class SmartCabinetEntity extends BaseEntity<SmartCabinetEntity> {
@TableField("location") @TableField("location")
private Integer location; private Integer location;
@ApiModelProperty("已用格口数")
private Integer usedCells;
@ApiModelProperty("未用格口数")
private Integer availableCells;
@Override @Override
public Serializable pkVal() { public Serializable pkVal() {

View File

@ -17,9 +17,12 @@ import java.util.List;
* @since 2025-03-17 * @since 2025-03-17
*/ */
public interface SmartCabinetMapper extends BaseMapper<SmartCabinetEntity> { public interface SmartCabinetMapper extends BaseMapper<SmartCabinetEntity> {
@Select("SELECT sc.*, scl.cabinet_name AS mainCabinetName " + @Select("SELECT sc.*, scl.cabinet_name AS mainCabinetName, " +
"SUM(CASE WHEN cc.usage_status = 2 AND cc.deleted = 0 THEN 1 ELSE 0 END) AS usedCells, " +
"SUM(CASE WHEN cc.usage_status = 1 AND cc.deleted = 0 THEN 1 ELSE 0 END) AS availableCells " +
"FROM smart_cabinet sc " + "FROM smart_cabinet sc " +
"LEFT JOIN smart_cabinet scl ON scl.cabinet_id = sc.main_cabinet " + "LEFT JOIN smart_cabinet scl ON scl.cabinet_id = sc.main_cabinet " +
"LEFT JOIN cabinet_cell cc ON cc.cabinet_id = sc.cabinet_id " +
"${ew.customSqlSegment}") "${ew.customSqlSegment}")
Page<SmartCabinetEntity> getCabinetList( Page<SmartCabinetEntity> getCabinetList(
Page<SmartCabinetEntity> page, Page<SmartCabinetEntity> page,
@ -51,4 +54,12 @@ public interface SmartCabinetMapper extends BaseMapper<SmartCabinetEntity> {
@Select("SELECT COUNT(1) FROM smart_cabinet WHERE deleted = 0") @Select("SELECT COUNT(1) FROM smart_cabinet WHERE deleted = 0")
Long countAllRecord(); Long countAllRecord();
@Select("SELECT sc.*, COUNT(cc.cell_id) AS cell_count " +
"FROM smart_cabinet sc " +
"LEFT JOIN cabinet_cell cc ON cc.cabinet_id = sc.cabinet_id AND cc.deleted = 0 " +
"WHERE sc.belong_type = 1 AND sc.deleted = 0 " +
"GROUP BY sc.cabinet_id " +
"ORDER BY sc.create_time DESC")
List<SmartCabinetDO> selectSmartCabinetDOList();
} }

View File

@ -24,4 +24,6 @@ public interface SmartCabinetService extends IService<SmartCabinetEntity> {
SmartCabinetEntity getByCabinetId(Long cabinetId); SmartCabinetEntity getByCabinetId(Long cabinetId);
Long countAllRecord(); Long countAllRecord();
List<SmartCabinetDO> selectSmartCabinetDOList();
} }

View File

@ -45,4 +45,9 @@ public class SmartCabinetServiceImpl extends ServiceImpl<SmartCabinetMapper, Sma
return baseMapper.countAllRecord(); return baseMapper.countAllRecord();
} }
@Override
public List<SmartCabinetDO> selectSmartCabinetDOList() {
return baseMapper.selectSmartCabinetDOList();
}
} }

View File

@ -17,11 +17,6 @@ public class SmartCabinetDTO {
public SmartCabinetDTO(SmartCabinetEntity entity) { public SmartCabinetDTO(SmartCabinetEntity entity) {
if (entity != null) { if (entity != null) {
BeanUtil.copyProperties(entity, this); BeanUtil.copyProperties(entity, this);
/* SysUserEntity creator = CacheCenter.userCache.getObjectById(entity.getOperId());
if (creator != null) {
this.operator = creator.getUsername();
}*/
} }
} }
@ -61,6 +56,9 @@ public class SmartCabinetDTO {
@ExcelColumn(name = "柜机位置") @ExcelColumn(name = "柜机位置")
private Integer location; private Integer location;
@ExcelColumn(name = "操作人") @ExcelColumn(name = "已用格口数")
private String operator; private Integer usedCells;
@ExcelColumn(name = "未用格口数")
private Integer availableCells;
} }

View File

@ -33,7 +33,8 @@ public class SearchSmartCabinetQuery<T> extends AbstractPageQuery<T> {
.eq(belongType!= null, "sc.belong_type", belongType) .eq(belongType!= null, "sc.belong_type", belongType)
.eq(StrUtil.isNotEmpty(templateNo), "sc.template_no", templateNo) .eq(StrUtil.isNotEmpty(templateNo), "sc.template_no", templateNo)
.eq("sc.deleted", false) .eq("sc.deleted", false)
.between(startTime != null && endTime != null, "sc.create_time", startTime, endTime); .between(startTime != null && endTime != null, "sc.create_time", startTime, endTime)
.groupBy("sc.cabinet_id");
this.timeRangeColumn = "create_time"; this.timeRangeColumn = "create_time";

View File

@ -0,0 +1,9 @@
package com.agileboot.domain.cabinet.smartCabinet.vo;
import lombok.Data;
@Data
public class CabinetVO {
private Long cabinetId;
}

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.QyUserEntity;
import com.agileboot.domain.qywx.user.db.QyUserService; import com.agileboot.domain.qywx.user.db.QyUserService;
import com.agileboot.domain.qywx.user.dto.QyUserDTO; 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.UserModel;
import com.agileboot.domain.qywx.user.model.QyUserModelFactory; import com.agileboot.domain.qywx.user.model.QyUserModelFactory;
import com.agileboot.domain.qywx.user.query.SearchQyUserQuery; import com.agileboot.domain.qywx.user.query.SearchQyUserQuery;
@ -74,6 +75,9 @@ public class QyUserApplicationService {
public void updateUser(UpdateQyUserCommand command) { public void updateUser(UpdateQyUserCommand command) {
UserModel model = qyUserModelFactory.loadById(command.getId()); UserModel model = qyUserModelFactory.loadById(command.getId());
if (command.getBalanceLimit() != null && command.getBalance() == null) {
command.setBalance(command.getBalanceLimit().subtract(model.getUseBalance()));
}
model.loadUpdateCommand(command); model.loadUpdateCommand(command);
model.updateById(); model.updateById();
@ -136,7 +140,7 @@ public class QyUserApplicationService {
} }
} }
public BigDecimal selectTotalBalance(String corpid) { public QyUserStatsDTO selectTotalBalance(String corpid) {
return userService.selectTotalBalance(corpid); return userService.selectTotalBalance(corpid);
} }
} }

View File

@ -148,6 +148,14 @@ public class QyUserEntity extends BaseEntity<QyUserEntity> {
@TableField("balance") @TableField("balance")
private BigDecimal balance; private BigDecimal balance;
@ApiModelProperty("已使用用户余额")
@TableField("use_balance")
private BigDecimal useBalance;
@ApiModelProperty("用户余额额度")
@TableField("balance_limit")
private BigDecimal balanceLimit;
@ApiModelProperty("系统角色id") @ApiModelProperty("系统角色id")
@TableField("sys_role_id") @TableField("sys_role_id")
private Long sysRoleId; private Long sysRoleId;

View File

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

View File

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

View File

@ -106,6 +106,12 @@ public class QyUserDTO {
@ExcelColumn(name = "用户余额") @ExcelColumn(name = "用户余额")
private BigDecimal balance; private BigDecimal balance;
@ExcelColumn(name = "已使用用户余额")
private BigDecimal useBalance;
@ExcelColumn(name = "用户余额额度")
private BigDecimal balanceLimit;
@ExcelColumn(name = "系统角色ID") @ExcelColumn(name = "系统角色ID")
private Long sysRoleId; private Long sysRoleId;

View File

@ -0,0 +1,20 @@
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;
// 余额额度
private BigDecimal balanceLimit;
}

View File

@ -192,6 +192,7 @@ public class ReturnApprovalApplicationService {
QyUserEntity qyUser = userService.getUserByUserId(userid, WeixinConstants.corpid); QyUserEntity qyUser = userService.getUserByUserId(userid, WeixinConstants.corpid);
if (null != qyUser) { if (null != qyUser) {
qyUser.setBalance(qyUser.getBalance().add(command.getReturnAmount())); qyUser.setBalance(qyUser.getBalance().add(command.getReturnAmount()));
qyUser.setUseBalance(qyUser.getUseBalance().subtract(command.getReturnAmount()));
} }
userService.updateById(qyUser); userService.updateById(qyUser);
} catch (Exception e) { } catch (Exception e) {

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.cell.db.CabinetCellService;
import com.agileboot.domain.cabinet.mainboard.db.CabinetMainboardEntity; import com.agileboot.domain.cabinet.mainboard.db.CabinetMainboardEntity;
import com.agileboot.domain.cabinet.mainboard.db.CabinetMainboardService; 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.command.AddCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel; import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModelFactory; 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.mqtt.MqttService;
import com.agileboot.domain.qywx.user.db.QyUserEntity; import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.db.QyUserService; 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.ShopGoodsEntity;
import com.agileboot.domain.shop.goods.db.ShopGoodsService; import com.agileboot.domain.shop.goods.db.ShopGoodsService;
import com.agileboot.domain.shop.order.command.SubmitOrderCommand; 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.db.dto.OrderWithGoodsDTO;
import com.agileboot.domain.shop.order.dto.CreateOrderResult; import com.agileboot.domain.shop.order.dto.CreateOrderResult;
import com.agileboot.domain.shop.order.dto.GetOrdersByOpenIdDTO; 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.dto.TopGoodsDTO;
import com.agileboot.domain.shop.order.model.OrderModel; import com.agileboot.domain.shop.order.model.OrderModel;
import com.agileboot.domain.shop.order.model.OrderModelFactory; 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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -74,7 +68,6 @@ public class OrderApplicationService {
private final SmartCabinetService smartCabinetService; private final SmartCabinetService smartCabinetService;
private final MqttService mqttService; private final MqttService mqttService;
private final QyUserService userService; private final QyUserService userService;
private final QyUserModelFactory qyUserModelFactory;
private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory; private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory;
private final PaymentOperationLogApplicationService paymentOperationLogApplicationService; private final PaymentOperationLogApplicationService paymentOperationLogApplicationService;
private final CabinetMainboardService cabinetMainboardService; private final CabinetMainboardService cabinetMainboardService;
@ -192,6 +185,7 @@ public class OrderApplicationService {
throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "余额不足"); throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "余额不足");
} else { } else {
qyUser.setBalance(qyUser.getBalance().subtract(orderModel.getTotalAmount())); qyUser.setBalance(qyUser.getBalance().subtract(orderModel.getTotalAmount()));
qyUser.setUseBalance(qyUser.getUseBalance().add(orderModel.getTotalAmount()));
userService.updateById(qyUser); userService.updateById(qyUser);
} }
// 金额转换元转分并四舍五入 // 金额转换元转分并四舍五入

View File

@ -53,6 +53,11 @@ public class RoleApplicationService {
return new PageDTO<>(records, page.getTotal()); 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) { public RoleDTO getRoleInfo(Long roleId) {
SysRoleEntity byId = roleService.getById(roleId); SysRoleEntity byId = roleService.getById(roleId);
RoleDTO roleDTO = new RoleDTO(byId); RoleDTO roleDTO = new RoleDTO(byId);

View File

@ -48,5 +48,5 @@ public interface SysRoleService extends IService<SysRoleEntity> {
*/ */
List<SysMenuEntity> getMenuListByRoleId(Long roleId); 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); 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);
}
} }

View File

@ -5,3 +5,11 @@ AFTER `goods_detail`;
ALTER TABLE `qy_user` ALTER TABLE `qy_user`
ADD COLUMN `sys_role_id` BIGINT DEFAULT NULL COMMENT '系统角色id' ADD COLUMN `sys_role_id` BIGINT DEFAULT NULL COMMENT '系统角色id'
AFTER `balance`; AFTER `balance`;
ALTER TABLE `qy_user`
ADD COLUMN `use_balance` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '已使用用户余额'
AFTER `balance`;
ALTER TABLE `qy_user`
ADD COLUMN `balance_limit` DECIMAL(15,2) NOT NULL DEFAULT '0.00' COMMENT '余额额度'
AFTER `use_balance`;