From 24f518acd1db8bf9ae9698a5494135c9c47ba9fa Mon Sep 17 00:00:00 2001 From: yys <47@gamerwa.com> Date: Thu, 23 Apr 2026 17:16:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=A2=E9=98=9F=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=B8=8E=E7=AE=A1=E7=90=86=E7=AB=AF=E8=AE=A2=E5=8D=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=87=8D=E6=9E=84=E3=80=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/ai/balanceChangeRecord/index.vue | 35 +++- .../src/views/subteam/userBalance/index.vue | 185 ++++++++++++++---- .../subteam/SubteamUserBalanceController.java | 50 ++++- .../ai/domain/AiBalanceChangeRecord.java | 12 ++ .../vo/AiBalanceChangeRecordListVo.java | 16 +- .../impl/DeptUserScoreTransferTxService.java | 12 +- .../system/AiBalanceChangeRecordMapper.xml | 7 +- web-api/sql/sql变更.sql | 2 + 8 files changed, 264 insertions(+), 55 deletions(-) diff --git a/admin-ui/src/views/ai/balanceChangeRecord/index.vue b/admin-ui/src/views/ai/balanceChangeRecord/index.vue index d2aba14..cf7d247 100644 --- a/admin-ui/src/views/ai/balanceChangeRecord/index.vue +++ b/admin-ui/src/views/ai/balanceChangeRecord/index.vue @@ -16,6 +16,16 @@ @keyup.enter.native="handleQuery" /> + + + + { + this.deptOptions = this.handleTree(res.data, "deptId"); + }); + }, + deptNormalizer(node) { + if (node.children && !node.children.length) { + delete node.children; + } + return { + id: node.deptId, + label: node.deptName, + children: node.children + }; + }, /** 西式千分位(en-US),积分为整数 */ formatPointsWestern(value) { if (value === null || value === undefined || value === "") { diff --git a/admin-ui/src/views/subteam/userBalance/index.vue b/admin-ui/src/views/subteam/userBalance/index.vue index 88bc5b4..cedc6b2 100644 --- a/admin-ui/src/views/subteam/userBalance/index.vue +++ b/admin-ui/src/views/subteam/userBalance/index.vue @@ -1,11 +1,36 @@ diff --git a/web-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/subteam/SubteamUserBalanceController.java b/web-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/subteam/SubteamUserBalanceController.java index c9d9ea8..1d69759 100644 --- a/web-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/subteam/SubteamUserBalanceController.java +++ b/web-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/subteam/SubteamUserBalanceController.java @@ -1,17 +1,24 @@ package com.ruoyi.web.controller.subteam; import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.ai.domain.AiBalanceChangeRecord; +import com.ruoyi.ai.domain.vo.AiBalanceChangeRecordListVo; import com.ruoyi.ai.service.IAiBalanceChangeRecordService; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.subteam.ISubteamDataQueryService; import com.ruoyi.system.service.subteam.ISubteamScopeService; @@ -31,15 +38,54 @@ public class SubteamUserBalanceController extends BaseController { @PreAuthorize("@ss.hasPermi('subteam:userBalance:list')") @GetMapping("/list") public TableDataInfo list(AiBalanceChangeRecord query) { + clearCrossTeamQueryFields(query); startPage(); List list = subteamDataQueryService.selectUserBalanceRecords(query); - return getDataTable(list); + List rows = list.stream() + .map(AiBalanceChangeRecordListVo::from) + .peek(v -> v.setDeptName(null)) + .collect(Collectors.toList()); + TableDataInfo rsp = getDataTable(list); + rsp.setRows(rows); + return rsp; + } + + /** + * 与本团队 /ai/balance-change-record 导出同结构,不导出「团队名称」列(本端仅看本团队)。 + * 复用 {@link ISubteamDataQueryService#selectUserBalanceRecords} 与 {@link com.ruoyi.ai.mapper.AiBalanceChangeRecordMapper}。 + */ + @PreAuthorize("@ss.hasPermi('subteam:userBalance:export')") + @Log(title = "用户积分变动", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, AiBalanceChangeRecord query) { + clearCrossTeamQueryFields(query); + List list = subteamDataQueryService.selectUserBalanceRecords(query); + List rows = list.stream() + .map(AiBalanceChangeRecordListVo::from) + .collect(Collectors.toList()); + ExcelUtil util = new ExcelUtil<>(AiBalanceChangeRecordListVo.class); + util.hideColumn("deptName"); + util.exportExcel(response, rows, "用户积分变动"); } @PreAuthorize("@ss.hasPermi('subteam:userBalance:query')") @GetMapping("/{id}") public AjaxResult getInfo(@PathVariable Long id) { subteamScopeService.assertAiBalanceRecordVisible(id, subteamScopeService.currentTeamDeptId()); - return success(aiBalanceChangeRecordService.selectAiBalanceChangeRecordById(id)); + AiBalanceChangeRecord record = aiBalanceChangeRecordService.selectAiBalanceChangeRecordById(id); + AiBalanceChangeRecordListVo vo = AiBalanceChangeRecordListVo.from(record); + if (vo != null) { + vo.setDeptName(null); + } + return success(vo); + } + + /** 忽略入参中的团队条件,仅数据范围以当前团队为准 */ + private void clearCrossTeamQueryFields(AiBalanceChangeRecord query) { + if (query == null) { + return; + } + query.setDeptId(null); + query.setDeptName(null); } } diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiBalanceChangeRecord.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiBalanceChangeRecord.java index a6ee865..f156177 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiBalanceChangeRecord.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiBalanceChangeRecord.java @@ -69,4 +69,16 @@ public class AiBalanceChangeRecord extends BaseEntity { @TableField(exist = false) private String nickname; + /** + * 用户归属团队(ai_user.dept_id,用于筛选) + */ + @TableField(exist = false) + private Long deptId; + + /** + * 团队名称(关联 sys_dept.dept_name) + */ + @TableField(exist = false) + private String deptName; + } diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/vo/AiBalanceChangeRecordListVo.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/vo/AiBalanceChangeRecordListVo.java index 3faed9e..220b336 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/vo/AiBalanceChangeRecordListVo.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/domain/vo/AiBalanceChangeRecordListVo.java @@ -27,23 +27,26 @@ public class AiBalanceChangeRecordListVo implements Serializable { @Excel(name = "用户昵称", sort = 3) private String nickname; - @Excel(name = "关联订单号", sort = 4) + @Excel(name = "团队名称", sort = 4) + private String deptName; + + @Excel(name = "关联订单号", sort = 5) private String orderNo; - @Excel(name = "操作类型", sort = 5, readConverterExp = "0=充值,1=返佣,2=充值赠送,3=体验金赠送,4=体验金回收,5=一键换衣,6=图生图2,7=一键换脸,8=快捷生图,9=快捷生视频,10=退款,11=系统操作,12=团队下发,13=团队收回") + @Excel(name = "操作类型", sort = 6, readConverterExp = "0=充值,1=返佣,2=充值赠送,3=体验金赠送,4=体验金回收,5=一键换衣,6=图生图2,7=一键换脸,8=快捷生图,9=快捷生视频,10=退款,11=系统操作,12=团队下发,13=团队收回") private Integer type; - @Excel(name = "变更积分", sort = 6, handler = BalanceChangeAmountExcelHandler.class) + @Excel(name = "变更积分", sort = 7, handler = BalanceChangeAmountExcelHandler.class) private BigDecimal changeAmount; - @Excel(name = "变更后积分", sort = 7) + @Excel(name = "变更后积分", sort = 8) private BigDecimal resultAmount; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "操作时间", sort = 8, width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", sort = 9, width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date createTime; - @Excel(name = "备注", sort = 9) + @Excel(name = "备注", sort = 10) private String remark; public static AiBalanceChangeRecordListVo from(AiBalanceChangeRecord e) { @@ -54,6 +57,7 @@ public class AiBalanceChangeRecordListVo implements Serializable { v.setId(e.getId()); v.setUuid(e.getUuid()); v.setNickname(e.getNickname()); + v.setDeptName(e.getDeptName()); v.setOrderNo(e.getOrderNo()); v.setType(e.getType()); v.setChangeAmount(e.getChangeAmount()); diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/DeptUserScoreTransferTxService.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/DeptUserScoreTransferTxService.java index a770db4..920741e 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/DeptUserScoreTransferTxService.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/DeptUserScoreTransferTxService.java @@ -73,9 +73,8 @@ public class DeptUserScoreTransferTxService { } String orderNum = buildOrderNum(); - String remark = buildRemark(request.getRemark(), "用户积分回收至团队"); - aiUserService.addUserBalance(orderNum, user.getId(), amount.negate(), BalanceChangerConstants.DEPT_SCORE_RECLAIM, remark); + aiUserService.addUserBalance(orderNum, user.getId(), amount.negate(), BalanceChangerConstants.DEPT_SCORE_RECLAIM, request.getRemark()); int rows = deptService.addDeptBalance(deptId, amount); if (rows == 0) { @@ -83,7 +82,7 @@ public class DeptUserScoreTransferTxService { } BigDecimal deptBalAfter = getDeptBalance(deptId); - insertGroupRecord(orderNum, deptId, GroupBalanceChangeType.RECLAIM.getCode(), amount, deptBalAfter, remark); + insertGroupRecord(orderNum, deptId, GroupBalanceChangeType.RECLAIM.getCode(), amount, deptBalAfter, request.getRemark()); } private AiUser requireUserWithDept(Long id) { @@ -108,13 +107,6 @@ public class DeptUserScoreTransferTxService { return BigDecimal.valueOf(amount); } - private String buildRemark(String input, String defaultPrefix) { - if (StringUtils.isNotEmpty(input)) { - return input; - } - return defaultPrefix; - } - private BigDecimal getDeptBalance(Long deptId) { SysDept dept = deptService.selectDeptById(deptId); if (dept == null) { diff --git a/web-api/ruoyi-system/src/main/resources/mapper/system/AiBalanceChangeRecordMapper.xml b/web-api/ruoyi-system/src/main/resources/mapper/system/AiBalanceChangeRecordMapper.xml index 0107d6c..99f9b5b 100644 --- a/web-api/ruoyi-system/src/main/resources/mapper/system/AiBalanceChangeRecordMapper.xml +++ b/web-api/ruoyi-system/src/main/resources/mapper/system/AiBalanceChangeRecordMapper.xml @@ -19,20 +19,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select r.id, r.del_flag, r.create_by, r.create_time, r.update_by, r.update_time, r.remark, r.order_no, r.user_id, r.type, r.change_amount, r.result_amount, u.nickname, u.user_id uuid from ai_balance_change_record r + select r.id, r.del_flag, r.create_by, r.create_time, r.update_by, r.update_time, r.remark, r.order_no, r.user_id, r.type, r.change_amount, r.result_amount, u.nickname, u.user_id uuid, d.dept_name from ai_balance_change_record r left join ai_user u on u.id = r.user_id + left join sys_dept d on d.dept_id = u.dept_id and d.del_flag = '0'