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.DeviceSimChargeDto;
import com.xy.dto.OrderMercManageDto;
import com.xy.dto.be.MercDto;
import com.xy.entity.DeviceSimCharge;
import com.xy.mapper.DeviceSimChargeMapper;
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.util.Arrays;
import java.util.List;
import static com.xy.utils.Beans.copy;
import static com.xy.utils.PlusBeans.toIPage;
import static com.xy.utils.PlusBeans.toPageBean;
/**
*
* 设备流量卡充值表 服务实现类
*
*
* @author lijin
* @since 2023-10-16
*/
@Service
@AllArgsConstructor
@Api(tags = "设备流量卡充值表")
public class DeviceSimChargeServiceImpl extends ServiceImpl implements DeviceSimChargeService {
private OrderMercManageService orderMercManageService;
private MercService mercService;
private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
private HttpServletResponse response;
private FileConfig fileConfig;
@PostMapping("page")
@ApiOperation("分页查询")
public R> page(@RequestBody DeviceSimChargeDto.Page page) {
PageBean pageBean = page.getPage();
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceSimCharge.class)
.ge(DeviceSimCharge::getCreateTime, page.getBeginCreateTime())
.le(DeviceSimCharge::getCreateTime, page.getEndCreateTime())
.build()
.orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceSimCharge::getCreateTime);
IPage iPage = page(toIPage(pageBean), lambdaQueryWrapper);
PageBean voPageBean = toPageBean(DeviceSimChargeDto.Vo.class, iPage);
List records = voPageBean.getRecords();
if (Emptys.check(records)) {
copy(records)
.target(() -> orderMercManageService.list(new OrderMercManageDto.SelectList().setId(new JArrayList<>(records).getProperty(DeviceSimChargeDto.Vo::getOrderId))).getData()
, DeviceSimChargeDto.Vo::getOrderId, DeviceSimChargeDto.Vo::getFiles, OrderMercManageDto.Vo::getId, OrderMercManageDto.Vo::getFiles
).target(() -> mercService.list(new MercDto.SelectList().setMercIds(new JArrayList<>(records).getProperty(DeviceSimChargeDto.Vo::getMercId).comparing())).getData()
, DeviceSimChargeDto.Vo::getMercId, DeviceSimChargeDto.Vo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
.builder();
}
return R.ok(voPageBean);
}
@ApiOperation("月统计分页")
@PostMapping("moonCountPage")
public R> moonCountPage(@RequestBody DeviceSimChargeDto.MoonCountPage moonCountPage) {
JList moonCountVos = new JArrayList<>();
//查询数据
List attrNames = Arrays.asList(
LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMercId)
);
List selectNames = Arrays.asList(
attrNames.get(0),
String.format("count(*) %s", LambdaUtils.getProperty(DeviceSimCharge::getSize)),
String.format("sum(%s) %s", LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMoney), LambdaUtils.getProperty(DeviceSimCharge::getMoney))
);
QueryWrapper queryWrapper = new QueryWrapper()
.select(selectNames.toArray(new String[selectNames.size()]))
.in(Emptys.check(moonCountPage.getMercIds()), attrNames.get(0), moonCountPage.getMercIds())
.between("DATE_FORMAT(" + LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getCreateTime) + ", '%Y-%m-%d')", moonCountPage.getBeginDate(), moonCountPage.getEndDate())
.groupBy(attrNames);
IPage iPage = page(toIPage(moonCountPage.getPage()), queryWrapper);
List records = iPage.getRecords();
if (!Emptys.check(records)) {
return R.ok(new PageBean<>());
}
String date = String.format("%s~%s", moonCountPage.getBeginDate(), moonCountPage.getEndDate());
records.forEach(deviceSimCharge -> {
DeviceSimChargeDto.MoonCountVo moonCountVo = new DeviceSimChargeDto.MoonCountVo()
.setDate(date)
.setMercId(deviceSimCharge.getMercId())
.setSimSize(deviceSimCharge.getSize())
.setMoney(deviceSimCharge.getMoney());
moonCountVos.add(moonCountVo);
});
//翻译商户名称
Beans.copy(moonCountVos).target(() -> mercService.list(new MercDto.SelectList().setMercIds(moonCountVos.getProperty(DeviceSimChargeDto.MoonCountVo::getMercId).comparing())).getData(),
DeviceSimChargeDto.MoonCountVo::getMercId, DeviceSimChargeDto.MoonCountVo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
.builder();
PageBean pageBean = new PageBean()
.setCurrent(iPage.getCurrent())
.setSize(iPage.getSize())
.setTotal(iPage.getTotal())
.setRecords(moonCountVos);
return R.ok(pageBean);
}
@ApiOperation("月统计")
@PostMapping("moonCount")
public R> moonCount(@RequestBody DeviceSimChargeDto.MoonCount moonCount) {
JList moonCountVos = new JArrayList<>();
//查询数据
List attrNames = Arrays.asList(
LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMercId),
"DATE_FORMAT(" + LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getCreateTime) + ", '%Y-%m')"
);
List selectNames = Arrays.asList(
attrNames.get(0),
attrNames.get(1) + " " + LambdaUtils.getProperty(DeviceSimCharge::getNote),
String.format("count(*) %s", LambdaUtils.getProperty(DeviceSimCharge::getSize)),
String.format("sum(%s) %s", LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMoney), LambdaUtils.getProperty(DeviceSimCharge::getMoney))
);
List dateDifference = deviceChargingHistoryService.getDateDifference(moonCount.getBeginDate(), moonCount.getEndDate());
ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, dateDifference.size());
dateDifference.forEach(date -> execute.execute(() -> {
QueryWrapper queryWrapper = new QueryWrapper()
.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 deviceSimCharges = list(queryWrapper);
deviceSimCharges.forEach(deviceSimCharge -> {
DeviceSimChargeDto.MoonCountVo moonCountVo = new DeviceSimChargeDto.MoonCountVo()
.setDate(deviceSimCharge.getNote())
.setMercId(deviceSimCharge.getMercId())
.setSimSize(deviceSimCharge.getSize())
.setMoney(deviceSimCharge.getMoney());
moonCountVos.add(moonCountVo);
});
}));
execute.end();
//翻译商户名称
Beans.copy(moonCountVos).target(() -> mercService.list(new MercDto.SelectList().setMercIds(moonCountVos.getProperty(DeviceSimChargeDto.MoonCountVo::getMercId).comparing())).getData(),
DeviceSimChargeDto.MoonCountVo::getMercId, DeviceSimChargeDto.MoonCountVo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
.builder();
return R.ok(moonCountVos.desc(DeviceSimChargeDto.MoonCountVo::getDate));
}
@SneakyThrows
@ApiOperation("月统计导出")
@PostMapping("moonCountDownload")
public void moonCountDownload(@RequestBody DeviceSimChargeDto.MoonCount moonCount) {
//生成excel
String name = YitIdHelper.nextId() + ".xlsx";
String path = fileConfig.getPath() + File.separator + name;
ExcelUtils.SheetAndData sheetAndData = ExcelUtils.create(path, MoonCountData.class);
sheetAndData.sheet("设备流量卡月统计数据", () -> {
List 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();
}
@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 simSize;
@ColumnWidth(25)
@ExcelProperty(value = "续费金额")
private Integer money;
}
}