Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

523096025 vor 2 Monaten
Ursprung
Commit
9bd07be1a5
20 geänderte Dateien mit 764 neuen und 8 gelöschten Zeilen
  1. 8 0
      huimv-farm/src/main/java/vip/xiaonuo/money/controller/MoneyProduceController.java
  2. 46 0
      huimv-farm/src/main/java/vip/xiaonuo/money/entity/vo/MoneyProduceScreenVo.java
  3. 4 0
      huimv-farm/src/main/java/vip/xiaonuo/money/service/IMoneyProduceService.java
  4. 31 0
      huimv-farm/src/main/java/vip/xiaonuo/money/service/impl/MoneyProduceServiceImpl.java
  5. 15 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleCustomerController.java
  6. 8 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleDetailController.java
  7. 43 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleTargetController.java
  8. 7 1
      huimv-farm/src/main/java/vip/xiaonuo/sale/entity/SaleTarget.java
  9. 45 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleCustomerVo.java
  10. 16 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleTargetDetailVo.java
  11. 41 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleTargetVo.java
  12. 4 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/mapper/SaleCustomerMapper.java
  13. 4 1
      huimv-farm/src/main/java/vip/xiaonuo/sale/param/SaleParam.java
  14. 6 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleCustomerService.java
  15. 4 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleDetailService.java
  16. 21 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleTargetService.java
  17. 112 1
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleCustomerServiceImpl.java
  18. 75 0
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleDetailServiceImpl.java
  19. 263 5
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleTargetServiceImpl.java
  20. 11 0
      huimv-farm/src/main/resources/mapper/SaleCustomerMapper.xml

+ 8 - 0
huimv-farm/src/main/java/vip/xiaonuo/money/controller/MoneyProduceController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.money.entity.MoneyProduce;
+import vip.xiaonuo.money.entity.vo.MoneyProduceScreenVo;
 import vip.xiaonuo.money.param.MoneyAnalysisParam;
 import vip.xiaonuo.money.param.MoneyInOutParam;
 import vip.xiaonuo.money.param.MoneyProduceIncomeParam;
@@ -71,4 +72,11 @@ public class MoneyProduceController {
     public CommonResult<JSONArray> produceIncomeAnalysis(@RequestBody MoneyProduceIncomeParam moneyProduceParam) {
         return CommonResult.data(produceService.produceIncomeAnalysis(moneyProduceParam));
     }
+
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("大屏各部门销售收入趋势分析")
+    @PostMapping("/money-produce/getList")
+    public CommonResult<List<MoneyProduceScreenVo>> getList(@RequestBody MoneyInOutParam inOutParam) {
+        return CommonResult.data(produceService.getList(inOutParam));
+    }
 }

+ 46 - 0
huimv-farm/src/main/java/vip/xiaonuo/money/entity/vo/MoneyProduceScreenVo.java

@@ -0,0 +1,46 @@
+package vip.xiaonuo.money.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 财务产品销售收入
+ * </p>
+ *
+ * @author author
+ * @since 2024-11-19
+ */
+@Data
+
+public class MoneyProduceScreenVo implements Serializable {
+
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间", position = 8)
+    private String createTime;
+
+
+    /**
+     * 收入类型 0为国内 1为国外
+     */
+    @ApiModelProperty(value = "国内收入", position = 11)
+    private String inMoney;
+
+    /**
+     * 收入类型 0为国内 1为国外
+     */
+    @ApiModelProperty(value = "国外收入", position = 12)
+    private String outMoney;
+}

+ 4 - 0
huimv-farm/src/main/java/vip/xiaonuo/money/service/IMoneyProduceService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import vip.xiaonuo.money.entity.MoneyProduce;
 import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.money.entity.vo.MoneyProduceScreenVo;
 import vip.xiaonuo.money.param.MoneyAnalysisParam;
 import vip.xiaonuo.money.param.MoneyInOutParam;
 import vip.xiaonuo.money.param.MoneyProduceIncomeParam;
@@ -34,4 +35,7 @@ public interface IMoneyProduceService extends IService<MoneyProduce> {
 
     //财务图表产品销售收入分析
     JSONArray produceIncomeAnalysis(MoneyProduceIncomeParam moneyProduceParam);
+
+    //大屏各部门销售收入趋势分析
+    List<MoneyProduceScreenVo> getList(MoneyInOutParam inOutParam);
 }

+ 31 - 0
huimv-farm/src/main/java/vip/xiaonuo/money/service/impl/MoneyProduceServiceImpl.java

@@ -10,6 +10,7 @@ import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import vip.xiaonuo.money.entity.MoneyProduce;
 import vip.xiaonuo.money.entity.MoneyProduceIncome;
+import vip.xiaonuo.money.entity.vo.MoneyProduceScreenVo;
 import vip.xiaonuo.money.mapper.MoneyProduceIncomeMapper;
 import vip.xiaonuo.money.mapper.MoneyProduceMapper;
 import vip.xiaonuo.money.param.MoneyAnalysisParam;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -240,4 +242,33 @@ public class MoneyProduceServiceImpl extends ServiceImpl<MoneyProduceMapper, Mon
         }
         return jsonArray;
     }
+
+    @Override
+    public List<MoneyProduceScreenVo> getList(MoneyInOutParam inOutParam) {
+        String orgId = inOutParam.getOrgId();
+        QueryWrapper<MoneyProduce> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+//        queryWrapper.ge("create_time", DateUtil.beginOfYear(new Date()));
+        queryWrapper.select(" IFNULL(sum(in_money),'0') inMoney,IFNULL(sum(out_money),'0') outMoney,create_time createTime");
+        queryWrapper.orderByAsc("create_time");
+        queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')");
+        List<MoneyProduce> produces = produceMapper.selectList(queryWrapper);
+        List<MoneyProduceScreenVo> list = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        if (produces.size() != 0) {
+            for (MoneyProduce produce : produces) {
+                BigDecimal math = new BigDecimal("10000");
+                BigDecimal bg=new BigDecimal(produce.getInMoney());
+                BigDecimal bg1=new BigDecimal(produce.getOutMoney());
+                MoneyProduceScreenVo vo = new MoneyProduceScreenVo();
+                vo.setCreateTime(sdf.format(produce.getCreateTime()));
+                vo.setInMoney(bg.divide(math, 2, RoundingMode.HALF_UP).toString());
+                vo.setOutMoney(bg1.divide(math, 2, RoundingMode.HALF_UP).toString());
+                list.add(vo);
+            }
+
+        }
+        return list;
+    }
+
 }

+ 15 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleCustomerController.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.sale.entity.SaleCustomer;
 import vip.xiaonuo.sale.entity.SaleSalesman;
+import vip.xiaonuo.sale.entity.vo.SaleCustomerVo;
 import vip.xiaonuo.sale.param.SaleCustomerParam;
 import vip.xiaonuo.sale.param.SaleSalesmanParam;
 import vip.xiaonuo.sale.service.ISaleCustomerService;
@@ -44,4 +45,18 @@ public class SaleCustomerController {
     public CommonResult<List<SaleCustomer>> getList(@RequestBody SaleCustomerParam customerParam) {
         return CommonResult.data(customerService.getList(customerParam));
     }
+
+    @PostMapping("/sale-customer/getListTop")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("大屏客户销售金额分析,只取top10")
+    public CommonResult<List<SaleCustomer>> getListTop(@RequestBody SaleCustomerParam customerParam) {
+        return CommonResult.data(customerService.getListTop(customerParam));
+    }
+
+    @PostMapping("/sale-customer/getDetail")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("大屏客户销售金额变动分析")
+    public CommonResult<List<SaleCustomerVo>> getDetail(@RequestBody SaleCustomerParam customerParam) {
+        return CommonResult.data(customerService.getDetail(customerParam));
+    }
 }

+ 8 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleDetailController.java

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.sale.entity.SaleDetail;
 import vip.xiaonuo.sale.entity.SaleReceive;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
 import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleDetailParam;
 import vip.xiaonuo.sale.param.SaleReceiveParam;
@@ -53,4 +54,11 @@ public class SaleDetailController {
     public CommonResult<Page<SaleDetail>> getList2(@RequestBody SaleDetailPageParam detailPageParam) {
         return CommonResult.data(detailService.getList2(detailPageParam));
     }
+
+    @PostMapping("/sale-detail/listTop")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("大屏业务员销售排名top10,包含全部")
+    public CommonResult<Page<SaleDetail>> listTop(@RequestBody SaleDetailPageParam customerParam) {
+        return CommonResult.data(detailService.listTop(customerParam));
+    }
 }

+ 43 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/controller/SaleTargetController.java

@@ -2,6 +2,7 @@ package vip.xiaonuo.sale.controller;
 
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import io.swagger.annotations.Api;
@@ -15,7 +16,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.sale.entity.SaleCost;
+import vip.xiaonuo.sale.entity.SaleTarget;
+import vip.xiaonuo.sale.entity.vo.SaleTargetDetailVo;
+import vip.xiaonuo.sale.entity.vo.SaleTargetVo;
 import vip.xiaonuo.sale.param.SaleCostParam;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
+import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleParam;
 import vip.xiaonuo.sale.service.ISaleTargetService;
 
@@ -44,4 +50,41 @@ public class SaleTargetController {
     public CommonResult<JSONArray> getList(@RequestBody SaleParam saleParam) {
         return CommonResult.data(targetService.getTarget(saleParam));
     }
+
+    @PostMapping("/sale-target/getTargetScreen")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("大屏销售指标")
+    public CommonResult<SaleTargetVo> getTargetScreen(@RequestBody SaleParam saleParam) {
+        return CommonResult.data(targetService.getTargetScreen(saleParam));
+    }
+
+    @PostMapping("/sale-target/getCompleteDetail")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("大屏销售计划完成率详情")
+    public CommonResult<List<SaleTargetDetailVo>> getCompleteDetail(@RequestBody SaleParam saleParam) {
+        return CommonResult.data(targetService.getCompleteDetail(saleParam));
+    }
+
+    @PostMapping("/sale-target/getVisitNumDetail")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("大屏客户拜访次数详情")
+    public CommonResult<List<SaleTargetDetailVo>> getVisitNumDetail(@RequestBody SaleParam saleParam) {
+        return CommonResult.data(targetService.getVisitNumDetail(saleParam));
+    }
+
+    @PostMapping("/sale-target/getSaleMoneyDetail")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("大屏销售合同金额详情")
+    public CommonResult<List<SaleTargetDetailVo>> getSaleMoneyDetail(@RequestBody SaleParam saleParam) {
+        return CommonResult.data(targetService.getSaleMoneyDetail(saleParam));
+    }
+
+    @PostMapping("/sale-target/listTop")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation("大屏客户拜访top10,包含全部")
+    public CommonResult<Page<SaleTarget>> listTop(@RequestBody SaleDetailPageParam customerParam) {
+        return CommonResult.data(targetService.listTop(customerParam));
+    }
 }
+
+

+ 7 - 1
huimv-farm/src/main/java/vip/xiaonuo/sale/entity/SaleTarget.java

@@ -41,6 +41,12 @@ public class SaleTarget implements Serializable {
     /**
      * 拜访客户次数
      */
+    @ApiModelProperty(value = "客户名称",position =2 )
+    private String customerName;
+
+    /**
+     * 拜访客户次数
+     */
     @ApiModelProperty(value = "拜访客户次数",position =2 )
     private String visitNumber;
 
@@ -81,7 +87,7 @@ public class SaleTarget implements Serializable {
     @ApiModelProperty(value = "组织id",position =8 )
     private String orgId;
 
-    private String customerName;
+
 
 
 }

+ 45 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleCustomerVo.java

@@ -0,0 +1,45 @@
+package vip.xiaonuo.sale.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 销售客户贡献
+ * </p>
+ *
+ * @author author
+ * @since 2024-12-13
+ */
+@Data
+
+public class SaleCustomerVo  {
+
+    /**
+     * 客户名称
+     */
+    @ApiModelProperty(value = "客户名称", position =1)
+    private String customer;
+
+    /**
+     * 销售额
+     */
+    @ApiModelProperty(value = "本年销售额", position =2)
+    private String saleMoney;
+
+    /**
+     * 销售额
+     */
+    @ApiModelProperty(value = "去年销售额", position =3)
+    private String lastSaleMoney;
+
+}

+ 16 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleTargetDetailVo.java

@@ -0,0 +1,16 @@
+package vip.xiaonuo.sale.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SaleTargetDetailVo {
+
+    private String value;
+
+    private String createTime;
+
+}

+ 41 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/entity/vo/SaleTargetVo.java

@@ -0,0 +1,41 @@
+package vip.xiaonuo.sale.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SaleTargetVo {
+
+    @ApiModelProperty(value = "销售计划完成率",position = 1)
+    private String complete;
+
+    @ApiModelProperty(value = "销售计划完成率同比",position = 2)
+    private String completeRate;
+
+    @ApiModelProperty(value = "客户拜访次数",position = 3)
+    private String visitNum;
+
+    @ApiModelProperty(value = "客户拜访次数同比",position = 4)
+    private String visitNumRate;
+
+    @ApiModelProperty(value = "销售合同金额", position = 5)
+    private String saleMoney;
+
+    @ApiModelProperty(value = "销售合同金额同比", position = 6)
+    private String saleMoneyRate;
+
+    @ApiModelProperty(value = "销售发货金额", position = 7)
+    private String saleDeliverMoney;
+
+    @ApiModelProperty(value = "销售发货金额同比", position = 8)
+    private String saleDeliverMoneyRate;
+
+    @ApiModelProperty(value = "销售应收款", position = 9)
+    private String receiveMoney;
+
+    @ApiModelProperty(value = "销售应收款同比", position = 10)
+    private String receiveMoneyRate;
+}

+ 4 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/mapper/SaleCustomerMapper.java

@@ -2,6 +2,9 @@ package vip.xiaonuo.sale.mapper;
 
 import vip.xiaonuo.sale.entity.SaleCustomer;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.sale.entity.vo.SaleCustomerVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface SaleCustomerMapper extends BaseMapper<SaleCustomer> {
 
+    List<SaleCustomerVo> getDetail(String orgId);
 }

+ 4 - 1
huimv-farm/src/main/java/vip/xiaonuo/sale/param/SaleParam.java

@@ -30,7 +30,10 @@ public class SaleParam {
     @ApiModelProperty(value = "orgId", required = true)
     private String orgId;
 
-    @ApiModelProperty(value = "时间,格式为‘2024-12’", required = true)
+    @ApiModelProperty(value = "时间,格式为‘2024-12’")
     private String time;
 
+    @ApiModelProperty(value = "0月 1年’")
+    private Integer type;
+
 }

+ 6 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleCustomerService.java

@@ -2,6 +2,7 @@ package vip.xiaonuo.sale.service;
 
 import vip.xiaonuo.sale.entity.SaleCustomer;
 import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.sale.entity.vo.SaleCustomerVo;
 import vip.xiaonuo.sale.param.SaleCustomerParam;
 
 import java.util.List;
@@ -18,4 +19,9 @@ public interface ISaleCustomerService extends IService<SaleCustomer> {
 
     List<SaleCustomer> getList(SaleCustomerParam customerParam);
 
+    //大屏客户销售金额分析,只取top10
+    List<SaleCustomer> getListTop(SaleCustomerParam customerParam);
+
+    //大屏客户销售金额变动分析
+    List<SaleCustomerVo> getDetail(SaleCustomerParam customerParam);
 }

+ 4 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleDetailService.java

@@ -3,6 +3,7 @@ package vip.xiaonuo.sale.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import vip.xiaonuo.sale.entity.SaleDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
 import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleDetailParam;
 
@@ -24,4 +25,7 @@ public interface ISaleDetailService extends IService<SaleDetail> {
     //客户销售额明显表
     Page<SaleDetail> getList2(SaleDetailPageParam detailPageParam);
 
+    //大屏业务员销售排名top10,包含全部
+    Page<SaleDetail> listTop(SaleDetailPageParam customerParam);
+
 }

+ 21 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/service/ISaleTargetService.java

@@ -1,10 +1,17 @@
 package vip.xiaonuo.sale.service;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import vip.xiaonuo.sale.entity.SaleTarget;
 import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.sale.entity.vo.SaleTargetDetailVo;
+import vip.xiaonuo.sale.entity.vo.SaleTargetVo;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
+import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleParam;
 
+import java.util.List;
+
 /**
  * <p>
  * 销售指标 服务类
@@ -17,4 +24,18 @@ public interface ISaleTargetService extends IService<SaleTarget> {
 
     JSONArray getTarget(SaleParam saleParam);
 
+    //大屏指标
+    SaleTargetVo getTargetScreen(SaleParam saleParam);
+
+    //销售计划完成率详情
+    List<SaleTargetDetailVo> getCompleteDetail(SaleParam saleParam);
+
+    //大屏客户拜访次数详情
+    List<SaleTargetDetailVo> getVisitNumDetail(SaleParam saleParam);
+
+    //大屏销售合同金额详情
+    List<SaleTargetDetailVo> getSaleMoneyDetail(SaleParam saleParam);
+
+    //大屏客户拜访top10,包含全部
+    Page<SaleTarget> listTop(SaleDetailPageParam customerParam);
 }

+ 112 - 1
huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleCustomerServiceImpl.java

@@ -1,9 +1,16 @@
 package vip.xiaonuo.sale.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import vip.xiaonuo.sale.entity.SaleCustomer;
+import vip.xiaonuo.sale.entity.SaleSalesman;
+import vip.xiaonuo.sale.entity.vo.SaleCustomerVo;
 import vip.xiaonuo.sale.mapper.SaleCustomerMapper;
 import vip.xiaonuo.sale.param.SaleCustomerParam;
 import vip.xiaonuo.sale.service.ISaleCustomerService;
@@ -12,7 +19,8 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * <p>
@@ -45,4 +53,107 @@ public class SaleCustomerServiceImpl extends ServiceImpl<SaleCustomerMapper, Sal
         return saleCustomers;
     }
 
+    @Override
+    public List<SaleCustomer> getListTop(SaleCustomerParam customerParam) {
+        String orgId = customerParam.getOrgId();
+        QueryWrapper<SaleCustomer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.select(" customer customer,IFNULL(sum(sale_money),'0') saleMoney");
+        queryWrapper.groupBy("customer");
+        List<SaleCustomer> saleCustomers = customerMapper.selectList(queryWrapper);
+        BigDecimal math = new BigDecimal("10000");
+        for (SaleCustomer saleCustomer : saleCustomers) {
+            BigDecimal bg = new BigDecimal(saleCustomer.getSaleMoney());
+            bg = bg.divide(math, 2, RoundingMode.HALF_UP);
+            saleCustomer.setSaleMoney(bg.toString());
+        }
+        List<SaleCustomer> customers = jsonArraySort(saleCustomers, true);
+        return customers;
+    }
+
+    @Override
+    public List<SaleCustomerVo> getDetail(SaleCustomerParam customerParam) {
+        String orgId = customerParam.getOrgId();
+        QueryWrapper<SaleCustomer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        String year = sdf.format(date);
+        queryWrapper.between("create_time", Integer.parseInt(year) - 1 + "-01-01 00:00:00", Integer.parseInt(year) - 1 + "-12-31 23:59:59");
+        queryWrapper.select(" IFNULL(sum(sale_money),'0') saleMoney,customer");
+        queryWrapper.groupBy("customer");
+        List<SaleCustomer> saleCustomers = customerMapper.selectList(queryWrapper);
+        List<SaleCustomerVo> customerVos = new ArrayList<>();
+        BigDecimal math = new BigDecimal("10000");
+        if (saleCustomers.size() != 0) {
+            List<SaleCustomer> customers = jsonArraySort(saleCustomers, true);
+            for (SaleCustomer customer : customers) {
+                SaleCustomerVo vo = new SaleCustomerVo();
+                QueryWrapper<SaleCustomer> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.eq("customer", customer.getCustomer()).ge("create_time", DateUtil.beginOfYear(new Date()));
+                queryWrapper1.select(" IFNULL(sum(sale_money),'0') saleMoney");
+                SaleCustomer saleCustomer = customerMapper.selectOne(queryWrapper1);
+                vo.setCustomer(customer.getCustomer());
+                BigDecimal bg = new BigDecimal(saleCustomer.getSaleMoney());
+                bg = bg.divide(math, 2, RoundingMode.HALF_UP);
+                BigDecimal bg1 = new BigDecimal(customer.getSaleMoney());
+                bg1 = bg1.divide(math, 2, RoundingMode.HALF_UP);
+                vo.setLastSaleMoney(bg1.toString());
+                vo.setSaleMoney(bg.toString());
+                customerVos.add(vo);
+            }
+        }
+
+        return customerVos;
+    }
+
+
+    /*数组排序*/
+    public static List<SaleCustomer> jsonArraySort(List<SaleCustomer> jsonArr, boolean is_desc) {
+        //存放排序结果json数组
+        List<SaleCustomer> salesmanList = new ArrayList<>();
+        //用于排序的list
+        List<SaleCustomer> list = new ArrayList<>();
+        //将参数json数组每一项取出,放入list
+
+        for (int i = 0; i <jsonArr.size() ; i++) {
+            list.add(jsonArr.get(i));
+        }
+
+        //快速排序,重写compare方法,完成按指定字段比较,完成排序
+        Collections.sort(list, new Comparator<SaleCustomer>() {
+            @Override
+            public int compare(SaleCustomer o1, SaleCustomer o2) {
+                //如果用String接会导致一位数和两位数混合比对的时候不能准确比出来,要用int类型接
+                //String valA = new String();
+                //String valB = new String();
+                Float valA = 0.00f;
+                Float valB = 0.00f;
+                try {
+                    valA = Float.parseFloat(o1.getSaleMoney());
+                    valB = Float.parseFloat(o2.getSaleMoney());
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                //是升序还是降序
+                if (is_desc) {
+                    return -valA.compareTo(valB);
+                } else {
+                    return -valB.compareTo(valA);
+                }
+
+            }
+        });
+        //将排序后结果放入结果jsonArray
+        if (jsonArr.size() > 10) {
+            for (int i = 0; i < 10; i++) {
+                salesmanList.add(list.get(i));
+            }
+        } else {
+            for (int i = 0; i < jsonArr.size(); i++) {
+                salesmanList.add(list.get(i));
+            }
+        }
+        return salesmanList;
+    }
 }

+ 75 - 0
huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleDetailServiceImpl.java

@@ -1,17 +1,25 @@
 package vip.xiaonuo.sale.service.impl;
 
+import com.alibaba.fastjson.JSONException;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.beans.factory.annotation.Autowired;
 import vip.xiaonuo.sale.entity.SaleDetail;
+import vip.xiaonuo.sale.entity.SaleSalesman;
 import vip.xiaonuo.sale.mapper.SaleDetailMapper;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
 import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleDetailParam;
 import vip.xiaonuo.sale.service.ISaleDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -50,4 +58,71 @@ public class SaleDetailServiceImpl extends ServiceImpl<SaleDetailMapper, SaleDet
         return detailMapper.selectPage(page, queryWrapper);
     }
 
+    @Override
+    public Page<SaleDetail> listTop(SaleDetailPageParam customerParam) {
+        Integer pageNum = customerParam.getPageNum();
+        Integer pageSize = customerParam.getPageSize();
+        String orgId = customerParam.getOrgId();
+        Page<SaleDetail> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<SaleDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.select(" IFNULL(sum(sale_money),'0') saleMoney,salesman salesman");
+        queryWrapper.orderByDesc("saleMoney");
+        queryWrapper.groupBy("salesman");
+        Page<SaleDetail> selectPage = detailMapper.selectPage(page, queryWrapper);
+        List<SaleDetail> saleDetails = selectPage.getRecords();
+        BigDecimal math = new BigDecimal("10000");
+        if (saleDetails.size() != 0) {
+            for (int i = 0; i < saleDetails.size(); i++) {
+                BigDecimal bg = new BigDecimal(saleDetails.get(i).getSaleMoney());
+                saleDetails.get(i).setSaleMoney(bg.divide(math, 2, RoundingMode.HALF_UP).toString());
+                saleDetails.get(i).setId(i + 1);
+            }
+        }
+        return selectPage;
+    }
+
+    /*数组排序*/
+    public static List<SaleDetail> jsonArraySort(List<SaleDetail> jsonArr, boolean is_desc) {
+        //存放排序结果json数组
+        List<SaleDetail> salesmanList = new ArrayList<>();
+        //用于排序的list
+        List<SaleDetail> list = new ArrayList<>();
+        //将参数json数组每一项取出,放入list
+
+        for (int i = 0; i <jsonArr.size() ; i++) {
+            list.add(jsonArr.get(i));
+        }
+
+        //快速排序,重写compare方法,完成按指定字段比较,完成排序
+        Collections.sort(list, new Comparator<SaleDetail>() {
+            @Override
+            public int compare(SaleDetail o1, SaleDetail o2) {
+                //如果用String接会导致一位数和两位数混合比对的时候不能准确比出来,要用int类型接
+                //String valA = new String();
+                //String valB = new String();
+                Float valA = 0.00f;
+                Float valB = 0.00f;
+                try {
+                    valA = Float.parseFloat(o1.getSaleMoney());
+                    valB = Float.parseFloat(o2.getSaleMoney());
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                //是升序还是降序
+                if (is_desc) {
+                    return -valA.compareTo(valB);
+                } else {
+                    return -valB.compareTo(valA);
+                }
+
+            }
+        });
+        //将排序后结果放入结果jsonArray
+        for (int i = 0; i < jsonArr.size(); i++) {
+            salesmanList.add(list.get(i));
+        }
+
+        return salesmanList;
+    }
 }

+ 263 - 5
huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleTargetServiceImpl.java

@@ -5,12 +5,14 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.beans.factory.annotation.Autowired;
-import vip.xiaonuo.sale.entity.SaleDeliver;
-import vip.xiaonuo.sale.entity.SaleInvoice;
-import vip.xiaonuo.sale.entity.SaleOrder;
-import vip.xiaonuo.sale.entity.SaleTarget;
+import vip.xiaonuo.sale.entity.*;
+import vip.xiaonuo.sale.entity.vo.SaleTargetDetailVo;
+import vip.xiaonuo.sale.entity.vo.SaleTargetVo;
 import vip.xiaonuo.sale.mapper.*;
+import vip.xiaonuo.sale.param.SaleCustomerParam;
+import vip.xiaonuo.sale.param.SaleDetailPageParam;
 import vip.xiaonuo.sale.param.SaleParam;
 import vip.xiaonuo.sale.service.ISaleTargetService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -18,7 +20,11 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * <p>
@@ -39,12 +45,14 @@ public class SaleTargetServiceImpl extends ServiceImpl<SaleTargetMapper, SaleTar
     private SaleDeliverMapper deliverMapper;
     @Autowired
     private SaleOrderMapper orderMapper;
+    @Autowired
+    private SaleReceiveMapper receiveMapper;
 
     @Override
     public JSONArray getTarget(SaleParam saleParam) {
         String orgId = saleParam.getOrgId();
         String time = saleParam.getTime();
-        String year = time.substring(0, 4);
+        String year = time.substring(0, 4);//2025-02
 
         //销售发货金额
         QueryWrapper<SaleDeliver> deliverQueryWrapper = new QueryWrapper<>();
@@ -122,4 +130,254 @@ public class SaleTargetServiceImpl extends ServiceImpl<SaleTargetMapper, SaleTar
         jsonArray.add(jsonObject1);
         return jsonArray;
     }
+
+    @Override
+    public SaleTargetVo getTargetScreen(SaleParam saleParam) {
+        String orgId = saleParam.getOrgId();
+        String time = saleParam.getTime();
+        String year = time.substring(0, 4);
+        int lastYear = Integer.parseInt(year) - 1;
+        String month = time.substring(5, 7);
+        SaleTargetVo vo = new SaleTargetVo();
+
+
+        //客户拜访次数
+        QueryWrapper<SaleTarget> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        queryWrapper.select(" IFNULL(sum(visit_number),'0') visitNumber");
+        SaleTarget monthTarget = targetMapper.selectOne(queryWrapper);
+        queryWrapper.clear();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.between("create_time", lastYear+"-"+month + "-01 00:00:00", lastYear+"-"+month +  "-31 23:59:59");
+        queryWrapper.select(" IFNULL(sum(visit_number),'0') visitNumber");
+        SaleTarget lastMonthTarget = targetMapper.selectOne(queryWrapper);
+
+        //销售合同金额
+        QueryWrapper<SaleOrder> orderQueryWrapper = new QueryWrapper<>();
+        orderQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        orderQueryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        orderQueryWrapper.select(" IFNULL(sum(sale_money),'0') saleMoney");
+        SaleOrder monthOrder = orderMapper.selectOne(orderQueryWrapper);
+        orderQueryWrapper.clear();
+        orderQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        orderQueryWrapper.between("create_time", lastYear+"-"+month + "-01 00:00:00", lastYear+"-"+month + "-31 23:59:59");
+        orderQueryWrapper.select(" IFNULL(sum(sale_money),'0') saleMoney");
+        SaleOrder yearOrder = orderMapper.selectOne(orderQueryWrapper);
+
+        //销售发货金额
+        QueryWrapper<SaleDeliver> deliverQueryWrapper = new QueryWrapper<>();
+        deliverQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        deliverQueryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        deliverQueryWrapper.select(" IFNULL(sum(sale_deliver_money),'0') saleDeliverMoney");
+        SaleDeliver monthDeliver = deliverMapper.selectOne(deliverQueryWrapper);
+        deliverQueryWrapper.clear();
+        deliverQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        deliverQueryWrapper.between("create_time", lastYear+"-"+month + "-01 00:00:00", lastYear+"-"+month + "-31 23:59:59");
+        deliverQueryWrapper.select(" IFNULL(sum(sale_deliver_money),'0') saleDeliverMoney");
+        SaleDeliver yearDeliver = deliverMapper.selectOne(deliverQueryWrapper);
+
+        //预期应收款金额
+        QueryWrapper<SaleReceive> saleReceiveQueryWrapper = new QueryWrapper<>();
+        saleReceiveQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        saleReceiveQueryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        saleReceiveQueryWrapper.select(" IFNULL(sum(receive_money),'0') receiveMoney");
+        SaleReceive monthReceive = receiveMapper.selectOne(saleReceiveQueryWrapper);
+        saleReceiveQueryWrapper.clear();
+        saleReceiveQueryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        saleReceiveQueryWrapper.between("create_time", lastYear+"-"+month + "-01 00:00:00", lastYear+"-"+month + "-31 23:59:59");
+        saleReceiveQueryWrapper.select(" IFNULL(sum(receive_money),'0') receiveMoney");
+        SaleReceive yearReceive = receiveMapper.selectOne(saleReceiveQueryWrapper);
+
+        DecimalFormat def = new DecimalFormat("0.00");
+        BigDecimal math = new BigDecimal("10000");
+
+        if (lastMonthTarget.getVisitNumber().equals("0")) {
+            vo.setVisitNumRate("0");
+        } else {
+            double v = (Double.valueOf(monthTarget.getVisitNumber()) - Double.valueOf(lastMonthTarget.getVisitNumber()))/Double.valueOf(lastMonthTarget.getVisitNumber());
+            if (v >= 1.0) {
+                vo.setVisitNumRate("100");
+            } else {
+                vo.setVisitNumRate(def.format(v * 100));
+            }
+        }
+        vo.setVisitNum(monthTarget.getVisitNumber());
+        vo.setComplete("0");
+        vo.setCompleteRate("0");
+        if (yearOrder.getSaleMoney().equals("0")) {
+            vo.setSaleMoneyRate("0");
+        } else {
+            double v = (Double.valueOf(monthOrder.getSaleMoney()) - Double.valueOf(yearOrder.getSaleMoney()))/Double.valueOf(yearOrder.getSaleMoney());
+            if (v >= 1.0) {
+                vo.setSaleMoneyRate("100");
+            } else {
+                vo.setSaleMoneyRate(def.format(v * 100));
+            }
+        }
+        BigDecimal bg = new BigDecimal(monthOrder.getSaleMoney());
+        vo.setSaleMoney(bg.divide(math, 2, RoundingMode.HALF_UP).toString());
+
+        if (yearDeliver.getSaleDeliverMoney().equals("0")) {
+            vo.setSaleDeliverMoneyRate("0");
+        } else {
+            double v = (Double.valueOf(monthDeliver.getSaleDeliverMoney()) - Double.valueOf(yearDeliver.getSaleDeliverMoney()))/Double.valueOf(yearDeliver.getSaleDeliverMoney());
+            if (v >= 1.0) {
+                vo.setSaleDeliverMoneyRate("100");
+            } else {
+                vo.setSaleDeliverMoneyRate(def.format(v * 100));
+            }
+        }
+        BigDecimal bg2 = new BigDecimal(monthDeliver.getSaleDeliverMoney());
+        vo.setSaleDeliverMoney(bg2.divide(math, 2, RoundingMode.HALF_UP).toString());
+
+        if (yearReceive.getReceiveMoney().equals("0")) {
+            vo.setReceiveMoneyRate("0");
+        } else {
+            double v = (Double.valueOf(monthReceive.getReceiveMoney()) - Double.valueOf(yearReceive.getReceiveMoney()))/Double.valueOf(yearReceive.getReceiveMoney());
+            if (v >= 1.0) {
+                vo.setReceiveMoneyRate("100");
+            } else {
+                vo.setReceiveMoneyRate(def.format(v * 100));
+            }
+        }
+        BigDecimal bg3 = new BigDecimal(monthReceive.getReceiveMoney());
+        vo.setReceiveMoney(bg3.divide(math, 2, RoundingMode.HALF_UP).toString());
+
+        return vo;
+    }
+
+    @Override
+    public List<SaleTargetDetailVo> getCompleteDetail(SaleParam saleParam) {
+        Integer type = saleParam.getType();
+        String time = saleParam.getTime();
+        String orgId = saleParam.getOrgId();
+        QueryWrapper<SaleTarget> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+//        queryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        if (0 == type) {
+            queryWrapper.select("convert(IFNULL(avg(complete_rate),'0'),decimal(10,2)) completeRate,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y-%m')");
+        } else {
+            queryWrapper.select("convert(IFNULL(avg(complete_rate),'0'),decimal(10,2)) completeRate,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y')");
+        }
+        queryWrapper.orderByAsc("create_time");
+
+        List<SaleTarget> targets = targetMapper.selectList(queryWrapper);
+        List<SaleTargetDetailVo> list = new ArrayList<>();
+        if (targets.size() != 0) {
+            for (SaleTarget target : targets) {
+                SaleTargetDetailVo vo = new SaleTargetDetailVo();
+                if (0 == type) {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                } else {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                }
+
+                vo.setValue(target.getCompleteRate());
+
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<SaleTargetDetailVo> getVisitNumDetail(SaleParam saleParam) {
+        Integer type = saleParam.getType();
+        String time = saleParam.getTime();
+        String orgId = saleParam.getOrgId();
+        QueryWrapper<SaleTarget> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+//        queryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        queryWrapper.orderByAsc("create_time");
+        if (0 == type) {
+            queryWrapper.select("convert(IFNULL(sum(visit_number),'0'),decimal(10,2)) visitNumber,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y-%m')");
+        } else {
+            queryWrapper.select("convert(IFNULL(sum(visit_number),'0'),decimal(10,2)) visitNumber,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y')");
+        }
+
+        List<SaleTarget> targets = targetMapper.selectList(queryWrapper);
+        List<SaleTargetDetailVo> list = new ArrayList<>();
+        if (targets.size() != 0) {
+            for (SaleTarget target : targets) {
+                SaleTargetDetailVo vo = new SaleTargetDetailVo();
+                if (0 == type) {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                } else {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                }
+                vo.setValue(target.getVisitNumber());
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<SaleTargetDetailVo> getSaleMoneyDetail(SaleParam saleParam) {
+        Integer type = saleParam.getType();
+        String time = saleParam.getTime();
+        String orgId = saleParam.getOrgId();
+        QueryWrapper<SaleOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+//        queryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        queryWrapper.orderByAsc("create_time");
+        if (0 == type) {
+            queryWrapper.select("IFNULL(sum(sale_money),'0') saleMoney,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y-%m')");
+        } else {
+            queryWrapper.select("IFNULL(sum(sale_money),'0') saleMoney,create_time createTime");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y')");
+        }
+
+        List<SaleOrder> targets = orderMapper.selectList(queryWrapper);
+        List<SaleTargetDetailVo> list = new ArrayList<>();
+        BigDecimal math = new BigDecimal("10000");
+        if (targets.size() != 0) {
+            for (SaleOrder target : targets) {
+                SaleTargetDetailVo vo = new SaleTargetDetailVo();
+                if (0 == type) {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                } else {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+                    vo.setCreateTime(sdf.format(target.getCreateTime()));
+                }
+                BigDecimal bg = new BigDecimal(target.getSaleMoney());
+                vo.setValue(bg.divide(math,2,RoundingMode.HALF_UP).toString());
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public Page<SaleTarget> listTop(SaleDetailPageParam customerParam) {
+        Integer pageNum = customerParam.getPageNum();
+        Integer pageSize = customerParam.getPageSize();
+        String orgId = customerParam.getOrgId();
+        Page<SaleTarget> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<SaleTarget> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.select(" IFNULL(sum(visit_number),'0') visitNumber,customer_name customerName");
+        queryWrapper.orderByDesc("visit_number");
+        queryWrapper.groupBy("customer_name");
+        Page<SaleTarget> targets = targetMapper.selectPage(page, queryWrapper);
+        List<SaleTarget> records = targets.getRecords();
+        if (records.size() != 0) {
+            for (int i = 0; i < records.size(); i++) {
+                records.get(i).setId(i + 1);
+            }
+        }
+        return targets;
+    }
+
 }

+ 11 - 0
huimv-farm/src/main/resources/mapper/SaleCustomerMapper.xml

@@ -2,4 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.sale.mapper.SaleCustomerMapper">
 
+    <select id="getDetail" resultType="vip.xiaonuo.sale.entity.vo.SaleCustomerVo">
+        SELECT
+    customer customer,
+    SUM(CASE WHEN YEAR(create_time) = YEAR(CURDATE()) THEN sale_money ELSE 0 END) AS saleMoney,
+    SUM(CASE WHEN YEAR(create_time) = YEAR(CURDATE()) - 1 THEN sale_money ELSE 0 END) AS lastSaleMoney
+FROM sale_customer
+        <if test="orgId!=null and orgId!=''">
+         where  org_id = #{orgId}
+        </if>
+GROUP BY customer;
+    </select>
 </mapper>