From b9ffc6004d6ca118a8d59c79ad59919a54d93aa9 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Wed, 30 Jul 2025 11:36:32 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=9E=83=E5=9C=BE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/jindouMapper/BeanRechargeMapper.xml | 6 ------ src/main/resources/mapper/UrlMapper.xml | 8 -------- 2 files changed, 14 deletions(-) delete mode 100644 src/main/resources/jindouMapper/BeanRechargeMapper.xml delete mode 100644 src/main/resources/mapper/UrlMapper.xml diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper.xml b/src/main/resources/jindouMapper/BeanRechargeMapper.xml deleted file mode 100644 index 7f1b697..0000000 --- a/src/main/resources/jindouMapper/BeanRechargeMapper.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/resources/mapper/UrlMapper.xml b/src/main/resources/mapper/UrlMapper.xml deleted file mode 100644 index 714c781..0000000 --- a/src/main/resources/mapper/UrlMapper.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file From a95c19c926531ca79b405c3efb8b724cd9e7d4f0 Mon Sep 17 00:00:00 2001 From: lijianlin Date: Wed, 30 Jul 2025 13:10:08 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E7=9B=B4=E6=92=AD=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E4=B8=8E=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=88=86=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 43 ++++++++++++++++++++++ .../demo/domain/vo/bean/BeanConsumeLive.java | 38 +++++++++++++++++++ .../com/example/demo/domain/vo/bean/BeanPage.java | 24 ++++++++++++ .../java/com/example/demo/domain/vo/coin/Page.java | 2 + .../demo/mapper/bean/BeanConsumeMapper.java | 18 +++++++++ .../example/demo/mapper/coin/PermissionMapper.java | 13 ++++++- .../demo/service/bean/BeanConsumeService.java | 17 +++++++++ .../serviceImpl/bean/BeanConsumeServiceImpl.java | 28 ++++++++++++++ .../resources/jindouMapper/BeanConsumeMapper.xml | 9 +++++ 9 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/demo/controller/bean/BeanConsumeController.java create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanPage.java create mode 100644 src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java create mode 100644 src/main/java/com/example/demo/service/bean/BeanConsumeService.java create mode 100644 src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java create mode 100644 src/main/resources/jindouMapper/BeanConsumeMapper.xml diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java new file mode 100644 index 0000000..f3c87d7 --- /dev/null +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -0,0 +1,43 @@ +package com.example.demo.controller.bean; + +import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.coin.Result; +import com.example.demo.service.bean.BeanConsumeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanConsumeController + * @description: + * @author: Ethan + * @create: 2025−07-30 11:30 + * @Version 1.0 + **/ +@RestController +@RequestMapping("/beanConsume") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class BeanConsumeController { + @Autowired + private BeanConsumeService beanConsumeService; + + //获取用户分布信息 + @PostMapping("/getDept") + public Result getDept(){ + + List deptList = beanConsumeService.getDept(); + return Result.success(deptList); + } + + @PostMapping("/selectBy") + public Result selectBy(@RequestBody BeanPage beanPage){ + return null; + } + +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java new file mode 100644 index 0000000..d2c7a5c --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -0,0 +1,38 @@ +package com.example.demo.domain.vo.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanConsume + * @description: + * @author: Ethan + * @create: 2025−07-30 10:41 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class BeanConsumeLive { + private static final long serialVersionUID = 1L; + private String name; //姓名 + private Integer jwcode; //精网号 + private List dept; //地区/分部 + //类型 直播: 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 + //文章: 1. 打赏2. 付费 + private String type; //类型 + private String gift; //礼物名称 + private String beanNum; //金豆数量 + private String channel; //频道名称(截取content) + private String liveName; //直播间名称 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date time; // 消费时间 (时间戳转化) + private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java new file mode 100644 index 0000000..7276efb --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -0,0 +1,24 @@ +package com.example.demo.domain.vo.bean; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: gold-java + * @ClassName Page + * @description: + * @author: Ethan + * @create: 2025−07-30 11:44 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +public class BeanPage { + private static final long serialVersionUID = 1L; + + private String token; + private Integer pageNum; + private Integer pageSize; + + private BeanConsumeLive beanConsumeLive; +} diff --git a/src/main/java/com/example/demo/domain/vo/coin/Page.java b/src/main/java/com/example/demo/domain/vo/coin/Page.java index d06d6bb..a77fa89 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/Page.java +++ b/src/main/java/com/example/demo/domain/vo/coin/Page.java @@ -1,6 +1,7 @@ package com.example.demo.domain.vo.coin; import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.bean.BeanConsumeLive; import lombok.Data; import lombok.NoArgsConstructor; @@ -29,4 +30,5 @@ public class Page { private RefundAudit refundAudit; private RechargeUser rechargeUser; private RoleVo roleVo; + } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java new file mode 100644 index 0000000..33148dd --- /dev/null +++ b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java @@ -0,0 +1,18 @@ +package com.example.demo.mapper.bean; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanConsumeMapper.xml + * @description: + * @author: Ethan + * @create: 2025−07-30 11:56 + * @Version 1.0 + **/ +@Mapper +public interface BeanConsumeMapper { + List getDept(); +} diff --git a/src/main/java/com/example/demo/mapper/coin/PermissionMapper.java b/src/main/java/com/example/demo/mapper/coin/PermissionMapper.java index 58a8e7a..92cf1d5 100644 --- a/src/main/java/com/example/demo/mapper/coin/PermissionMapper.java +++ b/src/main/java/com/example/demo/mapper/coin/PermissionMapper.java @@ -3,7 +3,6 @@ package com.example.demo.mapper.coin; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.AdminRole; import com.example.demo.domain.entity.Role; -import com.example.demo.domain.vo.coin.AdminVo; import com.example.demo.domain.vo.coin.Permission; import org.apache.ibatis.annotations.Mapper; @@ -30,4 +29,16 @@ public interface PermissionMapper { // Integer deleteAdminRole(Integer id); Integer updateAdminRole(AdminRole adminRole); Integer updateAdmin(Admin admin); + + /** + * @program: gold-java + * @ClassName BeanConsumeMapper.xml + * @description: + * @author: Ethan + * @create: 2025−07-30 11:55 + * @Version 1.0 + **/ + + interface BeanConsumeMapper { + } } diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java new file mode 100644 index 0000000..2419e1d --- /dev/null +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -0,0 +1,17 @@ +package com.example.demo.service.bean; + +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanConsumeService + * @description: + * @author: Ethan + * @create: 2025−07-30 11:53 + * @Version 1.0 + **/ + +public interface BeanConsumeService { + //获取用户分部 + List getDept(); +} diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java new file mode 100644 index 0000000..8a7fba7 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -0,0 +1,28 @@ +package com.example.demo.serviceImpl.bean; + +import com.example.demo.mapper.bean.BeanConsumeMapper; +import com.example.demo.service.bean.BeanConsumeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanConsumeServiceImpl + * @description: + * @author: Ethan + * @create: 2025−07-30 11:53 + * @Version 1.0 + **/ +@Service +public class BeanConsumeServiceImpl implements BeanConsumeService { + @Autowired + private BeanConsumeMapper BeanConsumeMapper; + + @Override + public List getDept() { + List deptList = BeanConsumeMapper.getDept(); + return deptList; + } +} diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml new file mode 100644 index 0000000..4ed16e3 --- /dev/null +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file From b36a5e25fc13b2619380360fd84aab61a6d69419 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Wed, 30 Jul 2025 14:58:19 +0800 Subject: [PATCH 03/17] =?UTF-8?q?7=E6=9C=8830=E6=97=A5=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=87=91=E8=B1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanRechargeController.java | 29 +++++++++- .../demo/controller/bean/BeanUserController.java | 2 +- .../example/demo/domain/vo/bean/BeanRecharge.java | 21 +++++++ .../example/demo/domain/vo/bean/BeanUserCard.java | 2 +- .../demo/mapper/bean/BeanRechargeMapper.java | 14 ----- .../demo/service/bean/BeanRechargeService.java | 7 ++- .../serviceImpl/bean/BeanRechargeServiceImpl.java | 66 +++++++++++++++++++++- src/main/resources/jindouMapper/BeanUser.xml | 7 ++- 8 files changed, 124 insertions(+), 24 deletions(-) delete mode 100644 src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index 1bd711e..3101ec4 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -1,5 +1,14 @@ package com.example.demo.controller.bean; +import com.example.demo.domain.vo.bean.BeanRecharge; +import com.example.demo.domain.vo.coin.Result; +import com.example.demo.service.bean.BeanRechargeService; +import com.example.demo.service.bean.BeanUserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + /** * @program: gold-java * @ClassName BeanRechrageController @@ -9,5 +18,23 @@ package com.example.demo.controller.bean; * @Version 1.0 **/ +@RestController +@RequestMapping("/beanRecharge") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin public class BeanRechargeController { -} + + @Autowired + private BeanRechargeService beanRechargeService; + + //添加金豆 + @PostMapping("/add") + public Result add(@RequestBody BeanRecharge recharge) { + try { + return beanRechargeService.add(recharge); + } catch (Exception e) { + return Result.error("添加失败"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/bean/BeanUserController.java b/src/main/java/com/example/demo/controller/bean/BeanUserController.java index 5fb72ba..4549988 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanUserController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanUserController.java @@ -34,7 +34,7 @@ public class BeanUserController { try { return beanUserService.userCard(user.getJwcode().toString()); } catch (Exception e) { - return Result.error("请检查输入精网号"); + return Result.error("请检查输入精网号格式"); } } } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java index ef9c6de..72577fd 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java @@ -1,5 +1,9 @@ package com.example.demo.domain.vo.bean; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + /** * @program: gold-java * @ClassName BeanRecharge @@ -9,5 +13,22 @@ package com.example.demo.domain.vo.bean; * @Version 1.0 **/ +@Data +@NoArgsConstructor +@AllArgsConstructor public class BeanRecharge { + private Integer jwcode; // 精网号 + private Integer freeBean; // 免费豆 + private Integer permanentBean; // 永久豆 + private String remark; //备注 + + + + + + + + + + } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java b/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java index 8787d19..2f62f15 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java @@ -24,5 +24,5 @@ public class BeanUserCard { private String market; // 所属地区 private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 - private Integer consumeNum; // 消费次数 + private Integer consumeSum; // 消费金额 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java deleted file mode 100644 index aebf03b..0000000 --- a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo.mapper.bean; - - -/** - * @program: gold-java - * @ClassName BeanRechargeMapper - * @description: - * @author: Double - * @create: 2025−07-29 16:46 - * @Version 1.0 - **/ - -public interface BeanRechargeMapper { -} diff --git a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java index 87b1e20..dc06862 100644 --- a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java @@ -1,6 +1,9 @@ package com.example.demo.service.bean; +import com.example.demo.domain.vo.coin.Result; +import com.example.demo.domain.vo.bean.BeanRecharge; + /** * @program: gold-java * @ClassName BeanRechargeService @@ -11,4 +14,6 @@ package com.example.demo.service.bean; **/ public interface BeanRechargeService { -} + + Result add(BeanRecharge recharge); +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index e055363..6082501 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -1,6 +1,16 @@ package com.example.demo.serviceImpl.bean; +import com.example.demo.domain.vo.bean.BeanRecharge; +import com.example.demo.domain.vo.coin.Result; +import com.example.demo.service.bean.BeanRechargeService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.UUID; /** * @program: gold-java @@ -10,7 +20,57 @@ import org.springframework.stereotype.Service; * @create: 2025−07-29 16:47 * @Version 1.0 **/ - @Service -public class BeanRechargeServiceImpl { -} +@RequiredArgsConstructor +public class BeanRechargeServiceImpl implements BeanRechargeService { + + @Autowired + private RestTemplate restTemplate; + + @Override + public Result add(BeanRecharge recharge) { + try { + // 验证精网号是否有效 + if (recharge.getJwcode() == null || recharge.getJwcode().toString().isEmpty()) { + return Result.error("精网号不能为空"); + } + + // 验证免费豆和永久豆是否为非负数 + if (recharge.getFreeBean() < 0 || recharge.getPermanentBean() < 0) { + return Result.error("免费豆和永久豆不能为负数"); + } + // 验证免费豆和永久豆是否均为0 + if (recharge.getFreeBean() == 0 && recharge.getPermanentBean() == 0) { + return Result.error("免费豆和永久豆不能同时为0"); + } + // 验证备注是否为空 + if (recharge.getRemark() == null || recharge.getRemark().toString().isEmpty()) { + return Result.error("备注不能为空"); + } + String jwcode = recharge.getJwcode().toString(); + String op = "recharge"; // 操作类型(根据实际业务定义,例如"recharge"表示充值) + String content = recharge.getRemark(); // 备注作为content参数 + String orderNo = UUID.randomUUID().toString().replace("-", ""); // 生成唯一订单号(去除横线) + + // 2. 构建接口URL及参数 + String apiUrl = "http://47.92.148.30:3003/mock/61/hljw/api/user/gold"; + UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(apiUrl) + .queryParam("jwcode", jwcode) + .queryParam("op", op) + .queryParam("gold", recharge.getPermanentBean()) + .queryParam("content", content) + .queryParam("order_no", orderNo); + + // 3. 发送GET请求 + ResponseEntity response = restTemplate.getForEntity(urlBuilder.toUriString(), String.class); + + // 4. 处理响应结果 + if (!response.getStatusCode().is2xxSuccessful()) { + return Result.error("远程接口调用失败,状态码:" + response.getStatusCodeValue()); + } + return Result.success("添加成功"); + } catch (Exception e) { + return Result.error("系统异常:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/resources/jindouMapper/BeanUser.xml b/src/main/resources/jindouMapper/BeanUser.xml index 5de856a..c029b3e 100644 --- a/src/main/resources/jindouMapper/BeanUser.xml +++ b/src/main/resources/jindouMapper/BeanUser.xml @@ -8,12 +8,13 @@ SELECT m.nickname AS name, m.jwcode AS jwcode, - m.loc_market AS market, + m.dept AS market, y.jinbi_free AS freeBean, - y.jinbi_buy AS permanentBean + y.jinbi_buy AS permanentBean, + y.jinbi_cost_total AS consumeSum FROM fx_member m - INNER JOIN + LEFT JOIN fx_yaoqing y ON m.id = y.uid m.jwcode = #{jwcode} From 9be131f870ece6bee4635fc89182d4b735b22182 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Wed, 30 Jul 2025 15:06:18 +0800 Subject: [PATCH 04/17] =?UTF-8?q?7=E6=9C=8830=E6=97=A5=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index 6082501..dec9e70 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -27,6 +27,7 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { @Autowired private RestTemplate restTemplate; + //新增金豆 @Override public Result add(BeanRecharge recharge) { try { @@ -39,6 +40,10 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { if (recharge.getFreeBean() < 0 || recharge.getPermanentBean() < 0) { return Result.error("免费豆和永久豆不能为负数"); } + // 验证免费豆和永久豆是否为非负数 + if (recharge.getFreeBean() > 999999 || recharge.getPermanentBean() > 999999) { + return Result.error("免费豆和永久豆不能超过999999"); + } // 验证免费豆和永久豆是否均为0 if (recharge.getFreeBean() == 0 && recharge.getPermanentBean() == 0) { return Result.error("免费豆和永久豆不能同时为0"); From 98e156370ba59c4684df9658660185d9345c2f5c Mon Sep 17 00:00:00 2001 From: lijianlin Date: Wed, 30 Jul 2025 18:29:13 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=B6=88=E8=B4=B9=E5=90=88=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=EF=BC=88=E4=BB=85=E7=9B=B4=E6=92=AD=E6=B6=88=E8=80=97?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 56 ++++++++++- .../demo/domain/vo/bean/BeanConsumeGold.java | 23 +++++ .../demo/domain/vo/bean/BeanConsumeLive.java | 7 +- .../com/example/demo/domain/vo/bean/BeanPage.java | 1 + .../demo/mapper/bean/BeanConsumeMapper.java | 14 +++ .../demo/service/bean/BeanConsumeService.java | 11 +- .../serviceImpl/bean/BeanConsumeServiceImpl.java | 29 ++++++ .../resources/jindouMapper/BeanConsumeMapper.xml | 112 ++++++++++++++++++++- 8 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index f3c87d7..232fb5b 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -1,13 +1,25 @@ package com.example.demo.controller.bean; +import com.example.demo.Util.JWTUtil; +import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.vo.bean.BeanConsumeGold; +import com.example.demo.domain.vo.bean.BeanConsumeLive; import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.Page; +import com.example.demo.domain.vo.coin.RechargeAudit; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanConsumeService; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import java.util.Arrays; import java.util.List; /** @@ -27,7 +39,7 @@ public class BeanConsumeController { @Autowired private BeanConsumeService beanConsumeService; - //获取用户分布信息 + //获取消费用户分部信息 @PostMapping("/getDept") public Result getDept(){ @@ -35,9 +47,45 @@ public class BeanConsumeController { return Result.success(deptList); } - @PostMapping("/selectBy") + //筛选查询直播消费记录 + @PostMapping("/selectLiveBy") public Result selectBy(@RequestBody BeanPage beanPage){ - return null; - } + try { + if (ObjectUtils.isEmpty(beanPage.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(beanPage.getPageSize())) { + return Result.error("页大小为空!"); + } else { + //解token权限 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + if (admin != null) { + // List list = Arrays.asList(admin.getMarkets().split(",")); + // beanPage.XXXX.setMarkets(list); + } + else{ + return Result.error("角色为空"); + } + return Result.success(beanConsumeService.selectLiveBy(beanPage.getPageNum(), beanPage.getPageSize(), beanPage.getBeanConsumeLive())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error("请检查筛选数据的格式"); + }} + //消费合计数 + @PostMapping("sumConsumeGold") + public BeanConsumeGold sumConsumeGold(@RequestBody BeanPage beanPage) throws Exception { + //解token权限 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + if (admin != null) { + //List list = Arrays.asList(admin.getMarkets().split(",")); + //.setMarkets(list); + } + return beanConsumeService.sumConsumeGold( beanPage); + } } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java new file mode 100644 index 0000000..2e9f885 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java @@ -0,0 +1,23 @@ +package com.example.demo.domain.vo.bean; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: gold-java + * @ClassName BeanConsumeGold + * @description: + * @author: Ethan + * @create: 2025−07-30 16:12 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class BeanConsumeGold { + private static final long serialVersionUID = 1L; + private Integer permanentBean ; //付费金豆 + private Integer freeBean ; //免费金豆 + private Integer totalNum; //总条数 +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java index d2c7a5c..3820534 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -23,7 +23,7 @@ public class BeanConsumeLive { private static final long serialVersionUID = 1L; private String name; //姓名 private Integer jwcode; //精网号 - private List dept; //地区/分部 + private String dept; //地区/分部 //类型 直播: 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 //文章: 1. 打赏2. 付费 private String type; //类型 @@ -32,7 +32,8 @@ public class BeanConsumeLive { private String channel; //频道名称(截取content) private String liveName; //直播间名称 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date time; // 消费时间 (时间戳转化) + private Date consumeTime; // 消费时间 (时间戳转化) private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) - + private String sortField; //排序字段 + private String sortOrder; //排序顺序 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java index 7276efb..0466660 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -21,4 +21,5 @@ public class BeanPage { private Integer pageSize; private BeanConsumeLive beanConsumeLive; + private BeanConsumeGold beanConsumeGold; } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java index 33148dd..371485b 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java @@ -1,6 +1,10 @@ package com.example.demo.mapper.bean; +import com.example.demo.domain.vo.bean.BeanConsumeGold; +import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.coin.RechargeAudit; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -14,5 +18,15 @@ import java.util.List; **/ @Mapper public interface BeanConsumeMapper { + //获取消费用户分部 List getDept(); + //筛选查询直播消费 + List selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); + //查询消费订单金额 + List selectConsumeGoldsBy(@Param("pageNum") Integer pageNum, + @Param("pageSize") Integer pageSize, + @Param("beanConsumeGold") BeanConsumeGold beanConsumeGold); + + BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); } + diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java index 2419e1d..736ccdf 100644 --- a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -1,5 +1,10 @@ package com.example.demo.service.bean; +import com.example.demo.domain.vo.bean.BeanConsumeGold; +import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.coin.Gold; + import java.util.List; /** @@ -12,6 +17,10 @@ import java.util.List; **/ public interface BeanConsumeService { - //获取用户分部 + //获取消费用户的分部 List getDept(); + //筛选查询消费 + Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive); + //消费金币合计数 + BeanConsumeGold sumConsumeGold(BeanPage beanPage); } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index 8a7fba7..c7cebcb 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -1,7 +1,15 @@ package com.example.demo.serviceImpl.bean; +import com.example.demo.domain.vo.bean.BeanConsumeGold; +import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.RechargeAudit; +import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.mapper.bean.BeanConsumeMapper; import com.example.demo.service.bean.BeanConsumeService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,9 +28,30 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { @Autowired private BeanConsumeMapper BeanConsumeMapper; + //获取消费用户分部 @Override public List getDept() { List deptList = BeanConsumeMapper.getDept(); return deptList; } + //筛选查询直播消费 + @Override + public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) { + PageHelper.startPage(pageNum, pageSize); + List beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive); + return new PageInfo<>(beanConsumeLives); + } + + @Override + public BeanConsumeGold sumConsumeGold(BeanPage beanPage) { + BeanConsumeGold gold = new BeanConsumeGold(); + BeanConsumeLive beanConsumeLive = beanPage.getBeanConsumeLive(); + //直播消费合计 + BeanConsumeGold BeanConsumeGolds = BeanConsumeMapper.selectSumLiveBy( beanConsumeLive); + + gold.setTotalNum(BeanConsumeGolds.getTotalNum()); + gold.setPermanentBean(BeanConsumeGolds.getPermanentBean()); + gold.setFreeBean(BeanConsumeGolds.getFreeBean()); + return gold; + } } diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml index 4ed16e3..758901f 100644 --- a/src/main/resources/jindouMapper/BeanConsumeMapper.xml +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -2,8 +2,116 @@ - + + + + + + \ No newline at end of file From 9d9d0faefa27a855363a3251bdcf13447c633351 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Wed, 30 Jul 2025 18:29:30 +0800 Subject: [PATCH 06/17] =?UTF-8?q?7=E6=9C=8830=E6=97=A5=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=85=85=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanRechargeController.java | 41 +++++++++++++++++++++- .../com/example/demo/domain/vo/bean/BeanPage.java | 1 + .../example/demo/domain/vo/bean/BeanRecharge.java | 10 ------ .../demo/domain/vo/bean/BeanRechargeInfo.java | 39 ++++++++++++++++++++ .../demo/mapper/bean/BeanRechargeMapper.java | 22 ++++++++++++ .../demo/service/bean/BeanRechargeService.java | 6 ++++ .../serviceImpl/bean/BeanRechargeServiceImpl.java | 18 ++++++++++ .../resources/jindouMapper/BeanRechargeMapper.xml | 18 ++++++++++ 8 files changed, 144 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java create mode 100644 src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java create mode 100644 src/main/resources/jindouMapper/BeanRechargeMapper.xml diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index 3101ec4..508d087 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -1,13 +1,22 @@ package com.example.demo.controller.bean; +import com.example.demo.Util.JWTUtil; +import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanRecharge; +import com.example.demo.domain.vo.bean.BeanPage; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanRechargeService; -import com.example.demo.service.bean.BeanUserService; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.Arrays; +import java.util.List; /** * @program: gold-java @@ -37,4 +46,34 @@ public class BeanRechargeController { return Result.error("添加失败"); } } + + //系统充值 + @PostMapping("/selectBySystem") + public Result selectBySystem(@RequestBody BeanPage page) { + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + //解token权限 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + if (admin != null) { + List list = Arrays.asList(admin.getMarkets().split(",")); + page.getBeanRechargeInfo().setMarkets(list); + } + else{ + return Result.error("角色为空"); + } + return Result.success(beanRechargeService.selectBySystem(page.getPageNum(), page.getPageSize(), page.getBeanRechargeInfo())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error("请检查筛选数据的格式"); + } + + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java index 7276efb..54000ef 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -21,4 +21,5 @@ public class BeanPage { private Integer pageSize; private BeanConsumeLive beanConsumeLive; + private BeanRechargeInfo beanRechargeInfo; } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java index 72577fd..c31756c 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java @@ -21,14 +21,4 @@ public class BeanRecharge { private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 private String remark; //备注 - - - - - - - - - - } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java new file mode 100644 index 0000000..5952369 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java @@ -0,0 +1,39 @@ +package com.example.demo.domain.vo.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanRecharge + * @description: + * @author: Double + * @create: 2025−07-30 15:11 + * @Version 1.0 + **/ + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BeanRechargeInfo { + + private Long id;//id + private Integer jwcode; // 精网号 + private String name; // 姓名 + private String market; // 所属地区 + private Integer freeBean; // 免费豆 + private Integer permanentBean; // 永久豆 + private Integer num; // 数量 + private Double amount; // 金额 + private String orderNo; // 订单号 + private String remark; //备注 + private String platform; // 充值平台 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date rechargeTime; // 充值时间 + private List markets; // 地区列表 +} diff --git a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java new file mode 100644 index 0000000..2beaf4b --- /dev/null +++ b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java @@ -0,0 +1,22 @@ +package com.example.demo.mapper.bean; + + +import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @program: gold-java + * @ClassName BeanRechargeMapper + * @description: + * @author: Double + * @create: 2025−07-30 15:43 + * @Version 1.0 + **/ + +@Mapper +public interface BeanRechargeMapper { + + List selectBySystem(BeanRechargeInfo beanRechargeInfo); +} diff --git a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java index dc06862..3597c5e 100644 --- a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java @@ -1,8 +1,11 @@ package com.example.demo.service.bean; +import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.coin.RefundUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.bean.BeanRecharge; +import com.github.pagehelper.PageInfo; /** * @program: gold-java @@ -16,4 +19,7 @@ import com.example.demo.domain.vo.bean.BeanRecharge; public interface BeanRechargeService { Result add(BeanRecharge recharge); + + PageInfo selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo); + } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index dec9e70..e7b79be 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -1,8 +1,13 @@ package com.example.demo.serviceImpl.bean; import com.example.demo.domain.vo.bean.BeanRecharge; +import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.Result; +import com.example.demo.mapper.bean.BeanRechargeMapper; import com.example.demo.service.bean.BeanRechargeService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -10,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.util.List; import java.util.UUID; /** @@ -27,6 +33,9 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { @Autowired private RestTemplate restTemplate; + @Autowired + private BeanRechargeMapper beanRechargeMapper; + //新增金豆 @Override public Result add(BeanRecharge recharge) { @@ -78,4 +87,13 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { return Result.error("系统异常:" + e.getMessage()); } } + + + //系统充值明细 + @Override + public PageInfo selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo){ + PageHelper.startPage(pageNum, pageSize); + List beanRechargeInfos = beanRechargeMapper.selectBySystem(beanRechargeInfo); + return new PageInfo<>(beanRechargeInfos); + } } \ No newline at end of file diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper.xml b/src/main/resources/jindouMapper/BeanRechargeMapper.xml new file mode 100644 index 0000000..762172f --- /dev/null +++ b/src/main/resources/jindouMapper/BeanRechargeMapper.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file From 91ed5a7eac5d5879334bf11a82a33ea9ee082a86 Mon Sep 17 00:00:00 2001 From: lijianlin Date: Thu, 31 Jul 2025 11:01:42 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E6=B6=88=E8=B4=B9=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=88=E5=88=97=E8=A1=A8+=E5=90=88?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 32 ++++++--------- .../demo/domain/vo/bean/BeanConsumeLive.java | 4 ++ .../com/example/demo/domain/vo/bean/BeanPage.java | 12 +++--- .../demo/mapper/bean/BeanConsumeMapper.java | 12 ++++-- .../demo/service/bean/BeanConsumeService.java | 4 ++ .../serviceImpl/bean/BeanConsumeServiceImpl.java | 25 +++++++++--- .../resources/jindouMapper/BeanConsumeMapper.xml | 47 ++++++++++++++++++---- 7 files changed, 92 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index 232fb5b..03f40b4 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -57,17 +57,7 @@ public class BeanConsumeController { if (ObjectUtils.isEmpty(beanPage.getPageSize())) { return Result.error("页大小为空!"); } else { - //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - // List list = Arrays.asList(admin.getMarkets().split(",")); - // beanPage.XXXX.setMarkets(list); - } - else{ - return Result.error("角色为空"); - } + return Result.success(beanConsumeService.selectLiveBy(beanPage.getPageNum(), beanPage.getPageSize(), beanPage.getBeanConsumeLive())); } } catch (Exception e) { @@ -76,16 +66,18 @@ public class BeanConsumeController { }} //消费合计数 @PostMapping("sumConsumeGold") - public BeanConsumeGold sumConsumeGold(@RequestBody BeanPage beanPage) throws Exception { + public BeanConsumeGold sumConsumeGold(@RequestBody BeanPage beanPage) { - //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - //List list = Arrays.asList(admin.getMarkets().split(",")); - //.setMarkets(list); - } return beanConsumeService.sumConsumeGold( beanPage); } + //查询所有直播礼物 + @PostMapping("/getLiveGift") + public Result getLiveGift(){ + return Result.success(beanConsumeService.getLiveGift()); + } + //查询所有直播频道 + @PostMapping("/getLiveChannel") + public Result getLiveChannel(){ + return Result.success(beanConsumeService.getLiveChannel()); + } } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java index 3820534..0af90f9 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -36,4 +36,8 @@ public class BeanConsumeLive { private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) private String sortField; //排序字段 private String sortOrder; //排序顺序 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date startTime; // 开始时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date endTime; // 结束时间 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java index da4c899..156311a 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -17,10 +17,10 @@ public class BeanPage { private static final long serialVersionUID = 1L; private String token; - private Integer pageNum; - private Integer pageSize; - - private BeanConsumeLive beanConsumeLive; - private BeanRechargeInfo beanRechargeInfo; - private BeanConsumeGold beanConsumeGold; + private Integer pageNum; //页码 + private Integer pageSize; //每页大小 + private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + private BeanConsumeLive beanConsumeLive; //直播金豆消费 + private BeanRechargeInfo beanRechargeInfo; //金豆充值信息 + private BeanConsumeGold beanConsumeGold; //金豆消费合计数 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java index 371485b..7b0093f 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java @@ -2,6 +2,7 @@ package com.example.demo.mapper.bean; import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.bean.BeanPage; import com.example.demo.domain.vo.coin.RechargeAudit; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,11 +23,14 @@ public interface BeanConsumeMapper { List getDept(); //筛选查询直播消费 List selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); - //查询消费订单金额 - List selectConsumeGoldsBy(@Param("pageNum") Integer pageNum, - @Param("pageSize") Integer pageSize, - @Param("beanConsumeGold") BeanConsumeGold beanConsumeGold); + //查询金豆直播消费金额 BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); + //查询金豆铁粉消费金额 + // BeanConsumeGold selectSumFansBy(BeanPage beanPage); + //查询直播礼物 + List getLiveGift(); + //查询直播全部频道 + List getLiveChannel(); } diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java index 736ccdf..d04e80d 100644 --- a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -23,4 +23,8 @@ public interface BeanConsumeService { Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive); //消费金币合计数 BeanConsumeGold sumConsumeGold(BeanPage beanPage); + //查询直播礼物 + List getLiveGift(); + + List getLiveChannel(); } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index c7cebcb..8627347 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -45,13 +45,26 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { @Override public BeanConsumeGold sumConsumeGold(BeanPage beanPage) { BeanConsumeGold gold = new BeanConsumeGold(); - BeanConsumeLive beanConsumeLive = beanPage.getBeanConsumeLive(); - //直播消费合计 - BeanConsumeGold BeanConsumeGolds = BeanConsumeMapper.selectSumLiveBy( beanConsumeLive); + Integer payType = beanPage.getPayType(); + if (payType==1) { + //直播消费合计 + gold = BeanConsumeMapper.selectSumLiveBy(beanPage.getBeanConsumeLive()); + }else if (payType==7) { + //充值消费合计 + // gold = BeanConsumeMapper.selectSumFansBy(beanPage); + } - gold.setTotalNum(BeanConsumeGolds.getTotalNum()); - gold.setPermanentBean(BeanConsumeGolds.getPermanentBean()); - gold.setFreeBean(BeanConsumeGolds.getFreeBean()); return gold; } + //查询直播礼物 + @Override + public List getLiveGift() { + + return BeanConsumeMapper.getLiveGift(); + } + //查询直播全部频道 + @Override + public List getLiveChannel() { + return BeanConsumeMapper.getLiveChannel(); + } } diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml index 758901f..e222d34 100644 --- a/src/main/resources/jindouMapper/BeanConsumeMapper.xml +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -44,8 +44,9 @@ AND fyr.source_type = #{beanConsumeLive.type} - - AND consumeTime BETWEEN #{beanConsumeLive.startTime} AND #{beanConsumeLive.endTime} + + AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime}) + AND UNIX_TIMESTAMP(#{beanConsumeLive.endTime}) ) AS t @@ -54,9 +55,14 @@ AND t.gift = #{beanConsumeLive.gift} - AND t.channel = #{beanConsumeLive.channel} + AND t.channel= #{beanConsumeLive.channel} + + AND t.liveName LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%') + + + ORDER BY t.${beanConsumeLive.sortField} ${beanConsumeLive.sortOrder} @@ -66,10 +72,8 @@ - - + + + + \ No newline at end of file From 3ce7e1a727081dd16111b0ccb0a204cb6c3e14d1 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Thu, 31 Jul 2025 12:05:36 +0800 Subject: [PATCH 08/17] =?UTF-8?q?7=E6=9C=8831=E6=97=A5=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=85=85=E5=80=BC=E4=B8=8E=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ++ .../controller/bean/BeanRechargeController.java | 11 ---- .../example/demo/domain/vo/bean/BeanRecharge.java | 2 + .../demo/domain/vo/bean/BeanRechargeInfo.java | 6 +++ ...echargeMapper.java => BeanRechargeMapper2.java} | 5 +- .../demo/mapper/coin/BeanRechargeMapper1.java | 20 +++++++ .../serviceImpl/bean/BeanRechargeServiceImpl.java | 58 ++++++++++---------- .../resources/jindouMapper/BeanRechargeMapper.xml | 18 ------- .../resources/jindouMapper/BeanRechargeMapper2.xml | 61 ++++++++++++++++++++++ src/main/resources/mapper/BeanRechargeMapper1.xml | 28 ++++++++++ 10 files changed, 155 insertions(+), 59 deletions(-) rename src/main/java/com/example/demo/mapper/bean/{BeanRechargeMapper.java => BeanRechargeMapper2.java} (90%) create mode 100644 src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java delete mode 100644 src/main/resources/jindouMapper/BeanRechargeMapper.xml create mode 100644 src/main/resources/jindouMapper/BeanRechargeMapper2.xml create mode 100644 src/main/resources/mapper/BeanRechargeMapper1.xml diff --git a/pom.xml b/pom.xml index b3b2b4d..0948cd6 100644 --- a/pom.xml +++ b/pom.xml @@ -115,6 +115,11 @@ 3.0.4 test + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.2 + diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index 508d087..715cc37 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -57,17 +57,6 @@ public class BeanRechargeController { if (ObjectUtils.isEmpty(page.getPageSize())) { return Result.error("页大小为空!"); } else { - //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getBeanRechargeInfo().setMarkets(list); - } - else{ - return Result.error("角色为空"); - } return Result.success(beanRechargeService.selectBySystem(page.getPageNum(), page.getPageSize(), page.getBeanRechargeInfo())); } } catch (Exception e) { diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java index c31756c..02f4ab2 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java @@ -17,8 +17,10 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class BeanRecharge { + private Integer id;//id private Integer jwcode; // 精网号 private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 private String remark; //备注 + private String adminName; // 管理员名称 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java index 5952369..58ae730 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java @@ -35,5 +35,11 @@ public class BeanRechargeInfo { private String platform; // 充值平台 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date rechargeTime; // 充值时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date startTime; // 开始时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date endTime; // 结束时间 private List markets; // 地区列表 + private String sortField; //排序字段 + private String sortOrder; //排序顺序 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java similarity index 90% rename from src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java rename to src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java index 2beaf4b..427a270 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java @@ -16,7 +16,8 @@ import java.util.List; **/ @Mapper -public interface BeanRechargeMapper { +public interface BeanRechargeMapper2 { List selectBySystem(BeanRechargeInfo beanRechargeInfo); -} + +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java b/src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java new file mode 100644 index 0000000..f71216e --- /dev/null +++ b/src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java @@ -0,0 +1,20 @@ +package com.example.demo.mapper.coin; + + +import com.example.demo.domain.vo.bean.BeanRecharge; +import org.apache.ibatis.annotations.Mapper; + +/** + * @program: gold-java + * @ClassName BeanRechargeMapper + * @description: + * @author: Double + * @create: 2025−07-30 15:43 + * @Version 1.0 + **/ + +@Mapper +public interface BeanRechargeMapper1 { + + int add(BeanRecharge recharge); +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index e7b79be..8bb36a0 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -2,21 +2,18 @@ package com.example.demo.serviceImpl.bean; import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanRechargeInfo; -import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.Result; -import com.example.demo.mapper.bean.BeanRechargeMapper; +import com.example.demo.mapper.bean.BeanRechargeMapper2; +import com.example.demo.mapper.coin.BeanRechargeMapper1; import com.example.demo.service.bean.BeanRechargeService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; import java.util.List; -import java.util.UUID; /** * @program: gold-java @@ -34,7 +31,11 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { private RestTemplate restTemplate; @Autowired - private BeanRechargeMapper beanRechargeMapper; + private BeanRechargeMapper2 beanRechargeMapper2; + + @Autowired + private BeanRechargeMapper1 beanRechargeMapper1; + //新增金豆 @Override @@ -61,27 +62,28 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { if (recharge.getRemark() == null || recharge.getRemark().toString().isEmpty()) { return Result.error("备注不能为空"); } - String jwcode = recharge.getJwcode().toString(); - String op = "recharge"; // 操作类型(根据实际业务定义,例如"recharge"表示充值) - String content = recharge.getRemark(); // 备注作为content参数 - String orderNo = UUID.randomUUID().toString().replace("-", ""); // 生成唯一订单号(去除横线) - - // 2. 构建接口URL及参数 - String apiUrl = "http://47.92.148.30:3003/mock/61/hljw/api/user/gold"; - UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(apiUrl) - .queryParam("jwcode", jwcode) - .queryParam("op", op) - .queryParam("gold", recharge.getPermanentBean()) - .queryParam("content", content) - .queryParam("order_no", orderNo); - - // 3. 发送GET请求 - ResponseEntity response = restTemplate.getForEntity(urlBuilder.toUriString(), String.class); - - // 4. 处理响应结果 - if (!response.getStatusCode().is2xxSuccessful()) { - return Result.error("远程接口调用失败,状态码:" + response.getStatusCodeValue()); - } + beanRechargeMapper1.add(recharge); +// String jwcode = recharge.getJwcode().toString(); +// String op = "recharge"; // 操作类型(根据实际业务定义,例如"recharge"表示充值) +// String content = recharge.getRemark(); // 备注作为content参数 +// String orderNo = UUID.randomUUID().toString().replace("-", ""); // 生成唯一订单号(去除横线) +// +// // 2. 构建接口URL及参数 +// String apiUrl = "http://47.92.148.30:3003/mock/61/hljw/api/user/gold"; +// UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(apiUrl) +// .queryParam("jwcode", jwcode) +// .queryParam("op", op) +// .queryParam("gold", recharge.getPermanentBean()) +// .queryParam("content", content) +// .queryParam("order_no", orderNo); +// +// // 3. 发送GET请求 +// ResponseEntity response = restTemplate.getForEntity(urlBuilder.toUriString(), String.class); +// +// // 4. 处理响应结果 +// if (!response.getStatusCode().is2xxSuccessful()) { +// return Result.error("远程接口调用失败,状态码:" + response.getStatusCodeValue()); +// } return Result.success("添加成功"); } catch (Exception e) { return Result.error("系统异常:" + e.getMessage()); @@ -93,7 +95,7 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { @Override public PageInfo selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo){ PageHelper.startPage(pageNum, pageSize); - List beanRechargeInfos = beanRechargeMapper.selectBySystem(beanRechargeInfo); + List beanRechargeInfos = beanRechargeMapper2.selectBySystem(beanRechargeInfo); return new PageInfo<>(beanRechargeInfos); } } \ No newline at end of file diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper.xml b/src/main/resources/jindouMapper/BeanRechargeMapper.xml deleted file mode 100644 index 762172f..0000000 --- a/src/main/resources/jindouMapper/BeanRechargeMapper.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper2.xml b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml new file mode 100644 index 0000000..c24b04f --- /dev/null +++ b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/BeanRechargeMapper1.xml b/src/main/resources/mapper/BeanRechargeMapper1.xml new file mode 100644 index 0000000..8fd108d --- /dev/null +++ b/src/main/resources/mapper/BeanRechargeMapper1.xml @@ -0,0 +1,28 @@ + + + + + + + INSERT INTO audit + + jwcode, + buy_jd, + free_jd, + type, + admin_name, + remark, + audit_status + + VALUES + + #{jwcode}, + #{permanentBean}, + #{freeBean}, + 0, + #{adminName}, + #{remark}, + 0 + + + \ No newline at end of file From 6607411bb73131d97cbc5dd9040ad2688fbff496 Mon Sep 17 00:00:00 2001 From: lijianlin Date: Thu, 31 Jul 2025 16:36:43 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E9=93=81=E7=B2=89=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E5=90=88=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 23 +++++- .../demo/domain/vo/bean/BeanConsumeFan.java | 38 ++++++++++ .../demo/domain/vo/bean/BeanConsumeLive.java | 2 +- .../com/example/demo/domain/vo/bean/BeanPage.java | 1 + .../demo/mapper/bean/BeanConsumeMapper.java | 7 +- .../demo/service/bean/BeanConsumeService.java | 8 +- .../serviceImpl/bean/BeanConsumeServiceImpl.java | 10 ++- .../resources/jindouMapper/BeanConsumeMapper.xml | 85 ++++++++++++++++++++-- 8 files changed, 160 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index 03f40b4..66b0328 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -49,7 +49,7 @@ public class BeanConsumeController { //筛选查询直播消费记录 @PostMapping("/selectLiveBy") - public Result selectBy(@RequestBody BeanPage beanPage){ + public Result selectLiveBy(@RequestBody BeanPage beanPage){ try { if (ObjectUtils.isEmpty(beanPage.getPageNum())) { return Result.error("页码数为空!"); @@ -62,8 +62,27 @@ public class BeanConsumeController { } } catch (Exception e) { e.printStackTrace(); - return Result.error("请检查筛选数据的格式"); + return Result.error(e.toString()); }} + //筛选查询直播消费记录 + @PostMapping("/selectFanBy") + public Result selectFanBy(@RequestBody BeanPage beanPage){ + try { + if (ObjectUtils.isEmpty(beanPage.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(beanPage.getPageSize())) { + return Result.error("页大小为空!"); + } else { + + return Result.success(beanConsumeService.selectFanBy(beanPage.getPageNum(), beanPage.getPageSize(), beanPage.getBeanConsumeFan())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.toString()); + }} + + //消费合计数 @PostMapping("sumConsumeGold") public BeanConsumeGold sumConsumeGold(@RequestBody BeanPage beanPage) { diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java new file mode 100644 index 0000000..636a00c --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java @@ -0,0 +1,38 @@ +package com.example.demo.domain.vo.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @program: gold-java + * @ClassName BeanConsumeFan + * @description: + * @author: Ethan + * @create: 2025−07-31 11:30 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class BeanConsumeFan { + private static final long serialVersionUID = 1L; + private String name; //姓名 + private Integer jwcode; //精网号 + private String dept; //地区/分部 + private String beanNum; //金豆数量 + private String channel; //频道名称(source_name) + private String type; //类型source_type 单月,连续包月 + private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + private String sortField; //排序字段 + private String sortOrder; //排序顺序 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date consumeTime; // 消费时间 (时间戳转化) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date startTime; // 开始时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date endTime; // 结束时间 +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java index 0af90f9..9dc736f 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -29,7 +29,7 @@ public class BeanConsumeLive { private String type; //类型 private String gift; //礼物名称 private String beanNum; //金豆数量 - private String channel; //频道名称(截取content) + private String liveChannel; //频道名称(截取content) private String liveName; //直播间名称 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 消费时间 (时间戳转化) diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java index 156311a..b04fcde 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -21,6 +21,7 @@ public class BeanPage { private Integer pageSize; //每页大小 private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) private BeanConsumeLive beanConsumeLive; //直播金豆消费 + private BeanConsumeFan beanConsumeFan; //铁粉金豆消费 private BeanRechargeInfo beanRechargeInfo; //金豆充值信息 private BeanConsumeGold beanConsumeGold; //金豆消费合计数 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java index 7b0093f..91b4279 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java @@ -1,5 +1,6 @@ package com.example.demo.mapper.bean; +import com.example.demo.domain.vo.bean.BeanConsumeFan; import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeLive; import com.example.demo.domain.vo.bean.BeanPage; @@ -23,14 +24,16 @@ public interface BeanConsumeMapper { List getDept(); //筛选查询直播消费 List selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); - + //筛选查询铁粉消费 + List selectFanBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); //查询金豆直播消费金额 BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); //查询金豆铁粉消费金额 - // BeanConsumeGold selectSumFansBy(BeanPage beanPage); + BeanConsumeGold selectSumFansBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); //查询直播礼物 List getLiveGift(); //查询直播全部频道 List getLiveChannel(); + } diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java index d04e80d..993a471 100644 --- a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -1,5 +1,6 @@ package com.example.demo.service.bean; +import com.example.demo.domain.vo.bean.BeanConsumeFan; import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeLive; import com.example.demo.domain.vo.bean.BeanPage; @@ -19,12 +20,15 @@ import java.util.List; public interface BeanConsumeService { //获取消费用户的分部 List getDept(); - //筛选查询消费 + //筛选查询直播消费 Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive); + //筛选查询铁粉消费 + Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan); //消费金币合计数 BeanConsumeGold sumConsumeGold(BeanPage beanPage); //查询直播礼物 List getLiveGift(); - + //获取直播频道 List getLiveChannel(); + } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index 8627347..2dc1233 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -1,5 +1,6 @@ package com.example.demo.serviceImpl.bean; +import com.example.demo.domain.vo.bean.BeanConsumeFan; import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeLive; import com.example.demo.domain.vo.bean.BeanPage; @@ -41,6 +42,13 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { List beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive); return new PageInfo<>(beanConsumeLives); } + //筛选查询铁粉消费 + @Override + public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) { + PageHelper.startPage(pageNum, pageSize); + List beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan); + return new PageInfo<>(beanConsumeFans); + } @Override public BeanConsumeGold sumConsumeGold(BeanPage beanPage) { @@ -51,7 +59,7 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { gold = BeanConsumeMapper.selectSumLiveBy(beanPage.getBeanConsumeLive()); }else if (payType==7) { //充值消费合计 - // gold = BeanConsumeMapper.selectSumFansBy(beanPage); + gold = BeanConsumeMapper.selectSumFansBy(beanPage.getBeanConsumeFan()); } return gold; diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml index e222d34..c0f17f2 100644 --- a/src/main/resources/jindouMapper/BeanConsumeMapper.xml +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -27,7 +27,7 @@ WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 THEN SUBSTRING_INDEX(SUBSTRING(content, LOCATE('直播间', content) + CHAR_LENGTH('直播间')), '送礼物', 1) ELSE NULL - END AS channel, + END AS liveChannel, fyr.source_name AS liveName, FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime, fyr.pay_type AS payType @@ -54,8 +54,8 @@ AND t.gift = #{beanConsumeLive.gift} - - AND t.channel= #{beanConsumeLive.channel} + + AND t.liveChannel= #{beanConsumeLive.liveChannel} AND t.liveName LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%') @@ -105,12 +105,12 @@ ELSE NULL END = #{beanConsumeLive.gift} - + AND CASE WHEN LOCATE('直播间', fyr.content) > 0 AND LOCATE('送礼物', fyr.content) > 0 THEN SUBSTRING_INDEX(SUBSTRING(fyr.content, LOCATE('直播间', fyr.content) + CHAR_LENGTH('直播间')), '送礼物', 1) ELSE NULL - END = #{beanConsumeLive.channel} + END = #{beanConsumeLive.liveChannel} AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime}) @@ -122,6 +122,78 @@ ) AS t + + + + + \ No newline at end of file From c2f590d6c43680a6b0b1a38425b80efca686a7d5 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 31 Jul 2025 16:45:26 +0800 Subject: [PATCH 10/17] =?UTF-8?q?7.30=E5=9C=B0=E5=8C=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A5=E5=8F=8A=E5=AF=BC=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/DemoApplication.java | 1 + .../com/example/demo/Export/ExportServiceImpl.java | 272 ++--- .../demo/config/Mysql2DataSourceConfig.java | 5 +- .../demo/controller/coin/ConsumeController.java | 57 +- .../demo/controller/coin/GoldDetailController.java | 8 +- .../demo/controller/coin/RechargeController.java | 51 +- .../demo/controller/coin/RefundController.java | 52 +- .../demo/controller/coin/WorkbenchController.java | 2 +- .../example/demo/domain/vo/coin/ConsumeUser.java | 2 +- .../example/demo/domain/vo/coin/GoldDetail.java | 2 +- .../example/demo/domain/vo/coin/RechargeUser.java | 42 +- .../example/demo/domain/vo/coin/RefundUser.java | 2 +- .../demo/service/coin/ExportExcelService.java | 7 + .../demo/service/listen/BaseMessageListener.java | 66 ++ .../serviceImpl/coin/ExportExcelServiceImpl.java | 1211 ++------------------ .../demo/serviceImpl/coin/GeneralServiceImpl.java | 10 +- .../demo/serviceImpl/coin/MarketServiceImpl.java | 2 +- .../serviceImpl/coin/PermissionServiceImpl.java | 4 +- .../serviceImpl/coin/WorkbenchServiceImpl.java | 6 +- src/main/resources/mapper/AuditMapper.xml | 4 +- src/main/resources/mapper/ConsumeMapper.xml | 11 +- src/main/resources/mapper/PermissionMapper.xml | 2 +- src/main/resources/mapper/RechargeMapper.xml | 20 +- src/main/resources/mapper/RefundMapper.xml | 11 +- src/main/resources/mapper/RoleMapper.xml | 4 +- src/main/resources/mapper/UserMapper.xml | 2 +- 26 files changed, 493 insertions(+), 1363 deletions(-) create mode 100644 src/main/java/com/example/demo/service/listen/BaseMessageListener.java diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index 4118dbf..dd35ee5 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -8,6 +8,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // 启用调度功能 @MapperScan(basePackages = "com.example.demo.mapper", sqlSessionTemplateRef = "mysql1SqlSessionTemplate") +@MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate") public class DemoApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index adf13eb..4d14a12 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -32,7 +32,7 @@ import java.util.Map; * @Version 1.0 **/ @Service -public class ExportServiceImpl implements ExportService{ +public class ExportServiceImpl implements ExportService { @Autowired private GoldDetailMapper goldDetailMapper; @Autowired @@ -40,174 +40,150 @@ public class ExportServiceImpl implements ExportService{ @Autowired private AdminService adminService; - @Override - public Result addExportRecharge(RechargeDTO dto) { - // 获取操作者 jwcode - HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + /** + * 通用导出逻辑 + * + * @param dto 数据传输对象 (RechargeDTO, RefundDTO, ConsumeDTO) + * @param exportType 导出类型 ("充值明细", "退款明细", "消耗明细") + * @param queueName Redis 队列名称 + * @param requestData 请求数据字段名 ("rechargeUser", "refundUser", "consumeUser") + * @return Result + */ + private Result addExport(Object dto, String exportType, String queueName, String requestData) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String token = request.getHeader("token"); + try { - UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - dto.setAccount(Integer.valueOf(token1.getUsername())); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); - } - String admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "充值明细", - admin, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); -// System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + // 获取操作者信息 + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + Integer account = Integer.valueOf(admin.getAccount()); + String adminName = admin.getAdminName(); - try{ - // 调用方式 + // 设置 DTO 的通用字段 + setCommonFields(dto, account, adminName); + + // 插入导出记录并获取主键 GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); - goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() - ); - // 获取主键 + insertExportRecord(dto, idHolder, account); Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("rechargeUser", dto.getRechargeUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 + + // 构造完整的 JSON 数据 + Map exportData = constructExportData(recordId, token, dto, requestData); + + // 发送到 Redis 消息队列 String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("recharge:queue:export_queue", jsonData); - }catch (Exception e){ + redisUtil.sendMessage(queueName, jsonData); + + } catch (Exception e) { e.printStackTrace(); throw new SystemException("导出数据异常,请稍后重试", e); } + return Result.success(); } - @Override - public Result addExportRefund(RefundDTO dto) { - // 获取操作者 jwcode - HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - try { - UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - dto.setAccount(Integer.valueOf(token1.getUsername())); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + /** + * 设置 DTO 的通用字段 + */ + private void setCommonFields(Object dto, Integer account,String adminName) throws Exception { + if (dto instanceof RechargeDTO rechargeDTO) { + rechargeDTO.setAccount(Integer.valueOf(account)); + rechargeDTO.setUrl(""); + rechargeDTO.setFileName(generateFileName("充值明细", adminName)); + rechargeDTO.setDataNum(0); + } else if (dto instanceof RefundDTO refundDTO) { + refundDTO.setAccount(Integer.valueOf(account)); + refundDTO.setUrl(""); + refundDTO.setFileName(generateFileName("退款明细", adminName)); + refundDTO.setDataNum(0); + } else if (dto instanceof ConsumeDTO consumeDTO) { + consumeDTO.setAccount(Integer.valueOf(account)); + consumeDTO.setUrl(""); + consumeDTO.setFileName(generateFileName("消耗明细", adminName)); + consumeDTO.setDataNum(0); } - String admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "退款明细", - admin, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + } - try{ - // 调用方式 - GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); + /** + * 插入导出记录 + */ + private void insertExportRecord(Object dto, GoldDetailMapper.ExportRecordIdHolder idHolder, Integer account) throws Exception { + if (dto instanceof RechargeDTO rechargeDTO) { goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() + idHolder, + account, + rechargeDTO.getType(), + rechargeDTO.getState(), + rechargeDTO.getUrl(), + rechargeDTO.getFileName(), + rechargeDTO.getDataNum() + ); + } else if (dto instanceof RefundDTO refundDTO) { + goldDetailMapper.insertExportRecord( + idHolder, + account, + refundDTO.getType(), + refundDTO.getState(), + refundDTO.getUrl(), + refundDTO.getFileName(), + refundDTO.getDataNum() + ); + } else if (dto instanceof ConsumeDTO consumeDTO) { + goldDetailMapper.insertExportRecord( + idHolder, + account, + consumeDTO.getType(), + consumeDTO.getState(), + consumeDTO.getUrl(), + consumeDTO.getFileName(), + consumeDTO.getDataNum() ); - // 获取主键 - Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("refundUser", dto.getRefundUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 - String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("refund:queue:export_queue", jsonData); - }catch (Exception e){ - e.printStackTrace(); - throw new SystemException("导出数据异常,请稍后重试", e); } - return Result.success(); } - @Override - public Result addExportConsume(ConsumeDTO dto) { - // 获取操作者 jwcode - HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - try { - UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - dto.setAccount(Integer.valueOf(token1.getUsername())); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + /** + * 构造导出数据 + */ + private Map constructExportData(Long recordId, String token, Object dto, String requestDataKey) throws Exception { + Map exportData = new HashMap<>(); + exportData.put("recordId", recordId); + exportData.put("token", token); + + Map requestData = new HashMap<>(); + if (dto instanceof RechargeDTO rechargeDTO) { + requestData.put(requestDataKey, rechargeDTO.getRechargeUser()); + } else if (dto instanceof RefundDTO refundDTO) { + requestData.put(requestDataKey, refundDTO.getRefundUser()); + } else if (dto instanceof ConsumeDTO consumeDTO) { + requestData.put(requestDataKey, consumeDTO.getConsumeUser()); } - String admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "消耗明细", - admin, + exportData.put("requestData", requestData); + + return exportData; + } + + /** + * 生成文件名 + */ + private String generateFileName(String exportType, String adminName) { + return String.format("%s_%s_%s.xlsx", + exportType, + adminName, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + } - try{ - // 调用方式 - GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); - goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() - ); - // 获取主键 - Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("consumeUser", dto.getConsumeUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 - String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("consume:queue:export_queue", jsonData); - }catch (Exception e){ - e.printStackTrace(); - throw new SystemException("导出数据异常,请稍后重试", e); - } - return Result.success(); + @Override + public Result addExportRecharge(RechargeDTO dto) { + return addExport(dto, "充值明细", "recharge:queue:export_queue", "rechargeUser"); + } + + @Override + public Result addExportRefund(RefundDTO dto) { + return addExport(dto, "退款明细", "refund:queue:export_queue", "refundUser"); + } + + @Override + public Result addExportConsume(ConsumeDTO dto) { + return addExport(dto, "消耗明细", "consume:queue:export_queue", "consumeUser"); } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java index 225424b..1693570 100644 --- a/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java +++ b/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java @@ -17,10 +17,7 @@ import javax.sql.DataSource; @Slf4j @Configuration -@MapperScan( - basePackages = "com.example.demo.mapper.bean", // 扫描coin包 - sqlSessionTemplateRef = "mysql2SqlSessionTemplate" -) + public class Mysql2DataSourceConfig { @Bean(name = "mysql2DataSource") diff --git a/src/main/java/com/example/demo/controller/coin/ConsumeController.java b/src/main/java/com/example/demo/controller/coin/ConsumeController.java index f89a901..e07de1d 100644 --- a/src/main/java/com/example/demo/controller/coin/ConsumeController.java +++ b/src/main/java/com/example/demo/controller/coin/ConsumeController.java @@ -10,6 +10,7 @@ import com.example.demo.service.coin.ConsumeService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -85,15 +86,15 @@ public class ConsumeController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getConsumeUser().setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(page.getConsumeUser().getMarkets()==null||page.getConsumeUser().getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + page.getConsumeUser().setMarkets(markets); + } } return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser())); } @@ -108,16 +109,15 @@ public class ConsumeController { @PostMapping("/statsGold") public Result statsGold(@RequestBody ConsumeUser consumeUser) { try { - //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - consumeUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(consumeUser.getMarkets()==null||consumeUser.getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + consumeUser.setMarkets(markets); + } } Gold gold = consumeService.statsGold(consumeUser); return Result.success(gold); @@ -144,6 +144,25 @@ public class ConsumeController { } } + public Result select(@RequestBody Page page) { + try { + //页码校验 + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + //页面大小校验 + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + + return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java index e3ace4b..f890b29 100644 --- a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java +++ b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java @@ -65,7 +65,7 @@ public class GoldDetailController { String token = request.getHeader("token"); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getGoldDetail().setMarkets(markets); } } @@ -82,7 +82,7 @@ public class GoldDetailController { String token = request.getHeader("token"); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getGoldDetail().setMarkets(markets); } } @@ -96,7 +96,7 @@ public class GoldDetailController { Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { user.setMarkets(markets); } } @@ -117,7 +117,7 @@ public class GoldDetailController { Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getUser().setMarkets(markets); } } diff --git a/src/main/java/com/example/demo/controller/coin/RechargeController.java b/src/main/java/com/example/demo/controller/coin/RechargeController.java index 9552fb5..7fcbfa2 100644 --- a/src/main/java/com/example/demo/controller/coin/RechargeController.java +++ b/src/main/java/com/example/demo/controller/coin/RechargeController.java @@ -7,6 +7,7 @@ import com.example.demo.service.coin.RechargeService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -78,15 +79,14 @@ public class RechargeController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getRechargeUser().setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(page.getRechargeUser().getMarkets()==null||page.getRechargeUser().getMarkets().isEmpty()){ + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; + if(!markets.contains("1")) { + page.getRechargeUser().setMarkets(markets); + } } return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); } @@ -101,15 +101,14 @@ public class RechargeController { public Result statsGold(@RequestBody RechargeUser rechargeUser) { try { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - rechargeUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(rechargeUser.getMarkets()==null||rechargeUser.getMarkets().isEmpty()){ + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; + if(!markets.contains("1")) { + rechargeUser.setMarkets(markets); + } } Gold gold = rechargeService.statsGold(rechargeUser); return Result.success(gold); @@ -129,5 +128,21 @@ public class RechargeController { } + public Result selcet(@RequestBody Page page) { + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + //解token权限 + return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); + } + } catch (Exception e) { + return Result.error("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/RefundController.java b/src/main/java/com/example/demo/controller/coin/RefundController.java index e730265..ef1f6ba 100644 --- a/src/main/java/com/example/demo/controller/coin/RefundController.java +++ b/src/main/java/com/example/demo/controller/coin/RefundController.java @@ -6,6 +6,7 @@ import com.example.demo.service.coin.RefundService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -73,14 +74,15 @@ public class RefundController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getRefundUser().setMarkets(list); - } else { - return Result.error("角色为空"); + if(page.getRefundUser().getMarkets()==null||page.getRefundUser().getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + page.getRefundUser().setMarkets(markets); + } } return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser())); } @@ -95,15 +97,15 @@ public class RefundController { public Result statsGold(@RequestBody RefundUser refundUser) { try { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - refundUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(refundUser.getMarkets()==null||refundUser.getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + refundUser.setMarkets(markets); + } } Gold gold = refundService.statsGold(refundUser); return Result.success(gold); @@ -135,4 +137,20 @@ public class RefundController { return Result.error("请检查数据的格式"); } } + public Result selcet(@RequestBody Page page) { + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + + return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser())); + } + } catch (Exception e) { + return Result.error("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java index 8029bce..7e5d3da 100644 --- a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java @@ -57,7 +57,7 @@ public class WorkbenchController { List markets = workbenchService.getAdminMarket(account); WorkbenchCard result; //判断是否是总部 - if (markets != null && markets.contains("总部")) { + if (markets != null && markets.contains("1")) { result = workbenchService.getCardCache(markets);//走缓存,拿全部市场的缓存数据 } else { result = workbenchService.getCard(markets);//不走缓存,计算卡片属性 diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index d00c03a..31cae1f 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -68,6 +68,6 @@ public class ConsumeUser implements Serializable { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java index 668167f..5f5af0e 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java +++ b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java @@ -57,7 +57,7 @@ public class GoldDetail { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - @ExcelIgnore + @ExcelProperty("更新时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date auditTime; @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java index 60f12d8..fb540a2 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java @@ -25,64 +25,64 @@ public class RechargeUser { private static final long serialVersionUID = 1L; -// @ExcelProperty("客户姓名") + @ExcelProperty("客户姓名") private String name; // 客户姓名 -// @ExcelProperty("精网号") + @ExcelProperty("精网号") private Integer jwcode; // 精网号 -// @ExcelProperty("所属地区") + @ExcelProperty("所属地区") private String market; // 所属地区 -// @ExcelProperty("活动名称") + @ExcelProperty("活动名称") private String activity; // 活动名称 -// @ExcelProperty("汇率ID") + @ExcelProperty("汇率ID") private Integer rateId; // 汇率ID -// @ExcelProperty("汇率名称") + @ExcelProperty("汇率名称") private String rateName; // 汇率名称 -// @ExcelProperty("金额[分]") + @ExcelProperty("金额[分]") private Integer money; // 金额[分] -// @ExcelProperty("永久金币") + @ExcelProperty("永久金币") private Integer permanentGold; // 永久金币 -// @ExcelProperty("免费金币") + @ExcelProperty("免费金币") private Integer freeGold; // 免费金币 -// @ExcelProperty("支付方式") + @ExcelProperty("支付方式") private String payModel; // 支付方式 -// @ExcelProperty("支付平台") + @ExcelProperty("支付平台") private String payPlatform; // 支付平台 -// @ExcelProperty("支付凭证") + @ExcelProperty("支付凭证") private String voucher; // 支付凭证 -// @ExcelProperty("备注") + @ExcelProperty("备注") private String remark; // 备注 -// @ExcelProperty("提交人Id") + @ExcelProperty("提交人Id") private Integer adminId; // 提交人Id -// @ExcelProperty("提交人姓名") + @ExcelProperty("提交人姓名") private String adminName; // 提交人姓名 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") -// @ExcelProperty("创建时间") + @ExcelProperty("创建时间") private Date payTime; // 创建时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") -// @ExcelIgnore + @ExcelIgnore private Date startTime; // 开始时间 -// @ExcelIgnore + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 结束时间 -// @ExcelIgnore + @ExcelIgnore private String sortField; //排序字段 -// @ExcelIgnore + @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java index 3575ae3..548e784 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java @@ -68,6 +68,6 @@ public class RefundUser { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/service/coin/ExportExcelService.java b/src/main/java/com/example/demo/service/coin/ExportExcelService.java index 3001598..7e7ada1 100644 --- a/src/main/java/com/example/demo/service/coin/ExportExcelService.java +++ b/src/main/java/com/example/demo/service/coin/ExportExcelService.java @@ -1,8 +1,12 @@ package com.example.demo.service.coin; import com.example.demo.domain.entity.Export; +import com.example.demo.domain.vo.coin.Page; +import com.example.demo.domain.vo.coin.Result; +import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.function.Function; /** * @program: GOLD @@ -19,4 +23,7 @@ public interface ExportExcelService { Exception consumeExcel(String message) throws Exception; Exception refundExcel(String message) throws Exception; List getExcel(Export export); + + @Transactional + Exception exportExcelGeneric(String message, String exportType, Function dataFetcher) throws Exception; } \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/listen/BaseMessageListener.java b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java new file mode 100644 index 0000000..b3f3d9f --- /dev/null +++ b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java @@ -0,0 +1,66 @@ +package com.example.demo.service.listen; + +import cn.hutool.core.util.StrUtil; +import com.example.demo.Util.ExecutionContextUtil; +import com.example.demo.Util.FeiShuAlertUtil; +import com.example.demo.Util.RedisUtil; +import com.example.demo.domain.vo.coin.ExecutionContext; +import com.example.demo.service.queue.AbstractMessageListener; + +public abstract class BaseMessageListener extends AbstractMessageListener { + + protected BaseMessageListener(RedisUtil redisQueueUtil, String queueName) { + super(redisQueueUtil, queueName); + System.out.println("监听器已启动,队列: " + queueName); + } + + @Override + protected void handleError(Exception e, T message) { + handleException(e, message.toString()); // 统一异常处理 + } + + /** + * 验证消息是否为空 + */ + protected void validateMessage(T message) { + if (message == null || (message instanceof String && StrUtil.isBlank((String) message))) { + throw new IllegalArgumentException("Redis消息队列数据为空: " + message); + } + } + + /** + * 统一异常处理 + */ + protected void handleException(Exception e, String message) { + logError(e, message); // 记录错误日志 + sendAlert(e, message); // 发送告警通知 + throw new RuntimeException("Failed to process message: " + e.getMessage(), e); + } + + /** + * 记录错误日志 + */ + protected void logError(Exception e, String message) { + System.err.println("Message listener exception: " + e.getMessage()); + e.printStackTrace(); + } + + /** + * 发送告警通知 + */ + protected void sendAlert(Exception e, String message) { + try { + ExecutionContext context = ExecutionContextUtil.getExecutionContext(); + String cause = e.getCause() != null ? e.getCause().getMessage() : ""; + FeiShuAlertUtil.sendAlertMessage( + context, + e.getStackTrace()[0].getFileName(), + e.getStackTrace()[0].getLineNumber(), + "Message Listener Error: " + e.getMessage() + " 底层错误: " + cause, + "Failed message: " + message + ); + } catch (Exception alertEx) { + System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index b2895f1..3f17182 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -42,6 +42,7 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.function.Function; @Service @@ -76,921 +77,95 @@ public class ExportExcelServiceImpl implements ExportExcelService { @Transactional @Override public Exception handleExcelExportData(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long sTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode token = requestDataNode.path("token"); - String tokenValue = token.asText(); - JsonNode goldDetailNode = requestDataNode.path("goldDetail"); - GoldDetail goldDetail = objectMapper.treeToValue(goldDetailNode, GoldDetail.class); - - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // 从JSON中提取单个值 - - Date startTime = null; - if (goldDetailNode.has("startTime") && goldDetailNode.get("startTime") != null) { - String startTimeStr = goldDetailNode.get("startTime").asText(); - if (!"null".equalsIgnoreCase(startTimeStr) && !startTimeStr.trim().isEmpty()) { - try { - startTime = dateFormat.parse(startTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 startTime: " + startTimeStr); - e.printStackTrace(); - } - } - } - - // 解析 endTime - Date endTime = null; - - if (goldDetailNode.has("endTime") && goldDetailNode.get("endTime") != null) { - String endTimeStr = goldDetailNode.get("endTime").asText(); - if (!"null".equalsIgnoreCase(endTimeStr) && !endTimeStr.trim().isEmpty()) { - try { - endTime = dateFormat.parse(endTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 endTime: " + endTimeStr); - e.printStackTrace(); - } - } - } - - try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, GoldDetail.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setGoldDetail(goldDetail); - if(goldDetail.getMarkets()==null||goldDetail.getMarkets().isEmpty()){ - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(tokenValue), Admin.class); - List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { - page.getGoldDetail().setMarkets(markets); - } - } - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - - boolean hasMore = true; - while (hasMore) { - Result pageResult = goldDetailController.ExcelGoldDetail(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long eTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (eTime - sTime)); - } - return null; - } - - - - @Transactional - @Override - public Exception handleExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long stTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode token = requestDataNode.path("token"); - String tokenValue = token.asText(); - JsonNode userNode = requestDataNode.path("user"); - User user = objectMapper.treeToValue(userNode, User.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // 从JSON中提取单个值 -// String text = requestDataNode.has("text") ? requestDataNode.get("text").asText() : null; -// Integer sort = requestDataNode.has("sort") ? requestDataNode.get("sort").asInt() : null; -// String field = requestDataNode.has("field") ? requestDataNode.get("field").asText() : null; -// String deptId = requestDataNode.has("deptId") ? requestDataNode.get("deptId").asText() : null; - - Date startTime = null; - if (userNode.has("startTime") && userNode.get("startTime") != null) { - String startTimeStr = userNode.get("startTime").asText(); - if (!"null".equalsIgnoreCase(startTimeStr) && !startTimeStr.trim().isEmpty()) { - try { - startTime = dateFormat.parse(startTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 startTime: " + startTimeStr); - e.printStackTrace(); - } - } - } - - // 解析 endTime - Date endTime = null; - - if (userNode.has("endTime") && userNode.get("endTime") != null) { - String endTimeStr = userNode.get("endTime").asText(); - if (!"null".equalsIgnoreCase(endTimeStr) && !endTimeStr.trim().isEmpty()) { - try { - endTime = dateFormat.parse(endTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 endTime: " + endTimeStr); - e.printStackTrace(); - } - } - } - - try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, User.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setUser(user); - if(user.getMarkets()==null||user.getMarkets().isEmpty()){ - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(tokenValue), Admin.class); - List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { - page.getUser().setMarkets(markets); - } - } - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - boolean hasMore = true; - while (hasMore) { - Result pageResult = goldDetailController.ExcelGold(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long eTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (eTime - stTime)); - } - return null; - } - - @Transactional - @Override - public Exception rechargeExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long startTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - String token = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - token = rootNode.path("token").asText(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode rechargeNode = requestDataNode.path("rechargeUser"); - RechargeUser rechargeUser = objectMapper.treeToValue(rechargeNode, RechargeUser.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 -// String text = requestDataNode.has("text") ? requestDataNode.get("text").asText() : null; -// Integer sort = requestDataNode.has("sort") ? requestDataNode.get("sort").asInt() : null; -// String field = requestDataNode.has("field") ? requestDataNode.get("field").asText() : null; -// String deptId = requestDataNode.has("deptId") ? requestDataNode.get("deptId").asText() : null; - - try { - // 6. 初始化Excel写入器(指向本地文件流) - try { - excelWriter = EasyExcel.write(outputStream, RechargeUser.class).build(); - } catch (Exception e) { - log.error("Excel 写入器初始化失败", e); - throw new RuntimeException("Excel 写入器初始化失败", e); - } - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - page.setRechargeUser(rechargeUser); - boolean hasMore = true; - while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = rechargeController.selcetBy(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } + return exportExcelGeneric(message, "goldDetail", page -> { + try { + return goldDetailController.ExcelGoldDetail(page); + } catch (Exception e) { + throw new RuntimeException(e); } - long endTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime)); - } - return null; + }); } @Transactional @Override - public Exception consumeExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long startTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - String token = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - token = rootNode.path("token").asText(); - JsonNode consumeUserNode = requestDataNode.path("consumeUser"); - ConsumeUser consumeUser = objectMapper.treeToValue(consumeUserNode, ConsumeUser.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - log.info("到这了---------------------------------------------"); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 - - + public Exception handleExcel(String message) throws Exception { + return exportExcelGeneric(message, "user", page -> { try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, ConsumeUser.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setPageNum(1); - page.setPageSize(5000); - page.setConsumeUser(consumeUser); - Integer totalCount = 0; - boolean hasMore = true; - while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = consumeController.selectBy(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); + return goldDetailController.ExcelGold(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); + @Transactional + @Override + public Exception rechargeExcel(String message) throws Exception { + return exportExcelGeneric(message, "rechargeUser", page -> { + try { + return rechargeController.selcet(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + @Transactional + @Override + public Exception consumeExcel(String message) throws Exception { + return exportExcelGeneric(message, "consumeUser", page -> { + try { + return consumeController.select(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); + @Transactional + @Override + public Exception refundExcel(String message) throws Exception { + return exportExcelGeneric(message, "refundUser", page -> { + try { + return refundController.selcet(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } + @Override + public List getExcel(Export export) { + List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); + System.out.println(list+"-------------------------------"); + return list; + } - log.info("解析到的URL: {}", fileUrl); - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } + /** + * 验证导出记录 + */ + private AiEmotionExportRecordVO validateExportRecord(Long recordId) throws Exception { + AiEmotionExportRecordVO record = aiEmotionService.getRecordById(recordId); + AbstractLog log = null; + if (record == null) { + log.error("导出记录不存在 recordId: {}", recordId); + return null; + } - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long endTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime)); + // 检查是否已经处理过 + if (record.getState() != 0) { + log.warn("导出记录已处理 recordId: {}, status: {}", recordId, record.getState()); + return null; } - return null; + return record; } @Transactional @Override - public Exception refundExcel(String message) throws Exception { + public Exception exportExcelGeneric(String message, String exportType, Function dataFetcher) throws Exception { System.out.println("明细导出excel数据开始执行:" + message); long startTime = System.currentTimeMillis(); Long recordId = null; - String fileName = null; - String token = null; File tempFile = null; OutputStream outputStream = null; ExcelWriter excelWriter = null; @@ -998,51 +173,41 @@ public class ExportExcelServiceImpl implements ExportExcelService { try { // 1. 解析JSON任务 JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 recordId = rootNode.path("recordId").asLong(); - token = rootNode.path("token").asText(); JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode refundUserNode = requestDataNode.path("refundUser"); - RefundUser refundUser = objectMapper.treeToValue(refundUserNode, RefundUser.class); - // 3. 验证导出记录 + String tokenValue = requestDataNode.path("token").asText(); + + // 2. 验证导出记录 AiEmotionExportRecordVO record = validateExportRecord(recordId); if (record == null) return null; - //4. 更新状态为处理中 + + // 3. 更新状态为处理中 aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) + + // 4. 准备Excel文件 + String fileName = record.getFileName(); tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 + outputStream = new FileOutputStream(tempFile); try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, RefundUser.class).build(); + // 5. 初始化Excel写入器 + Class clazz = getExportClass(exportType); // 动态获取导出类 + excelWriter = EasyExcel.write(outputStream, clazz).build(); WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 + + // 6. 分页查询并写入数据 Page page = new Page(); page.setPageNum(1); - page.setPageSize(5000); - page.setRefundUser(refundUser); + page.setPageSize(PAGE_SIZE); Integer totalCount = 0; boolean hasMore = true; + while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = refundController.selcetBy(page); + Result pageResult = dataFetcher.apply(page); Integer code = pageResult.getCode(); Object data = pageResult.getData(); if (code == 200) { - // 判断 data 是否是 PageInfo 类型 if (!(data instanceof PageInfo)) { log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); hasMore = false; @@ -1050,21 +215,17 @@ public class ExportExcelServiceImpl implements ExportExcelService { } @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); + PageInfo pageInfo = (PageInfo) data; + Long total = pageInfo.getTotal(); + List list = pageInfo.getList(); if (list == null || list.isEmpty()) { hasMore = false; } else { - // 写入 Excel 数据 excelWriter.write(list, writeSheet); - page.setPageNum(page.getPageNum() + 1); totalCount += list.size(); log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - hasMore = totalCount < total; } } else { @@ -1072,80 +233,49 @@ public class ExportExcelServiceImpl implements ExportExcelService { log.error("获取数据失败,状态码: {}", code); } } - // 7. 完成Excel写入(所有数据写入后关闭写入器) + + // 7. 完成Excel写入 if (excelWriter != null) { excelWriter.finish(); } if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 + outputStream.flush(); + outputStream.close(); } - // 检查文件是否存在且不为空 + + // 8. 检查文件是否存在且不为空 if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; + // 9. 上传到OSS try { - // 1. 创建上传工具实例 ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); + String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } + JsonNode uploadResult = objectMapper.readTree(result); + long code = uploadResult.path("code").asLong(); + String fileUrl = ""; + JsonNode dataNode = uploadResult.path("data"); - log.info("解析到的URL: {}", fileUrl); + if (dataNode.isObject()) { + fileUrl = dataNode.path("url").asText(); + } else if (dataNode.isTextual()) { + fileUrl = dataNode.asText(); + } - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); + if (code == 200 && !fileUrl.isEmpty()) { + aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); + } else { + aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); } } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); + aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); + throw new Exception("文件上传云端失败", e); } } else { throw new Exception("导出的Excel文件不存在或为空"); } - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 if (recordId != null) { aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); } @@ -1166,11 +296,9 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } catch (Exception e) { log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 if (recordId != null) { aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); } - System.out.println("<导出失败>" + e.getMessage()); throw new Exception("导出任务处理失败", e); } finally { // 清理临时文件 @@ -1191,113 +319,20 @@ public class ExportExcelServiceImpl implements ExportExcelService { } return null; } - - - @Override - public List getExcel(Export export) { - List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); - System.out.println(list+"-------------------------------"); - return list; - } - - - /** - * 验证导出记录 - */ - private AiEmotionExportRecordVO validateExportRecord(Long recordId) throws Exception { - AiEmotionExportRecordVO record = aiEmotionService.getRecordById(recordId); - AbstractLog log = null; - if (record == null) { - log.error("导出记录不存在 recordId: {}", recordId); - return null; - } - - // 检查是否已经处理过 - if (record.getState() != 0) { - log.warn("导出记录已处理 recordId: {}, status: {}", recordId, record.getState()); - return null; - } - return record; - } - - /** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter initExcelWriter(OutputStream os, String exportType) { - switch (exportType) { - case "user": - return EasyExcel.write(os, Goldmingxi.class) - .inMemory(Boolean.TRUE) - .build(); - default: - throw new IllegalArgumentException("不支持的导出类型: " + exportType); - } - } - /** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter ExcelWriter(OutputStream os, String exportType) { - switch (exportType) { - case "user": - return EasyExcel.write(os, User.class) - .inMemory(Boolean.TRUE) - .build(); - default: - throw new IllegalArgumentException("不支持的导出类型: " + exportType); - } - } - /** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter RechargeExcelWriter(OutputStream os, String exportType) { - switch (exportType) { - case "user": - return EasyExcel.write(os, RechargeUser.class) - .inMemory(Boolean.TRUE) - .build(); - default: - throw new IllegalArgumentException("不支持的导出类型: " + exportType); - } - } - /** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter ConExcelWriter(OutputStream os, String exportType) { - switch (exportType) { - case "user": - return EasyExcel.write(os, ConsumeUser.class) - .inMemory(Boolean.TRUE) - .build(); - default: - throw new IllegalArgumentException("不支持的导出类型: " + exportType); - } - }/** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter RefundExcelWriter(OutputStream os, String exportType) { + private Class getExportClass(String exportType) { switch (exportType) { + case "goldDetail": + return GoldDetail.class; case "user": - return EasyExcel.write(os, RefundUser.class) - .inMemory(Boolean.TRUE) - .build(); + return User.class; + case "rechargeUser": + return RechargeUser.class; + case "consumeUser": + return ConsumeUser.class; + case "refundUser": + return RefundUser.class; default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } } - } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java index 25ea11f..b827a95 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java @@ -130,10 +130,10 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { List allMarkets = getMarket(); // 获取所有地区 - allMarkets.remove("总部"); // 先移除可能存在的总部 - allMarkets.add(0, "总部"); // 将总部添加到列表第一位 + allMarkets.remove("1"); // 先移除可能存在的总部 + allMarkets.add(0, "1"); // 将总部添加到列表第一位 list = allMarkets; // 更新list } return list; @@ -156,7 +156,7 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { list=getMarket();//总部有所有地区的权限 } return list; @@ -181,7 +181,7 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { list=getAllRoleMarket();//总部有所有地区的权限 } return list; diff --git a/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java index f0c9424..31d028c 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java @@ -20,7 +20,7 @@ public class MarketServiceImpl implements MarketService { List markets = marketMapper.getMarket(); // 2. 构建树形结构(根节点parentId=1) - return buildTree(markets, 1); + return buildTree(markets, -1); } private List buildTree(List markets, Integer parentId) { // 过滤出当前父节点的子菜单 diff --git a/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java index 8931a28..aaa66ec 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java @@ -75,7 +75,7 @@ public class PermissionServiceImpl implements PermissionService { if (ObjectUtils.isEmpty(admin.getMarket())) { throw new Exception("地区为空!"); } - if (admin.getMarket().contains("总部") && admin.getMarket().size() > 1) { + if (admin.getMarket().contains("1") && admin.getMarket().size() > 1) { throw new Exception("总部不可与其他地区共存"); } if (ObjectUtils.isEmpty(admin.getPostiton())) { @@ -148,7 +148,7 @@ public class PermissionServiceImpl implements PermissionService { if (ObjectUtils.isEmpty(adminVo.getMarket())) { throw new Exception("地区为空!"); } - if (adminVo.getMarket().contains("总部") && adminVo.getMarket().size() > 1) { + if (adminVo.getMarket().contains("1") && adminVo.getMarket().size() > 1) { throw new Exception("总部不可与其他地区共存"); } // 校验职位是否为空(管理员职位为必填项) diff --git a/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java index a123b13..f9d8c7b 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java @@ -60,10 +60,10 @@ public class WorkbenchServiceImpl implements WorkbenchService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { List allMarkets = workBenchMapper.getMarket(); // 获取所有地区 - allMarkets.remove("总部"); // 先移除可能存在的总部 - allMarkets.add(0, "总部"); // 将总部添加到列表第一位 + allMarkets.remove("1"); // 先移除可能存在的总部 + allMarkets.add(0, "1"); // 将总部添加到列表第一位 list = allMarkets; // 更新list } return list; diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 7ab53f9..2e5bb5e 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -61,7 +61,7 @@ AND ugr.activity = #{rechargeAudit.activity} - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -122,7 +122,7 @@ AND u.market = #{refundAudit.market} - + AND ( u.market LIKE CONCAT('%', #{market}, '%') diff --git a/src/main/resources/mapper/ConsumeMapper.xml b/src/main/resources/mapper/ConsumeMapper.xml index 79f0bda..38d429b 100644 --- a/src/main/resources/mapper/ConsumeMapper.xml +++ b/src/main/resources/mapper/ConsumeMapper.xml @@ -24,7 +24,7 @@ ugr.type = 1 AND ugr.flag = 1 - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -92,12 +92,11 @@ admin a ON ugr.admin_id = a.id ugr.type = 1 AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/PermissionMapper.xml b/src/main/resources/mapper/PermissionMapper.xml index 3740d89..eded8b8 100644 --- a/src/main/resources/mapper/PermissionMapper.xml +++ b/src/main/resources/mapper/PermissionMapper.xml @@ -84,7 +84,7 @@ and admin.postiton=#{postiton} - + AND ( admin.market LIKE CONCAT('%', #{market}, '%') diff --git a/src/main/resources/mapper/RechargeMapper.xml b/src/main/resources/mapper/RechargeMapper.xml index 08d3527..5ee4e84 100644 --- a/src/main/resources/mapper/RechargeMapper.xml +++ b/src/main/resources/mapper/RechargeMapper.xml @@ -27,13 +27,12 @@ ugr.type = 0 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + + AND user.market IN + + #{markets} - ) @@ -97,12 +96,11 @@ ugr.type = 0 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/RefundMapper.xml b/src/main/resources/mapper/RefundMapper.xml index eae9331..1c12cf7 100644 --- a/src/main/resources/mapper/RefundMapper.xml +++ b/src/main/resources/mapper/RefundMapper.xml @@ -26,7 +26,7 @@ ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -95,12 +95,11 @@ admin a ON ugr.admin_id = a.id ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/RoleMapper.xml b/src/main/resources/mapper/RoleMapper.xml index c176265..125c3be 100644 --- a/src/main/resources/mapper/RoleMapper.xml +++ b/src/main/resources/mapper/RoleMapper.xml @@ -37,7 +37,7 @@ SELECT id,role_name FROM role - + AND market IN #{market} @@ -91,7 +91,7 @@ r.market LIKE CONCAT('%', #{market}, '%') - + AND r.market IN #{market} diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml index 11478d8..c288009 100644 --- a/src/main/resources/mapper/UserMapper.xml +++ b/src/main/resources/mapper/UserMapper.xml @@ -57,7 +57,7 @@ jwcode = #{jwcode} - + AND ( market LIKE CONCAT('%', #{market}, '%') From 0e5dfe0fc283a1d4c6fb33cd190b993ddc50b38d Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Thu, 31 Jul 2025 17:21:38 +0800 Subject: [PATCH 11/17] =?UTF-8?q?7=E6=9C=8831=E6=97=A5=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=85=85=E5=80=BC=E4=B8=8E=E4=B8=8E=E9=87=91=E5=B8=81=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanRechargeController.java | 15 +++++++++ .../example/demo/domain/vo/bean/BeanRecharge.java | 1 + .../demo/domain/vo/bean/BeanRechargeInfo.java | 2 ++ .../com/example/demo/domain/vo/bean/GoldBean.java | 24 ++++++++++++++ .../demo/service/bean/BeanRechargeService.java | 2 ++ .../serviceImpl/bean/BeanRechargeServiceImpl.java | 37 ++++++++++++++++++++++ .../resources/jindouMapper/BeanRechargeMapper2.xml | 19 ++++++----- 7 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/vo/bean/GoldBean.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index 715cc37..0a4d0db 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -4,6 +4,10 @@ import com.example.demo.Util.JWTUtil; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; +import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanRechargeService; import jakarta.servlet.http.HttpServletRequest; @@ -65,4 +69,15 @@ public class BeanRechargeController { } } + + //系统金豆统计 + @PostMapping("/statsSystemBean") + public Result statsSystemBean(@RequestBody BeanRechargeInfo beanRechargeInfo) { + try { + GoldBean goldBean = beanRechargeService.statsSystemBean(beanRechargeInfo); + return Result.success(goldBean); + } catch (Exception e) { + return Result.error("请检查数据的格式"); + } + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java index 02f4ab2..88a5709 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java @@ -22,5 +22,6 @@ public class BeanRecharge { private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 private String remark; //备注 + private Integer money; // 金额 private String adminName; // 管理员名称 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java index 58ae730..57ee8f5 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java @@ -28,6 +28,7 @@ public class BeanRechargeInfo { private String market; // 所属地区 private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 + private Integer money; // 金额 private Integer num; // 数量 private Double amount; // 金额 private String orderNo; // 订单号 @@ -35,6 +36,7 @@ public class BeanRechargeInfo { private String platform; // 充值平台 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date rechargeTime; // 充值时间 + private Integer time; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date startTime; // 开始时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") diff --git a/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java b/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java new file mode 100644 index 0000000..8c87de5 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java @@ -0,0 +1,24 @@ +package com.example.demo.domain.vo.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: gold-java + * @ClassName GoldBean + * @description: + * @author: Double + * @create: 2025−07-31 13:10 + * @Version 1.0 + **/ + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GoldBean { + private Integer freeBean; // 免费豆 + private Integer permanentBean; // 永久豆 + private Integer money; // 金额 + private Integer beanNum; // 豆数量 +} diff --git a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java index 3597c5e..e5f7ed2 100644 --- a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java @@ -2,6 +2,7 @@ package com.example.demo.service.bean; import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; import com.example.demo.domain.vo.coin.RefundUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.bean.BeanRecharge; @@ -22,4 +23,5 @@ public interface BeanRechargeService { PageInfo selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo); + GoldBean statsSystemBean(BeanRechargeInfo beanRechargeInfo); } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index 8bb36a0..f91726e 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -2,6 +2,9 @@ package com.example.demo.serviceImpl.bean; import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; +import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.bean.BeanRechargeMapper2; import com.example.demo.mapper.coin.BeanRechargeMapper1; @@ -90,6 +93,40 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { } } + //统计系统金豆记录 + @Override + public GoldBean statsSystemBean(BeanRechargeInfo beanRechargeInfo) { + GoldBean gold = new GoldBean(); + List beanRechargeInfos = beanRechargeMapper2.selectBySystem(beanRechargeInfo); + + // 初始化累加器 + int permanentGoldSum = 0; + int freeGoldSum = 0; + int moneySum = 0; + + // 遍历充值记录并累加金币 + for (BeanRechargeInfo info : beanRechargeInfos) { + // 累加永久金币 + if (info.getPermanentBean() != null) { + permanentGoldSum += info.getPermanentBean(); + } + // 累加免费金币 + if (info.getFreeBean() != null) { + freeGoldSum += info.getFreeBean(); + } + // 累加金额 + if (info.getMoney() != null) { + moneySum += info.getMoney(); + } + } + + // 将累加结果设置到Gold对象 + gold.setPermanentBean(permanentGoldSum); + gold.setFreeBean(freeGoldSum); + gold.setMoney(moneySum); + gold.setBeanNum(permanentGoldSum+freeGoldSum); + return gold; + } //系统充值明细 @Override diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper2.xml b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml index c24b04f..48b2fc6 100644 --- a/src/main/resources/jindouMapper/BeanRechargeMapper2.xml +++ b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml @@ -8,20 +8,21 @@ m.dept AS market, f.money_free AS freeBean, f.money_buy AS permanentBean, + f.money AS money, f.content AS remark, FROM_UNIXTIME(f.time) AS rechargeTime FROM fx_yaoqing_records f LEFT JOIN fx_member m ON f.uid = m.id - f.data = 0 - - - AND ( - - m.dept LIKE CONCAT('%', #{market}, '%') - - ) + + AND m.jwcode = #{jwcode} + + + AND m.dept = #{market} + + + AND FROM_UNIXTIME(f.time) BETWEEN #{startTime} AND #{endTime} @@ -37,7 +38,6 @@ f.time - @@ -50,7 +50,6 @@ DESC - f.time DESC From 7949151ab624232d8177e84dfce1587e4c05142f Mon Sep 17 00:00:00 2001 From: lijianlin Date: Thu, 31 Jul 2025 18:44:32 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=8E=E5=90=88=E8=AE=A1=E6=95=B0=EF=BC=8C?= =?UTF-8?q?BeanPage=E8=BD=AC=E7=A7=BB=E8=87=B3Page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 40 +++++-- .../controller/bean/BeanRechargeController.java | 3 +- .../demo/domain/vo/bean/BeanConsumeArticle.java | 41 ++++++++ .../com/example/demo/domain/vo/bean/BeanPage.java | 6 +- .../java/com/example/demo/domain/vo/coin/Page.java | 9 +- .../demo/mapper/bean/BeanConsumeMapper.java | 9 +- .../demo/service/bean/BeanConsumeService.java | 11 +- .../serviceImpl/bean/BeanConsumeServiceImpl.java | 24 +++-- .../resources/jindouMapper/BeanConsumeMapper.xml | 117 ++++++++++++++++++++- 9 files changed, 223 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index 66b0328..ccd838c 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -49,45 +49,63 @@ public class BeanConsumeController { //筛选查询直播消费记录 @PostMapping("/selectLiveBy") - public Result selectLiveBy(@RequestBody BeanPage beanPage){ + public Result selectLiveBy(@RequestBody Page page){ try { - if (ObjectUtils.isEmpty(beanPage.getPageNum())) { + if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); } - if (ObjectUtils.isEmpty(beanPage.getPageSize())) { + if (ObjectUtils.isEmpty(page.getPageSize())) { return Result.error("页大小为空!"); } else { - return Result.success(beanConsumeService.selectLiveBy(beanPage.getPageNum(), beanPage.getPageSize(), beanPage.getBeanConsumeLive())); + return Result.success(beanConsumeService.selectLiveBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeLive())); } } catch (Exception e) { e.printStackTrace(); + //返回堆栈信息 return Result.error(e.toString()); }} - //筛选查询直播消费记录 + //筛选查询铁粉消费记录 @PostMapping("/selectFanBy") - public Result selectFanBy(@RequestBody BeanPage beanPage){ + public Result selectFanBy(@RequestBody Page page){ try { - if (ObjectUtils.isEmpty(beanPage.getPageNum())) { + if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); } - if (ObjectUtils.isEmpty(beanPage.getPageSize())) { + if (ObjectUtils.isEmpty(page.getPageSize())) { return Result.error("页大小为空!"); } else { - return Result.success(beanConsumeService.selectFanBy(beanPage.getPageNum(), beanPage.getPageSize(), beanPage.getBeanConsumeFan())); + return Result.success(beanConsumeService.selectFanBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeFan())); } } catch (Exception e) { e.printStackTrace(); return Result.error(e.toString()); }} + //筛选查询文章消费记录 + @PostMapping("/selectArticleBy") + public Result selectArticleBy(@RequestBody Page page){ + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + + return Result.success(beanConsumeService.selectArticleBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeArticle())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.toString()); + }} //消费合计数 @PostMapping("sumConsumeGold") - public BeanConsumeGold sumConsumeGold(@RequestBody BeanPage beanPage) { + public BeanConsumeGold sumConsumeGold(@RequestBody Page page) { - return beanConsumeService.sumConsumeGold( beanPage); + return beanConsumeService.sumConsumeGold( page); } //查询所有直播礼物 @PostMapping("/getLiveGift") diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index 715cc37..57ca90f 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -4,6 +4,7 @@ import com.example.demo.Util.JWTUtil; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanRechargeService; import jakarta.servlet.http.HttpServletRequest; @@ -49,7 +50,7 @@ public class BeanRechargeController { //系统充值 @PostMapping("/selectBySystem") - public Result selectBySystem(@RequestBody BeanPage page) { + public Result selectBySystem(@RequestBody Page page) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java new file mode 100644 index 0000000..01a33d1 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java @@ -0,0 +1,41 @@ +package com.example.demo.domain.vo.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @program: gold-java + * @ClassName BeanConsumeArticle + * @description: + * @author: Ethan + * @create: 2025−07-31 17:05 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class BeanConsumeArticle { + private static final long serialVersionUID = 1L; + private String name; //姓名 + private Integer jwcode; //精网号 + private String dept; //地区/分部 + private String type; //类型source_type 9、10打赏,11付费 + private Integer payMode; // 0 打赏 1 付费 2 其他 + private String beanNum; //金豆数量 + private Integer articleId; //文章/视频ID + private String articleName; //文章/视频标题(source_name) + private String author; //作者 + private String payType; //支付类型 1-5:直播 7铁粉 8文章 + private String sortField; //排序字段 + private String sortOrder; //排序顺序 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date consumeTime; // 付费时间 (时间戳转化) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date startTime; // 开始时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date endTime; // 结束时间 +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java index b04fcde..b747967 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java @@ -19,9 +19,5 @@ public class BeanPage { private String token; private Integer pageNum; //页码 private Integer pageSize; //每页大小 - private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) - private BeanConsumeLive beanConsumeLive; //直播金豆消费 - private BeanConsumeFan beanConsumeFan; //铁粉金豆消费 - private BeanRechargeInfo beanRechargeInfo; //金豆充值信息 - private BeanConsumeGold beanConsumeGold; //金豆消费合计数 + } diff --git a/src/main/java/com/example/demo/domain/vo/coin/Page.java b/src/main/java/com/example/demo/domain/vo/coin/Page.java index a77fa89..dc476be 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/Page.java +++ b/src/main/java/com/example/demo/domain/vo/coin/Page.java @@ -1,7 +1,7 @@ package com.example.demo.domain.vo.coin; import com.example.demo.domain.entity.User; -import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.bean.*; import lombok.Data; import lombok.NoArgsConstructor; @@ -30,5 +30,10 @@ public class Page { private RefundAudit refundAudit; private RechargeUser rechargeUser; private RoleVo roleVo; - + private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + private BeanConsumeLive beanConsumeLive; //直播金豆消费 + private BeanConsumeFan beanConsumeFan; //铁粉金豆消费 + private BeanConsumeArticle beanConsumeArticle; //文章金豆消费 + private BeanRechargeInfo beanRechargeInfo; //金豆充值信息 + private BeanConsumeGold beanConsumeGold; //金豆消费合计数 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java index 91b4279..701e48e 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java @@ -1,9 +1,6 @@ package com.example.demo.mapper.bean; -import com.example.demo.domain.vo.bean.BeanConsumeFan; -import com.example.demo.domain.vo.bean.BeanConsumeGold; -import com.example.demo.domain.vo.bean.BeanConsumeLive; -import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.coin.RechargeAudit; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,10 +23,14 @@ public interface BeanConsumeMapper { List selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); //筛选查询铁粉消费 List selectFanBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); + //筛选查询文章消费 + List selectArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle); //查询金豆直播消费金额 BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); //查询金豆铁粉消费金额 BeanConsumeGold selectSumFansBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); + //查询金豆文章消费金额 + BeanConsumeGold selectSumArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle); //查询直播礼物 List getLiveGift(); //查询直播全部频道 diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java index 993a471..4982d03 100644 --- a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -1,10 +1,8 @@ package com.example.demo.service.bean; -import com.example.demo.domain.vo.bean.BeanConsumeFan; -import com.example.demo.domain.vo.bean.BeanConsumeGold; -import com.example.demo.domain.vo.bean.BeanConsumeLive; -import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.Page; import java.util.List; @@ -24,11 +22,14 @@ public interface BeanConsumeService { Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive); //筛选查询铁粉消费 Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan); + //筛选查询文章消费 + Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle); //消费金币合计数 - BeanConsumeGold sumConsumeGold(BeanPage beanPage); + BeanConsumeGold sumConsumeGold(Page page); //查询直播礼物 List getLiveGift(); //获取直播频道 List getLiveChannel(); + } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index 2dc1233..8bcc656 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -1,10 +1,8 @@ package com.example.demo.serviceImpl.bean; -import com.example.demo.domain.vo.bean.BeanConsumeFan; -import com.example.demo.domain.vo.bean.BeanConsumeGold; -import com.example.demo.domain.vo.bean.BeanConsumeLive; -import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.coin.Gold; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.RechargeAudit; import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.mapper.bean.BeanConsumeMapper; @@ -49,17 +47,27 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { List beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan); return new PageInfo<>(beanConsumeFans); } + //筛选查询文章消费 + @Override + public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) { + PageHelper.startPage(pageNum, pageSize); + List beanConsumeArticles = BeanConsumeMapper.selectArticleBy(beanConsumeArticle); + return new PageInfo<>(beanConsumeArticles); + } @Override - public BeanConsumeGold sumConsumeGold(BeanPage beanPage) { + public BeanConsumeGold sumConsumeGold(Page page) { BeanConsumeGold gold = new BeanConsumeGold(); - Integer payType = beanPage.getPayType(); + Integer payType = page.getPayType(); if (payType==1) { //直播消费合计 - gold = BeanConsumeMapper.selectSumLiveBy(beanPage.getBeanConsumeLive()); + gold = BeanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive()); }else if (payType==7) { //充值消费合计 - gold = BeanConsumeMapper.selectSumFansBy(beanPage.getBeanConsumeFan()); + gold = BeanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan()); + }else if (payType==8) { + //文章消费合计 + gold = BeanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle()); } return gold; diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml index c0f17f2..ce304e5 100644 --- a/src/main/resources/jindouMapper/BeanConsumeMapper.xml +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -122,6 +122,7 @@ ) AS t + + + + + + + SELECT g.id AS id, + g.jwcode AS jwcode, + m.name AS name, + m.deptName AS market, + g.order_no AS orderNo, + g.count AS num, + g.price AS money, + g.platform AS platform, + FROM_UNIXTIME(g.add_time) AS rechargeTime + FROM g_order g + LEFT JOIN member_info m ON g.jwcode = m.jwcode + + g.type = "gold" AND g.state = 1 + + AND g.jwcode = #{jwcode} + + + AND m.deptName = #{market} + + + AND g.order_no = #{orderNo} + + + AND g.platform = #{platform} + + + AND FROM_UNIXTIME(g.add_time) BETWEEN #{startTime} AND #{endTime} + + + + + + + + + g.count + g.price + + g.add_time + + g.add_time + + + + + ASC + DESC + DESC + + + + DESC + + + + + g.add_time DESC + + + + + \ No newline at end of file From 92ce83c7683fd95699632a3f3c1dad75f57a4cd6 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Thu, 31 Jul 2025 20:25:46 +0800 Subject: [PATCH 14/17] =?UTF-8?q?7=E6=9C=8831=E6=97=A5=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/controller/bean/BeanRechargeController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index bd5367a..f173799 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -4,6 +4,9 @@ import com.example.demo.Util.JWTUtil; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanPage; +import com.example.demo.domain.vo.bean.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanRechargeService; import jakarta.servlet.http.HttpServletRequest; @@ -79,7 +82,7 @@ public class BeanRechargeController { //线上充值 @PostMapping("/selectByOnline") - public Result selectByOnline(@RequestBody BeanPage page) { + public Result selectByOnline(@RequestBody Page page) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); From c39565c4096d86bb06e5d276f1b47c48394830aa Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Fri, 1 Aug 2025 10:50:26 +0800 Subject: [PATCH 15/17] =?UTF-8?q?8=E6=9C=881=E6=97=A5=E5=85=85=E5=80=BC?= =?UTF-8?q?=E5=9C=B0=E5=8C=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanRechargeController.java | 15 +++++++++++++ .../demo/mapper/bean/BeanRechargeMapper2.java | 1 + .../demo/mapper/pay/BeanRechargeMapper3.java | 1 + .../demo/service/bean/BeanRechargeService.java | 8 +++++++ .../serviceImpl/bean/BeanRechargeServiceImpl.java | 26 ++++++++++++++++++++++ .../resources/jindouMapper/BeanRechargeMapper2.xml | 4 ++++ .../resources/paymapper/BeanRechargeMapper3.xml | 4 ++++ 7 files changed, 59 insertions(+) diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index f173799..287a8b2 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -79,6 +79,13 @@ public class BeanRechargeController { return Result.error("请检查数据的格式"); } } + //获取系统充值地区 + @PostMapping("/systemMarket") + public Result systemMarket() + { + List list = beanRechargeService.systemMarket(); + return Result.success(list); + } //线上充值 @PostMapping("/selectByOnline") @@ -109,4 +116,12 @@ public class BeanRechargeController { return Result.error("请检查数据的格式"); } } + + //获取线上充值地区 + @PostMapping("/onlineMarket") + public Result onlineMarket() + { + List list = beanRechargeService.onlineMarket(); + return Result.success(list); + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java index 427a270..f61556e 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java @@ -20,4 +20,5 @@ public interface BeanRechargeMapper2 { List selectBySystem(BeanRechargeInfo beanRechargeInfo); + List systemMarket(); } \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java b/src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java index b43fb4a..8f32789 100644 --- a/src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java +++ b/src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java @@ -20,4 +20,5 @@ public interface BeanRechargeMapper3 { List selectByOnline(BeanRechargeInfo beanRechargeInfo); + List systemMarket(); } \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java index e3e3941..fd41a35 100644 --- a/src/main/java/com/example/demo/service/bean/BeanRechargeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanRechargeService.java @@ -8,6 +8,8 @@ import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.bean.BeanRecharge; import com.github.pagehelper.PageInfo; +import java.util.List; + /** * @program: gold-java * @ClassName BeanRechargeService @@ -33,4 +35,10 @@ public interface BeanRechargeService { //线上金豆统计 GoldBean statsOnlineBean(BeanRechargeInfo beanRechargeInfo); + + //获取系统充值地区 + List systemMarket(); + + //获取线上充值地区 + List onlineMarket(); } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java index d000fa3..5b31ab8 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java @@ -20,7 +20,9 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; /** * @program: gold-java @@ -146,6 +148,17 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { return gold; } + @Override + public List systemMarket() { + List list = beanRechargeMapper2.systemMarket(); + // 使用 Java 8 的 Stream API 过滤 null 和空字符串 + List filteredList = list.stream() + .filter(Objects::nonNull) // 过滤掉 null 值 + .filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串 + .collect(Collectors.toList()); + return filteredList; + } + //线上充值明细 @Override public PageInfo selectByOnline(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo){ @@ -182,4 +195,17 @@ public class BeanRechargeServiceImpl implements BeanRechargeService { return gold; } + + + @Override + public List onlineMarket() { + List list = beanRechargeMapper3.systemMarket(); + // 使用 Java 8 的 Stream API 过滤 null 和空字符串 + List filteredList = list.stream() + .filter(Objects::nonNull) // 过滤掉 null 值 + .filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串 + .collect(Collectors.toList()); + return filteredList; + } + } \ No newline at end of file diff --git a/src/main/resources/jindouMapper/BeanRechargeMapper2.xml b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml index 48b2fc6..14ab855 100644 --- a/src/main/resources/jindouMapper/BeanRechargeMapper2.xml +++ b/src/main/resources/jindouMapper/BeanRechargeMapper2.xml @@ -57,4 +57,8 @@ + + \ No newline at end of file diff --git a/src/main/resources/paymapper/BeanRechargeMapper3.xml b/src/main/resources/paymapper/BeanRechargeMapper3.xml index 645003c..1078b2b 100644 --- a/src/main/resources/paymapper/BeanRechargeMapper3.xml +++ b/src/main/resources/paymapper/BeanRechargeMapper3.xml @@ -63,4 +63,8 @@ + + \ No newline at end of file From 6ec8e59080722012a7411b0b72b3ed599239bfe4 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Fri, 1 Aug 2025 11:50:11 +0800 Subject: [PATCH 16/17] =?UTF-8?q?7.30=E5=9C=B0=E5=8C=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A5=E5=8F=8A=E5=AF=BC=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/Export/ExportService.java | 7 +- .../com/example/demo/Export/ExportServiceImpl.java | 25 ++++++- .../demo/config/Mysql3DataSourceConfig.java | 2 +- .../demo/controller/coin/ExportController.java | 18 +++++ .../java/com/example/demo/domain/DTO/LiveDTO.java | 37 ++++++++++ .../demo/service/coin/ExportExcelService.java | 2 + .../service/listen/AiEmotionExportListener.java | 84 ---------------------- .../demo/service/listen/BaseMessageListener.java | 3 +- .../demo/service/listen/ConsumeListener.java | 42 ++--------- .../demo/service/listen/GoldDetailListener.java | 50 +++++++++++++ .../example/demo/service/listen/GoldListener.java | 43 ++--------- .../example/demo/service/listen/LiveListener.java | 38 ++++++++++ .../demo/service/listen/RechargeListener.java | 68 +++--------------- .../demo/service/listen/RefundListener.java | 44 ++---------- .../serviceImpl/coin/ExportExcelServiceImpl.java | 19 +++++ src/main/resources/application-dev.yml | 2 +- src/main/resources/application-test.yml | 8 +-- src/main/resources/application.yml | 8 +-- 18 files changed, 225 insertions(+), 275 deletions(-) create mode 100644 src/main/java/com/example/demo/domain/DTO/LiveDTO.java delete mode 100644 src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java create mode 100644 src/main/java/com/example/demo/service/listen/GoldDetailListener.java create mode 100644 src/main/java/com/example/demo/service/listen/LiveListener.java diff --git a/src/main/java/com/example/demo/Export/ExportService.java b/src/main/java/com/example/demo/Export/ExportService.java index 6598c9b..6fc145c 100644 --- a/src/main/java/com/example/demo/Export/ExportService.java +++ b/src/main/java/com/example/demo/Export/ExportService.java @@ -1,9 +1,6 @@ package com.example.demo.Export; -import com.example.demo.domain.DTO.ConsumeDTO; -import com.example.demo.domain.DTO.GoldDetailDTO; -import com.example.demo.domain.DTO.RechargeDTO; -import com.example.demo.domain.DTO.RefundDTO; +import com.example.demo.domain.DTO.*; import com.example.demo.domain.vo.coin.Result; /** @@ -21,5 +18,7 @@ public interface ExportService { Result addExportRefund(RefundDTO dto); //消费导出 Result addExportConsume(ConsumeDTO dto); + //金豆直播导出 + Result addExportLive(LiveDTO dto); } diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index 4d14a12..b89460b 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -2,6 +2,7 @@ package com.example.demo.Export; import com.example.demo.Util.JWTUtil; import com.example.demo.domain.DTO.ConsumeDTO; +import com.example.demo.domain.DTO.LiveDTO; import com.example.demo.domain.DTO.RechargeDTO; import com.example.demo.domain.DTO.RefundDTO; import com.example.demo.domain.entity.Admin; @@ -46,7 +47,7 @@ public class ExportServiceImpl implements ExportService { * @param dto 数据传输对象 (RechargeDTO, RefundDTO, ConsumeDTO) * @param exportType 导出类型 ("充值明细", "退款明细", "消耗明细") * @param queueName Redis 队列名称 - * @param requestData 请求数据字段名 ("rechargeUser", "refundUser", "consumeUser") + * @param requestData 请求数据字段名 ("rechargeUser", "refundUser", "consumeUser","liveUser") * @return Result */ private Result addExport(Object dto, String exportType, String queueName, String requestData) { @@ -101,6 +102,11 @@ public class ExportServiceImpl implements ExportService { consumeDTO.setUrl(""); consumeDTO.setFileName(generateFileName("消耗明细", adminName)); consumeDTO.setDataNum(0); + } else if (dto instanceof LiveDTO liveDTO) { + liveDTO.setAccount(Integer.valueOf(account)); + liveDTO.setUrl(""); + liveDTO.setFileName(generateFileName("直播明细", adminName)); + liveDTO.setDataNum(0); } } @@ -138,6 +144,16 @@ public class ExportServiceImpl implements ExportService { consumeDTO.getFileName(), consumeDTO.getDataNum() ); + } else if(dto instanceof LiveDTO liveDTO){ + goldDetailMapper.insertExportRecord( + idHolder, + account, + liveDTO.getType(), + liveDTO.getState(), + liveDTO.getUrl(), + liveDTO.getFileName(), + liveDTO.getDataNum() + ); } } @@ -156,6 +172,8 @@ public class ExportServiceImpl implements ExportService { requestData.put(requestDataKey, refundDTO.getRefundUser()); } else if (dto instanceof ConsumeDTO consumeDTO) { requestData.put(requestDataKey, consumeDTO.getConsumeUser()); + } else if(dto instanceof LiveDTO liveDTO){ + requestData.put(requestDataKey, liveDTO.getBeanConsumeLive()); } exportData.put("requestData", requestData); @@ -186,4 +204,9 @@ public class ExportServiceImpl implements ExportService { public Result addExportConsume(ConsumeDTO dto) { return addExport(dto, "消耗明细", "consume:queue:export_queue", "consumeUser"); } + + @Override + public Result addExportLive(LiveDTO dto) { + return addExport(dto, "直播明细", "live:queue:export_queue", "beanConsumeLive"); + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java index e03cc15..d04f212 100644 --- a/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java +++ b/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java @@ -29,7 +29,7 @@ public class Mysql3DataSourceConfig { @Qualifier("globalConfiguration3") org.apache.ibatis.session.Configuration globalConfiguration3) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); - sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:payMapper/*.xml")); + sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:paymapper/*.xml")); sessionFactory.setConfiguration(globalConfiguration3); return sessionFactory.getObject(); } diff --git a/src/main/java/com/example/demo/controller/coin/ExportController.java b/src/main/java/com/example/demo/controller/coin/ExportController.java index 17c8462..fdb397c 100644 --- a/src/main/java/com/example/demo/controller/coin/ExportController.java +++ b/src/main/java/com/example/demo/controller/coin/ExportController.java @@ -4,6 +4,7 @@ import com.example.demo.Util.BusinessException; import com.example.demo.Util.JWTUtil; import com.example.demo.Util.RedisLockUtil; import com.example.demo.domain.DTO.ConsumeDTO; +import com.example.demo.domain.DTO.LiveDTO; import com.example.demo.domain.DTO.RechargeDTO; import com.example.demo.domain.DTO.RefundDTO; import com.example.demo.domain.entity.Admin; @@ -100,4 +101,21 @@ public class ExportController { redisLockUtil.unlock(lockKey, requestId); } } + @PostMapping("/exportLive") + public Result export(@Valid @RequestBody LiveDTO dto) { + String lockKey = "export:lock:" + dto.getToken(); + String requestId = UUID.randomUUID().toString(); + long expireTime = 5000; + try { + // 尝试获取锁 + if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { + throw new BusinessException("操作太频繁,请稍后重试"); + } + // 执行业务逻辑 + return exportService.addExportLive(dto); + } finally { + // 释放锁 + redisLockUtil.unlock(lockKey, requestId); + } + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/DTO/LiveDTO.java b/src/main/java/com/example/demo/domain/DTO/LiveDTO.java new file mode 100644 index 0000000..180aded --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/LiveDTO.java @@ -0,0 +1,37 @@ +package com.example.demo.domain.DTO; + +import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.coin.ConsumeUser; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: GOLD + * @ClassName LiveDTO + * @description: + * @author: huangqizhen + * @create: 2025−07-31 17:28 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +public class LiveDTO { + private String token; + private String url = ""; + private String fileName = ""; + private Integer sort = 0; + private String field = ""; + private Integer account; + private Integer type = 6; //类型 + private Integer state = 0; //状态 + private String text = ""; //关键词搜索 + private Integer dataNum = 0; + private String deptid = ""; + + @NotNull(message = "page不能为空") + private Integer page = 1; + @NotNull(message = "pageSize不能为空") + private Integer pageSize = 20; + private BeanConsumeLive beanConsumeLive; +} diff --git a/src/main/java/com/example/demo/service/coin/ExportExcelService.java b/src/main/java/com/example/demo/service/coin/ExportExcelService.java index 7e7ada1..583c880 100644 --- a/src/main/java/com/example/demo/service/coin/ExportExcelService.java +++ b/src/main/java/com/example/demo/service/coin/ExportExcelService.java @@ -22,6 +22,8 @@ public interface ExportExcelService { Exception rechargeExcel(String message) throws Exception; Exception consumeExcel(String message) throws Exception; Exception refundExcel(String message) throws Exception; + + Exception LiveExcel(String message) throws Exception; List getExcel(Export export); @Transactional diff --git a/src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java b/src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java deleted file mode 100644 index 2fe592c..0000000 --- a/src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.example.demo.service.listen; - -import cn.hutool.core.util.StrUtil; - - -import com.example.demo.Util.ExecutionContextUtil; -import com.example.demo.Util.FeiShuAlertUtil; -import com.example.demo.Util.RedisUtil; -import com.example.demo.domain.vo.coin.ExecutionContext; -import com.example.demo.service.coin.ExportExcelService; -import com.example.demo.service.queue.AbstractMessageListener; - - - - - - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import static java.lang.Thread.sleep; - - -@Component -public class AiEmotionExportListener extends AbstractMessageListener { - - - //注入ExportExcelService - @Autowired - private ExportExcelService exportExcelService; - - @Autowired - public AiEmotionExportListener( - RedisUtil redisQueueUtil - - ) { - super(redisQueueUtil, "hwgold:queue:export_queue"); - System.out.println("监听器已启动,队列: "); - } - - @Override - protected void handleMessage(String message) { - if (StrUtil.isBlank(message)) { - System.err.println("redis消息队列数据为空" + message); - } - try { - Thread.sleep(5000); - exportExcelService.handleExcelExportData(message); - } catch (Exception e) { - logError(e, message); - throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e); - } - - - } - - private void logError(Exception e, String message) { - System.err.println("Export data listener exception: " + e.getMessage()); - e.printStackTrace(); - try { - ExecutionContext context = ExecutionContextUtil.getExecutionContext(); - String cause = ""; - if (e.getCause() != null) { - cause = e.getCause().getMessage(); - } - FeiShuAlertUtil.sendAlertMessage( - context, - e.getStackTrace()[0].getFileName(), - e.getStackTrace()[0].getLineNumber(), - "HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause , - "Failed message: " + message - ); - } catch (Exception alertEx) { - System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); - } - } - - @Override - protected void handleError(Exception e, String message) { - System.err.println("处理消息失败: " + message); - e.printStackTrace(); - } - -} diff --git a/src/main/java/com/example/demo/service/listen/BaseMessageListener.java b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java index b3f3d9f..5244884 100644 --- a/src/main/java/com/example/demo/service/listen/BaseMessageListener.java +++ b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java @@ -63,4 +63,5 @@ public abstract class BaseMessageListener extends AbstractMessageListener System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); } } -} \ No newline at end of file + +} diff --git a/src/main/java/com/example/demo/service/listen/ConsumeListener.java b/src/main/java/com/example/demo/service/listen/ConsumeListener.java index bcf76b1..0c70347 100644 --- a/src/main/java/com/example/demo/service/listen/ConsumeListener.java +++ b/src/main/java/com/example/demo/service/listen/ConsumeListener.java @@ -19,62 +19,28 @@ import org.springframework.stereotype.Component; * @Version 1.0 **/ @Component -public class ConsumeListener extends AbstractMessageListener { +public class ConsumeListener extends BaseMessageListener { //注入ExportExcelService @Autowired private ExportExcelService exportService; @Autowired - public ConsumeListener( - RedisUtil redisQueueUtil - - ) { + public ConsumeListener(RedisUtil redisQueueUtil) { super(redisQueueUtil, "consume:queue:export_queue"); - System.out.println("监听器已启动,队列: "); } @Override protected void handleMessage(String message) { - if (StrUtil.isBlank(message)) { - System.err.println("redis消息队列数据为空" + message); - } + validateMessage( message); try { Thread.sleep(5000); exportService.consumeExcel(message); } catch (Exception e) { - logError(e, message); - throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e); + handleException(e, message); } } - private void logError(Exception e, String message) { - System.err.println("Export data listener exception: " + e.getMessage()); - e.printStackTrace(); - try { - ExecutionContext context = ExecutionContextUtil.getExecutionContext(); - String cause = ""; - if (e.getCause() != null) { - cause = e.getCause().getMessage(); - } - FeiShuAlertUtil.sendAlertMessage( - context, - e.getStackTrace()[0].getFileName(), - e.getStackTrace()[0].getLineNumber(), - "HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause , - "Failed message: " + message - ); - } catch (Exception alertEx) { - System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); - } - } - - @Override - protected void handleError(Exception e, String message) { - System.err.println("处理消息失败: " + message); - e.printStackTrace(); - } - } diff --git a/src/main/java/com/example/demo/service/listen/GoldDetailListener.java b/src/main/java/com/example/demo/service/listen/GoldDetailListener.java new file mode 100644 index 0000000..fd9662e --- /dev/null +++ b/src/main/java/com/example/demo/service/listen/GoldDetailListener.java @@ -0,0 +1,50 @@ +package com.example.demo.service.listen; + +import cn.hutool.core.util.StrUtil; + + +import com.example.demo.Util.ExecutionContextUtil; +import com.example.demo.Util.FeiShuAlertUtil; +import com.example.demo.Util.RedisUtil; +import com.example.demo.domain.vo.coin.ExecutionContext; +import com.example.demo.service.coin.ExportExcelService; +import com.example.demo.service.queue.AbstractMessageListener; + + + + + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import static java.lang.Thread.sleep; + + +@Component +public class GoldDetailListener extends BaseMessageListener { + + + //注入ExportExcelService + @Autowired + private ExportExcelService exportExcelService; + + @Autowired + public GoldDetailListener(RedisUtil redisQueueUtil) { + super(redisQueueUtil, "hwgold:queue:export_queue"); + } + + @Override + protected void handleMessage(String message) { + validateMessage( message); + try { + Thread.sleep(5000); + exportExcelService.handleExcelExportData(message); + } catch (Exception e) { + handleException(e, message); + } + + + } + +} diff --git a/src/main/java/com/example/demo/service/listen/GoldListener.java b/src/main/java/com/example/demo/service/listen/GoldListener.java index e454fa2..edf7b8b 100644 --- a/src/main/java/com/example/demo/service/listen/GoldListener.java +++ b/src/main/java/com/example/demo/service/listen/GoldListener.java @@ -20,62 +20,27 @@ import org.springframework.stereotype.Component; * @Version 1.0 **/ @Component -public class GoldListener extends AbstractMessageListener { +public class GoldListener extends BaseMessageListener { //注入ExportExcelService @Autowired private ExportExcelService exportExcelService; @Autowired - public GoldListener( - RedisUtil redisQueueUtil - - ) { + public GoldListener(RedisUtil redisQueueUtil) { super(redisQueueUtil, "gold:queue:export_queue"); - System.out.println("监听器已启动,队列: "); } @Override protected void handleMessage(String message) { - if (StrUtil.isBlank(message)) { - System.err.println("redis消息队列数据为空" + message); - } + validateMessage( message); try { Thread.sleep(5000); exportExcelService.handleExcel(message); } catch (Exception e) { - logError(e, message); - throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e); + handleException(e, message); } - } - private void logError(Exception e, String message) { - System.err.println("Export data listener exception: " + e.getMessage()); - e.printStackTrace(); - try { - ExecutionContext context = ExecutionContextUtil.getExecutionContext(); - String cause = ""; - if (e.getCause() != null) { - cause = e.getCause().getMessage(); - } - FeiShuAlertUtil.sendAlertMessage( - context, - e.getStackTrace()[0].getFileName(), - e.getStackTrace()[0].getLineNumber(), - "HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause , - "Failed message: " + message - ); - } catch (Exception alertEx) { - System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); - } } - @Override - protected void handleError(Exception e, String message) { - System.err.println("处理消息失败: " + message); - e.printStackTrace(); - } - -} - diff --git a/src/main/java/com/example/demo/service/listen/LiveListener.java b/src/main/java/com/example/demo/service/listen/LiveListener.java new file mode 100644 index 0000000..bf9f863 --- /dev/null +++ b/src/main/java/com/example/demo/service/listen/LiveListener.java @@ -0,0 +1,38 @@ +package com.example.demo.service.listen; + +import com.example.demo.Util.RedisUtil; +import com.example.demo.service.coin.ExportExcelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @program: GOLD + * @ClassName LiveListener + * @description: + * @author: huangqizhen + * @create: 2025−07-31 17:53 + * @Version 1.0 + **/ +@Component +public class LiveListener extends BaseMessageListener{ + + @Autowired + private ExportExcelService exportExcelService; + + @Autowired + public LiveListener(RedisUtil redisQueueUtil) { + super(redisQueueUtil, "live:queue:export_queue"); + } + + @Override + protected void handleMessage(String message) { + validateMessage( message); + try { + Thread.sleep(5000); + exportExcelService.LiveExcel(message); + } catch (Exception e) { + handleException(e, message); + } + } + + } diff --git a/src/main/java/com/example/demo/service/listen/RechargeListener.java b/src/main/java/com/example/demo/service/listen/RechargeListener.java index 79f961f..e0dfb1d 100644 --- a/src/main/java/com/example/demo/service/listen/RechargeListener.java +++ b/src/main/java/com/example/demo/service/listen/RechargeListener.java @@ -1,80 +1,32 @@ package com.example.demo.service.listen; -import cn.hutool.core.util.StrUtil; -import com.example.demo.Util.ExecutionContextUtil; -import com.example.demo.Util.FeiShuAlertUtil; import com.example.demo.Util.RedisUtil; -import com.example.demo.domain.vo.coin.ExecutionContext; import com.example.demo.service.coin.ExportExcelService; -import com.example.demo.service.queue.AbstractMessageListener; +import com.example.demo.service.listen.BaseMessageListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -/** - * @program: GOLD - * @ClassName RechargeListener - * @description: - * @author: huangqizhen - * @create: 2025−07-01 15:46 - * @Version 1.0 - **/ +import static org.ehcache.core.exceptions.StorePassThroughException.handleException; + @Component -public class RechargeListener extends AbstractMessageListener { - //注入ExportExcelService +public class RechargeListener extends BaseMessageListener { + @Autowired private ExportExcelService exportService; @Autowired - public RechargeListener( - RedisUtil redisQueueUtil - - ) { + public RechargeListener(RedisUtil redisQueueUtil) { super(redisQueueUtil, "recharge:queue:export_queue"); - System.out.println("监听器已启动,队列: "); } @Override protected void handleMessage(String message) { - if (StrUtil.isBlank(message)) { - System.err.println("redis消息队列数据为空" + message); - } + validateMessage(message); // 验证消息 try { - Thread.sleep(5000); + Thread.sleep(5000); // 模拟延迟处理 exportService.rechargeExcel(message); } catch (Exception e) { - logError(e, message); - throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e); + handleException(e, message); // 统一异常处理 } - - } - - private void logError(Exception e, String message) { - System.err.println("Export data listener exception: " + e.getMessage()); - e.printStackTrace(); - try { - ExecutionContext context = ExecutionContextUtil.getExecutionContext(); - String cause = ""; - if (e.getCause() != null) { - cause = e.getCause().getMessage(); - } - FeiShuAlertUtil.sendAlertMessage( - context, - e.getStackTrace()[0].getFileName(), - e.getStackTrace()[0].getLineNumber(), - "HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause , - "Failed message: " + message - ); - } catch (Exception alertEx) { - System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); - } - } - - @Override - protected void handleError(Exception e, String message) { - System.err.println("处理消息失败: " + message); - e.printStackTrace(); - } - -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/listen/RefundListener.java b/src/main/java/com/example/demo/service/listen/RefundListener.java index 791ab30..fc48600 100644 --- a/src/main/java/com/example/demo/service/listen/RefundListener.java +++ b/src/main/java/com/example/demo/service/listen/RefundListener.java @@ -19,62 +19,26 @@ import org.springframework.stereotype.Component; * @Version 1.0 **/ @Component -public class RefundListener extends AbstractMessageListener { +public class RefundListener extends BaseMessageListener { //注入ExportExcelService @Autowired private ExportExcelService exportExcelService; @Autowired - public RefundListener( - RedisUtil redisQueueUtil - - ) { + public RefundListener(RedisUtil redisQueueUtil) { super(redisQueueUtil, "refund:queue:export_queue"); - System.out.println("监听器已启动,队列: "); } @Override protected void handleMessage(String message) { - if (StrUtil.isBlank(message)) { - System.err.println("redis消息队列数据为空" + message); - } + validateMessage( message); try { Thread.sleep(5000); exportExcelService.refundExcel(message); } catch (Exception e) { - logError(e, message); - throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e); + handleException(e, message); } } - - private void logError(Exception e, String message) { - System.err.println("Export data listener exception: " + e.getMessage()); - e.printStackTrace(); - try { - ExecutionContext context = ExecutionContextUtil.getExecutionContext(); - String cause = ""; - if (e.getCause() != null) { - cause = e.getCause().getMessage(); - } - FeiShuAlertUtil.sendAlertMessage( - context, - e.getStackTrace()[0].getFileName(), - e.getStackTrace()[0].getLineNumber(), - "HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause , - "Failed message: " + message - ); - } catch (Exception alertEx) { - System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); - } - } - - @Override - protected void handleError(Exception e, String message) { - System.err.println("处理消息失败: " + message); - e.printStackTrace(); - } - } - diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index 3f17182..06233fe 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.example.demo.Util.ExcelUploadUtil; import com.example.demo.Util.JWTUtil; +import com.example.demo.controller.bean.BeanConsumeController; import com.example.demo.controller.coin.ConsumeController; import com.example.demo.controller.coin.GoldDetailController; import com.example.demo.controller.coin.RechargeController; @@ -14,6 +15,8 @@ import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Export; import com.example.demo.domain.entity.User; import com.example.demo.domain.export.Goldmingxi; +import com.example.demo.domain.vo.bean.BeanConsumeLive; +import com.example.demo.domain.vo.bean.BeanPage; import com.example.demo.domain.vo.coin.*; import com.example.demo.mapper.coin.ExportMapper; @@ -66,6 +69,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { @Autowired private ConsumeController consumeController; @Autowired + private BeanConsumeController beanConsumeController; + @Autowired private AuthenticationManager authenticationManager; // 每页查询的数据量 private static final int PAGE_SIZE = 1000; @@ -134,6 +139,17 @@ public class ExportExcelServiceImpl implements ExportExcelService { } @Override + public Exception LiveExcel(String message) throws Exception { + return exportExcelGeneric(message, "liveUser", page -> { + try { + return beanConsumeController.selectLiveBy(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + + @Override public List getExcel(Export export) { List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); System.out.println(list+"-------------------------------"); @@ -141,6 +157,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } + /** * 验证导出记录 */ @@ -331,6 +348,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { return ConsumeUser.class; case "refundUser": return RefundUser.class; + case "liveUser": + return BeanConsumeLive.class; default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 9e0b8a1..041d0b5 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -53,7 +53,7 @@ feishu: url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877 server: - port: 8081 + port: 10704 logging: level: diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 612d4bd..482564f 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -35,9 +35,9 @@ spring: data: redis: database: 1 - host: 18.143.76.3 - port: 10703 - password: Ngc0FYUTA6h3wC5J + host: localhost + port: 6379 + password: 123456 lettuce: pool: @@ -56,7 +56,7 @@ feishu: server: - port: 10704 + port: 8081 logging: level: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4031b8d..e7061c3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: dev + active: test jackson: deserialization: fail-on-unknown-properties: false @@ -28,7 +28,7 @@ spring: password: 4hHmzxZH4rF4c5xr driver-class-name: com.mysql.cj.jdbc.Driver hikari: - pool-name: mysql2HikariCP + pool-name: mysql3HikariCP maximum-pool-size: 10 sqlserver1: jdbc-url: jdbc:sqlserver://52.76.43.43:1433;databaseName=hwhcGold;encrypt=true;sslProtocol=TLSv1;trustServerCertificate=true; @@ -69,10 +69,10 @@ mybatis: configuration: mysql1: map-underscore-to-camel-case: true -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl sqlserver1: map-underscore-to-camel-case: true -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mysql2: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl From 2abd7a31796dc51f9248c1389a4469519f2cde4b Mon Sep 17 00:00:00 2001 From: lijianlin Date: Fri, 1 Aug 2025 15:48:19 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E9=87=91=E8=B1=86?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E5=8F=8A=E5=90=88=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/bean/BeanConsumeController.java | 10 ---- .../controller/bean/BeanRechargeController.java | 9 --- .../demo/controller/bean/BeanUserController.java | 39 +++++++++++++ .../com/example/demo/domain/vo/bean/BeanPage.java | 23 -------- .../com/example/demo/domain/vo/bean/BeanUser.java | 28 +++++++++ .../example/demo/domain/vo/bean/BeanUserCard.java | 1 + .../java/com/example/demo/domain/vo/coin/Page.java | 2 + .../example/demo/mapper/bean/BeanUserMapper.java | 8 +++ .../example/demo/service/bean/BeanUserService.java | 11 ++++ .../demo/serviceImpl/bean/BeanUserServiceImpl.java | 22 +++++++ src/main/resources/jindouMapper/BeanUser.xml | 67 ++++++++++++++++++++++ 11 files changed, 178 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanPage.java create mode 100644 src/main/java/com/example/demo/domain/vo/bean/BeanUser.java diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index ccd838c..14164f1 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -1,25 +1,15 @@ package com.example.demo.controller.bean; -import com.example.demo.Util.JWTUtil; -import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanConsumeGold; -import com.example.demo.domain.vo.bean.BeanConsumeLive; -import com.example.demo.domain.vo.bean.BeanPage; -import com.example.demo.domain.vo.coin.Gold; import com.example.demo.domain.vo.coin.Page; -import com.example.demo.domain.vo.coin.RechargeAudit; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanConsumeService; -import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import java.util.Arrays; import java.util.List; /** diff --git a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java index f173799..3d921c4 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanRechargeController.java @@ -1,25 +1,16 @@ package com.example.demo.controller.bean; -import com.example.demo.Util.JWTUtil; -import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.bean.BeanRecharge; -import com.example.demo.domain.vo.bean.BeanPage; import com.example.demo.domain.vo.bean.BeanRechargeInfo; import com.example.demo.domain.vo.bean.GoldBean; import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanRechargeService; -import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.util.Arrays; -import java.util.List; /** * @program: gold-java diff --git a/src/main/java/com/example/demo/controller/bean/BeanUserController.java b/src/main/java/com/example/demo/controller/bean/BeanUserController.java index 4549988..097fb00 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanUserController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanUserController.java @@ -1,14 +1,19 @@ package com.example.demo.controller.bean; import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.bean.BeanUser; import com.example.demo.domain.vo.bean.BeanUserCard; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.bean.BeanUserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * @program: gold-java * @ClassName BeanUserController @@ -37,4 +42,38 @@ public class BeanUserController { return Result.error("请检查输入精网号格式"); } } + //客户金豆余额 + @PostMapping("/userBean") + public Result userBean(@RequestBody Page page) { + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + + return Result.success(beanUserService.selectUserBy(page.getPageNum(), page.getPageSize(), page.getBeanUser())); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.toString()); + }} + //客户金币余额合计数 + @PostMapping("/userBeanSum") + public Result userBeanSum(@RequestBody Page page) { + + return Result.success(beanUserService.sumUserGold(page)); + } + //查询客户分部 + @PostMapping("/getDept") + public Result getDept() { + List deptList = beanUserService.getDept(); + return Result.success(deptList); + } } + + + + + diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java b/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java deleted file mode 100644 index b747967..0000000 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanPage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.demo.domain.vo.bean; - -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @program: gold-java - * @ClassName Page - * @description: - * @author: Ethan - * @create: 2025−07-30 11:44 - * @Version 1.0 - **/ -@Data -@NoArgsConstructor -public class BeanPage { - private static final long serialVersionUID = 1L; - - private String token; - private Integer pageNum; //页码 - private Integer pageSize; //每页大小 - -} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanUser.java b/src/main/java/com/example/demo/domain/vo/bean/BeanUser.java new file mode 100644 index 0000000..65fd39a --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanUser.java @@ -0,0 +1,28 @@ +package com.example.demo.domain.vo.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: gold-java + * @ClassName BeanUser + * @description: + * @author: Ethan + * @create: 2025−08-01 10:40 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BeanUser { + private String name; //姓名 + private Integer jwcode; //精网号 + private String dept; //分部 + private Integer beanNum; //金豆数量 + private Integer buyBean; //付费金豆 + private Integer freeBean; //免费金豆 + private Integer totalCostBean; //历史消费 + private String sortField; //排序字段 + private String sortOrder; //排序顺序 +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java b/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java index 2f62f15..7a5597f 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java @@ -22,6 +22,7 @@ public class BeanUserCard { private String name; // 客户姓名 private Integer jwcode; // 精网号 private String market; // 所属地区 + private Integer sumBean; // 所有金豆 private Integer freeBean; // 免费豆 private Integer permanentBean; // 永久豆 private Integer consumeSum; // 消费金额 diff --git a/src/main/java/com/example/demo/domain/vo/coin/Page.java b/src/main/java/com/example/demo/domain/vo/coin/Page.java index dc476be..d763a14 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/Page.java +++ b/src/main/java/com/example/demo/domain/vo/coin/Page.java @@ -36,4 +36,6 @@ public class Page { private BeanConsumeArticle beanConsumeArticle; //文章金豆消费 private BeanRechargeInfo beanRechargeInfo; //金豆充值信息 private BeanConsumeGold beanConsumeGold; //金豆消费合计数 + private BeanUser beanUser; //客户金豆余额明细 + private BeanUserCard beanUserCard; //客户金豆卡片 } diff --git a/src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java b/src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java index 3ff34ef..66694c2 100644 --- a/src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java +++ b/src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java @@ -1,6 +1,7 @@ package com.example.demo.mapper.bean; +import com.example.demo.domain.vo.bean.BeanUser; import com.example.demo.domain.vo.bean.BeanUserCard; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,6 +19,13 @@ import java.util.List; @Mapper public interface BeanUserMapper { + //查询客户金豆余额 + List selectUserBy(@Param("beanUser") BeanUser beanUser); + //查询用户卡片 BeanUserCard userCard(@Param("jwcode")String jwcode, @Param("markets")List markets); + //查询客户金豆余额合计 + BeanUserCard SumUserBy(@Param("beanUser")BeanUser beanUser); + //查询客户分部 + List getDept(); } diff --git a/src/main/java/com/example/demo/service/bean/BeanUserService.java b/src/main/java/com/example/demo/service/bean/BeanUserService.java index e50db56..5dcbc47 100644 --- a/src/main/java/com/example/demo/service/bean/BeanUserService.java +++ b/src/main/java/com/example/demo/service/bean/BeanUserService.java @@ -2,9 +2,13 @@ package com.example.demo.service.bean; +import com.example.demo.domain.vo.bean.BeanUser; import com.example.demo.domain.vo.bean.BeanUserCard; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; +import java.util.List; + /** * @program: gold-java * @ClassName BeanUserService @@ -17,4 +21,11 @@ import com.example.demo.domain.vo.coin.Result; public interface BeanUserService { //查询用户卡片 Result userCard(String jwcode); + //查询客户金豆余额 + Object selectUserBy(Integer pageNum, Integer pageSize, BeanUser beanUser); + //客户金豆余额合计数 + BeanUserCard sumUserGold(Page page); + + //客户 部门 + List getDept(); } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java index ca21b09..415963a 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java @@ -2,10 +2,15 @@ package com.example.demo.serviceImpl.bean; import com.example.demo.Util.JWTUtil; import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.vo.bean.BeanConsumeArticle; +import com.example.demo.domain.vo.bean.BeanUser; import com.example.demo.domain.vo.bean.BeanUserCard; +import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.bean.BeanUserMapper; import com.example.demo.service.bean.BeanUserService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -51,4 +56,21 @@ public class BeanUserServiceImpl implements BeanUserService { return Result.error("用户查找不到"); } } + //查询客户金豆余额 + @Override + public Object selectUserBy(Integer pageNum, Integer pageSize, BeanUser beanUser) { + PageHelper.startPage(pageNum, pageSize); + List beanUsers = beanUserMapper.selectUserBy(beanUser); + return new PageInfo<>(beanUsers); + } + //客户金豆余额合计数 + @Override + public BeanUserCard sumUserGold(Page page) { + return beanUserMapper.SumUserBy(page.getBeanUser()); + } + + @Override + public List getDept() { + return beanUserMapper.getDept(); + } } diff --git a/src/main/resources/jindouMapper/BeanUser.xml b/src/main/resources/jindouMapper/BeanUser.xml index c029b3e..1055283 100644 --- a/src/main/resources/jindouMapper/BeanUser.xml +++ b/src/main/resources/jindouMapper/BeanUser.xml @@ -20,5 +20,72 @@ m.jwcode = #{jwcode} + + + + + + \ No newline at end of file