123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- package com.xy.service;
- import com.alibaba.excel.annotation.ExcelProperty;
- import com.alibaba.excel.annotation.write.style.ColumnWidth;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.metadata.IPage;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.github.yitter.idgen.YitIdHelper;
- import com.xy.collections.list.JArrayList;
- import com.xy.collections.list.JList;
- import com.xy.config.DeviceThreadPoolConfig;
- import com.xy.config.FileConfig;
- import com.xy.dto.DeviceChargingHistoryDto;
- import com.xy.dto.OrderMercManageDto;
- import com.xy.dto.be.MercDto;
- import com.xy.entity.DeviceChargingHistory;
- import com.xy.mapper.DeviceChargingHistoryMapper;
- import com.xy.service.be.MercService;
- import com.xy.util.ExcelUtils;
- import com.xy.utils.*;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.SneakyThrows;
- import lombok.experimental.Accessors;
- import org.springframework.stereotype.Service;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import javax.servlet.http.HttpServletResponse;
- import java.io.File;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.time.YearMonth;
- import java.time.temporal.ChronoUnit;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import static com.xy.utils.Beans.copy;
- import static com.xy.utils.PlusBeans.toPageBean;
- /**
- * <p>
- * 设备计费历史表 服务实现类
- * </p>
- *
- * @author lijin
- * @since 2023-04-14
- */
- @Service
- @AllArgsConstructor
- @Api(tags = "设备计费历史表")
- public class DeviceChargingHistoryServiceImpl extends ServiceImpl<DeviceChargingHistoryMapper, DeviceChargingHistory> implements DeviceChargingHistoryService {
- private OrderMercManageService orderMercManageService;
- private MercService mercService;
- private HttpServletResponse response;
- private FileConfig fileConfig;
- @Override
- @ApiOperation("分页查询")
- public R<PageBean<DeviceChargingHistoryDto.Vo>> page(DeviceChargingHistoryDto.Page page) {
- LambdaQueryWrapper<DeviceChargingHistory> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceChargingHistory.class)
- .build()
- .orderByDesc(DeviceChargingHistory::getCreateTime);
- IPage<DeviceChargingHistory> iPage = page(PlusBeans.toIPage(page.getPage()), lambdaQueryWrapper);
- PageBean<DeviceChargingHistoryDto.Vo> pageBean = toPageBean(DeviceChargingHistoryDto.Vo.class, iPage);
- List<DeviceChargingHistoryDto.Vo> records = pageBean.getRecords();
- if (Emptys.check(records)) {
- copy(records)
- .target(() -> orderMercManageService.list(new OrderMercManageDto.SelectList().setId(new JArrayList<>(records).getProperty(DeviceChargingHistoryDto.Vo::getOrderId))).getData()
- , DeviceChargingHistoryDto.Vo::getOrderId, DeviceChargingHistoryDto.Vo::getFiles, OrderMercManageDto.Vo::getId, OrderMercManageDto.Vo::getFiles
- )
- .target(() -> mercService.list(new MercDto.SelectList().setMercIds(new JArrayList<>(records).getProperty(DeviceChargingHistoryDto.Vo::getMercId).comparing())).getData(),
- DeviceChargingHistoryDto.Vo::getMercId, DeviceChargingHistoryDto.Vo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
- .builder();
- }
- return R.ok(pageBean);
- }
- @ApiOperation("月统计")
- @PostMapping("moonCount")
- public R<List<DeviceChargingHistoryDto.MoonCountVo>> moonCount(@RequestBody DeviceChargingHistoryDto.MoonCount moonCount) {
- JList<DeviceChargingHistoryDto.MoonCountVo> moonCountVos = new JArrayList<>();
- //查询数据
- List<String> attrNames = Arrays.asList(
- LambdaUtils.getUnderlineCaseName(DeviceChargingHistory::getMercId),
- "DATE_FORMAT(" + LambdaUtils.getUnderlineCaseName(DeviceChargingHistory::getCreateTime) + ", '%Y-%m')"
- );
- List<String> selectNames = Arrays.asList(
- attrNames.get(0),
- attrNames.get(1) + " " + LambdaUtils.getProperty(DeviceChargingHistory::getNote),
- String.format("count(*) %s", LambdaUtils.getProperty(DeviceChargingHistory::getChargingSize)),
- String.format("sum(%s) %s", LambdaUtils.getUnderlineCaseName(DeviceChargingHistory::getChargingMoney), LambdaUtils.getProperty(DeviceChargingHistory::getChargingMoney))
- );
- List<String> dateDifference = getDateDifference(moonCount.getBeginDate(), moonCount.getEndDate());
- ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, dateDifference.size());
- dateDifference.forEach(date -> execute.execute(() -> {
- QueryWrapper<DeviceChargingHistory> queryWrapper = new QueryWrapper<DeviceChargingHistory>()
- .select(selectNames.get(0), selectNames.get(1), selectNames.get(2), selectNames.get(3))
- .in(Emptys.check(moonCount.getMercIds()), attrNames.get(0), moonCount.getMercIds())
- .eq(attrNames.get(1), date)
- .groupBy(attrNames.get(0), attrNames.get(1));
- List<DeviceChargingHistory> deviceChargingHistories = list(queryWrapper);
- deviceChargingHistories.forEach(deviceChargingHistory -> {
- DeviceChargingHistoryDto.MoonCountVo moonCountVo = new DeviceChargingHistoryDto.MoonCountVo()
- .setDate(deviceChargingHistory.getNote())
- .setMercId(deviceChargingHistory.getMercId())
- .setDeviceSize(deviceChargingHistory.getChargingSize())
- .setChargingMoney(deviceChargingHistory.getChargingMoney());
- moonCountVos.add(moonCountVo);
- });
- }));
- execute.end();
- //翻译商户名称
- Beans.copy(moonCountVos).target(() -> mercService.list(new MercDto.SelectList().setMercIds(moonCountVos.getProperty(DeviceChargingHistoryDto.MoonCountVo::getMercId).comparing())).getData(),
- DeviceChargingHistoryDto.MoonCountVo::getMercId, DeviceChargingHistoryDto.MoonCountVo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
- .builder();
- return R.ok(moonCountVos.asc(DeviceChargingHistoryDto.MoonCountVo::getDate));
- }
- @SneakyThrows
- @ApiOperation("月统计导出")
- @PostMapping("moonCountDownload")
- public void moonCountDownload(@RequestBody DeviceChargingHistoryDto.MoonCount moonCount) {
- //生成excel
- String name = YitIdHelper.nextId() + ".xlsx";
- String path = fileConfig.getPath() + File.separator + name;
- ExcelUtils.SheetAndData<MoonCountData> sheetAndData = ExcelUtils.create(path, MoonCountData.class);
- sheetAndData.sheet("设备管理费月统计数据", () -> {
- List<DeviceChargingHistoryDto.MoonCountVo> data = moonCount(moonCount).getData();
- if (!Emptys.check(data)) {
- return null;
- }
- return Beans.copy(MoonCountData.class, data);
- }).builder();
- //下载文件
- InputStream inputStream = IoUtils.inputStream(path).get();
- response.setHeader("Content-Disposition", "attachment; filename=" + "设备管理费月统计数据.xlsx");
- response.setContentType("application/xlsx");
- byte[] buffer = new byte[1024];
- int bytesRead;
- OutputStream outputStream = response.getOutputStream();
- while ((bytesRead = inputStream.read(buffer)) != -1) {
- outputStream.write(buffer, 0, bytesRead);
- }
- inputStream.close();
- outputStream.close();
- //删除文件
- new File(path).delete();
- }
- public List<String> getDateDifference(String date1, String date2) {
- List<String> dateDifference = new ArrayList<>();
- // 解析日期字符串
- YearMonth yearMonth1 = YearMonth.parse(date1);
- YearMonth yearMonth2 = YearMonth.parse(date2);
- // 计算日期差异
- long monthsDiff = ChronoUnit.MONTHS.between(yearMonth1, yearMonth2);
- // 将差异的每个月添加到集合中
- YearMonth temp = yearMonth1;
- for (int i = 0; i <= monthsDiff; i++) {
- dateDifference.add(temp.toString());
- temp = temp.plusMonths(1);
- }
- return dateDifference;
- }
- @Data
- @Accessors(chain = true)
- public static class MoonCountData {
- @ColumnWidth(25)
- @ExcelProperty(value = "统计时间 yyyy-MM")
- private String date;
- @ColumnWidth(25)
- @ExcelProperty(value = "商户id")
- private Long mercId;
- @ColumnWidth(25)
- @ExcelProperty(value = "商户名称")
- private String mercName;
- @ColumnWidth(25)
- @ExcelProperty(value = "设备数")
- private Integer deviceSize;
- @ColumnWidth(25)
- @ExcelProperty(value = "续费金额")
- private Integer chargingMoney;
- }
- }
|