update 广播模块,新增广播按钮和跳转路径。定时任务新增开关功能

This commit is contained in:
yyb
2025-07-08 14:22:25 +08:00
parent c698a8244c
commit a51771db2e
21 changed files with 493 additions and 95 deletions

View File

@@ -44,7 +44,6 @@ public class ManageBroadcastController {
@PostMapping("/find/data/by/id")
@ApiOperation(value = "业务系统:用于获取m2pool广播数据")
public R<List<ManageBroadcastDto>> findDataById(@RequestBody(required = false) ManageBaseVo manageBaseVo){
return manageBroadcastService.findDataById(manageBaseVo);
}

View File

@@ -33,4 +33,10 @@ public class ManageBroadcastDto {
@ApiModelProperty(value = "创建时间",example = "2025-05-22 14:22:13")
private LocalDateTime createTime;
@ApiModelProperty(value = "按钮内容",example = "按钮内容")
private String buttonContent;
@ApiModelProperty(value = "按钮跳转路径",example = "按钮跳转路径")
private String buttonPath;
}

View File

@@ -26,7 +26,7 @@ public class ManageMiningUserOnlineDto {
//private String minerUser;
@ApiModelProperty(value = "时间",example = "2025-06-27 16:30:00",required = true)
private LocalDateTime date;
private Date date;
@ApiModelProperty(value = "在线数量",example = "15")
private Integer onlineNum;

View File

@@ -7,6 +7,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -21,6 +22,9 @@ import java.util.List;
@ApiModel(value = "WalletEarningsInfoDto", description = "钱包收益详情信息返回对象")
public class WalletEarningsInfoDto {
@ApiModelProperty(value = "钱包余额",example = "100000.0000000000")
private BigDecimal accountBalance;
@ApiModelProperty(value = "钱包历史地址集合",example = "")
List<HistoryBalanceDto> historyBalance;

View File

@@ -36,4 +36,10 @@ public class ManageBroadcast {
private LocalDateTime updateTime;
private Boolean del;
private String buttonContent;
private String buttonPath;
private String buttonContentEn;
}

View File

@@ -9,6 +9,7 @@ import com.m2pool.manage.vo.ManageBaseVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@@ -87,4 +88,8 @@ public interface ManageBroadcastMapper extends BaseMapper<ManageBroadcast> {
* @return
*/
List<ManageBroadcastDto> getListDataByPage();
@DistributionDB
BigDecimal getAccountBalance(@Param("user") String user, @Param("coin") String coin);
}

View File

@@ -44,7 +44,7 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
@Override
public TableDataInfo<ManageBroadcastDto> getListDataByPage(PageVo pageVo) {
PageHelper.startPage(pageVo.getPageNum(), pageVo.getPageSize());
PageHelper.startPage(pageVo.getPageNum(), pageVo.getPageSize());
List<ManageBroadcastDto> listDataByPage = manageBroadcastMapper.getListDataByPage();
return getDataTable(listDataByPage);
}
@@ -81,6 +81,8 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
collect = list.stream().map(broadcast ->
ManageBroadcastDto.builder()
.content(broadcast.getContent())
.buttonContent(broadcast.getButtonContent())
.buttonPath(broadcast.getButtonPath())
.id(broadcast.getId())
.createUser(broadcast.getCreateUser())
.updateUser(broadcast.getUpdateUser())
@@ -91,12 +93,15 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
}else{
collect = list.stream().map(broadcast -> {
//如果英文为null需要翻译并保存一下
if("".equals(broadcast.getContentEn())){
if("".equals(broadcast.getContentEn()) || "".equals(broadcast.getButtonContentEn())){
broadcast.setContentEn(TranslateUtils.translate(broadcast.getContent(), "zh", "en"));
broadcast.setButtonContentEn(TranslateUtils.translate(broadcast.getButtonContent(), "zh", "en"));
manageBroadcastMapper.updateById(broadcast);
}
return ManageBroadcastDto.builder()
.content(broadcast.getContentEn())
.buttonContent(broadcast.getButtonContentEn())
.buttonPath(broadcast.getButtonPath())
.id(broadcast.getId())
.createUser(broadcast.getCreateUser())
.updateUser(broadcast.getUpdateUser())
@@ -110,6 +115,7 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
return R.success(collect);
}
private static String SEPARATE = ",yKbjIAIgFpbdESYaE7A,";
/**
* 新增广播信息
*
@@ -118,10 +124,20 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
*/
@Override
public R<String> addBroadcast(ManageBroadcastVo broadcastVo) {
String translate = TranslateUtils.translate(broadcastVo.getContent(), "zh", "en");
String contentEn = TranslateUtils.translate(broadcastVo.getContent(), "zh", "en");
// 休眠 1 秒,确保符合 API 的 QPS 限制。可升级为高级版qps为10。不要把两个文本放到一起同时翻译会出问题
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
String buttonContentEn = TranslateUtils.translate(broadcastVo.getButtonContent(), "zh", "en");
ManageBroadcast broadcast = ManageBroadcast.builder()
.content(broadcastVo.getContent())
.contentEn(translate)
.contentEn(contentEn)
.buttonContent(broadcastVo.getButtonContent())
.buttonContentEn(buttonContentEn)
.buttonPath(broadcastVo.getButtonPath())
.createUser(SecurityUtils.getUsername())
.updateTime(LocalDateTime.now())
.build();
@@ -148,11 +164,21 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
@Override
public R<String> updateBroadcast(ManageBroadcastVo broadcastVo) {
String translate = TranslateUtils.translate(broadcastVo.getContent(), "zh", "en");
String contentEn = TranslateUtils.translate(broadcastVo.getContent(), "zh", "en");
// 休眠 1 秒,确保符合 API 的 QPS 限制。可升级为高级版qps为10。不要把两个文本放到一起同时翻译会出问题
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
String buttonContentEN = TranslateUtils.translate(broadcastVo.getButtonContent(), "zh", "en");
boolean b = this.updateById(ManageBroadcast.builder()
.id(broadcastVo.getId())
.content(broadcastVo.getContent())
.contentEn(translate)
.contentEn(contentEn)
.buttonContent(broadcastVo.getButtonContent())
.buttonContentEn(buttonContentEN)
.buttonPath(broadcastVo.getButtonPath())
.updateUser(SecurityUtils.getUsername())
.build());
if (b){
@@ -170,6 +196,8 @@ public class ManageBroadcastServiceImpl extends ServiceImpl<ManageBroadcastMappe
return R.success(ManageBroadcastDto.builder()
.content(byId.getContent())
.id(byId.getId())
.buttonPath(byId.getButtonPath())
.buttonContent(byId.getButtonContent())
.createUser(byId.getCreateUser())
.updateUser(byId.getUpdateUser())
.updateTime(byId.getUpdateTime())

View File

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.m2pool.common.core.Result.R;
import com.m2pool.common.core.constant.HttpStatus;
import com.m2pool.common.core.utils.DateUtils;
import com.m2pool.common.core.utils.StringUtils;
import com.m2pool.common.core.web.page.TableDataInfo;
import com.m2pool.manage.dto.*;
@@ -96,11 +97,13 @@ public class ManageUserServiceImpl implements ManageUserService {
@Override
public R<WalletEarningsInfoDto> getUserInfo(ManageUserInfoVo manageUserInfoVo) {
//获取账户余额
BigDecimal accountBalance = manageBroadcastMapper.getAccountBalance(manageUserInfoVo.getMinerUser(), manageUserInfoVo.getCoin());
//获取挖矿账户历史收益记录
List<ManageUserInfoDto> walletInInfo = manageBroadcastMapper.getUserInfo(manageUserInfoVo.getMinerUser(), manageUserInfoVo.getCoin(), manageUserInfoVo.getStartDate(), manageUserInfoVo.getEndDate());
//获取挖矿账户历史地址
List<HistoryBalanceDto> historyBalance = manageBroadcastMapper.getHistoryBalance(manageUserInfoVo.getMinerUser(), manageUserInfoVo.getCoin());
WalletEarningsInfoDto manageUserInfoDto = new WalletEarningsInfoDto(historyBalance,walletInInfo);
WalletEarningsInfoDto manageUserInfoDto = new WalletEarningsInfoDto(accountBalance,historyBalance,walletInInfo);
return R.success(manageUserInfoDto);
}
@@ -123,7 +126,19 @@ public class ManageUserServiceImpl implements ManageUserService {
powerUnit = new PowerUnitUtils.NetPowerUnit("GH/S", BigDecimal.valueOf(1000 * 1000 * 1000));
}
changeUnit(powerUnit, list,BigDecimal.valueOf(1000 * 1000));
list = fillMissingData(list,powerUnit.getUnit(),manageMiningUserPowerVo.getMinerUser());
if (manageMiningUserPowerVo.getStartDate()==null || manageMiningUserPowerVo.getEndDate()==null){
}
Date endDate = manageMiningUserPowerVo.getEndDate();
Date startDate = manageMiningUserPowerVo.getStartDate();
if (manageMiningUserPowerVo.getStartDate()==null || manageMiningUserPowerVo.getEndDate()==null){
endDate = DateUtils.getPreviousHalfHourOrFullHour(new Date());
startDate = DateUtils.getOneMonthAgo(endDate);
}
list = fillMissingData(list,powerUnit.getUnit(),manageMiningUserPowerVo.getMinerUser(),startDate,endDate);
return R.success(list);
}
@@ -151,21 +166,10 @@ public class ManageUserServiceImpl implements ManageUserService {
* @param dataList
* @return
*/
public static List<ManageMiningUserPowerDto> fillMissingData(List<ManageMiningUserPowerDto> dataList,String unit,String minerUser) {
if (dataList == null || dataList.size() <= 1) {
return dataList;
}
// 对数据按时间排序
dataList.sort(Comparator.comparing(ManageMiningUserPowerDto::getDate));
public static List<ManageMiningUserPowerDto> fillMissingData(List<ManageMiningUserPowerDto> dataList,String unit,String minerUser,Date startTime,Date endTime) {
List<ManageMiningUserPowerDto> resultList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
// 获取起始和结束时间
Date startTime = dataList.get(0).getDate();
Date endTime = dataList.get(dataList.size() - 1).getDate();
calendar.setTime(startTime);
Map<Long, ManageMiningUserPowerDto> timeDataMap = new HashMap<>();
for (ManageMiningUserPowerDto data : dataList) {
@@ -195,6 +199,50 @@ public class ManageUserServiceImpl implements ManageUserService {
manageMiningUserPowerVo.getCoin(),
manageMiningUserPowerVo.getStartDate(),
manageMiningUserPowerVo.getEndDate());
return R.success(minerUserOnlineStatus);
Date endDate = manageMiningUserPowerVo.getEndDate();
Date startDate = manageMiningUserPowerVo.getStartDate();
if (manageMiningUserPowerVo.getStartDate()==null || manageMiningUserPowerVo.getEndDate()==null){
endDate = DateUtils.getPreviousHalfHourOrFullHour(new Date());
startDate = DateUtils.getOneMonthAgo(endDate);
}
return R.success(fillMissingOnlineData(minerUserOnlineStatus, startDate, endDate));
}
/**
* 数据补零 30分钟时间端
* @param dataList
* @return
*/
public static List<ManageMiningUserOnlineDto> fillMissingOnlineData(List<ManageMiningUserOnlineDto> dataList,Date startTime,Date endTime) {
List<ManageMiningUserOnlineDto> resultList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startTime);
Map<Long, ManageMiningUserOnlineDto> timeDataMap = new HashMap<>();
for (ManageMiningUserOnlineDto data : dataList) {
timeDataMap.put(data.getDate().getTime(), data);
}
while (calendar.getTime().getTime() <= endTime.getTime()) {
long currentTime = calendar.getTime().getTime();
ManageMiningUserOnlineDto data = timeDataMap.get(currentTime);
if (data != null) {
resultList.add(data);
} else {
resultList.add(new ManageMiningUserOnlineDto(calendar.getTime(),0, 0));
}
// 增加 30 分钟
calendar.add(Calendar.MINUTE, 30);
}
return resultList;
}
}

View File

@@ -40,6 +40,7 @@ public class TranslateUtils {
private static String extractDstFromResponse(String response) {
try {
JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
JsonArray transResultArray = jsonObject.getAsJsonArray("trans_result");
@@ -48,7 +49,7 @@ public class TranslateUtils {
return firstResult.get("dst").getAsString();
}
} catch (Exception e) {
System.out.println("翻译结果解析失败"+e.getMessage());
System.out.println("翻译结果解析失败"+e.getMessage()+"翻译结果:"+response);
}
return "";
}

View File

@@ -25,4 +25,10 @@ public class ManageBroadcastVo{
@ApiModelProperty(value = "内容",example = "广播内容")
private String content;
@ApiModelProperty(value = "按钮内容",example = "按钮内容")
private String buttonContent;
@ApiModelProperty(value = "按钮跳转路径",example = "按钮跳转路径")
private String buttonPath;
}

View File

@@ -17,4 +17,5 @@ public class PageVo {
@ApiModelProperty(value = "每页条数",example = "20")
private Integer pageSize;
}

View File

@@ -13,7 +13,7 @@
uma.coin,
uab.balance,
uab.active,
COALESCE(uab.amount,0),
COALESCE(uab.amount,0) as amount,
uma.status
FROM
user_account_balance uab
@@ -45,18 +45,14 @@
coin = #{coin} AND `user` = #{user}
<choose>
<when test="startDate != null and endDate != null">
and `create_date` >= #{startDate} AND `create_date`<![CDATA[ <= ]]> #{endDate}
and `create_date` >= #{startDate} and `create_date`<![CDATA[ <= ]]> #{endDate}
</when>
<otherwise>
and `create_date` >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
</otherwise>
</choose>
</where>
</select>
<select id="getHistoryBalance" resultType="com.m2pool.manage.dto.HistoryBalanceDto">
SELECT
@@ -87,9 +83,15 @@
${coin}_users_30m
<where>
`user` = #{minerUser}
<if test="startDate != null and endDate != null">
and `date` >= #{startDate} AND `date`<![CDATA[ <= ]]> #{endDate}
</if>
<choose>
<when test="startDate != null and endDate != null">
and `date` >= #{startDate} and `date`<![CDATA[ <= ]]> #{endDate}
</when>
<otherwise>
and `date` >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
</otherwise>
</choose>
</where>
</select>
@@ -102,9 +104,14 @@
${coin}_mhsv2
<where>
`user` = #{minerUser}
<if test="startDate != null and endDate != null">
and `date` >= #{startDate} AND `date`<![CDATA[ <= ]]> #{endDate}
</if>
<choose>
<when test="startDate != null and endDate != null">
and `date` >= #{startDate} and `date`<![CDATA[ <= ]]> #{endDate}
</when>
<otherwise>
and `date` >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
</otherwise>
</choose>
</where>
group by `date`
</select>
@@ -118,10 +125,20 @@
create_user as createUser,
update_user as updateUser,
update_time as updateTime,
create_time as createTime
create_time as createTime,
button_content as buttonContent,
button_path as buttonPath
FROM
manage_broadcast
where del =false
</select>
<select id="getAccountBalance" resultType="java.math.BigDecimal">
SELECT
SUM(amount)
FROM
wallet_in
where
coin = #{coin} AND `user` = #{user} AND state = 0
</select>
</mapper>