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()); } 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(); } 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(); } } 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; } ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ImportExcelUtil.java
New file @@ -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)); } } } ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WebUtils.java
New file @@ -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); } } 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); } }