Compare commits

...

17 Commits

Author SHA1 Message Date
lijianlin d780c23698 12-30 精确时间图表 3 months ago
lijianlin 42cb76bc3b 12-19 频道 角色频道权限 4 months ago
huangqizhen e230fdccea 12.17 修改参数 4 months ago
huangqizhen 83a6e93ded Merge branch 'refs/heads/milestone-20251209-多语言二期' into milestone-20251215-优化 4 months ago
huangqizhen 2e96bca9de 12.17 youhua 4 months ago
lijianlin 17d4ab6a98 Merge branch 'milestone-20251215-优化' of http://39.101.133.168:8807/huangqizhen/gold-java into lijianlin/feature-20251209-现金管理三期 4 months ago
lijianlin 79bce58fbd 12-12 同步金币数量进入商品数量(不乘一百) 4 months ago
lijianlin a577026c68 12-12 同步金豆*100计入永久金币 4 months ago
lijianlin 0aade1b7c4 12-12 新增现金转换前支付信息 4 months ago
lijianlin f46f1886dd Merge remote-tracking branch 'refs/remotes/origin/lijianlin/feature-20251211-fix' into dev 4 months ago
lijianlin 1cb29839f9 12-11 修复营收接口 4 months ago
lijianlin 4908f8c61d Merge remote-tracking branch 'refs/remotes/origin/milestone-20251203-冲刺计划' into dev 4 months ago
lijianlin b16dbd191e 12-11 同步审核字段 4 months ago
sunjiabei 7db77c5391 12月10日消费修复 4 months ago
lijianlin 1257bbb421 Merge branch 'milestone-20251203-冲刺计划' of http://39.101.133.168:8807/huangqizhen/gold-java into lijianlin/feature-20251209-现金管理三期 4 months ago
lijianlin 9f80eb6c0a 12-10 收款赠送免费金币 4 months ago
lijianlin 1ef52d0816 12-09 频道管理合计数的频道权限修复 4 months ago
  1. 25
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  2. 10
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  3. 24
      src/main/java/com/example/demo/controller/coin/WorkbenchController.java
  4. 9
      src/main/java/com/example/demo/domain/entity/CashRecord.java
  5. 8
      src/main/java/com/example/demo/domain/vo/cash/CashCollection.java
  6. 3
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  7. 2
      src/main/java/com/example/demo/mapper/coin/RoleMapper.java
  8. 2
      src/main/java/com/example/demo/mapper/coin/WorkBenchMapper.java
  9. 4
      src/main/java/com/example/demo/service/bean/BeanConsumeService.java
  10. 3
      src/main/java/com/example/demo/service/cash/CashCollectionService.java
  11. 2
      src/main/java/com/example/demo/service/coin/WorkbenchService.java
  12. 23
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  13. 52
      src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java
  14. 90
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  15. 5
      src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java
  16. 42
      src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java
  17. 2
      src/main/resources/application-dev.yml
  18. 8
      src/main/resources/application-test.yml
  19. 2
      src/main/resources/application.yml
  20. 8
      src/main/resources/cashMapper/CashCollectionMapper.xml
  21. 11
      src/main/resources/cashMapper/CashRefundMapper.xml
  22. 4
      src/main/resources/mapper/RoleMapper.xml
  23. 20
      src/main/resources/mapper/WorkBenchMapper.xml

25
src/main/java/com/example/demo/controller/bean/BeanConsumeController.java

@ -1,6 +1,8 @@
package com.example.demo.controller.bean; package com.example.demo.controller.bean;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.bean.BeanConsume; import com.example.demo.domain.vo.bean.BeanConsume;
import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeGold;
import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanRecharge;
@ -63,6 +65,29 @@ public class BeanConsumeController {
return Result.error(errorMsg); return Result.error(errorMsg);
} }
} }
//获取当前角色的频道权限
@PostMapping("/getRoleChannel")
public Result getLiveChannel(@RequestBody Admin admin, @RequestHeader(defaultValue = "zh_CN") String lang){
try {
String channelList = beanConsumeService.getRoleLiveChannel(admin.getRoleId());
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境先将翻译后的频道名称转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
}
// 对频道名称进行多语言转换
return Result.success(channelList);
}
catch (Exception e) {
String errorMsg = languageTranslationUtil.translate("获取频道权限失败", lang);
return Result.error(errorMsg);
}
}
//获取直播消费用户分部信息 //获取直播消费用户分部信息
@PostMapping("/getLiveDept") @PostMapping("/getLiveDept")

10
src/main/java/com/example/demo/controller/cash/CashCollectionController.java

@ -85,7 +85,15 @@ public class CashCollectionController {
return Result.error(errorMsg); return Result.error(errorMsg);
} }
} }
//新增赠送免费金币
@PostMapping("/addFreeCoin")
public Result addFreeCoin(@RequestBody CashCollection cashCollection) {
try {
return Result.success(cashCollectionService.addFreeCoin(cashCollection));
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
//撤回未审核的收款订单 //撤回未审核的收款订单
@PostMapping("/cancel") @PostMapping("/cancel")
public Result cancel(@RequestBody CashCollection cashRecord, @RequestHeader(defaultValue = "zh_CN") String lang) { public Result cancel(@RequestBody CashCollection cashRecord, @RequestHeader(defaultValue = "zh_CN") String lang) {

24
src/main/java/com/example/demo/controller/coin/WorkbenchController.java

@ -155,6 +155,30 @@ public class WorkbenchController {
return ResponseEntity.ok(result); return ResponseEntity.ok(result);
} }
//获取精确时间内的图表数据
@Log("获取精确时间内的图表数据")
@PostMapping("/getExactGraph")
public ResponseEntity<WorkbenchCard> getExactSingleGraph(@RequestBody WorkbenchCard workbench,
@AuthenticationPrincipal Admin admin,
@RequestHeader(defaultValue = "zh_CN") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(workbench, languageCode);
}
String account = admin.getAccount();
List<String> markets = workbenchService.getAdminMarket(account);
workbench.setMarkets(markets);
WorkbenchCard result = workbenchService.getExactGraph(workbench.getStartDate(), workbench.getEndDate(), workbench.getMarkets());
// 对结果进行多语言转换
translateWorkbenchCard(result, lang);
return ResponseEntity.ok(result);
}
/** /**
* 解析语言代码 * 解析语言代码
*/ */

9
src/main/java/com/example/demo/domain/entity/CashRecord.java

@ -1,5 +1,6 @@
package com.example.demo.domain.entity; package com.example.demo.domain.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -42,8 +43,10 @@ public class CashRecord implements Serializable {
private String payload; //平台 private String payload; //平台
// 金额信息 // 金额信息
private String paymentCurrency; // 付款币种
private BigDecimal paymentAmount; // 付款金额
private String paymentCurrencyOrig; // 原始付款币种
private BigDecimal paymentAmountOrig; // 原始付款金额
private String paymentCurrency; // 付款币种 转换后
private BigDecimal paymentAmount; // 付款金额 转换后
private String receivedCurrency; // 到账币种 private String receivedCurrency; // 到账币种
private BigDecimal receivedAmount; // 到账金额 private BigDecimal receivedAmount; // 到账金额
private BigDecimal handlingCharge; // 手续费 private BigDecimal handlingCharge; // 手续费
@ -55,6 +58,8 @@ public class CashRecord implements Serializable {
private LocalDateTime payTime; // 付款日期到秒 private LocalDateTime payTime; // 付款日期到秒
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime receivedTime; // 到账日期到秒 private LocalDateTime receivedTime; // 到账日期到秒
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime auditTime;
// 状态 & 操作人 // 状态 & 操作人
private Integer status; // 订单状态 private Integer status; // 订单状态

8
src/main/java/com/example/demo/domain/vo/cash/CashCollection.java

@ -45,8 +45,12 @@ public class CashCollection implements Serializable {
private String numUnit; //数量单位 // private String numUnit; //数量单位 //
private Integer permanentGold; // 永久金币数量 private Integer permanentGold; // 永久金币数量
private Integer freeGold; // 免费金币数量 private Integer freeGold; // 免费金币数量
//金额信息
@ExcelProperty("付款币种")
private String paymentCurrency; // 付款币种 private String paymentCurrency; // 付款币种
@ExcelProperty("付款金额")
private BigDecimal paymentAmount; // 付款金额 private BigDecimal paymentAmount; // 付款金额
@ExcelProperty("到账币种")
private String receivedCurrency; // 到账币种 private String receivedCurrency; // 到账币种
private BigDecimal receivedAmount; // 到账金额 private BigDecimal receivedAmount; // 到账金额
private BigDecimal handlingCharge; // 手续费 private BigDecimal handlingCharge; // 手续费
@ -101,4 +105,8 @@ public class CashCollection implements Serializable {
private String orderNoStatus; private String orderNoStatus;
@ExcelIgnore @ExcelIgnore
private String payload; private String payload;
@ExcelIgnore
private String PaymentCurrencyOrig;
@ExcelIgnore
private BigDecimal PaymentAmountOrig;
} }

3
src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java

@ -67,4 +67,7 @@ public class ConsumeUser implements Serializable {
@ExcelIgnore @ExcelIgnore
private Integer flag; //是否为员工号 private Integer flag; //是否为员工号
private BigDecimal price; // 折扣金币 private BigDecimal price; // 折扣金币
@ExcelIgnore
private Integer redMoney; //是否用红包
} }

2
src/main/java/com/example/demo/mapper/coin/RoleMapper.java

@ -50,4 +50,6 @@ public interface RoleMapper {
void updateRole(RoleVo roleVo); void updateRole(RoleVo roleVo);
//根据角色id获取频道 //根据角色id获取频道
String getChannel(Integer roleId); String getChannel(Integer roleId);
//获取角色频道
String getRoleChannel(Integer roleId);
} }

2
src/main/java/com/example/demo/mapper/coin/WorkBenchMapper.java

@ -57,4 +57,6 @@ public interface WorkBenchMapper {
List<WorkbenchRevenue> getRevenue( @Param("markets") List<String> markets, List<WorkbenchRevenue> getRevenue( @Param("markets") List<String> markets,
@Param("startDate") Date startDate, @Param("startDate") Date startDate,
@Param("endDate") Date endDate); @Param("endDate") Date endDate);
//获取精确的各地区数据
List<WorkbenchFullStatistics> getExactByMarketAndDate(List<String> markets, Date startDate, Date endDate);
} }

4
src/main/java/com/example/demo/service/bean/BeanConsumeService.java

@ -30,7 +30,7 @@ public interface BeanConsumeService {
Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan); Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan);
//筛选查询文章消费 //筛选查询文章消费
Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle); Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle);
//消费金合计数
//消费金合计数
BeanConsumeGold sumConsumeGold(Page page); BeanConsumeGold sumConsumeGold(Page page);
//查询直播礼物 //查询直播礼物
List<String> getLiveGift(); List<String> getLiveGift();
@ -39,4 +39,6 @@ public interface BeanConsumeService {
//筛选查询小黄车消费 //筛选查询小黄车消费
Object selectCartBy(Integer pageNum, Integer pageSize, BeanConsumeCartDTO beanConsumeCartDTO); Object selectCartBy(Integer pageNum, Integer pageSize, BeanConsumeCartDTO beanConsumeCartDTO);
//获取角色的频道权限
String getRoleLiveChannel(Integer roleId);
} }

3
src/main/java/com/example/demo/service/cash/CashCollectionService.java

@ -22,6 +22,8 @@ import java.util.List;
public interface CashCollectionService { public interface CashCollectionService {
//新增收款订单 //新增收款订单
String add(CashCollection cashCollection); String add(CashCollection cashCollection);
//赠送免费金币
String addFreeCoin(CashCollection cashCollection);
//撤回未审核的收款订单 //撤回未审核的收款订单
String cancel(String orderCode); String cancel(String orderCode);
//编辑并重新提交收款订单 //编辑并重新提交收款订单
@ -42,4 +44,5 @@ public interface CashCollectionService {
CashCollection selectByGoldCoinOrderCode(String orderNo); CashCollection selectByGoldCoinOrderCode(String orderNo);
//同步事务方法 //同步事务方法
void processBatch(List<GOrder> gOrders); void processBatch(List<GOrder> gOrders);
} }

2
src/main/java/com/example/demo/service/coin/WorkbenchService.java

@ -50,4 +50,6 @@ public interface WorkbenchService {
WorkbenchCard getSingleGraph(Date startDate, Date endDate, List<String> markets); WorkbenchCard getSingleGraph(Date startDate, Date endDate, List<String> markets);
//获取总营收 //获取总营收
List<WorkbenchRevenue> getTotalRevenue(Date startDate, Date endDate, List<String> markets); List<WorkbenchRevenue> getTotalRevenue(Date startDate, Date endDate, List<String> markets);
//获取精确时间内的工作台图表数据
WorkbenchCard getExactGraph(Date startDate, Date endDate, List<String> markets);
} }

23
src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java

@ -209,14 +209,37 @@ public class BeanConsumeServiceImpl implements BeanConsumeService {
return new PageInfo<>(beanConsumeCarts); return new PageInfo<>(beanConsumeCarts);
} }
//获取角色的频道权限
@Override
public String getRoleLiveChannel(Integer roleId) {
return roleMapper.getRoleChannel(roleId);
}
@Override @Override
public BeanConsumeGold sumConsumeGold(Page page) { public BeanConsumeGold sumConsumeGold(Page page) {
BeanConsumeGold gold = new BeanConsumeGold(); BeanConsumeGold gold = new BeanConsumeGold();
Integer payType = page.getPayType(); Integer payType = page.getPayType();
if (payType==1) { if (payType==1) {
//设置频道权限
String channel=roleMapper.getChannel(page.getBeanConsumeLive().getRoleId());
if (channel==null){
page.getBeanConsumeLive().setLiveChannel(null);
}
if (!channel.equals("全部")){
page.getBeanConsumeLive().setLiveChannel(channel);
}
//直播消费合计 //直播消费合计
gold = liveMapper.selectSumLiveBy(page.getBeanConsumeLive()); gold = liveMapper.selectSumLiveBy(page.getBeanConsumeLive());
}else if (payType==7) { }else if (payType==7) {
//设置频道权限
String channel=roleMapper.getChannel(page.getBeanConsumeFan().getRoleId());
if (channel==null){
page.getBeanConsumeFan().setChannel(null);
}
if (!channel.equals("全部")){
page.getBeanConsumeFan().setChannel(channel);
}
//充值消费合计 //充值消费合计
gold = beanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan()); gold = beanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan());
}else if (payType==8) { }else if (payType==8) {

52
src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java

@ -129,6 +129,58 @@ public class CashAuditServiceImpl implements CashAuditService {
user.setRechargeNum(1); //充值次数加一 user.setRechargeNum(1); //充值次数加一
auditMapper.updateUserGold(user); auditMapper.updateUserGold(user);
} }
if (order.getGoodsName().equals("免费金币赠送")) {
//往金币订单表加一条充值记录
UserGoldRecord rechargeOrder = new UserGoldRecord();
rechargeOrder.setOrderCode(orderCode.replaceFirst("^XJ_", "XJCZ_"));
rechargeOrder.setJwcode(order.getJwcode());
rechargeOrder.setActivity(order.getActivity());
rechargeOrder.setPermanentGold(0);
// 获取当前月份1-12
int currentMonth = LocalDate.now().getMonthValue();
// 根据当前月份设置对应字段
if (currentMonth >= 1 && currentMonth <= 6) {
// 1-6月设置12月额度6月保持默认值
rechargeOrder.setFreeJune(0);
rechargeOrder.setFreeDecember(order.getFreeGold());
} else {
// 7-12月设置6月额度12月保持默认值
rechargeOrder.setFreeJune(order.getFreeGold());
rechargeOrder.setFreeDecember(0);
}
rechargeOrder.setSumGold(order.getFreeGold());
rechargeOrder.setRemark(order.getRemark());
rechargeOrder.setPayPlatform("金币系统");
rechargeOrder.setAdminId(order.getSubmitterId());
rechargeOrder.setAuditId(auditId);
rechargeOrder.setType((byte) 0);
rechargeOrder.setAuditStatus(1);
rechargeOrder.setCreateTime(new Date());
rechargeMapper.add(rechargeOrder);
//往ERP加一条充值数据
GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
(double) (order.getFreeGold()) / 100,
order.getRemark(), 0, auditName, "金币充值");
//修改用户余额添加金币
User user = new User();
user.setJwcode(order.getJwcode());
user.setSumConsumePermanent(BigDecimal.valueOf(0));
// 根据当前月份设置对应字段
if (currentMonth >= 1 && currentMonth <= 6) {
// 1-6月设置12月额度6月保持默认值
user.setSumFreeJune(BigDecimal.valueOf(0));
user.setSumFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
user.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
} else {
// 7-12月设置6月额度12月保持默认值
user.setSumFreeJune(BigDecimal.valueOf(order.getFreeGold()));
user.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeGold()));
user.setSumFreeDecember(BigDecimal.valueOf(0));
}
user.setCurrentPermanentGold(BigDecimal.valueOf(0));
user.setRechargeNum(1); //充值次数加一
auditMapper.updateUserGold(user);
}
} else if (action == 2) { //驳回 } else if (action == 2) { //驳回
updateOrder.setStatus(2); updateOrder.setStatus(2);
updateOrder.setRejectReason(rejectReason); updateOrder.setRejectReason(rejectReason);

90
src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java

@ -29,6 +29,7 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -69,7 +70,7 @@ public class CashCollectionServiceImpl implements CashCollectionService {
throw new IllegalArgumentException("活动不能为空"); throw new IllegalArgumentException("活动不能为空");
} }
if (cashCollection.getGoodsName() == null|| cashCollection.getGoodsName().isEmpty()) { if (cashCollection.getGoodsName() == null|| cashCollection.getGoodsName().isEmpty()) {
throw new IllegalArgumentException("商品名不能为空");
throw new IllegalArgumentException("产品名称不能为空");
} }
if (cashCollection.getGoodsName().equals("金币充值")) { if (cashCollection.getGoodsName().equals("金币充值")) {
if (cashCollection.getPermanentGold() == 0 && cashCollection.getFreeGold() == 0) { if (cashCollection.getPermanentGold() == 0 && cashCollection.getFreeGold() == 0) {
@ -84,10 +85,10 @@ public class CashCollectionServiceImpl implements CashCollectionService {
throw new IllegalArgumentException("数量单位不能为空"); throw new IllegalArgumentException("数量单位不能为空");
} }
} }
if (cashCollection.getPaymentCurrency() == null || cashCollection.getPaymentCurrency().isEmpty()) {
if (cashCollection.getPaymentCurrencyOrig() == null || cashCollection.getPaymentCurrencyOrig().isEmpty()) {
throw new IllegalArgumentException("支付币种不能为空"); throw new IllegalArgumentException("支付币种不能为空");
} }
if (cashCollection.getPaymentAmount() == null || cashCollection.getPaymentAmount().compareTo(BigDecimal.ZERO) == 0) {
if (cashCollection.getPaymentAmountOrig() == null || cashCollection.getPaymentAmountOrig().compareTo(BigDecimal.ZERO) == 0) {
throw new IllegalArgumentException("支付金额不能为空"); throw new IllegalArgumentException("支付金额不能为空");
} }
if (cashCollection.getPayType() == null|| cashCollection.getPayType().isEmpty()) { if (cashCollection.getPayType() == null|| cashCollection.getPayType().isEmpty()) {
@ -112,8 +113,8 @@ public class CashCollectionServiceImpl implements CashCollectionService {
cashRecord.setNumUnit(cashCollection.getNumUnit()); //数量单位 cashRecord.setNumUnit(cashCollection.getNumUnit()); //数量单位
cashRecord.setPermanentGold(cashCollection.getPermanentGold()); //永久金币 cashRecord.setPermanentGold(cashCollection.getPermanentGold()); //永久金币
cashRecord.setFreeGold(cashCollection.getFreeGold()); //免费金币 cashRecord.setFreeGold(cashCollection.getFreeGold()); //免费金币
cashRecord.setPaymentCurrency(cashCollection.getPaymentCurrency()); //付款币种
cashRecord.setPaymentAmount(cashCollection.getPaymentAmount()); //付款金额
cashRecord.setPaymentCurrencyOrig(cashCollection.getPaymentCurrencyOrig()); //付款币种
cashRecord.setPaymentAmountOrig(cashCollection.getPaymentAmountOrig()); //付款金额
cashRecord.setReceivedMarket(cashCollection.getReceivedMarket()); //到账地区 cashRecord.setReceivedMarket(cashCollection.getReceivedMarket()); //到账地区
cashRecord.setPayType(cashCollection.getPayType()); //支付方式 cashRecord.setPayType(cashCollection.getPayType()); //支付方式
cashRecord.setPayTime(cashCollection.getPayTime()); //付款时间 cashRecord.setPayTime(cashCollection.getPayTime()); //付款时间
@ -142,6 +143,57 @@ public class CashCollectionServiceImpl implements CashCollectionService {
return "添加成功"; return "添加成功";
} }
@Override
public String addFreeCoin(CashCollection cashCollection) {
if (cashCollection.getJwcode() == null) {
throw new IllegalArgumentException("精网号不能为空");
}
if (cashCollection.getJwcode() < 10000000 || cashCollection.getJwcode() > 99999999) {
throw new IllegalArgumentException("精网号必须为8位");
}
if (cashCollection.getName() == null || cashCollection.getName().isEmpty()){
throw new IllegalArgumentException("客户姓名不能为空");
}
if (cashCollection.getActivity() == null || cashCollection.getActivity().isEmpty()) {
throw new IllegalArgumentException("活动不能为空");
}
if (cashCollection.getFreeGold() == 0) {
throw new IllegalArgumentException("免费金币数量不能为空");
}
//生成订单号后半部分
String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
CashRecord cashRecord = new CashRecord();
//构建订单信息
cashRecord.setOrderCode("XJ_" + orderNumber); //订单号
cashRecord.setJwcode(cashCollection.getJwcode()); //精网号
cashRecord.setName(cashCollection.getName()); //客户姓名
cashRecord.setActivity(cashCollection.getActivity()); // 活动
cashRecord.setGoodsName("免费金币赠送"); //商品名称
cashRecord.setFreeGold(cashCollection.getFreeGold()); //免费金币
cashRecord.setRemark(cashCollection.getRemark()); //备注
cashRecord.setStatus(0); //订单状态付款线下财务待审核
cashRecord.setSubmitterId(cashCollection.getSubmitterId()); //提交人ID
cashRecord.setSubmitterMarket(cashCollection.getSubmitterMarket());
cashRecord.setOrderType(1); //订单类型1-收款
cashRecord.setMarket(cashCollection.getMarket());
//地区根据jwcode插入
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
//插入新收款订单
cashCollectionMapper.add(cashRecord);
// 发送收款创建消息
Messages message = new Messages();
message.setJwcode(cashRecord.getJwcode());
message.setName(cashRecord.getName());
message.setStatus(cashRecord.getStatus());
message.setDesc(cashRecord.getJwcode()+"用户的现金收款申请待审核,请前往审核");
message.setTitle("现金收款--赠送免费金币");
message.setType(1);
message.setTypeId(cashRecord.getId());
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
return "添加成功";
}
//撤回未审核的订单 //撤回未审核的订单
@Override @Override
public String cancel(String orderCode) { public String cancel(String orderCode) {
@ -287,7 +339,9 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//补全手续费等内容 //补全手续费等内容
@Override @Override
public String complete(CashRecord cashRecord) { public String complete(CashRecord cashRecord) {
if (!Objects.equals(cashRecord.getPaymentCurrency(), cashRecord.getReceivedCurrency())){
throw new IllegalArgumentException("支付币种(转换后)和到账币种不一致");
}
int rows = cashCollectionMapper.complete(cashRecord); int rows = cashCollectionMapper.complete(cashRecord);
@ -351,6 +405,9 @@ public User getNameAndMarket(Integer jwcode) {
log.error("失败订单ID: {}", failedIds); log.error("失败订单ID: {}", failedIds);
// 可存入 error_log 供人工处理 // 可存入 error_log 供人工处理
// 这里选择继续下一批容忍部分失败 // 这里选择继续下一批容忍部分失败
} }
@ -375,20 +432,21 @@ public User getNameAndMarket(Integer jwcode) {
cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode())); cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode()));
if (gOrder.getType().equals("gold")){ //充金豆 if (gOrder.getType().equals("gold")){ //充金豆
cashRecord.setActivity("Link日常充值");
cashRecord.setActivity("99");
cashRecord.setGoodsName("Link充值金豆"); cashRecord.setGoodsName("Link充值金豆");
cashRecord.setRemark("Link充值金豆"); cashRecord.setRemark("Link充值金豆");
cashRecord.setNumUnit("个"); cashRecord.setNumUnit("个");
cashRecord.setPermanentGold(0); cashRecord.setPermanentGold(0);
cashRecord.setGoodNum(gOrder.getCount()); cashRecord.setGoodNum(gOrder.getCount());
cashRecord.setPermanentGold(gOrder.getPrice().intValue()*100);
} }
if (gOrder.getType().equals("gold_coin")){//充金币 if (gOrder.getType().equals("gold_coin")){//充金币
cashRecord.setActivity("Link日常充值");
cashRecord.setActivity("98");
cashRecord.setGoodsName("Link充值金币"); cashRecord.setGoodsName("Link充值金币");
cashRecord.setRemark("Link充值金币"); cashRecord.setRemark("Link充值金币");
cashRecord.setPermanentGold(gOrder.getCount()*100); cashRecord.setPermanentGold(gOrder.getCount()*100);
cashRecord.setGoodNum(0);
cashRecord.setGoodNum(gOrder.getCount());
} }
cashRecord.setOrderCode(gOrder.getOrderNo()); cashRecord.setOrderCode(gOrder.getOrderNo());
@ -401,25 +459,25 @@ public User getNameAndMarket(Integer jwcode) {
cashRecord.setPayload("IOS"); cashRecord.setPayload("IOS");
break; break;
case 5: case 5:
cashRecord.setPayType("Stripe-链接收款");
cashRecord.setPayType("Stripe");
cashRecord.setReceivedMarket("13"); cashRecord.setReceivedMarket("13");
cashRecord.setPayload("Stripe"); cashRecord.setPayload("Stripe");
break; break;
case 6: case 6:
cashRecord.setPayType("PaymentAsia-链接收款");
cashRecord.setPayType("PaymentAsia");
cashRecord.setReceivedMarket("13"); cashRecord.setReceivedMarket("13");
cashRecord.setPayload("PaymentAsia"); cashRecord.setPayload("PaymentAsia");
break; break;
case 7: case 7:
cashRecord.setPayType("Ipay88-链接收款");
cashRecord.setPayType("Ipay88");
cashRecord.setReceivedMarket("5"); cashRecord.setReceivedMarket("5");
cashRecord.setPayload("Ipay88"); cashRecord.setPayload("Ipay88");
break; break;
case 9: case 9:
cashRecord.setPayType("FistData");
cashRecord.setPayType("FirstData");
cashRecord.setReceivedMarket("4"); cashRecord.setReceivedMarket("4");
cashRecord.setBankCode(gOrder.getFirstdataIpgTransactionId()); cashRecord.setBankCode(gOrder.getFirstdataIpgTransactionId());
cashRecord.setPayload("FistData");
cashRecord.setPayload("FirstData");
break; break;
default: default:
break; break;
@ -428,7 +486,9 @@ public User getNameAndMarket(Integer jwcode) {
cashRecord.setFreeGold(0); cashRecord.setFreeGold(0);
cashRecord.setPaymentCurrency(""); cashRecord.setPaymentCurrency("");
cashRecord.setPaymentAmount(BigDecimal.valueOf(0)); cashRecord.setPaymentAmount(BigDecimal.valueOf(0));
cashRecord.setPayTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.UTC));
//转换时间戳加上时区偏移
cashRecord.setPayTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.of("+08:00")));
cashRecord.setAuditTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.of("+08:00")));
cashRecord.setStatus(3); cashRecord.setStatus(3);
cashRecord.setSubmitterId(99999); cashRecord.setSubmitterId(99999);
//存入现金库 //存入现金库

5
src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java

@ -204,10 +204,9 @@ public class ConsumeServiceImpl implements ConsumeService {
}catch (Exception e){ }catch (Exception e){
log.warn("消耗累加失败,主流程继续 | jwcode={}", consumeUser.getJwcode(), e); log.warn("消耗累加失败,主流程继续 | jwcode={}", consumeUser.getJwcode(), e);
} }
if(consumeUser.getRedMoney()==1){
redService.sendConsumeJwcode(consumeUser.getJwcode(),(consumeUser.getPrice().subtract(consumeUser.getSumGold())).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); redService.sendConsumeJwcode(consumeUser.getJwcode(),(consumeUser.getPrice().subtract(consumeUser.getSumGold())).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
// }
}
return Result.success(); return Result.success();
} }
// //

42
src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java

@ -449,6 +449,48 @@ public class WorkbenchServiceImpl implements WorkbenchService {
List<WorkbenchRevenue> list = workBenchMapper.getRevenue(markets, startDate, endDate); List<WorkbenchRevenue> list = workBenchMapper.getRevenue(markets, startDate, endDate);
return list; return list;
} }
// 获取精确图表数据
@Override
public WorkbenchCard getExactGraph(Date startDate, Date endDate, List<String> markets) {
if (markets == null || markets.isEmpty()) {
return new WorkbenchCard(new ArrayList<>(), new ArrayList<>(), markets, startDate, endDate,0,0,new Date());
}
// 单次批量查询
List<WorkbenchFullStatistics> statsList = workBenchMapper.getExactByMarketAndDate(markets, startDate, endDate);
// 构建 map: market -> statistics
Map<String, WorkbenchFullStatistics> statMap = statsList.stream()
.collect(Collectors.toMap(WorkbenchFullStatistics::getMarket, Function.identity()));
// 构建最终结果
List<WorkbenchMarketGraph> marketGraphs = new ArrayList<>();
for (String market : markets) {
WorkbenchFullStatistics stats = statMap.getOrDefault(market, new WorkbenchFullStatistics());
Map<String, Integer> sums = new HashMap<>();
sums.put("recharge", stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0);
sums.put("money", stats.getTotalMoney() != null ? stats.getTotalMoney() : 0);
sums.put("rFree", sums.get("recharge") - sums.get("money"));
sums.put("cPermanent", stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0);
sums.put("cFree", stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0);
sums.put("cTask", stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0);
sums.put("consume", sums.get("cPermanent") + sums.get("cFree") + sums.get("cTask"));
WorkbenchMarketGraph graph = new WorkbenchMarketGraph();
graph.setMarket(market);
graph.setSumRechargePermanent(sums.get("money"));
graph.setSumRechargeFree(sums.get("rFree"));
graph.setSumConsumePermanent(sums.get("cPermanent"));
graph.setSumConsumeFree(sums.get("cFree"));
graph.setSumConsumeTask(sums.get("cTask"));
graph.setSumConsume(sums.get("consume"));
marketGraphs.add(graph);
}
return new WorkbenchCard(new ArrayList<>(), marketGraphs, markets, startDate, endDate,0,0,new Date());
}
//获取最近的更新时间 //获取最近的更新时间
private Date findLatestUpdateTime(List<Statistics> statsList) { private Date findLatestUpdateTime(List<Statistics> statsList) {

2
src/main/resources/application-dev.yml

@ -90,7 +90,7 @@ spring:
file: file:
upload: upload:
url: http://39.101.133.168:8828/hljw/api/aws/upload
url: http://api.homilychart.com/hljwgo/api/file/upload
feishu: feishu:
webhook: webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877 url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877

8
src/main/resources/application-test.yml

@ -78,9 +78,9 @@ spring:
data: data:
redis: redis:
database: 0 database: 0
host: 54.255.212.181
port: 10703
password: Ngc0FYUTA6h3wC5J
host: localhost
port: 6379
password: 123456
lettuce: lettuce:
pool: pool:
@ -90,7 +90,7 @@ spring:
min-idle: 10 min-idle: 10
file: file:
upload: upload:
url: http://39.101.133.168:8828/hljw/api/aws/upload
url: http://api.homilychart.com/hljwgo/api/file/upload
feishu: feishu:
webhook: webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877 url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877

2
src/main/resources/application.yml

@ -41,7 +41,7 @@ upload:
file: file:
upload: upload:
url: http://39.101.133.168:8828/hljw/api/aws/upload
url: http://api.homilychart.com/hljwgo/api/file/upload
bean: bean:
recharge: recharge:
# url: http://api.homilychart.com/hljwgo/api/wallet/recharge # url: http://api.homilychart.com/hljwgo/api/wallet/recharge

8
src/main/resources/cashMapper/CashCollectionMapper.xml

@ -8,12 +8,12 @@
insert into insert into
cash_record_collection(order_type,jwcode,name,market,activity, cash_record_collection(order_type,jwcode,name,market,activity,
order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold, order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,received_market,
payment_currency_orig,payment_amount_orig,received_market,
pay_type,pay_time,status,submitter_id,submitter_market,payload, pay_type,pay_time,status,submitter_id,submitter_market,payload,
voucher,remark) voucher,remark)
values(#{orderType},#{jwcode},#{name},#{market},#{activity}, values(#{orderType},#{jwcode},#{name},#{market},#{activity},
#{orderCode},#{bankCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrency},
#{paymentAmount},#{receivedMarket},#{payType},#{payTime},
#{orderCode},#{bankCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrencyOrig},
#{paymentAmountOrig},#{receivedMarket},#{payType},#{payTime},
#{status},#{submitterId},#{submitterMarket},#{payload},#{voucher},#{remark}) #{status},#{submitterId},#{submitterMarket},#{payload},#{voucher},#{remark})
</insert> </insert>
<!-- <insert id="syncToCashRecord"> <!-- <insert id="syncToCashRecord">
@ -231,7 +231,7 @@
add_time,is_synced add_time,is_synced
from g_order from g_order
where is_synced=0 and state=1 and pay_style in(3,5,6,7,9) where is_synced=0 and state=1 and pay_style in(3,5,6,7,9)
and success_time>1665246960
and success_time>=1763136000
limit #{size} limit #{size}
</select> </select>
<select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection"> <select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection">

11
src/main/resources/cashMapper/CashRefundMapper.xml

@ -173,7 +173,8 @@
crc.voucher, crc.voucher,
crc.remark, crc.remark,
crc.payment_currency, crc.payment_currency,
crc.payment_amount
crc.payment_amount,
crr.reject_reason
from cash_record_refund crr from cash_record_refund crr
left join lhl_audit la on la.id = crr.audit_id left join lhl_audit la on la.id = crr.audit_id
left join cash_record_collection crc on crc.id = crr.related_id left join cash_record_collection crc on crc.id = crr.related_id
@ -250,7 +251,8 @@
la.area_servise, la.area_servise,
la.area_finance, la.area_finance,
la.area_charge, la.area_charge,
la.head_finance
la.head_finance,
crr.reject_reason
from cash_record_refund crr from cash_record_refund crr
left join cash_record_collection crc on crc.id = crr.related_id left join cash_record_collection crc on crc.id = crr.related_id
left join lhl_audit la on la.id = crr.audit_id left join lhl_audit la on la.id = crr.audit_id
@ -328,6 +330,8 @@
crc.num_unit, crc.num_unit,
crr.refund_model, crr.refund_model,
crr.refund_currency, crr.refund_currency,
crr.permanent_gold,
crr.free_gold,
crr.refund_amount, crr.refund_amount,
crr.refund_channels, crr.refund_channels,
crr.refund_voucher, crr.refund_voucher,
@ -340,7 +344,8 @@
la.area_servise, la.area_servise,
la.area_finance, la.area_finance,
la.area_charge, la.area_charge,
la.head_finance
la.head_finance,
crr.reject_reason
from cash_record_refund crr from cash_record_refund crr
left join cash_record_collection crc on crc.id = crr.related_id left join cash_record_collection crc on crc.id = crr.related_id
left join lhl_audit la on la.id = crr.audit_id left join lhl_audit la on la.id = crr.audit_id

4
src/main/resources/mapper/RoleMapper.xml

@ -120,5 +120,9 @@
<select id="getChannel" resultType="java.lang.String"> <select id="getChannel" resultType="java.lang.String">
select channel from role where id = #{roleId} select channel from role where id = #{roleId}
</select> </select>
<!--获取角色的频道权限-->
<select id="getRoleChannel" resultType="java.lang.String">
select channel from role where id = #{roleId}
</select>
</mapper> </mapper>

20
src/main/resources/mapper/WorkBenchMapper.xml

@ -179,7 +179,7 @@
SUM(CASE WHEN r.id = 7 THEN cr.received_amount/100 ELSE 0 END) AS vdn, SUM(CASE WHEN r.id = 7 THEN cr.received_amount/100 ELSE 0 END) AS vdn,
SUM(CASE WHEN r.id = 8 THEN cr.received_amount/100 ELSE 0 END) AS krw, SUM(CASE WHEN r.id = 8 THEN cr.received_amount/100 ELSE 0 END) AS krw,
ROUND( SUM(cr.received_amount/100 * r.num), 2) AS totalSGD ROUND( SUM(cr.received_amount/100 * r.num), 2) AS totalSGD
FROM cash_record cr
FROM cash_record_collection cr
JOIN market m ON cr.received_market = m.id JOIN market m ON cr.received_market = m.id
JOIN rate r ON cr.received_currency = r.id JOIN rate r ON cr.received_currency = r.id
WHERE cr.received_currency IN (2,3,4,5,6,7,8) -- 只统计这7种币 WHERE cr.received_currency IN (2,3,4,5,6,7,8) -- 只统计这7种币
@ -187,7 +187,23 @@
<foreach item="market" collection="markets" open="(" separator="," close=")">#{market}</foreach> <foreach item="market" collection="markets" open="(" separator="," close=")">#{market}</foreach>
AND cr.audit_time BETWEEN #{startDate} AND #{endDate} AND cr.audit_time BETWEEN #{startDate} AND #{endDate}
AND cr.order_type=1 AND cr.order_type=1
AND cr.status IN (1,3,4)
AND cr.status IN (0,1,3,4,6)
GROUP BY m.name; GROUP BY m.name;
</select> </select>
<!--获取精确的各地区数据-->
<select id="getExactByMarketAndDate" resultType="com.example.demo.domain.vo.coin.WorkbenchFullStatistics">
SELECT
CASE WHEN m.name IS NULL THEN '其他' ELSE m.name END AS market,
SUM(CASE WHEN ugr.type=0 THEN ugr.sum_gold ELSE 0 END) AS totalRecharge,
SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold ELSE 0 END) AS totalMoney,
SUM(CASE WHEN ugr.type=1 THEN ugr.permanent_gold ELSE 0 END) AS totalConsumePermanent,
SUM(CASE WHEN ugr.type=1 THEN ugr.free_june + ugr.free_december ELSE 0 END) AS totalConsumeFree,
SUM(CASE WHEN ugr.type=1 THEN ugr.task_gold ELSE 0 END) AS totalConsumeTask
FROM user_gold_record ugr
left join user u on ugr.jwcode=u.jwcode
left join market m on u.market=m.id
WHERE u.flag=1 and ugr.flag=1 and ugr.audit_status in (1,3)
AND ugr.create_time BETWEEN #{startDate} AND #{endDate}
GROUP BY u.market;
</select>
</mapper> </mapper>
Loading…
Cancel
Save