From 641ad2ace982eece2637c6a79d46094b3cb0d4ea Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 24 四月 2025 10:26:25 +0800
Subject: [PATCH] 大屏回收订单

---
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/controller/AnalysisOrderDataController.java |  114 +++++++++++++++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WebUtils.java                               |  170 ++++++++++++++++++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java                   |   11 +
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java             |    5 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java                  |    6 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/model/AnalysisOrderData.java                |   21 ++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ImportExcelUtil.java                        |   39 +++++
 7 files changed, 360 insertions(+), 6 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
index 17286a3..56b9e4d 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -268,6 +268,11 @@
             }
 
             @Override
+            public R<List<Order>> getTodayOrderData() {
+                return R.fail(cause.getMessage());
+            }
+
+            @Override
             public R<Boolean> changeOrderState(String orderId, Integer state) {
                 return R.fail(cause.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
index 0941c3a..e639dba 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -454,4 +454,10 @@
     @GetMapping(value = "/order/receiving")
     R<String> receiving(@RequestParam("orderId")String orderId, @RequestParam("recycleSubsidy")BigDecimal recycleSubsidy);
 
+    /**
+     * 今日订单数据
+     * @return
+     */
+    @GetMapping(value = "/order/getTodayOrderData")
+    R<List<Order>> getTodayOrderData();
 }
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/controller/AnalysisOrderDataController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/controller/AnalysisOrderDataController.java
index 645f8b3..e6e486d 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/controller/AnalysisOrderDataController.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/controller/AnalysisOrderDataController.java
@@ -1,24 +1,40 @@
 package com.ruoyi.admin.large.controller;
 
 
+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 com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.SysUserService;
+import com.ruoyi.admin.utils.ImportExcelUtil;
+import com.ruoyi.admin.utils.WebUtils;
 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.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * <p>
@@ -35,12 +51,14 @@
     private final AnalysisOrderDataService analysisOrderDataService;
     private final TokenService tokenService;
     private final SysUserService sysUserService;
+    private final OrderClient orderClient;
 
     @Autowired
-    public AnalysisOrderDataController(AnalysisOrderDataService analysisOrderDataService, TokenService tokenService, SysUserService sysUserService) {
+    public AnalysisOrderDataController(AnalysisOrderDataService analysisOrderDataService, TokenService tokenService, SysUserService sysUserService, OrderClient orderClient) {
         this.analysisOrderDataService = analysisOrderDataService;
         this.tokenService = tokenService;
         this.sysUserService = sysUserService;
+        this.orderClient = orderClient;
     }
 
     /**
@@ -94,5 +112,93 @@
     public R<Boolean> deleteById(@RequestParam("id") Integer id) {
         return R.ok(analysisOrderDataService.removeById(id));
     }
+
+    @ApiOperation(value = "回收订单导入模板下载")
+    @GetMapping("/import-template")
+    public void importTemplate() {
+        List<AnalysisOrderData> contractList = new ArrayList<>();
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), AnalysisOrderData.class, contractList);
+        HttpServletResponse response = WebUtils.response();
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("回收订单导入模板.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("content-Type", "application/vnd.ms-excel");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            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<String> importAnalysisOrder(@RequestPart("file") MultipartFile file) {
+        ImportParams params = new ImportParams();
+//        params.setTitleRows(1);//标题行数
+        params.setHeadRows(1); //表头行数
+        try {
+            InputStream inputStream = file.getInputStream();
+            List<AnalysisOrderData> analysisOrderDataList = ExcelImportUtil.importExcel(inputStream, AnalysisOrderData.class, params);
+            List<String> errors = new ArrayList<>();
+            Iterator<AnalysisOrderData> iterator = analysisOrderDataList.iterator();
+            while (iterator.hasNext()){
+                AnalysisOrderData analysisOrderData = iterator.next();
+                try {
+                    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<String> 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<String> synchronousOrder() {
+        // 查询家电回收哥今日订单数据
+        List<Order> orders = orderClient.getTodayOrderData().getData();
+        if(!CollectionUtils.isEmpty(orders)){
+            List<AnalysisOrderData> analysisOrderDataList = new ArrayList<>();
+            orders.forEach(order -> {
+                AnalysisOrderData analysisOrderData = new AnalysisOrderData();
+                analysisOrderData.setOrderNum(order.getOrderNumber());
+                analysisOrderData.setOrderDate(analysisOrderData.getOrderDate());
+//                analysisOrderData.setOrderChannel(order.getOrderChannel());
+                analysisOrderData.setCity(order.getCity());
+                analysisOrderData.setOrderCategory(order.getServeName());
+                analysisOrderData.setUserName(order.getReservationName());
+                analysisOrderData.setUserPhone(order.getReservationPhone());
+                analysisOrderData.setRecyclePerson(order.getServerName());
+                analysisOrderData.setState(order.getState());
+                analysisOrderDataList.add(analysisOrderData);
+            });
+            analysisOrderDataService.saveBatch(analysisOrderDataList);
+        }
+        return R.ok();
+    }
+
 }
 
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/model/AnalysisOrderData.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/model/AnalysisOrderData.java
index 248cca8..46bd01a 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/model/AnalysisOrderData.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/large/model/AnalysisOrderData.java
@@ -1,16 +1,21 @@
 package com.ruoyi.admin.large.model;
 
+import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * <p>
@@ -31,38 +36,47 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    @Excel(name = "订单渠道")
     @ApiModelProperty(value = "订单渠道")
     @TableField("order_channel")
     private String orderChannel;
 
+    @Excel(name = "订单编号")
     @ApiModelProperty(value = "订单编号")
     @TableField("order_num")
     private String orderNum;
 
+    @Excel(name = "城市")
     @ApiModelProperty(value = "城市")
     @TableField("city")
     private String city;
 
+    @Excel(name = "品类")
     @ApiModelProperty(value = "品类")
     @TableField("order_category")
     private String orderCategory;
 
+    @Excel(name = "用户姓名")
     @ApiModelProperty(value = "用户姓名")
     @TableField("user_name")
     private String userName;
 
-    @ApiModelProperty(value = "用户手机号")
+    @Excel(name = "电话")
+    @ApiModelProperty(value = "电话")
     @TableField("user_phone")
     private String userPhone;
 
+    @Excel(name = "回收员")
     @ApiModelProperty(value = "回收员")
     @TableField("recycle_person")
     private String recyclePerson;
 
     @ApiModelProperty(value = "日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("order_date")
-    private LocalDateTime orderDate;
+    private Date orderDate;
 
+    @Excel(name = "状态 0:待派单;1:待上门;2:待完工;3:已完结;4:已取消;5:已改派;6:待改派;7:待预约")
     @ApiModelProperty(value = "状态")
     @TableField("state")
     private Integer state;
@@ -71,5 +85,8 @@
     @TableField("import_time")
     private LocalDateTime importTime;
 
+    @Excel(name = "日期")
+    @TableField(exist = false)
+    private String orderDateStr;
 
 }
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ImportExcelUtil.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ImportExcelUtil.java
new file mode 100644
index 0000000..66ec7df
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ImportExcelUtil.java
@@ -0,0 +1,39 @@
+package com.ruoyi.admin.utils;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 导出返回信息
+ */
+@Slf4j
+public class ImportExcelUtil {
+
+    /**
+     * @param errorLines   错误行数
+     * @param successLines 成功行数
+     * @param errorMessage 错误信息
+     * @return
+     * @throws IOException
+     */
+    public static R<String> importReturnMsg(int errorLines, int successLines, List<String> errorMessage) throws IOException {
+        if (errorLines == 0) {
+            return R.ok("共" + successLines + "行数据全部导入成功!");
+        } else {
+            JSONObject result = new JSONObject(5);
+            int totalCount = successLines + errorLines;
+            result.put("totalCount", totalCount);
+            result.put("errorCount", errorLines);
+            result.put("errorMessage", errorMessage);
+            result.put("successCount", successLines);
+            result.put("msg", "总上传行数:" + totalCount + ",已导入行数:" + successLines + ",错误行数:" + errorLines);
+            return R.ok(JSON.toJSONString(result));
+        }
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WebUtils.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WebUtils.java
new file mode 100644
index 0000000..03618bf
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WebUtils.java
@@ -0,0 +1,170 @@
+package com.ruoyi.admin.utils;
+
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * web工具类
+ *
+ * @author liheng
+ */
+public final class WebUtils extends org.springframework.web.util.WebUtils {
+
+    /**
+     * 当前请求
+     */
+    public static HttpServletRequest request() {
+        return contextHolder() == null ? null : contextHolder().getRequest();
+    }
+
+    /**
+     * 当前响应
+     */
+    public static HttpServletResponse response() {
+        return contextHolder() == null ? null : contextHolder().getResponse();
+    }
+
+    /**
+     * 当前session
+     */
+    public static HttpSession session() {
+        return request() == null ? null : request().getSession();
+    }
+
+    /**
+     * 当前ServletRequest
+     */
+    public static ServletRequestAttributes contextHolder() {
+        return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+    }
+
+    /**
+     * 判断请求是否为 AJAX
+     *
+     * @param request 当前请求
+     */
+    public static boolean isAjax(HttpServletRequest request) {
+        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
+    }
+
+    /**
+     * 获取操作系统,浏览器及浏览器版本信息
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getOsAndBrowserInfo(HttpServletRequest request) {
+        Map<String, String> map = new HashMap<>(2);
+        String browserDetails = request.getHeader("User-Agent");
+        String userAgent = browserDetails;
+        String user = userAgent.toLowerCase();
+
+        String os = "";
+        String browser = "";
+        //=================OS Info=======================
+        if (userAgent.toLowerCase().contains("windows")) {
+            os = "Windows";
+        } else if (userAgent.toLowerCase().contains("mac")) {
+            os = "Mac";
+        } else if (userAgent.toLowerCase().contains("x11")) {
+            os = "Unix";
+        } else if (userAgent.toLowerCase().contains("android")) {
+            os = "Android";
+        } else if (userAgent.toLowerCase().contains("iphone")) {
+            os = "IPhone";
+        } else {
+            os = "UnKnown, More-Info: " + userAgent;
+        }
+        //===============Browser===========================
+        if (user.contains("edge")) {
+            browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("msie")) {
+            String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
+            browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
+        } else if (user.contains("safari") && user.contains("version")) {
+            browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
+                    + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+        } else if (user.contains("opr") || user.contains("opera")) {
+            if (user.contains("opera")) {
+                browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
+                        + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+            } else if (user.contains("opr")) {
+                browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
+                        .replace("OPR", "Opera");
+            }
+        } else if (user.contains("chrome")) {
+            browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
+        } else if ((user.contains("mozilla/7.0")) || (user.contains("netscape6")) ||
+                (user.contains("mozilla/4.7")) || (user.contains("mozilla/4.78")) ||
+                (user.contains("mozilla/4.08")) || (user.contains("mozilla/3"))) {
+            browser = "Netscape-?";
+        } else if (user.contains("firefox")) {
+            browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("rv")) {
+            String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
+            browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
+        } else {
+            browser = "UnKnown, More-Info: " + userAgent;
+        }
+        map.put("os", os);
+        map.put("browser", browser);
+        return map;
+    }
+
+    /**
+     * 读取cookie
+     *
+     * @param name cookie name
+     * @return cookie value
+     */
+    public String getCookieVal(String name) {
+        return getCookieVal(request(), name);
+    }
+
+    /**
+     * 读取cookie
+     *
+     * @param request HttpServletRequest
+     * @param name    cookie name
+     * @return cookie value
+     */
+    public String getCookieVal(HttpServletRequest request, String name) {
+        Cookie cookie = getCookie(request, name);
+        return cookie != null ? cookie.getValue() : null;
+    }
+
+    /**
+     * 清除 某个指定的cookie
+     *
+     * @param response HttpServletResponse
+     * @param key      cookie key
+     */
+    public void removeCookie(HttpServletResponse response, String key) {
+        setCookie(response, key, null, 0);
+    }
+
+    /**
+     * 设置cookie
+     *
+     * @param response        HttpServletResponse
+     * @param name            cookie name
+     * @param value           cookie value
+     * @param maxAgeInSeconds maxage
+     */
+    public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) {
+        Cookie cookie = new Cookie(name, value);
+        cookie.setPath("/");
+        cookie.setMaxAge(maxAgeInSeconds);
+        //cookie.setHttpOnly(true);
+        response.addCookie(cookie);
+    }
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
index aafb2a0..8990bdc 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.constant.Constants;
@@ -912,4 +913,14 @@
         return R.ok();
     }
 
+    /**
+     * 领取补贴金
+     */
+    @GetMapping(value = "/getTodayOrderData")
+    public R<List<Order>> getTodayOrderData() {
+        List<Order> orders = orderService.list(Wrappers.lambdaQuery(Order.class)
+                .between(Order::getCreateTime, LocalDate.now().atStartOfDay(), LocalDate.now().plusDays(1).atStartOfDay()));
+        return R.ok(orders);
+    }
+
 }

--
Gitblit v1.7.1