package com.ruoyi.admin.controller.large;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.io.resource.ClassPathResource;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.admin.entity.MasterWorker;
import com.ruoyi.admin.large.model.AnalysisOrderData;
import com.ruoyi.admin.large.model.query.OrderDataQuery;
import com.ruoyi.admin.large.service.AnalysisOrderDataService;
import com.ruoyi.admin.service.MasterWorkerService;
import com.ruoyi.admin.service.SysUserService;
import com.ruoyi.admin.utils.ImportExcelUtil;
import com.ruoyi.admin.utils.WebUtils;
import com.ruoyi.admin.vo.SiteLargeeVO;
import com.ruoyi.admin.vo.WorkersLargeeVO;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.entity.Order;
import com.ruoyi.order.api.feignClient.OrderClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author xiaochen
* @since 2025-04-22
*/
@Api(tags = {"大屏-上门回收订单"})
@RestController
@RequestMapping("/analysis-order-data")
public class AnalysisOrderDataController {
private final AnalysisOrderDataService analysisOrderDataService;
private final TokenService tokenService;
private final SysUserService sysUserService;
private final OrderClient orderClient;
private final MasterWorkerService masterWorkerService;
@Autowired
public AnalysisOrderDataController(AnalysisOrderDataService analysisOrderDataService, TokenService tokenService, SysUserService sysUserService, OrderClient orderClient,MasterWorkerService masterWorkerService) {
this.analysisOrderDataService = analysisOrderDataService;
this.tokenService = tokenService;
this.sysUserService = sysUserService;
this.orderClient = orderClient;
this.masterWorkerService = masterWorkerService;
}
/**
* 大屏-站点分布
*/
@ApiOperation( value = "大屏-站点分布")
@GetMapping(value = "/listSiteLarge")
public R listSiteLarge() {
SiteLargeeVO siteLargeeVO = new SiteLargeeVO();
// 回收订单数量
Map orderMap = new HashMap<>();
// 回收人员数量
Map userMap = new HashMap<>();
// 根据city为键,值为对应city的订单数量
List list1 = analysisOrderDataService.list();
for (AnalysisOrderData analysisOrderData : list1) {
if (orderMap.containsKey(analysisOrderData.getCity())) {
orderMap.put(analysisOrderData.getCity(), orderMap.get(analysisOrderData.getCity()) + 1);
} else {
orderMap.put(analysisOrderData.getCity(), 1);
}
if (userMap.containsKey(analysisOrderData.getCity())) {
userMap.put(analysisOrderData.getCity(), userMap.get(analysisOrderData.getCity()) + 1);
} else {
userMap.put(analysisOrderData.getCity(), 1);
}
}
siteLargeeVO.setOrderMap(orderMap);
siteLargeeVO.setUserMap(userMap);
return R.ok(siteLargeeVO);
}
/**
* 大屏-师傅定位分布
*/
@ApiOperation( value = "大屏-师傅定位分布")
@GetMapping(value = "/listWorkersLarge")
public R listWorkersLarge() {
WorkersLargeeVO siteLargeeVO = new WorkersLargeeVO();
// 查询师傅经纬度
List list = masterWorkerService.lambdaQuery().isNotNull(MasterWorker::getWorkerLat).isNotNull(MasterWorker::getWorkerLon)
.list();
siteLargeeVO.setWorkers(list);
// 师傅数量
Map userMap = new HashMap<>();
for (MasterWorker masterWorker : list) {
if (userMap.containsKey(masterWorker.getCity())) {
userMap.put(masterWorker.getCity(), userMap.get(masterWorker.getCity()) + 1);
} else {
userMap.put(masterWorker.getCity(), 1);
}
}
// siteLargeeVO.setSiteMap();
siteLargeeVO.setUserMap(userMap);
return R.ok(siteLargeeVO);
}
/**
* 查询上门回收订单列表
*/
@ApiOperation( value = "查询上门回收订单列表")
@PostMapping(value = "/pageList")
public R> pageList(@RequestBody OrderDataQuery orderDataQuery) {
Page page = analysisOrderDataService.lambdaQuery()
.like(StringUtils.isNotBlank(orderDataQuery.getOrderChannel()), AnalysisOrderData::getOrderChannel, orderDataQuery.getOrderChannel())
.like(StringUtils.isNotBlank(orderDataQuery.getOrderNum()), AnalysisOrderData::getOrderNum, orderDataQuery.getOrderNum())
.like(StringUtils.isNotBlank(orderDataQuery.getCity()), AnalysisOrderData::getCity, orderDataQuery.getCity())
.like(StringUtils.isNotBlank(orderDataQuery.getOrderCategory()), AnalysisOrderData::getOrderCategory, orderDataQuery.getOrderCategory())
.like(StringUtils.isNotBlank(orderDataQuery.getUserName()), AnalysisOrderData::getUserName, orderDataQuery.getUserName())
.like(StringUtils.isNotBlank(orderDataQuery.getRecyclePerson()), AnalysisOrderData::getRecyclePerson, orderDataQuery.getRecyclePerson())
.eq(Objects.nonNull(orderDataQuery.getState()), AnalysisOrderData::getState, orderDataQuery.getState())
.orderByDesc(AnalysisOrderData::getOrderDate)
.page(Page.of(orderDataQuery.getPageNum(), orderDataQuery.getPageSize()));
return R.ok(page);
}
/**
* 查询上门回收订单列表
*/
@ApiOperation( value = "查询上门回收订单列表-大屏")
@GetMapping(value = "/list")
public R> list() {
String startTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 00:00:00";
String endTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 23:59:59";
List list = analysisOrderDataService.list(Wrappers.lambdaQuery(AnalysisOrderData.class)
.between(AnalysisOrderData::getOrderDate, startTime, endTime)
.orderByDesc(AnalysisOrderData::getOrderDate));
return R.ok(list);
}
/**
* 修改上门回收订单
*/
@ApiOperation( value = "修改上门回收订单")
@PostMapping(value = "/update")
public R update(@RequestBody AnalysisOrderData dto) {
return R.ok(analysisOrderDataService.updateById(dto));
}
/**
* 删除上门回收订单
*/
@ApiOperation( value = "删除上门回收订单")
@DeleteMapping(value = "/deleteById")
public R deleteById(@RequestParam("id") Integer id) {
return R.ok(analysisOrderDataService.removeById(id));
}
@ApiOperation(value = "回收订单导入模板下载")
@GetMapping("/import-template")
public void importTemplate() {
ClassPathResource classPathResource = new ClassPathResource("template/回收订单导入.xlsx");
TemplateExportParams params = new TemplateExportParams(classPathResource.getPath());
Workbook workbook = ExcelExportUtil.exportExcel(params, new HashMap<>());
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = null;
try {
String fileName = URLEncoder.encode("回收订单导入.xlsx", "utf-8");
response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
System.out.println("回收订单导入模板下载失败!");
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@ApiOperation(value = "回收订单导入")
@PostMapping("/importAnalysisOrder")
@ApiImplicitParam(paramType = "form", name = "file", value = "文件对象", required = true, dataType = "__file")
public R importAnalysisOrder(@RequestPart("file") MultipartFile file) {
ImportParams params = new ImportParams();
// params.setTitleRows(1);//标题行数
params.setHeadRows(1); //表头行数
try {
InputStream inputStream = file.getInputStream();
List analysisOrderDataList = ExcelImportUtil.importExcel(inputStream, AnalysisOrderData.class, params);
List errors = new ArrayList<>();
Iterator iterator = analysisOrderDataList.iterator();
while (iterator.hasNext()){
AnalysisOrderData analysisOrderData = iterator.next();
try {
analysisOrderData.setDataType(1);
analysisOrderData.setOrderDate(new SimpleDateFormat("yyyy-MM-dd").parse(analysisOrderData.getOrderDateStr()));
}catch (Exception e){
errors.add("回收订单编号:["+analysisOrderData.getOrderNum()+"],时间格式化错误,忽略导入");
iterator.remove();
}
}
analysisOrderDataService.saveBatch(analysisOrderDataList);
Integer errorLines = 0;
Integer successLines = 0;
errorLines += errors.size();
successLines += (analysisOrderDataList.size() - errorLines);
R stringApiResult = ImportExcelUtil.importReturnMsg(errorLines, successLines, errors);
return stringApiResult;
} catch (Exception e) {
System.out.println("回收订单导入失败!" + e.getMessage());
e.printStackTrace();
}
return R.ok();
}
@ApiOperation(value = "同步家电回收哥当日订单数据")
@PostMapping("/synchronousOrder")
public R synchronousOrder() {
// 查询家电回收哥今日订单数据
List orders = orderClient.getTodayOrderData().getData();
if(!CollectionUtils.isEmpty(orders)){
List analysisOrderDataList = new ArrayList<>();
orders.forEach(order -> {
AnalysisOrderData analysisOrderData = new AnalysisOrderData();
analysisOrderData.setOrderNum(order.getOrderNumber());
try {
analysisOrderData.setOrderDate(new SimpleDateFormat("yyyy-MM-dd").parse(order.getTime()));
} catch (ParseException e) {
throw new RuntimeException(e);
}
analysisOrderData.setOrderChannel(order.getSiteName());
analysisOrderData.setCity(order.getCity());
analysisOrderData.setOrderCategory(order.getServeName());
analysisOrderData.setUserName(order.getReservationName());
analysisOrderData.setUserPhone(order.getReservationPhone());
analysisOrderData.setRecyclePerson(order.getServerName());
analysisOrderData.setState(order.getState());
analysisOrderData.setImportTime(LocalDateTime.now());
analysisOrderData.setDataType(2);
analysisOrderDataList.add(analysisOrderData);
});
// 删除今日订单
analysisOrderDataService.remove(new QueryWrapper().lambda()
.eq(AnalysisOrderData::getDataType,2)
.like(AnalysisOrderData::getOrderDate, new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
);
analysisOrderDataService.saveBatch(analysisOrderDataList);
}
return R.ok();
}
}