提交 76f49bbe authored 作者: 吕本才's avatar 吕本才

修改百分比,没有小数点的,清掉

上级 c124c1b1
package com.ruoyi.web.controller.dealer;
import cn.hutool.core.io.FileUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.dealer.domain.dto.DealerBigScreenDynamicRes;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupListRes;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupResultRes;
import com.ruoyi.dealer.domain.dto.DealerRoundDetailListRes;
import com.ruoyi.dealer.domain.dto.*;
import com.ruoyi.dealer.service.DealerRoundInfoService;
import com.ruoyi.dealer.service.IDealerBaseInfoService;
import com.ruoyi.dealer.service.IDealerRoundResultService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
/**
......@@ -23,6 +27,7 @@ import java.util.List;
* @author ruoyi
*/
@RestController
@Slf4j
@RequestMapping("/dealer/bigScreen")
public class DealerBigScreenController extends BaseController {
@Autowired
......@@ -44,6 +49,8 @@ public class DealerBigScreenController extends BaseController {
/**
* 第一列 按照分组 A B C 获取前几名
* 大屏个人分组接口--右侧 鲲鹏组 青龙组 麒麟组
*
* @param CategoryName
* @return
*/
......@@ -56,7 +63,6 @@ public class DealerBigScreenController extends BaseController {
/**
* 第二轮 按照分组获取分组合计的
*
*/
@GetMapping("/group/region")
public AjaxResult groupTotalList() {
......@@ -66,17 +72,51 @@ public class DealerBigScreenController extends BaseController {
/**
* 按照轮次查询轮次结果
*
*/
@GetMapping("/result/round/{roundTime}")
public AjaxResult groupRoundList(@PathVariable("roundTime") Integer roundTime, String phone, String dealerName) {
List<DealerRoundDetailListRes> list = resultService.groupRoundList(roundTime,phone,dealerName);
List<DealerRoundDetailListRes> list = resultService.groupRoundList(roundTime, phone, dealerName);
return success(list);
}
@GetMapping("/result/totalResult")
public AjaxResult totalResult() {
List<DealerBigScreenTotalResultRes> list = resultService.totalResult();
return success(list);
}
@GetMapping("/zip/download")
public void downloadZip(HttpServletResponse response) {
// 分组导出 写入到多个excel,并合并到zip文件导出
try {
String zipFilePath = resultService.downloadZip(); // 调用服务层
File zipFile = new File(zipFilePath);
// 设置响应头
response.setContentType("application/zip");
String encodedFileName = URLEncoder.encode("竞拍分组结果.zip", "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
// 输出 ZIP 文件内容到浏览器
try (FileInputStream fis = new FileInputStream(zipFile);
OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.flush();
}
// 清理资源
FileUtil.del(zipFile); // 删除 ZIP 文件
} catch (Exception e) {
log.error("导出 ZIP 失败", e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
}
......@@ -7,7 +7,7 @@ ruoyi:
# 版权年份
copyrightYear: 2025
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: D:/ruoyi/uploadPath
profile: /home/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
......@@ -74,7 +74,7 @@ token:
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
expireTime: 300
# MyBatis配置
#mybatis:
......
package com.ruoyi.common.utils;
/**
* 处理结果中的百分比计算,处理小数点问题
*/
public class NumberUtil {
}
package com.ruoyi.framework.web.service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
......@@ -22,10 +13,20 @@ import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* token验证处理
*
*
* @author ruoyi
*/
@Component
......@@ -45,6 +46,9 @@ public class TokenService
@Value("${token.expireTime}")
private int expireTime;
/**
*
*/
protected static final long MILLIS_SECOND = 1000;
protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
......@@ -56,7 +60,7 @@ public class TokenService
/**
* 获取用户身份信息
*
*
* @return 用户信息
*/
public LoginUser getLoginUser(HttpServletRequest request)
......@@ -107,7 +111,7 @@ public class TokenService
/**
* 创建令牌
*
*
* @param loginUser 用户信息
* @return 令牌
*/
......@@ -126,7 +130,7 @@ public class TokenService
/**
* 验证令牌有效期,相差不足20分钟,自动刷新缓存
*
*
* @param loginUser 登录信息
* @return 令牌
*/
......@@ -142,7 +146,7 @@ public class TokenService
/**
* 刷新令牌有效期
*
*
* @param loginUser 登录信息
*/
public void refreshToken(LoginUser loginUser)
......@@ -156,7 +160,7 @@ public class TokenService
/**
* 设置用户代理信息
*
*
* @param loginUser 登录信息
*/
public void setUserAgent(LoginUser loginUser)
......
......@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
......@@ -75,7 +74,7 @@ public class DealerRoundResult {
/**
* 预付款达成的百分比
*/
private BigDecimal paymentPercentage;
private String paymentPercentage;
private Integer version;
......
......@@ -10,6 +10,7 @@ public class DealerBigScreenGroupResultRes {
private Integer roundTime;
private String groupName;
private String salesRegionGroupName;
private Integer paymentTtl;
private Integer goalTtlAct;
......
......@@ -21,5 +21,6 @@ public class DealerRoundDetailListRes {
private String paymentPercentage;
private Integer paymentTtl;
private Integer goalTtlAct;
private String salesRegionGroupName;
}
......@@ -25,7 +25,6 @@ public interface DealerRoundResultMapper extends BaseMapper<DealerRoundResult> {
"order by payment_percentage desc limit 4")
List<DealerBigScreenGroupResultRes> getGroupList(String categoryName);
@Select("select result.round_time, result.sales_region_group_name as group_Name , sum(result.payment_ttl) as payment_ttl,sum(result.goal_ttl_act) as goal_ttl_act , 100*sum(result.payment_ttl)/sum(result.goal_ttl_act) as payment_percentage from dealer_round_result result " +
"where round_time = 2 " +
"group by round_time ,result.sales_region_group_name order by payment_percentage desc ")
// 手动指定映射:column(数据库字段)→ property(Java属性)
@Results({
......
......@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.dealer.domain.DealerRoundResult;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupListRes;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupResultRes;
import com.ruoyi.dealer.domain.dto.DealerBigScreenTotalResultRes;
import com.ruoyi.dealer.domain.dto.DealerRoundDetailListRes;
import java.util.List;
......@@ -21,5 +22,9 @@ public interface IDealerRoundResultService extends IService<DealerRoundResult> {
List<DealerRoundDetailListRes> groupRoundList(Integer roundTime, String phone, String dealerName);
int initRoundInfo();
String downloadZip();
List<DealerBigScreenTotalResultRes> totalResult();
// 自定义业务方法声明(可选)
}
......@@ -92,8 +92,11 @@ public class DealerBaseInfoImpl extends ServiceImpl<DealerBaseInfoMapper, Dealer
}
private String getPercentage(Integer paymentTtl, Integer goalTtlAct) {
return new BigDecimal(paymentTtl).multiply(new BigDecimal(100)).divide(new BigDecimal(goalTtlAct),2,RoundingMode.HALF_UP )
.toString();
return new BigDecimal(paymentTtl)
.multiply(new BigDecimal(100))
.divide(new BigDecimal(goalTtlAct),2,RoundingMode.HALF_UP )
.stripTrailingZeros()
.toPlainString();
}
}
......@@ -80,7 +80,7 @@ public class DealerRoundInfoServiceImpl extends ServiceImpl<DealerRoundInfoMappe
//更新结果表数据
DealerRoundResult resultInfo = new DealerRoundResult();
resultInfo.setDealerId(dealerRoundInfoReq.getDealerId());
resultInfo.setDealerId(userId);
resultInfo.setDealerName(dealerRoundInfoReq.getDealerName());
// 手机号传输 是脱敏手机号
......@@ -88,7 +88,7 @@ public class DealerRoundInfoServiceImpl extends ServiceImpl<DealerRoundInfoMappe
resultInfo.setRoundTime(dealerRoundInfoReq.getRoundTime());
resultInfo.setPaymentTtl(dealerRoundInfoReq.getPaymentTtlNew());
resultInfo.setPaymentTtlPre(dealerRoundInfoReq.getPaymentTtl());
resultInfo.setPaymentPercentage(new BigDecimal(getPercentage(dealerRoundInfoReq.getPaymentTtl(), dealerRoundInfoReq.getGoalTtlAct(),4)));
resultInfo.setPaymentPercentage(getPercentage(dealerRoundInfoReq.getPaymentTtlNew(), dealerRoundInfoReq.getGoalTtlAct(),4) + "%");
resultInfo.setGoalTtlAct(dealerRoundInfoReq.getGoalTtlAct());
resultInfo.setDealerCategory(dealerRoundInfoReq.getDealerCategory());
......@@ -142,7 +142,7 @@ public class DealerRoundInfoServiceImpl extends ServiceImpl<DealerRoundInfoMappe
res.setPaymentTtl(info.getPaymentTtlNew());
res.setPhone(info.getPhone());
res.setPaymentChange(info.getPaymentTtlNew() > info.getPaymentTtlPre() ? "up" : "down");
res.setPaymentPercentage(new BigDecimal(info.getPaymentTtlNew()).multiply(new BigDecimal(100)).divide(new BigDecimal(info.getGoalTtlAct()), 0, BigDecimal.ROUND_HALF_UP) + "%");
res.setPaymentPercentage(getPercentage(info.getPaymentTtlNew(), info.getGoalTtlAct(),2) + "%");
res.setRoundId(info.getRoundId());
return res;
......@@ -171,6 +171,7 @@ public class DealerRoundInfoServiceImpl extends ServiceImpl<DealerRoundInfoMappe
return new BigDecimal(paymentTtl)
.multiply(new BigDecimal(100))
.divide(new BigDecimal(goalTtlAct),scale, RoundingMode.HALF_UP)
.toString();
.stripTrailingZeros()
.toPlainString();
}
}
// 文件路径:ruoyi-system/src/main/java/com/ruoyi/dealer/service/impl/DealerRoundResultServiceImpl.java
package com.ruoyi.dealer.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ZipUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.dealer.domain.DealerBaseInfo;
import com.ruoyi.dealer.domain.DealerRoundResult;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupListRes;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupResultDto;
import com.ruoyi.dealer.domain.dto.DealerBigScreenGroupResultRes;
import com.ruoyi.dealer.domain.dto.DealerRoundDetailListRes;
import com.ruoyi.dealer.domain.dto.*;
import com.ruoyi.dealer.mapper.DealerRoundResultMapper;
import com.ruoyi.dealer.service.IDealerBaseInfoService;
import com.ruoyi.dealer.service.IDealerRoundResultService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 经销商轮次结果 Service 实现类
......@@ -29,6 +34,12 @@ public class DealerRoundResultServiceImpl extends ServiceImpl<DealerRoundResultM
@Autowired
private IDealerBaseInfoService dealerBaseInfoService;
/**
* 大屏 个人分组查询
* 大屏个人分组接口--右侧 鲲鹏组 青龙组 麒麟组
* @param CategoryName
* @return
*/
@Override
public List<DealerBigScreenGroupListRes> groupList(String CategoryName) {
// 查询第一列分组的前几名
......@@ -50,7 +61,7 @@ public class DealerRoundResultServiceImpl extends ServiceImpl<DealerRoundResultM
res.setGoalTtlAct(item.getGoalTtlAct());
res.setPaymentTtl(item.getPaymentTtl());
res.setPaymentPercentage(getPercentage(item.getPaymentTtl(), item.getGoalTtlAct(), 4) + "%");
res.setPaymentPercentage(getPercentage(item.getPaymentTtl(), item.getGoalTtlAct(), 2)+"%");
list.add(res);
});
......@@ -65,10 +76,11 @@ public class DealerRoundResultServiceImpl extends ServiceImpl<DealerRoundResultM
DealerBigScreenGroupResultRes res = new DealerBigScreenGroupResultRes();
res.setRoundTime(item.getRoundTime());
res.setGroupName(item.getGroupName());
res.setSalesRegionGroupName(item.getGroupName());
res.setPaymentTtl(item.getPaymentTtl());
res.setGoalTtlAct(item.getGoalTtlAct());
res.setPaymentPercentage(new BigDecimal(item.getPaymentPercentage()).setScale(4, RoundingMode.HALF_UP).toString() + "%");
res.setPaymentPercentage(getPercentage(item.getPaymentTtl(), item.getGoalTtlAct(), 2) + "%");
list.add(res);
});
return list;
......@@ -86,6 +98,7 @@ public class DealerRoundResultServiceImpl extends ServiceImpl<DealerRoundResultM
DealerRoundDetailListRes res = new DealerRoundDetailListRes();
res.setRoundTime(item.getRoundTime());
res.setGroupName(item.getGroupName());
res.setSalesRegionGroupName(item.getSalesRegionGroupName());
res.setDealerCategory(item.getDealerCategory());
res.setDealerName(item.getDealerName());
......@@ -116,28 +129,73 @@ public class DealerRoundResultServiceImpl extends ServiceImpl<DealerRoundResultM
// 复制所有数据
List<DealerRoundResult> roundResults = new ArrayList<>();
// 先清空id
roundResults.forEach(item -> {
resultList.forEach(baseInfo -> {
DealerRoundResult item = new DealerRoundResult();
item.setRoundTime(1);
item.setDealerId(item.getDealerId());
item.setResultId(null);
item.setDealerName(item.getDealerName());
item.setDealerCategory(item.getDealerCategory());
item.setPhone(item.getPhone());
item.setGoalTtlAct(item.getGoalTtlAct());
item.setPaymentTtl(item.getPaymentTtl());
item.setPaymentPercentage(item.getPaymentPercentage());
// 覆盖字段
item.setSalesRegionGroupName(item.getSalesRegionGroupName());
item.setDealerCategory(baseInfo.getDealerCategory());
item.setGroupName(baseInfo.getGroupName());
item.setSalesRegionGroupName(baseInfo.getSalesRegionGroupName());
item.setDealerId(baseInfo.getDealerId());
item.setDealerName(baseInfo.getDealerName());
item.setDealerCategory(baseInfo.getDealerCategory());
item.setPhone(baseInfo.getPhone());
item.setGoalTtlAct(baseInfo.getGoalTtlAct());
item.setPaymentTtlPre(baseInfo.getPaymentTtl());
item.setPaymentTtl(baseInfo.getPaymentTtl());
item.setPaymentPercentage(getPercentage(baseInfo.getPaymentTtl(), baseInfo.getGoalTtlAct(), 2));
roundResults.add(item);
});
this.saveBatch(roundResults);
this.saveOrUpdateBatch(roundResults);
return resultList.size();
}
@Override
public String downloadZip() {
List<DealerRoundResult> roundResults = this.list(new LambdaQueryWrapper<DealerRoundResult>()
.eq(DealerRoundResult::getRoundTime, 1)
);
Map<String, List<DealerRoundResult>> map = roundResults.stream().collect(Collectors.groupingBy(DealerRoundResult::getSalesRegionGroupName));
// 按照key 生成不同的excel文件
List<String> excelFilePaths = new ArrayList<>();
// 生成每个分组的 Excel 文件
for (Map.Entry<String, List<DealerRoundResult>> entry : map.entrySet()) {
String groupName = entry.getKey();
List<DealerRoundResult> groupData = entry.getValue();
ExcelUtil<DealerRoundResult> util = new ExcelUtil<>(DealerRoundResult.class);
String excelFileName = "分组结果_" + groupName + ".xlsx";
File excelFile = FileUtil.createTempFile(); // 创建临时文件
util.init(groupData, "分组结果", groupName, Excel.Type.EXPORT);
util.exportExcelFile(excelFile); // 导出到临时文件
excelFilePaths.add(excelFile.getAbsolutePath());
}
// 生成 ZIP 文件
File zipFile = FileUtil.createTempFile();
InputStream[] inputStreams =new InputStream[excelFilePaths.size()];
File zip = ZipUtil.zip(zipFile, excelFilePaths.toArray(new String[0]), inputStreams);// 打包所有 Excel 文件
// 返回 ZIP 文件路径
return zipFile.getAbsolutePath();
}
@Override
public List<DealerBigScreenTotalResultRes> totalResult() {
return null;
}
private String getPercentage(Integer paymentTtl, Integer goalTtlAct,Integer scale) {
if(null == paymentTtl || null == goalTtlAct){
return "0";
}
return new BigDecimal(paymentTtl)
.multiply(new BigDecimal(100))
.divide(new BigDecimal(goalTtlAct),scale, RoundingMode.HALF_UP)
.toString();
.stripTrailingZeros()
.toPlainString();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论