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(); } }