From 9bc659cd5e9f2cb53f295758507af3f7f7cebeb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=B8=A9=E6=96=87=E9=9D=99WWW?=
<15144434+wen-wenjing-www@user.noreply.gitee.com>
Date: Mon, 7 Jul 2025 00:38:44 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=86=E6=9E=90and?=
=?UTF-8?q?=E7=B4=A0=E6=9D=90=E8=B7=AF=E7=BA=BF=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../fly/controller/CpMaterialController.java | 136 +++++++++++++
.../controller/OdOrderAnalysisController.java | 35 ++++
.../api/fly/controller/RouteController.java | 136 +++++++++++++
.../api/fly/dao/CpMaterialMapper.java | 17 ++
.../com/aircraft/api/fly/dao/RouteMapper.java | 17 ++
.../aircraft/api/fly/entity/CpMaterial.java | 56 ++++++
.../com/aircraft/api/fly/entity/Route.java | 78 ++++++++
.../api/fly/service/CpMaterialService.java | 34 ++++
.../fly/service/OdOrderAnalysisService.java | 10 +
.../api/fly/service/RouteService.java | 34 ++++
.../service/impl/CpMaterialServiceImpl.java | 45 +++++
.../impl/OdOrderAnalysisServiceImpl.java | 183 ++++++++++++++++++
.../fly/service/impl/RouteServiceImpl.java | 45 +++++
.../api/fly/vo/OdOrderAnalysisQuery.java | 24 +++
.../api/fly/vo/OdOrderAnalysisResult.java | 53 +++++
15 files changed, 903 insertions(+)
create mode 100644 src/main/java/com/aircraft/api/fly/controller/CpMaterialController.java
create mode 100644 src/main/java/com/aircraft/api/fly/controller/OdOrderAnalysisController.java
create mode 100644 src/main/java/com/aircraft/api/fly/controller/RouteController.java
create mode 100644 src/main/java/com/aircraft/api/fly/dao/CpMaterialMapper.java
create mode 100644 src/main/java/com/aircraft/api/fly/dao/RouteMapper.java
create mode 100644 src/main/java/com/aircraft/api/fly/entity/CpMaterial.java
create mode 100644 src/main/java/com/aircraft/api/fly/entity/Route.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/CpMaterialService.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/OdOrderAnalysisService.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/RouteService.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/impl/CpMaterialServiceImpl.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/impl/OdOrderAnalysisServiceImpl.java
create mode 100644 src/main/java/com/aircraft/api/fly/service/impl/RouteServiceImpl.java
create mode 100644 src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisQuery.java
create mode 100644 src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisResult.java
diff --git a/src/main/java/com/aircraft/api/fly/controller/CpMaterialController.java b/src/main/java/com/aircraft/api/fly/controller/CpMaterialController.java
new file mode 100644
index 0000000..a8199bd
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/controller/CpMaterialController.java
@@ -0,0 +1,136 @@
+package com.aircraft.api.fly.controller;
+
+import com.aircraft.api.fly.entity.CpMaterial;
+import com.aircraft.api.fly.service.CpMaterialService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.base.annotation.SysLog;
+import com.base.helper.BaseController;
+import com.base.helper.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Api(tags = "素材管理")
+@RestController
+@RequestMapping("/cpMaterial")
+public class CpMaterialController extends BaseController {
+
+ private static final Logger LOG = LoggerFactory.getLogger(CpMaterialController.class);
+ @Autowired
+ private CpMaterialService entityService;
+
+ @SysLog(action = "findByPage", value = "分页查询素材")
+ @ApiOperation(value = "分页查询素材", notes = "分页查询素材")
+ @RequestMapping(method = RequestMethod.GET)
+ @ApiImplicitParams({@ApiImplicitParam(name = "size", value = "分页大小", paramType = "query"),
+ @ApiImplicitParam(name = "current", value = "当前页面:从1开始", paramType = "query")})
+ public Result> findByPage(final CpMaterial example, final Page page) {
+ IPage records = entityService.page(example,page);
+ return new Result(true, records);
+ }
+
+ @SysLog(action = "delete", value = "删除素材")
+ @ApiOperation(value = "删除素材")
+ @RequestMapping(value = "{id}", method = {RequestMethod.DELETE})
+ @ApiImplicitParam(name = "id", value = "素材ID", required = true, paramType = "path")
+ public Result delete(@PathVariable final Integer id) {
+ try {
+ entityService.removeById(id);
+ return new Result(true, "成功删除素材", null);
+ } catch (DataIntegrityViolationException e) {
+ LOG.error("删除素材失败", e);
+ return new Result(false, "删除素材失败", "该素材不能删除,存在其他关联数据");
+ } catch (Exception e) {
+ LOG.error("删除素材失败", e);
+ return new Result(false, "删除素材失败", e.getMessage());
+ }
+ }
+
+ @SysLog(action = "one", value = "查询单个素材")
+ @ApiOperation(value = "查询单个素材")
+ @RequestMapping(value = "{id}", method = {RequestMethod.GET})
+ @ApiImplicitParam(name = "id", value = "素材ID", required = true, paramType = "path")
+ public Result one(@PathVariable final Integer id) {
+ try {
+ CpMaterial entity = entityService.getById(id);
+ return new Result(true, entity);
+ } catch (Exception e) {
+ LOG.error("查询单个素材失败", e);
+ return new Result(false, new CpMaterial());
+ }
+ }
+
+ @SysLog(action = "add", value = "添加素材")
+ @ApiOperation(value = "添加素材")
+ @RequestMapping(method = {RequestMethod.POST})
+ public Result add(@Valid @RequestBody final CpMaterial entity, final BindingResult result) {
+ try {
+ if (result.hasErrors()) {
+ Map map = this.getErrors(result);
+ String errorMsg = map.entrySet().iterator().next().getValue();
+ return new Result(false, "保存素材失败", errorMsg, map);
+ } else {
+ entityService.save(entity);
+ return new Result(true, "成功保存素材", null);
+ }
+ } catch (Exception e) {
+ LOG.error("添加素材失败", e);
+ return new Result(false, "保存素材失败", e.getMessage());
+ }
+ }
+
+ @SysLog(action = "update", value = "修改素材")
+ @ApiOperation(value = "修改素材")
+ @RequestMapping(method = {RequestMethod.PUT})
+ public Result update(@Valid @RequestBody final CpMaterial entity, final BindingResult result) {
+ try {
+ if (result.hasErrors()) {
+ Map map = this.getErrors(result);
+ String errorMsg = map.entrySet().iterator().next().getValue();
+ return new Result(false, "修改素材失败", errorMsg, map);
+ } else {
+ if (null == entity.getId()) {
+ throw new RuntimeException("id不能为空");
+ }
+ entityService.updateById(entity);
+ return new Result(true, "成功修改素材", null);
+ }
+ } catch (Exception e) {
+ LOG.error("修改素材失败", e);
+ return new Result(false, "修改素材失败", e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "全部素材")
+ @RequestMapping(value = "all", method = RequestMethod.GET)
+ public Result> all(CpMaterial example) {
+ List entitys = entityService.list(example);
+ if (null != entitys) {
+ return new Result<>(true, entitys);
+ }
+ return new Result<>(true, Collections.emptyList());
+ }
+
+}
+
diff --git a/src/main/java/com/aircraft/api/fly/controller/OdOrderAnalysisController.java b/src/main/java/com/aircraft/api/fly/controller/OdOrderAnalysisController.java
new file mode 100644
index 0000000..4583cc7
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/controller/OdOrderAnalysisController.java
@@ -0,0 +1,35 @@
+package com.aircraft.api.fly.controller;
+
+import com.aircraft.api.fly.service.OdOrderAnalysisService;
+import com.aircraft.api.fly.vo.OdOrderAnalysisResult;
+import com.base.helper.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "订单分析")
+@RestController
+@RequestMapping("/order/analysis")
+public class OdOrderAnalysisController {
+
+ @Autowired
+ private OdOrderAnalysisService analysisService;
+
+ @ApiOperation("按时间维度分析订单")
+ @PostMapping("/time")
+ //传入day/month/year,返回某周,某月,某年的总订单量,总销售额及其趋势
+ public Result analyzeOrdersByTimeDimension(String TimeDimension) {
+ OdOrderAnalysisResult result = analysisService.analyzeOrdersByTimeDimension(TimeDimension);
+ return new Result<>(true, result);
+ }
+ @ApiOperation("按时间范围分析订单")
+ @GetMapping("/timeRange")
+ public OdOrderAnalysisResult analyzeByDateRange(
+ @RequestParam("startDate") String startDate,
+ @RequestParam("endDate") String endDate
+ ) {
+ return analysisService.analyzeOrdersByDateRange(startDate, endDate);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/aircraft/api/fly/controller/RouteController.java b/src/main/java/com/aircraft/api/fly/controller/RouteController.java
new file mode 100644
index 0000000..043ced1
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/controller/RouteController.java
@@ -0,0 +1,136 @@
+package com.aircraft.api.fly.controller;
+
+import com.aircraft.api.fly.entity.Route;
+import com.aircraft.api.fly.service.RouteService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.base.annotation.SysLog;
+import com.base.helper.BaseController;
+import com.base.helper.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 路线信息表 前端控制器
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Api(tags = "路线管理")
+@RestController
+@RequestMapping("/route")
+public class RouteController extends BaseController {
+
+ private static final Logger LOG = LoggerFactory.getLogger(RouteController.class);
+ @Autowired
+ private RouteService entityService;
+
+ @SysLog(action = "findByPage", value = "分页查询路线")
+ @ApiOperation(value = "分页查询路线", notes = "分页查询路线")
+ @RequestMapping(method = RequestMethod.GET)
+ @ApiImplicitParams({@ApiImplicitParam(name = "size", value = "分页大小", paramType = "query"),
+ @ApiImplicitParam(name = "current", value = "当前页面:从1开始", paramType = "query")})
+ public Result> findByPage(final Route example, final Page page) {
+ IPage records = entityService.page(example,page);
+ return new Result(true, records);
+ }
+
+ @SysLog(action = "delete", value = "删除路线")
+ @ApiOperation(value = "删除路线")
+ @RequestMapping(value = "{id}", method = {RequestMethod.DELETE})
+ @ApiImplicitParam(name = "id", value = "路线ID", required = true, paramType = "path")
+ public Result delete(@PathVariable final Integer id) {
+ try {
+ entityService.removeById(id);
+ return new Result(true, "成功删除路线", null);
+ } catch (DataIntegrityViolationException e) {
+ LOG.error("删除路线失败", e);
+ return new Result(false, "删除路线失败", "该路线不能删除,存在其他关联数据");
+ } catch (Exception e) {
+ LOG.error("删除路线失败", e);
+ return new Result(false, "删除路线失败", e.getMessage());
+ }
+ }
+
+ @SysLog(action = "one", value = "查询单个路线")
+ @ApiOperation(value = "查询单个路线")
+ @RequestMapping(value = "{id}", method = {RequestMethod.GET})
+ @ApiImplicitParam(name = "id", value = "路线ID", required = true, paramType = "path")
+ public Result one(@PathVariable final Integer id) {
+ try {
+ Route entity = entityService.getById(id);
+ return new Result(true, entity);
+ } catch (Exception e) {
+ LOG.error("查询单个路线失败", e);
+ return new Result(false, new Route());
+ }
+ }
+
+ @SysLog(action = "add", value = "添加路线")
+ @ApiOperation(value = "添加路线")
+ @RequestMapping(method = {RequestMethod.POST})
+ public Result add(@Valid @RequestBody final Route entity, final BindingResult result) {
+ try {
+ if (result.hasErrors()) {
+ Map map = this.getErrors(result);
+ String errorMsg = map.entrySet().iterator().next().getValue();
+ return new Result(false, "保存路线失败", errorMsg, map);
+ } else {
+ entityService.save(entity);
+ return new Result(true, "成功保存路线", null);
+ }
+ } catch (Exception e) {
+ LOG.error("添加路线失败", e);
+ return new Result(false, "保存路线失败", e.getMessage());
+ }
+ }
+
+ @SysLog(action = "update", value = "修改路线")
+ @ApiOperation(value = "修改路线")
+ @RequestMapping(method = {RequestMethod.PUT})
+ public Result update(@Valid @RequestBody final Route entity, final BindingResult result) {
+ try {
+ if (result.hasErrors()) {
+ Map map = this.getErrors(result);
+ String errorMsg = map.entrySet().iterator().next().getValue();
+ return new Result(false, "修改路线失败", errorMsg, map);
+ } else {
+ if (null == entity.getId()) {
+ throw new RuntimeException("id不能为空");
+ }
+ entityService.updateById(entity);
+ return new Result(true, "成功修改路线", null);
+ }
+ } catch (Exception e) {
+ LOG.error("修改路线失败", e);
+ return new Result(false, "修改路线失败", e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "全部路线")
+ @RequestMapping(value = "all", method = RequestMethod.GET)
+ public Result> all(Route example) {
+ List entitys = entityService.list(example);
+ if (null != entitys) {
+ return new Result<>(true, entitys);
+ }
+ return new Result<>(true, Collections.emptyList());
+ }
+
+}
+
diff --git a/src/main/java/com/aircraft/api/fly/dao/CpMaterialMapper.java b/src/main/java/com/aircraft/api/fly/dao/CpMaterialMapper.java
new file mode 100644
index 0000000..178d7fa
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/dao/CpMaterialMapper.java
@@ -0,0 +1,17 @@
+package com.aircraft.api.fly.dao;
+
+
+import com.aircraft.api.fly.entity.CpMaterial;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+public interface CpMaterialMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/dao/RouteMapper.java b/src/main/java/com/aircraft/api/fly/dao/RouteMapper.java
new file mode 100644
index 0000000..522f20f
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/dao/RouteMapper.java
@@ -0,0 +1,17 @@
+package com.aircraft.api.fly.dao;
+
+
+import com.aircraft.api.fly.entity.Route;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * 路线信息表 Mapper 接口
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+public interface RouteMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/entity/CpMaterial.java b/src/main/java/com/aircraft/api/fly/entity/CpMaterial.java
new file mode 100644
index 0000000..f88fcc4
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/entity/CpMaterial.java
@@ -0,0 +1,56 @@
+package com.aircraft.api.fly.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ *
+ *
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="CpMaterial", description="")
+public class CpMaterial implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "主键")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "素材名称")
+ private String name;
+
+ @ApiModelProperty(value = "素材存储路径")
+ private String path;
+
+ @ApiModelProperty(value = "素材类型:1:轮播图,2:宣传视频")
+ private Integer type;
+
+ @ApiModelProperty(value = "排序号,数值越小越靠前")
+ private Integer orderNum;
+
+ @ApiModelProperty(value = "链接地址")
+ private String url;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "状态:t:启用,f:禁用")
+ private String state;
+
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/entity/Route.java b/src/main/java/com/aircraft/api/fly/entity/Route.java
new file mode 100644
index 0000000..ff5adbe
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/entity/Route.java
@@ -0,0 +1,78 @@
+package com.aircraft.api.fly.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 路线信息表
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Route", description="路线信息表")
+public class Route implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "主键")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "路线名称")
+ private String name;
+
+ @ApiModelProperty(value = "城市名称,例如:广东,北京")
+ private String cityName;
+
+ @ApiModelProperty(value = "关联景区id")
+ private Integer scenicId;
+
+ @ApiModelProperty(value = "起点,手动存储经纬度,不调用地图")
+ private String startPoint;
+
+ @ApiModelProperty(value = "终点")
+ private String endPoint;
+
+ @ApiModelProperty(value = "价格")
+ private BigDecimal price;
+
+ @ApiModelProperty(value = "文章链接")
+ private String link;
+
+ @ApiModelProperty(value = "跳转地址")
+ private String url;
+
+ @ApiModelProperty(value = "封面图存储路径")
+ private String imgPath;
+
+ @ApiModelProperty(value = "排序号")
+ private Integer orderNum;
+
+ @ApiModelProperty(value = "是否展示在用户列表,“1”展示 “0”不展示(如超级管理员账号不展示在用户列表)")
+ private String show;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "更新时间")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "状态,“1”有效 “0”删除")
+ private String state;
+
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/service/CpMaterialService.java b/src/main/java/com/aircraft/api/fly/service/CpMaterialService.java
new file mode 100644
index 0000000..8f519db
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/CpMaterialService.java
@@ -0,0 +1,34 @@
+package com.aircraft.api.fly.service;
+
+import com.aircraft.api.fly.entity.CpMaterial;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+public interface CpMaterialService extends IService {
+
+ /**
+ * 条件查询
+ * @param example
+ * @return
+ */
+ List list(CpMaterial example);
+
+ /**
+ * 分页查询
+ * @param example
+ * @param page
+ * @return
+ */
+ IPage page(CpMaterial example,IPage page);
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/service/OdOrderAnalysisService.java b/src/main/java/com/aircraft/api/fly/service/OdOrderAnalysisService.java
new file mode 100644
index 0000000..9b4a298
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/OdOrderAnalysisService.java
@@ -0,0 +1,10 @@
+package com.aircraft.api.fly.service;
+
+import com.aircraft.api.fly.vo.OdOrderAnalysisResult;
+
+public interface OdOrderAnalysisService {
+
+ OdOrderAnalysisResult analyzeOrdersByTimeDimension(String TimeDimension);
+
+ OdOrderAnalysisResult analyzeOrdersByDateRange(String startDate, String endDate);
+}
diff --git a/src/main/java/com/aircraft/api/fly/service/RouteService.java b/src/main/java/com/aircraft/api/fly/service/RouteService.java
new file mode 100644
index 0000000..03ed887
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/RouteService.java
@@ -0,0 +1,34 @@
+package com.aircraft.api.fly.service;
+
+import com.aircraft.api.fly.entity.Route;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ *
+ * 路线信息表 服务类
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+public interface RouteService extends IService {
+
+ /**
+ * 条件查询
+ * @param example
+ * @return
+ */
+ List list(Route example);
+
+ /**
+ * 分页查询
+ * @param example
+ * @param page
+ * @return
+ */
+ IPage page(Route example,IPage page);
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/service/impl/CpMaterialServiceImpl.java b/src/main/java/com/aircraft/api/fly/service/impl/CpMaterialServiceImpl.java
new file mode 100644
index 0000000..db10c2d
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/impl/CpMaterialServiceImpl.java
@@ -0,0 +1,45 @@
+package com.aircraft.api.fly.service.impl;
+
+import com.aircraft.api.fly.dao.CpMaterialMapper;
+import com.aircraft.api.fly.entity.CpMaterial;
+import com.aircraft.api.fly.service.CpMaterialService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Service
+public class CpMaterialServiceImpl extends ServiceImpl implements CpMaterialService {
+
+ @Override
+ public List list(CpMaterial example) {
+ return this.list(buildWrapper(example));
+ }
+
+ @Override
+ public IPage page(CpMaterial example, IPage page) {
+ return this.page(page,buildWrapper(example));
+ }
+
+ /**
+ * 构建查询
+ *
+ * @param example
+ * @return
+ */
+ private QueryWrapper buildWrapper(CpMaterial example) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ return wrapper;
+ }
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/service/impl/OdOrderAnalysisServiceImpl.java b/src/main/java/com/aircraft/api/fly/service/impl/OdOrderAnalysisServiceImpl.java
new file mode 100644
index 0000000..e6e717e
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/impl/OdOrderAnalysisServiceImpl.java
@@ -0,0 +1,183 @@
+package com.aircraft.api.fly.service.impl;
+
+import com.aircraft.api.fly.service.OdOrderAnalysisService;
+import com.aircraft.api.fly.vo.OdOrderAnalysisResult;
+import com.aircraft.api.od.entity.OdOrder;
+import com.aircraft.api.od.service.OdOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class OdOrderAnalysisServiceImpl implements OdOrderAnalysisService {
+
+ @Autowired
+ private OdOrderService orderService;
+
+ @Override
+ //按日月年(传入day/month/year),分别统计本周每日、本周每月、近7年的订单数量和销售额
+ public OdOrderAnalysisResult analyzeOrdersByTimeDimension(String timeDimension) {
+ OdOrderAnalysisResult result = new OdOrderAnalysisResult();
+ switch (timeDimension.toLowerCase()) {
+ case "day":
+ // 处理按日统计逻辑,获取本周内每一天的数据
+ List dailyDataList = new ArrayList<>();
+ LocalDate today = LocalDate.now();
+ // 获取本周一
+ LocalDate monday = today.with(DayOfWeek.MONDAY);
+
+ // 遍历本周七天
+ for (int i = 0; i < 7; i++) {
+ LocalDate currentDay = monday.plusDays(i);
+ LocalDate nextDay = currentDay.plusDays(1);
+
+ // 查询当天订单
+ List dailyOrders = orderService.findByCreateTimeBetween(
+ currentDay.atStartOfDay(),
+ nextDay.atStartOfDay()
+ );
+
+ // 处理当天数据
+ OdOrderAnalysisResult.DailyData dailyData = new OdOrderAnalysisResult.DailyData();
+ dailyData.setDate(currentDay.format(DateTimeFormatter.ISO_LOCAL_DATE));
+ dailyData.setOrderCount(dailyOrders.size());
+
+ double dailySales = 0;
+ for (OdOrder order : dailyOrders) {
+ dailySales += order.getAmount();
+ }
+ dailyData.setSalesAmount(dailySales);
+
+ dailyDataList.add(dailyData);
+ }
+
+ result.setDailyDataList(dailyDataList);
+ result.setTimeDimensionDesc("本周每日");
+ break;
+ case "month":
+ // 处理按月统计逻辑(保持原有逻辑不变)
+ List monthlyDataList = new ArrayList<>();
+ for (int month = 1; month <= 12; month++) {
+ LocalDate monthStart = LocalDate.of(LocalDate.now().getYear(), month, 1);
+ LocalDate monthEnd = monthStart.plusMonths(1);
+ List monthOrders = orderService.findByCreateTimeBetween(monthStart.atStartOfDay(), monthEnd.atStartOfDay());
+ OdOrderAnalysisResult.MonthlyData monthlyData = new OdOrderAnalysisResult.MonthlyData();
+ monthlyData.setMonth(month + "月");
+ monthlyData.setOrderCount(monthOrders.size());
+
+ double monthlySales = 0;
+ for (OdOrder order : monthOrders) {
+ monthlySales += order.getAmount();
+ }
+ monthlyData.setSalesAmount(monthlySales);
+
+ monthlyDataList.add(monthlyData);
+ }
+ result.setMonthlyDataList(monthlyDataList);
+ result.setTimeDimensionDesc("每月");
+ break;
+ case "year":
+ // 处理按年统计逻辑,查询最近7年的数据
+ List yearlyDataList = new ArrayList<>();
+ LocalDate currentDate = LocalDate.now();
+
+ // 计算近7年的年份范围
+ for (int i = 6; i >= 0; i--) {
+ int year = currentDate.minus(i, ChronoUnit.YEARS).getYear();
+ LocalDate yearStart = LocalDate.of(year, 1, 1);
+ LocalDate yearEnd = yearStart.plusYears(1);
+
+ List yearOrders = orderService.findByCreateTimeBetween(yearStart.atStartOfDay(), yearEnd.atStartOfDay());
+
+ OdOrderAnalysisResult.YearlyData yearlyData = new OdOrderAnalysisResult.YearlyData();
+ yearlyData.setYear(year);
+ yearlyData.setOrderCount(yearOrders.size());
+
+ double yearlySales = 0;
+ for (OdOrder order : yearOrders) {
+ yearlySales += order.getAmount();
+ }
+ yearlyData.setSalesAmount(yearlySales);
+
+ yearlyDataList.add(yearlyData);
+ }
+ result.setYearlyDataList(yearlyDataList);
+ result.setTimeDimensionDesc("近7年");
+ break;
+ default:
+ throw new IllegalArgumentException("无效的时间维度,支持 'day'(本周每日)、'month'(每月)、'year'(每年)");
+ }
+ return result;
+ }
+
+ @Override
+ //传入时间范围,查询该时间范围内每日的数据,以及总订单量和销售额
+ public OdOrderAnalysisResult analyzeOrdersByDateRange(String startDateStr, String endDateStr) {
+ // 解析日期
+ LocalDate startDate = parseDate(startDateStr);
+ LocalDate endDate = parseDate(endDateStr);
+
+ // 验证日期有效性
+ if (startDate.isAfter(endDate)) {
+ throw new IllegalArgumentException("开始日期不能晚于结束日期");
+ }
+
+ // 初始化结果对象
+ OdOrderAnalysisResult result = new OdOrderAnalysisResult();
+ result.setTimeDimensionDesc(String.format("%s至%s", startDateStr, endDateStr));
+ List dailyDataList = new ArrayList<>();
+
+ // 计算总天数
+ long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate) + 1;
+
+ // 遍历日期范围,按天查询数据
+ for (int i = 0; i < daysBetween; i++) {
+ LocalDate currentDate = startDate.plusDays(i);
+ LocalDate nextDate = currentDate.plusDays(1);
+
+ // 查询当天订单
+ List dailyOrders = orderService.findByCreateTimeBetween(
+ currentDate.atStartOfDay(),
+ nextDate.atStartOfDay()
+ );
+
+ // 处理单日数据
+ OdOrderAnalysisResult.DailyData dailyData = new OdOrderAnalysisResult.DailyData();
+ dailyData.setDate(currentDate.toString());
+ dailyData.setOrderCount(dailyOrders.size());
+
+ double dailySales = 0;
+ for (OdOrder order : dailyOrders) {
+ dailySales += order.getAmount();
+ }
+ dailyData.setSalesAmount(dailySales);
+
+ dailyDataList.add(dailyData);
+ }
+ // 设置结果
+ result.setDailyDataList(dailyDataList);
+ // 计算总计
+ int totalOrderCount = dailyDataList.stream().mapToInt(OdOrderAnalysisResult.DailyData::getOrderCount).sum();
+ double totalSalesAmount = dailyDataList.stream().mapToDouble(OdOrderAnalysisResult.DailyData::getSalesAmount).sum();
+ result.setTotalOrderCount(totalOrderCount);
+ result.setTotalSalesAmount(totalSalesAmount);
+ return result;
+ }
+
+ /**
+ * 解析日期字符串,支持 yyyy-MM-dd 格式
+ */
+ private LocalDate parseDate(String dateStr) {
+ try {
+ return LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("日期格式不正确,支持格式:yyyy-MM-dd", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/aircraft/api/fly/service/impl/RouteServiceImpl.java b/src/main/java/com/aircraft/api/fly/service/impl/RouteServiceImpl.java
new file mode 100644
index 0000000..57dbecc
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/service/impl/RouteServiceImpl.java
@@ -0,0 +1,45 @@
+package com.aircraft.api.fly.service.impl;
+
+import com.aircraft.api.fly.dao.RouteMapper;
+import com.aircraft.api.fly.entity.Route;
+import com.aircraft.api.fly.service.RouteService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ *
+ * 路线信息表 服务实现类
+ *
+ *
+ * @author gjj
+ * @since 2025-07-05
+ */
+@Service
+public class RouteServiceImpl extends ServiceImpl implements RouteService {
+
+ @Override
+ public List list(Route example) {
+ return this.list(buildWrapper(example));
+ }
+
+ @Override
+ public IPage page(Route example, IPage page) {
+ return this.page(page,buildWrapper(example));
+ }
+
+ /**
+ * 构建查询
+ *
+ * @param example
+ * @return
+ */
+ private QueryWrapper buildWrapper(Route example) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ return wrapper;
+ }
+
+}
diff --git a/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisQuery.java b/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisQuery.java
new file mode 100644
index 0000000..b7b360a
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisQuery.java
@@ -0,0 +1,24 @@
+package com.aircraft.api.fly.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel("订单分析查询条件")
+public class OdOrderAnalysisQuery {
+
+ @ApiModelProperty("分析时间维度(日/月/年)")
+ private String timeDimension; // day/month/year
+
+ @ApiModelProperty("开始时间")
+ private LocalDateTime startTime;
+
+ @ApiModelProperty("结束时间")
+ private LocalDateTime endTime;
+
+ @ApiModelProperty("订单状态")
+ private String orderStatus;
+}
\ No newline at end of file
diff --git a/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisResult.java b/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisResult.java
new file mode 100644
index 0000000..6dae759
--- /dev/null
+++ b/src/main/java/com/aircraft/api/fly/vo/OdOrderAnalysisResult.java
@@ -0,0 +1,53 @@
+package com.aircraft.api.fly.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OdOrderAnalysisResult {
+
+ // 通用字段,用于周、年统计时的总订单量
+ private int totalOrderCount;
+ // 通用字段,用于周、年统计时的总销售额
+ private double totalSalesAmount;
+ // 时间维度描述,如“本周”“每月”“当年”
+ private String timeDimensionDesc;
+ // 按日统计时,存储每日数据的列表
+ private List dailyDataList;
+ // 按月统计时,存储每月数据的列表
+ private List monthlyDataList;
+ // 按年统计时,存储近7年数据的列表
+ private List yearlyDataList;
+
+ // 内部类,用于存储按日统计时每日的订单数量和销售额
+ @Data
+ public static class DailyData {
+ // 日期,如“2025-07-01”
+ private String date;
+ // 当日订单数量
+ private int orderCount;
+ // 当日销售额
+ private double salesAmount;
+ }
+
+ // 内部类,用于存储按月统计时每个月的订单数量和销售额
+ @Data
+ public static class MonthlyData {
+ // 月份,如“1月”“2月”等
+ private String month;
+ // 当月订单数量
+ private int orderCount;
+ // 当月销售额
+ private double salesAmount;
+ }
+
+ // 内部类,用于存储按年统计时每年的订单数量和销售额
+ @Data
+ public static class YearlyData {
+ private int year;
+ private int orderCount;
+ private double salesAmount;
+ }
+
+}
\ No newline at end of file