Browse Source
Merge branch 'milestone-20250727-金币重构三期' of http://39.101.133.168:8807/huangqizhen/gold-java into milestone-20250727-金币重构三期
lihuilin/hotfix-20250810160509-余额地区传参
Merge branch 'milestone-20250727-金币重构三期' of http://39.101.133.168:8807/huangqizhen/gold-java into milestone-20250727-金币重构三期
lihuilin/hotfix-20250810160509-余额地区传参
74 changed files with 2329 additions and 1677 deletions
-
5pom.xml
-
4src/main/java/com/example/demo/DemoApplication.java
-
7src/main/java/com/example/demo/Export/ExportService.java
-
295src/main/java/com/example/demo/Export/ExportServiceImpl.java
-
5src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java
-
2src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java
-
110src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
-
105src/main/java/com/example/demo/controller/bean/BeanRechargeController.java
-
41src/main/java/com/example/demo/controller/bean/BeanUserController.java
-
57src/main/java/com/example/demo/controller/coin/ConsumeController.java
-
18src/main/java/com/example/demo/controller/coin/ExportController.java
-
8src/main/java/com/example/demo/controller/coin/GoldDetailController.java
-
51src/main/java/com/example/demo/controller/coin/RechargeController.java
-
52src/main/java/com/example/demo/controller/coin/RefundController.java
-
2src/main/java/com/example/demo/controller/coin/WorkbenchController.java
-
37src/main/java/com/example/demo/domain/DTO/LiveDTO.java
-
41src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java
-
38src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
-
23src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java
-
43src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java
-
14src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java
-
47src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java
-
28src/main/java/com/example/demo/domain/vo/bean/BeanUser.java
-
3src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java
-
24src/main/java/com/example/demo/domain/vo/bean/GoldBean.java
-
2src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
-
2src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
-
9src/main/java/com/example/demo/domain/vo/coin/Page.java
-
42src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java
-
2src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
-
40src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java
-
14src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java
-
24src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java
-
8src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java
-
20src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java
-
13src/main/java/com/example/demo/mapper/coin/PermissionMapper.java
-
24src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java
-
35src/main/java/com/example/demo/service/bean/BeanConsumeService.java
-
30src/main/java/com/example/demo/service/bean/BeanRechargeService.java
-
11src/main/java/com/example/demo/service/bean/BeanUserService.java
-
9src/main/java/com/example/demo/service/coin/ExportExcelService.java
-
84src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java
-
67src/main/java/com/example/demo/service/listen/BaseMessageListener.java
-
42src/main/java/com/example/demo/service/listen/ConsumeListener.java
-
50src/main/java/com/example/demo/service/listen/GoldDetailListener.java
-
43src/main/java/com/example/demo/service/listen/GoldListener.java
-
38src/main/java/com/example/demo/service/listen/LiveListener.java
-
66src/main/java/com/example/demo/service/listen/RechargeListener.java
-
44src/main/java/com/example/demo/service/listen/RefundListener.java
-
86src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
-
199src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java
-
22src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java
-
1232src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
-
10src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java
-
2src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java
-
4src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java
-
6src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java
-
2src/main/resources/application-dev.yml
-
8src/main/resources/application-test.yml
-
8src/main/resources/application.yml
-
336src/main/resources/jindouMapper/BeanConsumeMapper.xml
-
6src/main/resources/jindouMapper/BeanRechargeMapper.xml
-
64src/main/resources/jindouMapper/BeanRechargeMapper2.xml
-
74src/main/resources/jindouMapper/BeanUser.xml
-
4src/main/resources/mapper/AuditMapper.xml
-
28src/main/resources/mapper/BeanRechargeMapper1.xml
-
11src/main/resources/mapper/ConsumeMapper.xml
-
2src/main/resources/mapper/PermissionMapper.xml
-
20src/main/resources/mapper/RechargeMapper.xml
-
11src/main/resources/mapper/RefundMapper.xml
-
4src/main/resources/mapper/RoleMapper.xml
-
8src/main/resources/mapper/UrlMapper.xml
-
2src/main/resources/mapper/UserMapper.xml
-
70src/main/resources/paymapper/BeanRechargeMapper3.xml
@ -0,0 +1,110 @@ |
|||
package com.example.demo.controller.bean; |
|||
|
|||
import com.example.demo.domain.vo.bean.BeanConsumeGold; |
|||
import com.example.demo.domain.vo.coin.Page; |
|||
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.util.ObjectUtils; |
|||
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<String> deptList = beanConsumeService.getDept(); |
|||
return Result.success(deptList); |
|||
} |
|||
|
|||
//筛选查询直播消费记录 |
|||
@PostMapping("/selectLiveBy") |
|||
public Result selectLiveBy(@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.selectLiveBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeLive())); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
//返回堆栈信息 |
|||
return Result.error(e.toString()); |
|||
}} |
|||
//筛选查询铁粉消费记录 |
|||
@PostMapping("/selectFanBy") |
|||
public Result selectFanBy(@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.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 Page page) { |
|||
|
|||
return beanConsumeService.sumConsumeGold( page); |
|||
} |
|||
//查询所有直播礼物 |
|||
@PostMapping("/getLiveGift") |
|||
public Result getLiveGift(){ |
|||
return Result.success(beanConsumeService.getLiveGift()); |
|||
} |
|||
//查询所有直播频道 |
|||
@PostMapping("/getLiveChannel") |
|||
public Result getLiveChannel(){ |
|||
return Result.success(beanConsumeService.getLiveChannel()); |
|||
} |
|||
} |
@ -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; |
|||
} |
@ -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; // 结束时间 |
|||
} |
@ -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; // 结束时间 |
|||
} |
@ -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; //总条数 |
|||
} |
@ -0,0 +1,43 @@ |
|||
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 String dept; //地区/分部 |
|||
//类型 直播: 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 |
|||
//文章: 1. 打赏2. 付费 |
|||
private String type; //类型 |
|||
private String gift; //礼物名称 |
|||
private String beanNum; //金豆数量 |
|||
private String liveChannel; //频道名称(截取content) |
|||
private String liveName; //直播间名称 |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
|||
private Date consumeTime; // 消费时间 (时间戳转化) |
|||
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; // 结束时间 |
|||
} |
@ -0,0 +1,47 @@ |
|||
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 Double money; // 金额 |
|||
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 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") |
|||
private Date endTime; // 结束时间 |
|||
private List<String> markets; // 地区列表 |
|||
private String sortField; //排序字段 |
|||
private String sortOrder; //排序顺序 |
|||
} |
@ -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; //排序顺序 |
|||
} |
@ -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 Double money; // 金额 |
|||
private Integer beanNum; // 豆数量 |
|||
} |
@ -0,0 +1,40 @@ |
|||
package com.example.demo.mapper.bean; |
|||
|
|||
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; |
|||
|
|||
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<String> getDept(); |
|||
//筛选查询直播消费 |
|||
List<BeanConsumeLive> selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); |
|||
//筛选查询铁粉消费 |
|||
List<BeanConsumeFan> selectFanBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); |
|||
//筛选查询文章消费 |
|||
List<BeanConsumeArticle> selectArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle); |
|||
//查询金豆直播消费金额 |
|||
BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); |
|||
//查询金豆铁粉消费金额 |
|||
BeanConsumeGold selectSumFansBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan); |
|||
//查询金豆文章消费金额 |
|||
BeanConsumeGold selectSumArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle); |
|||
//查询直播礼物 |
|||
List<String> getLiveGift(); |
|||
//查询直播全部频道 |
|||
List<String> getLiveChannel(); |
|||
|
|||
} |
|||
|
@ -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 { |
|||
} |
@ -0,0 +1,24 @@ |
|||
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 BeanRechargeMapper2 { |
|||
|
|||
List<BeanRechargeInfo> selectBySystem(BeanRechargeInfo beanRechargeInfo); |
|||
|
|||
List<String> systemMarket(); |
|||
} |
@ -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); |
|||
} |
@ -0,0 +1,24 @@ |
|||
package com.example.demo.mapper.pay; |
|||
|
|||
|
|||
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 BeanRechargeMapper3 { |
|||
|
|||
List<BeanRechargeInfo> selectByOnline(BeanRechargeInfo beanRechargeInfo); |
|||
|
|||
List<String> systemMarket(); |
|||
} |
@ -0,0 +1,35 @@ |
|||
package com.example.demo.service.bean; |
|||
|
|||
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; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName BeanConsumeService |
|||
* @description: |
|||
* @author: Ethan |
|||
* @create: 2025−07-30 11:53 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
public interface BeanConsumeService { |
|||
//获取消费用户的分部 |
|||
List<String> getDept(); |
|||
//筛选查询直播消费 |
|||
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(Page page); |
|||
//查询直播礼物 |
|||
List<String> getLiveGift(); |
|||
//获取直播频道 |
|||
List<String> getLiveChannel(); |
|||
|
|||
|
|||
} |
@ -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<String> { |
|||
|
|||
|
|||
//注入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(); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,67 @@ |
|||
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<T> extends AbstractMessageListener<T> { |
|||
|
|||
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()); |
|||
} |
|||
} |
|||
|
|||
} |
@ -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<String> { |
|||
|
|||
|
|||
//注入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); |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
@ -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<String>{ |
|||
|
|||
@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); |
|||
} |
|||
} |
|||
|
|||
} |
@ -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<String> { |
|||
//注入ExportExcelService |
|||
public class RechargeListener extends BaseMessageListener<String> { |
|||
|
|||
@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(); |
|||
} |
|||
|
|||
} |
|||
|
@ -0,0 +1,86 @@ |
|||
package com.example.demo.serviceImpl.bean; |
|||
|
|||
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; |
|||
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; |
|||
|
|||
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<String> getDept() { |
|||
List<String> deptList = BeanConsumeMapper.getDept(); |
|||
return deptList; |
|||
} |
|||
//筛选查询直播消费 |
|||
@Override |
|||
public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) { |
|||
PageHelper.startPage(pageNum, pageSize); |
|||
List<BeanConsumeLive> beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive); |
|||
return new PageInfo<>(beanConsumeLives); |
|||
} |
|||
//筛选查询铁粉消费 |
|||
@Override |
|||
public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) { |
|||
PageHelper.startPage(pageNum, pageSize); |
|||
List<BeanConsumeFan> beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan); |
|||
return new PageInfo<>(beanConsumeFans); |
|||
} |
|||
//筛选查询文章消费 |
|||
@Override |
|||
public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) { |
|||
PageHelper.startPage(pageNum, pageSize); |
|||
List<BeanConsumeArticle> beanConsumeArticles = BeanConsumeMapper.selectArticleBy(beanConsumeArticle); |
|||
return new PageInfo<>(beanConsumeArticles); |
|||
} |
|||
|
|||
@Override |
|||
public BeanConsumeGold sumConsumeGold(Page page) { |
|||
BeanConsumeGold gold = new BeanConsumeGold(); |
|||
Integer payType = page.getPayType(); |
|||
if (payType==1) { |
|||
//直播消费合计 |
|||
gold = BeanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive()); |
|||
}else if (payType==7) { |
|||
//充值消费合计 |
|||
gold = BeanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan()); |
|||
}else if (payType==8) { |
|||
//文章消费合计 |
|||
gold = BeanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle()); |
|||
} |
|||
|
|||
return gold; |
|||
} |
|||
//查询直播礼物 |
|||
@Override |
|||
public List<String> getLiveGift() { |
|||
|
|||
return BeanConsumeMapper.getLiveGift(); |
|||
} |
|||
//查询直播全部频道 |
|||
@Override |
|||
public List<String> getLiveChannel() { |
|||
return BeanConsumeMapper.getLiveChannel(); |
|||
} |
|||
} |
1232
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,336 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.bean.BeanConsumeMapper"> |
|||
|
|||
<!--获取消费用户分部--> |
|||
<select id="getDept" resultType="java.lang.String"> |
|||
select distinct fm.dept |
|||
from fx_member fm |
|||
inner join fx_yaoqing_records fyr on fyr.uid = fm.id |
|||
where fm.dept is not null and fm.dept != '' |
|||
</select> |
|||
<!--筛选查询直播消费--> |
|||
<select id="selectLiveBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeLive"> |
|||
SELECT * |
|||
FROM ( |
|||
SELECT fm.nickname AS name, |
|||
fm.jwcode, |
|||
fm.dept, |
|||
fyr.source_type AS type, |
|||
CASE |
|||
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
THEN SUBSTRING(content, LOCATE('送礼物', content) + CHAR_LENGTH('送礼物')) |
|||
ELSE NULL |
|||
END AS gift, |
|||
fyr.money AS beanNum, |
|||
CASE |
|||
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
THEN SUBSTRING_INDEX(SUBSTRING(content, LOCATE('直播间', content) + CHAR_LENGTH('直播间')), '送礼物', 1) |
|||
ELSE NULL |
|||
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 |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type IN (1,2,3,4,5) |
|||
<if test="beanConsumeLive.jwcode != null and beanConsumeLive.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeLive.jwcode} |
|||
</if> |
|||
<if test="beanConsumeLive.dept != null and beanConsumeLive.dept != ''"> |
|||
AND fm.dept = #{beanConsumeLive.dept} |
|||
</if> |
|||
<if test="beanConsumeLive.type != null and beanConsumeLive.type != ''"> |
|||
AND fyr.source_type = #{beanConsumeLive.type} |
|||
</if> |
|||
<if test="beanConsumeLive.startTime != null and beanConsumeLive.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeLive.endTime}) |
|||
</if> |
|||
</where> |
|||
) AS t |
|||
<where> |
|||
<if test="beanConsumeLive.gift != null and beanConsumeLive.gift != ''"> |
|||
AND t.gift = #{beanConsumeLive.gift} |
|||
</if> |
|||
<if test="beanConsumeLive.liveChannel != null and beanConsumeLive.liveChannel != ''"> |
|||
AND t.liveChannel= #{beanConsumeLive.liveChannel} |
|||
</if> |
|||
<if test="beanConsumeLive.liveName != null and beanConsumeLive.liveName != ''"> |
|||
AND t.liveName LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%') |
|||
</if> |
|||
|
|||
</where> |
|||
|
|||
<choose> |
|||
<when test="beanConsumeLive.sortField != null and beanConsumeLive.sortField != '' and beanConsumeLive.sortOrder != null and beanConsumeLive.sortOrder != ''"> |
|||
ORDER BY t.${beanConsumeLive.sortField} ${beanConsumeLive.sortOrder} |
|||
</when> |
|||
<otherwise> |
|||
ORDER BY t.consumeTime DESC |
|||
</otherwise> |
|||
</choose> |
|||
</select> |
|||
|
|||
<!--查询消费直播合计数--> |
|||
<select id="selectSumLiveBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold"> |
|||
SELECT |
|||
IFNULL(SUM(t.money_buy), 0) AS permanentBean, |
|||
IFNULL(SUM(t.money_free), 0) AS freeBean, |
|||
COUNT(*) AS totalNum |
|||
FROM ( |
|||
SELECT |
|||
fyr.money_buy, |
|||
fyr.money_free, |
|||
fyr.time |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type IN (1,2,3,4,5) |
|||
|
|||
<if test="beanConsumeLive.jwcode != null and beanConsumeLive.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeLive.jwcode} |
|||
</if> |
|||
<if test="beanConsumeLive.dept != null and beanConsumeLive.dept != ''"> |
|||
AND fm.dept = #{beanConsumeLive.dept} |
|||
</if> |
|||
<if test="beanConsumeLive.type != null and beanConsumeLive.type != ''"> |
|||
AND fyr.source_type = #{beanConsumeLive.type} |
|||
</if> |
|||
<if test="beanConsumeLive.gift != null and beanConsumeLive.gift != ''"> |
|||
AND CASE |
|||
WHEN LOCATE('直播间', fyr.content) > 0 AND LOCATE('送礼物', fyr.content) > 0 |
|||
THEN SUBSTRING(fyr.content, LOCATE('送礼物', fyr.content) + CHAR_LENGTH('送礼物')) |
|||
ELSE NULL |
|||
END = #{beanConsumeLive.gift} |
|||
</if> |
|||
<if test="beanConsumeLive.liveChannel != null and beanConsumeLive.liveChannel != ''"> |
|||
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.liveChannel} |
|||
</if> |
|||
<if test="beanConsumeLive.startTime != null and beanConsumeLive.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeLive.endTime}) |
|||
</if> |
|||
<if test="beanConsumeLive.liveName != null and beanConsumeLive.liveName != ''"> |
|||
AND fyr.source_name LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%') |
|||
</if> |
|||
</where> |
|||
) AS t |
|||
</select> |
|||
<!--筛选铁粉消费记录--> |
|||
<select id="selectFanBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeFan"> |
|||
SELECT fm.nickname AS name, |
|||
fm.jwcode, |
|||
fm.dept, |
|||
fyr.money AS beanNum, |
|||
fyr.source_name AS channel, |
|||
fyr.source_type AS type, |
|||
FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime, |
|||
fyr.pay_type AS payType |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type = 7 |
|||
<if test="beanConsumeFan.jwcode != null and beanConsumeFan.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeFan.jwcode} |
|||
</if> |
|||
<if test="beanConsumeFan.dept != null and beanConsumeFan.dept != ''"> |
|||
AND fm.dept = #{beanConsumeFan.dept} |
|||
</if> |
|||
<if test="beanConsumeFan.channel != null and beanConsumeFan.channel != ''"> |
|||
AND fyr.source_name =#{beanConsumeFan.channel} |
|||
</if> |
|||
<if test="beanConsumeFan.startTime != null and beanConsumeFan.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeFan.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeFan.endTime}) |
|||
</if> |
|||
</where> |
|||
|
|||
<choose> |
|||
<when test="beanConsumeFan.sortField != null and beanConsumeFan.sortField != '' and beanConsumeFan.sortOrder != null and beanConsumeFan.sortOrder != ''"> |
|||
ORDER BY ${beanConsumeFan.sortField} ${beanConsumeFan.sortOrder} |
|||
</when> |
|||
<otherwise> |
|||
ORDER BY consumeTime DESC |
|||
</otherwise> |
|||
</choose> |
|||
</select> |
|||
<!--铁粉消耗合计数--> |
|||
<select id="selectSumFansBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold"> |
|||
SELECT |
|||
IFNULL(SUM(t.money_buy), 0) AS permanentBean, |
|||
IFNULL(SUM(t.money_free), 0) AS freeBean, |
|||
COUNT(*) AS totalNum |
|||
FROM ( |
|||
SELECT |
|||
fyr.money_buy, |
|||
fyr.money_free, |
|||
fyr.time |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type = 7 |
|||
|
|||
<if test="beanConsumeFan.jwcode != null and beanConsumeFan.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeFan.jwcode} |
|||
</if> |
|||
<if test="beanConsumeFan.dept != null and beanConsumeFan.dept != ''"> |
|||
AND fm.dept = #{beanConsumeFan.dept} |
|||
</if> |
|||
<if test="beanConsumeFan.channel != null and beanConsumeFan.channel != ''"> |
|||
AND fyr.source_name = #{beanConsumeFan.channel} |
|||
</if> |
|||
|
|||
<if test="beanConsumeFan.startTime != null and beanConsumeFan.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeFan.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeFan.endTime}) |
|||
</if> |
|||
|
|||
</where> |
|||
) AS t |
|||
</select> |
|||
<!--筛选文章消费记录--> |
|||
<select id="selectArticleBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeArticle"> |
|||
SELECT fm.nickname AS name, |
|||
fm.jwcode, |
|||
fm.dept, |
|||
fyr.source_type AS type, |
|||
fyr.money AS beanNum, |
|||
fyr.source_id AS articleId, |
|||
fyr.source_name AS articleName, |
|||
(SELECT fm2.nickname |
|||
FROM fx_member fm2 |
|||
WHERE fm2.jwcode = fyr.source_jwcode |
|||
LIMIT 1) AS author, |
|||
FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime, |
|||
fyr.pay_type AS payType |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type = 8 |
|||
<if test="beanConsumeArticle.jwcode != null and beanConsumeArticle.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeArticle.jwcode} |
|||
</if> |
|||
<if test="beanConsumeArticle.dept != null and beanConsumeArticle.dept != ''"> |
|||
AND fm.dept = #{beanConsumeArticle.dept} |
|||
</if> |
|||
<if test="beanConsumeArticle.author != null and beanConsumeArticle.author != ''"> |
|||
AND (SELECT fm2.nickname |
|||
FROM fx_member fm2 |
|||
WHERE fm2.jwcode = fyr.source_jwcode |
|||
LIMIT 1)=#{beanConsumeArticle.author} |
|||
</if> |
|||
<if test="beanConsumeArticle.ArticleName != null and beanConsumeArticle.ArticleName != ''"> |
|||
AND fyr.source_name =#{beanConsumeArticle.ArticleName} |
|||
</if> |
|||
|
|||
<if test="beanConsumeArticle.articleId != null and beanConsumeArticle.articleId != ''"> |
|||
AND fyr.source_id =#{beanConsumeArticle.articleId} |
|||
</if> |
|||
<if test="beanConsumeArticle.startTime != null and beanConsumeArticle.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeArticle.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeArticle.endTime}) |
|||
</if> |
|||
</where> |
|||
<choose> |
|||
<when test="beanConsumeArticle.payMode == 0"> |
|||
AND fyr.source_type IN (9, 10) |
|||
</when> |
|||
<when test="beanConsumeArticle.payMode == 1"> |
|||
AND fyr.source_type = 11 |
|||
</when> |
|||
<when test="beanConsumeArticle.payMode == 2"> |
|||
AND fyr.source_type not in (9, 10,11) |
|||
</when> |
|||
<when test="beanConsumeArticle.sortField != null and beanConsumeArticle.sortField != '' and beanConsumeArticle.sortOrder != null and beanConsumeArticle.sortOrder != ''"> |
|||
ORDER BY ${beanConsumeArticle.sortField} ${beanConsumeArticle.sortOrder} |
|||
</when> |
|||
<otherwise> |
|||
ORDER BY consumeTime DESC |
|||
</otherwise> |
|||
</choose> |
|||
|
|||
</select> |
|||
<!--查询金豆文章消费--> |
|||
<select id="selectSumArticleBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold"> |
|||
SELECT |
|||
IFNULL(SUM(t.money_buy), 0) AS permanentBean, |
|||
IFNULL(SUM(t.money_free), 0) AS freeBean, |
|||
COUNT(*) AS totalNum |
|||
FROM ( SELECT |
|||
fyr.money_buy, |
|||
fyr.money_free, |
|||
fyr.time |
|||
FROM fx_member fm |
|||
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id |
|||
<where> |
|||
fyr.pay_type = 8 |
|||
<if test="beanConsumeArticle.jwcode != null and beanConsumeArticle.jwcode != ''"> |
|||
AND fm.jwcode = #{beanConsumeArticle.jwcode} |
|||
</if> |
|||
<if test="beanConsumeArticle.dept != null and beanConsumeArticle.dept != ''"> |
|||
AND fm.dept = #{beanConsumeArticle.dept} |
|||
</if> |
|||
<if test="beanConsumeArticle.ArticleName != null and beanConsumeArticle.ArticleName != ''"> |
|||
AND fyr.source_name =#{beanConsumeArticle.ArticleName} |
|||
</if> |
|||
<if test="beanConsumeArticle.author != null and beanConsumeArticle.author != ''"> |
|||
AND (SELECT fm2.nickname |
|||
FROM fx_member fm2 |
|||
WHERE fm2.jwcode = fyr.source_jwcode |
|||
LIMIT 1)=#{beanConsumeArticle.author} |
|||
</if> |
|||
<if test="beanConsumeArticle.articleId != null and beanConsumeArticle.articleId != ''"> |
|||
AND fyr.source_id =#{beanConsumeArticle.articleId} |
|||
</if> |
|||
<if test="beanConsumeArticle.startTime != null and beanConsumeArticle.endTime != null"> |
|||
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeArticle.startTime}) |
|||
AND UNIX_TIMESTAMP(#{beanConsumeArticle.endTime}) |
|||
</if> |
|||
</where> |
|||
<choose> |
|||
<when test="beanConsumeArticle.payMode == 0"> |
|||
AND fyr.source_type IN (9, 10) |
|||
</when> |
|||
<when test="beanConsumeArticle.payMode == 1"> |
|||
AND fyr.source_type = 11 |
|||
</when> |
|||
<when test="beanConsumeArticle.payMode == 2"> |
|||
AND fyr.source_type not in (9, 10,11) |
|||
</when> |
|||
|
|||
</choose> |
|||
) as t |
|||
</select> |
|||
|
|||
<!--获取直播礼物--> |
|||
<select id="getLiveGift" resultType="java.lang.String"> |
|||
SELECT DISTINCT |
|||
CASE |
|||
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
THEN SUBSTRING(content, LOCATE('送礼物', content) + CHAR_LENGTH('送礼物')) |
|||
ELSE NULL |
|||
END AS gift |
|||
FROM fx_yaoqing_records |
|||
WHERE LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
AND content IS NOT NULL AND source_type=1 |
|||
</select> |
|||
<select id="getLiveChannel" resultType="java.lang.String"> |
|||
SELECT DISTINCT |
|||
CASE |
|||
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
THEN SUBSTRING_INDEX(SUBSTRING(content, LOCATE('直播间', content) + CHAR_LENGTH('直播间')), '送礼物', 1) |
|||
ELSE NULL |
|||
END AS liveChannel |
|||
FROM fx_yaoqing_records |
|||
WHERE LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0 |
|||
AND content IS NOT NULL AND pay_type in (1,2,3,4,5) |
|||
</select> |
|||
|
|||
|
|||
</mapper> |
@ -1,6 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.coin.RechargeMapper"> |
|||
|
|||
|
|||
</mapper> |
@ -0,0 +1,64 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.bean.BeanRechargeMapper2"> |
|||
<select id="selectBySystem" resultType="com.example.demo.domain.vo.bean.BeanRechargeInfo"> |
|||
SELECT f.id AS id, |
|||
m.jwcode AS jwcode, |
|||
m.nickname AS name, |
|||
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 |
|||
<where> |
|||
f.data = 0 |
|||
<if test="jwcode != null and jwcode != ''"> |
|||
AND m.jwcode = #{jwcode} |
|||
</if> |
|||
<if test="market != null and market != ''"> |
|||
AND m.dept = #{market} |
|||
</if> |
|||
<if test="startTime != null and endTime != null"> |
|||
AND FROM_UNIXTIME(f.time) BETWEEN #{startTime} AND #{endTime} |
|||
</if> |
|||
</where> |
|||
<trim prefix="ORDER BY" suffixOverrides=","> |
|||
<choose> |
|||
<!-- 当指定排序字段时使用指定字段排序 --> |
|||
<when test="sortField != null and sortField != ''"> |
|||
<choose> |
|||
<!-- 对金币数量的排序处理 --> |
|||
<when test="sortField == 'permanentBean'">f.money_buy</when> |
|||
<when test="sortField == 'freeBean'">f.money_free</when> |
|||
<!-- 对时间字段的排序处理 --> |
|||
<when test="sortField == 'rechargeTime'">f.time</when> |
|||
<!-- 其他字段不支持排序,使用默认排序 --> |
|||
<otherwise>f.time</otherwise> |
|||
</choose> |
|||
<!-- 排序方向处理 --> |
|||
<if test="sortOrder != null and sortOrder != ''"> |
|||
<choose> |
|||
<when test="sortOrder == 'ASC'">ASC</when> |
|||
<when test="sortOrder == 'DESC'">DESC</when> |
|||
<otherwise>DESC</otherwise> |
|||
</choose> |
|||
</if> |
|||
<if test="sortOrder == null or sortOrder == ''"> |
|||
DESC |
|||
</if> |
|||
</when> |
|||
<!-- 未指定排序字段时,使用默认的时间降序排序 --> |
|||
<otherwise> |
|||
f.time DESC |
|||
</otherwise> |
|||
</choose> |
|||
</trim> |
|||
</select> |
|||
|
|||
<select id="systemMarket" resultType="java.lang.String"> |
|||
select DISTINCT dept from fx_member |
|||
</select> |
|||
</mapper> |
@ -0,0 +1,28 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.coin.BeanRechargeMapper1"> |
|||
|
|||
|
|||
<insert id="add" parameterType="com.example.demo.domain.vo.bean.BeanRecharge" useGeneratedKeys="true" keyProperty="id"> |
|||
INSERT INTO audit |
|||
<trim prefix="(" suffix=")" suffixOverrides=","> |
|||
jwcode, |
|||
buy_jd, |
|||
free_jd, |
|||
type, |
|||
admin_name, |
|||
remark, |
|||
audit_status |
|||
</trim> |
|||
VALUES |
|||
<trim prefix="(" suffix=")" suffixOverrides=","> |
|||
#{jwcode}, |
|||
#{permanentBean}, |
|||
#{freeBean}, |
|||
0, |
|||
#{adminName}, |
|||
#{remark}, |
|||
0 |
|||
</trim> |
|||
</insert> |
|||
</mapper> |
@ -1,8 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.UrlMapper"> |
|||
|
|||
<select id="selectBaseUrl" resultType="java.lang.String"> |
|||
select value from env where `key` = #{key} |
|||
</select> |
|||
</mapper> |
@ -0,0 +1,70 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.pay.BeanRechargeMapper3"> |
|||
<select id="selectByOnline" resultType="com.example.demo.domain.vo.bean.BeanRechargeInfo"> |
|||
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 |
|||
<where> |
|||
g.type = "gold" AND g.state = 1 |
|||
<if test="jwcode != null and jwcode != ''"> |
|||
AND g.jwcode = #{jwcode} |
|||
</if> |
|||
<if test="market != null and market != ''"> |
|||
AND m.deptName = #{market} |
|||
</if> |
|||
<if test="orderNo != null and orderNo != ''"> |
|||
AND g.order_no = #{orderNo} |
|||
</if> |
|||
<if test="platform != null and platform != ''"> |
|||
AND g.platform = #{platform} |
|||
</if> |
|||
<if test="startTime != null and endTime != null"> |
|||
AND FROM_UNIXTIME(g.add_time) BETWEEN #{startTime} AND #{endTime} |
|||
</if> |
|||
</where> |
|||
<trim prefix="ORDER BY" suffixOverrides=","> |
|||
<choose> |
|||
<!-- 当指定排序字段时使用指定字段排序 --> |
|||
<when test="sortField != null and sortField != ''"> |
|||
<choose> |
|||
<!-- 对金币数量的排序处理 --> |
|||
<when test="sortField == 'num'">g.count</when> |
|||
<when test="sortField == 'money'">g.price</when> |
|||
<!-- 对时间字段的排序处理 --> |
|||
<when test="sortField == 'rechargeTime'">g.add_time</when> |
|||
<!-- 其他字段不支持排序,使用默认排序 --> |
|||
<otherwise>g.add_time</otherwise> |
|||
</choose> |
|||
<!-- 排序方向处理 --> |
|||
<if test="sortOrder != null and sortOrder != ''"> |
|||
<choose> |
|||
<when test="sortOrder == 'ASC'">ASC</when> |
|||
<when test="sortOrder == 'DESC'">DESC</when> |
|||
<otherwise>DESC</otherwise> |
|||
</choose> |
|||
</if> |
|||
<if test="sortOrder == null or sortOrder == ''"> |
|||
DESC |
|||
</if> |
|||
</when> |
|||
<!-- 未指定排序字段时,使用默认的时间降序排序 --> |
|||
<otherwise> |
|||
g.add_time DESC |
|||
</otherwise> |
|||
</choose> |
|||
</trim> |
|||
</select> |
|||
|
|||
<select id="onlineMarket" resultType="java.lang.String"> |
|||
select DISTINCT deptName from member_info |
|||
</select> |
|||
</mapper> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue