Commit fe636ea3 by 一只苏

提交分页Rasy

parent 7eabc5e5
.idea
target
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.0.5.RELEASE</version>
</parent>
<groupId>org.example</groupId>
<artifactId>Rasy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.feng.su;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.feng.su.mapper")
@SpringBootApplication
public class RasyApplication {
public static void main(String[] args) {
SpringApplication.run(RasyApplication.class,args);
}
}
package com.feng.su.constant;
/**
* EXCEL常量类
*/
public class ExcelConstant {
/**
* 每个sheet存储的记录数 100W
*/
public static final Integer PER_SHEET_ROW_COUNT = 1000000;
/**
* 每次向EXCEL写入的记录数(查询每页数据大小) 20W
*/
public static final Integer PER_WRITE_ROW_COUNT = 200000;
/**
* 每个sheet的写入次数 5
*/
public static final Integer PER_SHEET_WRITE_COUNT = PER_SHEET_ROW_COUNT / PER_WRITE_ROW_COUNT;
}
package com.feng.su.controller;
import com.feng.su.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
* book控制类
*/
@RestController
@RequestMapping(value="/book")
public class BookController {
@Autowired
private IBookService bookService;
/**
* 查询做的书籍信息
* @param response
*/
@RequestMapping("/getBook")
public void getAllBook(HttpServletResponse response) throws Exception{
bookService.getAllBook(response);
}
/**
* 查询订单金额表
* @param response
*/
@RequestMapping("/getItem")
public void getItemByYear(HttpServletResponse response)throws Exception{
bookService.getOrderByYear(response);
}
/**
* 编辑支出四项明细
* @param response
*/
@RequestMapping("/getBalance")
public void getBalance(HttpServletResponse response)throws Exception{
bookService.getBalance(response);
}
/**
* 图书分类以及读者圈和内容占比
* @param response
*/
@RequestMapping("/getGMVPercent")
public void getBookTypeGMV(HttpServletResponse response)throws Exception{
bookService.getBookTypeGMV(response);
}
/**
* 产生GMV的书
* @param response
*/
@RequestMapping("/getGMVBook")
public void getGMVBook(HttpServletResponse response)throws Exception{
bookService.getGMVBook(response);
}
/**
* 商品类型gmv占比排行
* @param response
*/
@RequestMapping("/getProductGMV")
public void getProGMV(HttpServletResponse response)throws Exception{
bookService.getProGMV(response);
}
/**
* 读者圈和内容GMV明细表
* @param response
* @return
*/
@RequestMapping("/getRcGMV")
public void getRcGMV(HttpServletResponse response)throws Exception{
bookService.getRcGMV(response);
}
/**
* 获取订单
* @param response
* @return
*/
@RequestMapping("/getOrderDetail")
public void getOrderDetail(HttpServletResponse response)throws Exception{
bookService.getOrderDetail(response);
}
}
package com.feng.su.entity;
import lombok.Data;
/**
* 做的书
*/
@Data
public class Book {
private Integer seqId;//序号,用于Excel表排序
private Integer book_id;//图书id
private String book_name;//图书名称
private String book_type;//图书类型
private Integer print_num;//印册量
private Integer adviser_id;//编辑ID
private String adviser_name;//编辑名称
private String agent_name;//出版社名称
private String confirm_time;//图书确认时间
}
package com.feng.su.entity;
import lombok.Data;
/**
* 图书分类以及读者圈和内容占比
*/
@Data
public class BookTypeGMV {
private String book_type;//图书类型
private String reader_gmv;//读者圈GMV
private String reader_gmv_percent;//读者圈GMV占比
private String content_gmv;//内容GMV
private String content_gmv_percent;//内容GMV占比
private Integer book_count;//图书数量
private Integer print_num;//印册量
}
package com.feng.su.entity;
import lombok.Data;
/**
* 编辑四项支出明细
*/
@Data
public class FourBalance {
private Integer year;//年
private Integer month;//月
private Integer adviser_id;//编辑id
private String adviser_name;//编辑名称
private Integer adviser_fee;//编辑费用
private Integer author_fee;//作者费用
private Integer develop_fee;//研发费用
private Integer red_fee;//红榜任务
private Integer total_fee;//费用合计
private String agent_name;//出版社名称
}
package com.feng.su.entity;
import lombok.Data;
/**
* 产生GMV的书
*/
@Data
public class GMVBook {
private Integer seqId;//序号
private Integer book_id;//图书ID
private String book_name;//图书名称
private String book_type;//图书类别
private Integer print_num;//印册量
private String agent_name;//出版社名称
private Integer adviser_id;//编辑ID
private String adviser_name;//编辑名称
private String gmv;//产生的GMV
}
package com.feng.su.entity;
import lombok.Data;
@Data
public class ItemMoney {
private Integer year;
private Integer month;
private String gmv;
private Integer count;
}
package com.feng.su.entity;
import lombok.Data;
@Data
public class Order {
private Integer id;
private String order_num;
private String openid;
private String pro_name;
private Integer pro_type_id;
private Integer adviser_id;
private Integer agent_id;
private String price;
private Integer count;
private String wx_pay_num;
private String pay_time;
private String submit_time;
private Integer book_id;
private Integer pro_id;
private Integer is_fund;
private Integer data_source;
private Integer main_adviser_id;
private Integer specification_id;
private Integer pay_time_m;
}
package com.feng.su.entity;
import lombok.Data;
/**
* 商品类型gmv占比排行
*/
@Data
public class ProductGMV {
private Integer seqId;//序号
private Integer pro_type_id;//商品类型ID
private String type_name;//商品类型名称
private String rate;//占比
private String min_price;//最低价格
private String max_price;//最高价格
}
package com.feng.su.entity;
import lombok.Data;
@Data
public class ReaderContentGMV {
private Integer seqId;//序号
private Integer book_id;//图书ID
private String book_name;//图书名称
private String book_type;//图书类别
private String agent_name;//出版社
private Integer adviser_id;//编辑ID
private String adviser_name;//编辑名称
private String reader_gmv;//读者圈GMV
private String reader_gmv_rate;//读者圈GMV占比
private String reader_gmv_print_num;//读者圈GMV/印册量
private String content_gmv;//内容GMV
private String content_gmv_rate;//内容GMV占比
private String content_gmv_print_num;//内容GMV/印册量
private Integer print_num;//印册量
private String gmv;//产生的gmv
private String gmv_print_num;//产生的GMV/印册量
}
package com.feng.su.mapper;
import com.feng.su.entity.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface IBookMapper {
/**
* 获取新增书籍信息
* @return
*/
public List<Book> getAllBook(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 获取做书的数量
* @return
*/
public Integer getBookCount();
/**
* 获取订单金额信息
* @return
*/
public List<ItemMoney> getOrderByYear(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 获取订单金额信息数量
* @return
*/
public Integer getOrderByYearCount();
/**
* 按月编辑四项支出明细
* @return
*/
public List<FourBalance> getBalance(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 按月编辑四项支出明细数量
* @return
*/
public Integer getBalanceCount();
/**
* 图书分类以及读者圈和内容占比
* @return
*/
public List<BookTypeGMV> getBookTypeGMV(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 图书分类以及读者圈和内容占比数量
* @return
*/
public Integer getBookTypeGMVCount();
/**
* 产生GMV的书
*/
public List<GMVBook> getGMVBook(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 产生GMV的书的数量
*/
public Integer getGMVBookCount();
/**
* 商品类型gmv占比排行
* @return
*/
public List<ProductGMV> getProGMV(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 商品类型gmv占比排行的数量
* @return
*/
public Integer getProGMVCount();
/**
* 产生GMV的书-包括读者圈和内容GMV明细表
* @return
*/
public List<ReaderContentGMV> getRcGMV(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 产生GMV的书-包括读者圈和内容GMV明细表的数量
* @return
*/
public Integer getRcGMVCount();
/**
* 查询订单详情
* @return
*/
public List<Order> getOrderDetail(@Param(value="startIndex")Integer startIndex,@Param(value="pageSize") Integer pageSize);
/**
* 查询订单详情数量
* @return
*/
public Integer getOrderDetailCount();
}
package com.feng.su.service;
import javax.servlet.http.HttpServletResponse;
public interface IBookService {
void getAllBook(HttpServletResponse response) throws Exception;
void getOrderByYear(HttpServletResponse response)throws Exception;
void getBalance(HttpServletResponse response)throws Exception;
void getBookTypeGMV(HttpServletResponse response)throws Exception;
void getGMVBook(HttpServletResponse response)throws Exception;
void getProGMV(HttpServletResponse response)throws Exception;
void getRcGMV(HttpServletResponse response)throws Exception;
void getOrderDetail(HttpServletResponse response)throws Exception;
}
package com.feng.su.util;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期工具类
*/
public class DateUtil {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
/**
* 将日期转换为字符串
*
* @param date DATE日期
* @param format 转换格式
* @return 字符串日期
*/
public static String formatDate(Date date, String format) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
return simpleDateFormat.format(date);
}
}
package com.feng.su.util;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@Component
public class ExcelUtil <T>{
/**
* 将bean属性封装到每一行
* @param headers 表头
* @param t
* @param row 当前行对象
* @param rowNumber 当前行数
* @throws Exception
*/
public void convertBean(String[]headers, T t, SXSSFRow row,Integer rowNumber)throws Exception{
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < headers.length; i++) {
SXSSFCell cell = row.createCell(i);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = null;
// 其它数据类型都当作字符串简单处理
if(value != null && value != ""){
textValue = value.toString();
}else{
textValue=String.valueOf(rowNumber);
}
if (textValue != null) {
XSSFRichTextString richString = new XSSFRichTextString(textValue);
cell.setCellValue(richString);
}
}
}
}
package com.feng.su.util;
import java.util.List;
/**
* 用于分页的工具类
* @param <T>
*/
public class Pager<T> {
// 当前页
private Long currentNo;
// 单页显示数据条数
private Long pageSize;
// 总的数据条数
private Long totalRecord;
// 总页数
private Long totalPage;
// 开始索引
private Long startIndex;
// 分页显示
private Long start;
private Long end;
// 数据集合
private List<T> dataList;
/**
*
* @param currentNo
* 当前页
* @param pageSize
* 单页显示数据条数
* @param totalRecord
* 总的数据条数
*/
public Pager(Long currentNo, Long pageSize, Long totalRecord)
{
this.currentNo = currentNo;
this.pageSize = pageSize;
this.totalRecord = totalRecord;
// 获取总页数
if (totalRecord % pageSize == 0)
{
this.totalPage = totalRecord / pageSize;
} else
{
this.totalPage = totalRecord / pageSize + 1;
}
this.startIndex = (currentNo - 1) * pageSize;
this.start = 1L;
this.end = 5L;
if (totalPage <= 5)
{
this.end = this.totalPage;
} else
{
this.start = currentNo - 2;
this.end = currentNo + 2;
if (start < 0)
{
start = 1L;
end = 5L;
}
if (end > this.totalPage)
{
this.end = totalPage;
this.start = end - 5;
}
}
}
}
package com.feng.su.util;
import com.feng.su.constant.ExcelConstant;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
/**
* POI工具类
*/
public class PoiUtil {
private final static Logger logger = LoggerFactory.getLogger(PoiUtil.class);
/**
* 初始化EXCEL(sheet个数和标题)
*
* @param totalRowCount 总记录数
* @param titles 标题集合
* @return XSSFWorkbook对象
*/
public static SXSSFWorkbook initExcel(Integer totalRowCount, String[] titles) {
// 在内存当中保持 100 行 , 超过的数据放到硬盘中在内存当中保持 100 行 , 超过的数据放到硬盘中
SXSSFWorkbook wb = new SXSSFWorkbook(100);
Integer sheetCount = ((totalRowCount % ExcelConstant.PER_SHEET_ROW_COUNT == 0) ?
(totalRowCount / ExcelConstant.PER_SHEET_ROW_COUNT) : (totalRowCount / ExcelConstant.PER_SHEET_ROW_COUNT + 1));
// 根据总记录数创建sheet并分配标题
for (int i = 0; i < sheetCount; i++) {
SXSSFSheet sheet = wb.createSheet("sheet" + (i + 1));
SXSSFRow headRow = sheet.createRow(0);
for (int j = 0; j < titles.length; j++) {
SXSSFCell headRowCell = headRow.createCell(j);
headRowCell.setCellValue(titles[j]);
}
}
return wb;
}
/**
* 下载EXCEL到本地指定的文件夹
*
* @param wb EXCEL对象SXSSFWorkbook
* @param exportPath 导出路径
*/
public static void downLoadExcelToLocalPath(SXSSFWorkbook wb, String exportPath) {
FileOutputStream fops = null;
try {
fops = new FileOutputStream(exportPath);
wb.write(fops);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != wb) {
try {
wb.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
if (null != fops) {
try {
fops.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 下载EXCEL到浏览器
*
* @param wb EXCEL对象XSSFWorkbook
* @param response
* @param fileName 文件名称
* @throws IOException
*/
public static void downLoadExcelToWebsite(SXSSFWorkbook wb, HttpServletResponse response, String fileName) throws IOException {
response.setHeader("Content-disposition", "attachment; filename="
+ new String((fileName + ".xlsx").getBytes("utf-8"), "ISO8859-1"));//设置下载的文件名
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
wb.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != wb) {
try {
wb.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
if (null != outputStream) {
try {
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 导出Excel到本地指定路径
*
* @param totalRowCount 总记录数
* @param titles 标题
* @param exportPath 导出路径
* @param writeExcelDataDelegated 向EXCEL写数据/处理格式的委托类 自行实现
* @throws Exception
*/
public static final void exportExcelToLocalPath(Integer totalRowCount, String[] titles, String exportPath, WriteExcelDataDelegated writeExcelDataDelegated) throws Exception {
logger.info("开始导出:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
// 初始化EXCEL
SXSSFWorkbook wb = PoiUtil.initExcel(totalRowCount, titles);
// 调用委托类分批写数据
int sheetCount = wb.getNumberOfSheets();
for (int i = 0; i < sheetCount; i++) {
SXSSFSheet eachSheet = wb.getSheetAt(i);
for (int j = 1; j <= ExcelConstant.PER_SHEET_WRITE_COUNT; j++) {
int currentPage = i * ExcelConstant.PER_SHEET_WRITE_COUNT + j;
int pageSize = ExcelConstant.PER_WRITE_ROW_COUNT;
int startRowCount = (j - 1) * ExcelConstant.PER_WRITE_ROW_COUNT + 1;
int endRowCount = startRowCount + pageSize - 1;
writeExcelDataDelegated.writeExcelData(eachSheet, startRowCount, endRowCount, currentPage, pageSize);
}
}
// 下载EXCEL
PoiUtil.downLoadExcelToLocalPath(wb, exportPath);
logger.info("导出完成:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
}
/**
* 导出Excel到浏览器
*
* @param response
* @param totalRowCount 总记录数
* @param fileName 文件名称
* @param titles 标题
* @param writeExcelDataDelegated 向EXCEL写数据/处理格式的委托类 自行实现
* @throws Exception
*/
public static final void exportExcelToWebsite(HttpServletResponse response, Integer totalRowCount, String fileName, String[] titles, WriteExcelDataDelegated writeExcelDataDelegated) throws Exception {
logger.info("开始导出:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
// 初始化EXCEL
SXSSFWorkbook wb = PoiUtil.initExcel(totalRowCount, titles);
// 调用委托类分批写数据
int sheetCount = wb.getNumberOfSheets();
for (int i = 0; i < sheetCount; i++) {
SXSSFSheet eachSheet = wb.getSheetAt(i);
for (int j = 1; j <= ExcelConstant.PER_SHEET_WRITE_COUNT; j++) {
int currentPage = i * ExcelConstant.PER_SHEET_WRITE_COUNT + j;
int pageSize = ExcelConstant.PER_WRITE_ROW_COUNT;
int startRowCount = (j - 1) * ExcelConstant.PER_WRITE_ROW_COUNT+1;
int endRowCount = startRowCount + pageSize - 1;
if(totalRowCount-(i*ExcelConstant.PER_SHEET_ROW_COUNT+ExcelConstant.PER_WRITE_ROW_COUNT*(j-1))<ExcelConstant.PER_WRITE_ROW_COUNT){
pageSize=totalRowCount-i*ExcelConstant.PER_SHEET_ROW_COUNT+ExcelConstant.PER_WRITE_ROW_COUNT*(j-1);
endRowCount=startRowCount+pageSize-1;
writeExcelDataDelegated.writeExcelData(eachSheet, startRowCount, endRowCount, currentPage, pageSize);
break;
}
writeExcelDataDelegated.writeExcelData(eachSheet, startRowCount, endRowCount, currentPage, pageSize);
}
}
// 下载EXCEL
PoiUtil.downLoadExcelToWebsite(wb, response, fileName);
logger.info("导出完成:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
}
}
package com.feng.su.util;
import org.apache.poi.xssf.streaming.SXSSFSheet;
/**
* EXCEL写数据委托类
*/
public interface WriteExcelDataDelegated {
/**
* EXCEL写数据委托类 针对不同的情况自行实现
*
* @param eachSheet 指定SHEET
* @param startRowCount 开始行
* @param endRowCount 结束行
* @param currentPage 分批查询开始页
* @param pageSize 分批查询数据量
* @throws Exception
*/
public abstract void writeExcelData(SXSSFSheet eachSheet, Integer startRowCount, Integer endRowCount, Integer currentPage, Integer pageSize) throws Exception;
}
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://116.62.119.190:33306/readercenter
driver-class-name: com.mysql.jdbc.Driver
username: bi110
password: lgsc123
#url: jdbc:mysql://127.0.0.1:3306/spring_test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
#driver-class-name: com.mysql.jdbc.Driver
#username: root
#password: Cpic1234
# servlet:
# multipart:
# 最大文件大小。值可以使用后缀“MB”或“KB”。指示兆字节或千字节大小。
# max-file-size: 20MB
# # 最大请求大小可以是mb也可以是kb
# max-request-size: 200MB
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.feng.su.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment