doum
11 小时以前 af9dbca3efad378d31bbde9f78cea6e3ba08d39f
经销商管理
已添加6个文件
已修改2个文件
574 ■■■■ 文件已修改
admin/src/views/index.vue 340 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/WorkbenchController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/CountDataDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/BusinessDataCountVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/CountDataVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/WorkbenchService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WorkbenchServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue
@@ -1,91 +1,204 @@
<template>
  <TableLayout>
    <div slot="search-form" class="data">
        <div class="item-title">数据看板</div>
      <div class="top-tab">
        <div class="tab-title">经营数据分析</div>
        <div class="tab-item">
          <span v-for="(item,index) in tabs" :key="'tab'+index"  :class="item.index==tabIndex?'active-tab tab-btn':'tab-btn'" @click="changeTab(item)">{{item.name}}</span>
        </div>
      </div>
        <div class="item-title"> </div>
        <div class="data-summary">
          <div class="data-item">
            <div>会员数量</div>
            <div class="data-num">{{ countData.users }}</div>
          <div class="data-item blue">
            <div>{{tabName}}销售额</div>
            <div class="data-num">ï¿¥{{ (countData.totalPrice ||0).toFixed(2) }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>今日活跃用户</div>
            <div class="data-num">{{ countData.activeUsers }}</div>
          <div class="data-item yellow">
            <div>{{tabName}}成交订单量</div>
            <div class="data-num">{{ countData.totalNum ||0}}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>订单总数</div>
            <div class="data-num">{{ countData.orders }}</div>
          <div class="data-item green">
            <div>{{tabName}}退款金额</div>
            <div class="data-num">ï¿¥{{( countData.totalRefundPrice ||0).toFixed(2) }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>订单总金额</div>
            <div class="data-num">{{ countData.money }}</div>
          <div class="data-item orange">
            <div>{{tabName}}退款订单量</div>
            <div class="data-num">{{ countData.totalRefundNum ||0 }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>本月订单数</div>
            <div class="data-num">{{ countData.mouthOrders }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>本月订单总金额</div>
            <div class="data-num">{{ countData.mouthMoney }}</div>
          </div>
        </div>
      </div>
    <template v-slot:table-wrap>
      <div class="change-style">
        <div class="item-title">订单金额趋势</div>
        <div style="display: flex;">
          <el-button type="text" @click="changeCount(7)">7日</el-button>
          <div style="margin: 0 5px;">|</div>
          <el-button type="text" @click="changeCount(30)">30日</el-button>
        <div class="count-left">
          <div class="item-title">订单量与销售额趋势</div>
          <div ref="orderCount" class="bottom"></div>
        </div>
        <div class="count-right">
          <div class="item-title">各品类销售额占比</div>
          <div ref="cateCount" class="bottom"></div>
        </div>
      </div>
      <div ref="orderChange" class="bottom">
      <div class="change-style">
          <div class="tab-title" style="display: flex;align-items: center; ">
            <span style="">排名分析</span>
            <div class="tab-item" style="margin-left: 20px;" >
              <el-date-picker  style="width: 110px;height: 22px;margin-right: 10px;"   v-model="searchForm.topYear"  type="year"
                  clearable  value-format="yyyy"     format="yyyy'å¹´'"   placeholder="年份" ></el-date-picker>
              <el-date-picker  style="width: 100px;height: 22px;"   v-model="searchForm.topMonth"  type="month"
                               clearable  value-format="MM"     format="MM'月'"   placeholder="月份" ></el-date-picker>
            </div>
          </div>
      </div>
      <div class="change-style">
        <div class="count-left">
          <div class="item-title" style="display: flex;">
            <span style="flex: 1">经销商IOP10</span>
            <div class="tab-item" style="text-align: right;flex: 1.5; ">
              <span v-for="(item,index) in tabs1" :key="'tab'+index"  :class="item.index==tabIndex1?'active-tab tab-btn':'tab-btn'" @click="changeTab1(item)">{{item.name}}</span>
            </div>
          </div>
          <div class="bottom1">
            <el-table  :data="dataList1||[]"  stripe  border inline >
              <el-table-column prop="sortnum" label="排名"  align="center">
                <template slot-scope="scope">{{scope.$index +1}}</template>
              </el-table-column>
              <el-table-column prop="name" label="经销商名称"   align="center" >  </el-table-column>
              <el-table-column prop="num" label="订单量"   align="center" >  </el-table-column>
              <el-table-column prop="price" label="销售额(元)" align="center" ></el-table-column>
              <el-table-column prop="num2" label="会员数" align="center"  ></el-table-column>
            </el-table>
          </div>
        </div>
        <div class="count-right">
          <div class="item-title">
            <div class="item-title" style="display: flex;">
              <span style="flex: 1">单一商品TOP10</span>
              <div class="tab-item" style="text-align: right;flex: 1.5; ">
                <span v-for="(item,index) in tabs2" :key="'tab'+index"  :class="item.index==tabIndex2?'active-tab tab-btn':'tab-btn'" @click="changeTab2(item)">{{item.name}}</span>
              </div>
            </div>
          </div>
          <div class="bottom1">
            <el-table  :data="dataList2||[]"  stripe  border >
              <el-table-column prop="sortnum" label="排名"   align="center">
                <template slot-scope="scope">{{scope.$index +1}}</template>
              </el-table-column>
              <el-table-column prop="name" label="商品名称"   align="center" >  </el-table-column>
              <el-table-column prop="num" label="销量"   align="center" >  </el-table-column>
              <el-table-column prop="price" label="销售额(元)" align="center"  ></el-table-column>
            </el-table>
          </div>
        </div>
      </div>
      <div class="change-style">
        <div class="tab-title" style="display: flex;align-items: center; ">
          <span style="">营销数据分析</span>
          <div class="tab-item" style="margin-left: 20px;" >
            <el-date-picker  style="width: 110px;height: 22px;margin-right: 10px;"   v-model="searchForm.topYear2"  type="year"
                             clearable  value-format="yyyy"     format="yyyy'å¹´'"   placeholder="年份" ></el-date-picker>
          </div>
        </div>
      </div>
      <div class="change-style">
        <div class="count-left">
          <div class="item-title">积分发放类型占比</div>
          <div  class="bottom2" style="display: flex">
              <div ref="integralCount" style="flex: 1"></div>
              <div style="flex: 1;font-size: 14px;font-weight: 500;">
                  <div>累计消耗:{{10000}}</div>
                  <div>累计优惠金额:¥{{10000 }}</div>
              </div>
          </div>
        </div>
        <div class="count-right">
          <div class="item-title">优惠券发放类型占比</div>
          <div  class="bottom2">
            <div  class="bottom2" style="display: flex">
              <div ref="couponCount" style="flex: 1"></div>
              <div style="flex: 1;font-size: 14px;font-weight: 500;">
                <div>已使用优惠券:{{10000}}</div>
                <div>累计优惠金额:¥{{10000 }}</div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="change-style" v-if="1==2">
          <div class="item-title">营销投入费用与销售额分析</div>
          <div ref="feeCount" class="bottom"></div>
      </div>
    </template>
  </TableLayout>
</template>
<script>
import TableLayout from '@/layouts/TableLayout'
import * as echarts from 'echarts';
import { findAllList, createCoffeeTask } from '@/api/business/taskRule'
import * as echarts from 'echarts'
export default {
  components: {
    TableLayout
  },
  data() {
  data () {
    return {
      countData: {
        users: 1000,
        activeUsers: 1000,
        mouthOrders: 10,
        mouthMoney: 100000,
        orders: 10,
        money: 100000
      tabs2: [{ index: 0, name: '按销量' }, { index: 1, name: '按销售额' } ],
      tabs1: [{ index: 0, name: '按订单量' }, { index: 1, name: '按销售额' }, { index: 2, name: '按会员数' }],
      tabs: [{ index: 0, name: '今日' }, { index: 1, name: '近7日' }, { index: 2, name: '近30日' }, { index: 3, name: '近1å¹´' }],
      tabName: '今日',
      tabIndex: 0,
      tabIndex1: 0,
      tabIndex2: 0,
      searchForm:{
        topYear:null,
        topMonth:null,
        topYear2:null,
      },
      orderCorderCount: [10,10,20,10,40,10,30],
      countData: {
        totalPrice: 1000,
        totalNum: 1000,
        totalRefundPrice: 10000,
        totalRefundNum: 100
      },
      dataList1:[],
      dataList2:[],
      orderCorderCount: [10, 10, 20, 10, 40, 10, 30],
      opinionData: ['3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26'],
      myChart: null
      myChart0: null,
      myChart1: null
    }
  },
  mounted() {
    this.myChart = echarts.init(this.$refs.orderChange)
    window.addEventListener('resize', () => {
      this.myChart.resize()
    })
    this.renderOrderChange()
    findAllList({})
  mounted () {
    this.initCountData()
  },
  methods: {
    renderOrderChange() {
      this.myChart.setOption({
    initCountData () {
      this.myChart0 = echarts.init(this.$refs.orderCount)
      window.addEventListener('resize', () => {
        this.myChart0.resize()
      })
      this.myChart1 = echarts.init(this.$refs.cateCount)
      window.addEventListener('resize', () => {
        this.myChart1.resize()
      })
      this.renderOrderChange(this.myChart0)
      this.renderOrderChange(this.myChart1)
    },
    changeTab (item) {
      this.tabName = item.name
      this.tabIndex = item.index
    },
    changeTab1 (item) {
      this.tabIndex1 = item.index
    },
    changeTab2 (item) {
      this.tabIndex2 = item.index
    },
    renderOrderChange (chart) {
      chart.setOption({
        tooltip: {
          trigger: 'axis'
        },
@@ -97,7 +210,7 @@
        },
        toolbox: {
          feature: {
          }
        },
        xAxis: {
@@ -115,37 +228,90 @@
          data: this.orderCorderCount
        }]
      })
    },
    changeCount(page) {
    changeCount (page) {
      if (page == 7) {
        this.orderCorderCount = [10,10,20,10,40,10,30]
        this.orderCorderCount = [10, 10, 20, 10, 40, 10, 30]
        this.opinionData = ['3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26']
      } else {
        this.orderCorderCount = [11,10,20,10,40,10,30,20,10,20,10,40,10,30,10,10,20,10,40,10,30,10,10,20,10,40,10,30,20,40]
        this.opinionData = ['3.01','3.02','3.03','3.04','3.05','3.06','3.07','3.08','3.09','3.10','3.11','3.12','3.13','3.14','3.15','3.16','3.17','3.18','3.19','3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26', '3.27','3.28','3.28','3.30',]
        this.orderCorderCount = [11, 10, 20, 10, 40, 10, 30, 20, 10, 20, 10, 40, 10, 30, 10, 10, 20, 10, 40, 10, 30, 10, 10, 20, 10, 40, 10, 30, 20, 40]
        this.opinionData = ['3.01', '3.02', '3.03', '3.04', '3.05', '3.06', '3.07', '3.08', '3.09', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15', '3.16', '3.17', '3.18', '3.19', '3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26', '3.27', '3.28', '3.28', '3.30']
      }
      // this.orderCorderCount.push(1)
      // this.opinionData.push(1)
      this.renderOrderChange()
    }
  },
  }
}
</script>
<style lang="scss" scoped>
::v-deep .el-input--small .el-input__inner{
  height: 22px;
  line-height: 22px;
  border-radius: 0;
}
::v-deep .el-input--small .el-input__icon{
  height: 22px;
  line-height: 22px;
}
.top-tab{
  margin-bottom: 30px;
  display: block;
}
.tab-title{
  font-weight: 600;
  font-size: 16px;
  color: #222222;
  line-height: 22px;
  display: inline;
}
.tab-item{
  display: inline;
  margin-left: 50px;
  .active-tab{
    border: 1px solid #216EEE !important;
    color: #216EEE !important;
  }
  .tab-btn{
    font-weight: normal;
    cursor: pointer;
    border-radius: 0px;
    margin: 0px 5px;
    font-size: 12px;
    border: 1px solid #999;
    color: #999;
    padding: 1px 5px;
    background-color: #f2f2f2;
  }
}
.data {
  padding-bottom: 10px;
}
.item-title {
  font-weight: 500;
  font-weight: 600;
  font-size: 14px;
  color: #222222;
  margin-left: 20px;
  line-height: 22px;
}
.data-summary {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
  margin-bottom: 20px;
  .green{
    border-left: 8px solid #12bb8b;
  }
  .yellow{
    border-left: 8px solid #f6cf46;
  }
  .blue{
    border-left: 8px solid #216EEE;
  }
  .orange{
    border-left: 8px solid #ff9e56;
  }
  .data-item {
    flex: 1;
    height: 80px;
@@ -153,12 +319,15 @@
    box-sizing: border-box;
    padding: 15px;
    display: flex;
    font-size: 14px;
    flex-direction: column;
    justify-content: space-between;
    background-color: #f4f7fc;
    color: #666;
    .data-num {
      font-size: 20px;
      font-weight: 700;
      color:aqua
      font-weight: 800;
      color: #333;
    }
  }
  .parting {
@@ -169,9 +338,42 @@
  display: flex;
  justify-content: space-between;
  line-height: 31px;
}
.bottom {
  height: 500px;
}
</style>
  margin-bottom: 50px;
  .count-left{
    display: inline-block;
    margin-right: 10px;
    flex: 1;
    .bottom {
      height: 500px;
      width: 100%;
    }
    .bottom2 {
      height: 300px;
      width: 100%;
    }
    .bottom1 {
      height: auto;
      width: 100%;
    }
  }
  .count-right{
    display: inline-block;
    margin-left: 10px;
    flex: 1;
    .bottom {
      height: 500px;
      width: 100%;
    }
    .bottom2 {
      height: 300px;
      width: 100%;
    }
    .bottom1 {
      height: auto;
      width: 100%;
    }
  }
}
</style>
server/dmmall_admin/src/main/java/com/doumee/api/business/WorkbenchController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import com.doumee.service.business.FundService;
import com.doumee.service.business.WorkbenchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Api(tags = "工作台数据统计接口")
@RestController
@RequestMapping("/business/workbench")
public class WorkbenchController extends BaseController {
    @Autowired
    private WorkbenchService workbenchService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/businessData")
    @RequiresPermissions("business:fund:create")
    public ApiResponse<BusinessDataCountVO> create(@RequestBody CountDataDTO param) {
        return ApiResponse.success(workbenchService.businessData(param));
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
@@ -8,6 +8,8 @@
import com.doumee.dao.web.request.goods.GoodsRequest;
import com.doumee.dao.web.response.goods.GoodsInfoResponse;
import com.doumee.dao.web.response.goods.MemberOrderResponse;
import com.github.yulichang.base.mapper.MPJJoinMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.annotations.ApiModelProperty;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -18,7 +20,7 @@
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface GoodsorderMapper extends BaseMapper<Goodsorder> {
public interface GoodsorderMapper extends MPJJoinMapper<Goodsorder> {
    @Select(" select g.CODE AS code ,  g.id as orderId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/CountDataDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("经销商账户明细对象")
public class CountDataDTO {
    @ApiModelProperty(value = "排名", example = "1")
    private Integer year;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Integer month;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Integer type;
    @ApiModelProperty(value = "时间类型 0今天 1近七日 2近30天 3一年")
    private int dateType;
    @ApiModelProperty(value = "开始时间")
    private Date startTime;
    @ApiModelProperty(value = "截止时间")
    private Date endTime;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/BusinessDataCountVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("经营数据分析统计解雇")
public class BusinessDataCountVO {
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Long num;
    @ApiModelProperty(value = "统计数量2 (会员数)")
    private Long num2;
    @ApiModelProperty(value = "销售额,优惠金额")
    private BigDecimal price;
    @ApiModelProperty(value = "销售额,促成交易金额金额")
    private BigDecimal price1;
    @ApiModelProperty(value = "统计维度名称")
    private String name;
    @ApiModelProperty(value = "统计列表数据")
    private List<CountDataVO> dataList;
    @ApiModelProperty(value = "统计列表数据2")
    private List<CountDataVO> dataList2;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/CountDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.dao.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel("经销商账户明细对象")
public class CountDataVO {
    @ApiModelProperty(value = "排名", example = "1")
    private Integer sortnum;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Long num;
    @ApiModelProperty(value = "统计数量2 (会员数)")
    private Long num2;
    @ApiModelProperty(value = "销售额,优惠金额")
    private BigDecimal price;
    @ApiModelProperty(value = "销售额,促成交易金额金额")
    private BigDecimal price1;
    @ApiModelProperty(value = "统计维度名称")
    private String name;
}
server/dmmall_service/src/main/java/com/doumee/service/business/WorkbenchService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import java.util.List;
/**
 * èµ„金明细信息表Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface WorkbenchService {
    BusinessDataCountVO businessData(CountDataDTO param);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WorkbenchServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.rocketmq5.NormalMsgProducer;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import com.doumee.dao.web.dto.CollectDTO;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.dto.OrgDTO;
import com.doumee.dao.web.dto.activity.*;
import com.doumee.dao.web.dto.shop.ShopSimpleDTO;
import com.doumee.dao.web.request.ActivityPageListRequest;
import com.doumee.service.business.*;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * æ´»åŠ¨ã€èµ„è®¯ã€æŽ¢åº—ä¿¡æ¯è¡¨Service实现
 *
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Service
public class WorkbenchServiceImpl implements WorkbenchService {
    @Autowired
    private GoodsorderMapper goodsorderMapper;
    @Override
    public BusinessDataCountVO businessData(CountDataDTO param) {
        BusinessDataCountVO data = new BusinessDataCountVO();
        int dataType = param.getDateType();//0今日 1近七日 2近30日 3近1å¹´
        int days = 1;
        switch (dataType) {
            case 1: {
                days = 7;
                break;
            } case 2: {
                days =30;
                break;
            } case 3: {
                days = 365;
                break;
            } default:{
            }
        }
        Date startDate = DateUtil.addDaysToDate(Utils.Date.getStart(new Date()),-days);
        CountDataVO r=   goodsorderMapper.selectJoinOne(CountDataVO.class,new MPJLambdaWrapper<Goodsorder>()
                .ge(Goodsorder::getCreateDate,startDate)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.DONE.getKey())
                );
        return data;
    }
}