Răsfoiți Sursa

业务组月报表

yzc 1 an în urmă
părinte
comite
3fa469c9e7

+ 13 - 0
hx-sale/src/main/java/com/fjhx/sale/controller/dept/DeptPerfController.java

@@ -1,6 +1,8 @@
 package com.fjhx.sale.controller.dept;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.dto.DeptPerfSelectDto;
 import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
 import com.fjhx.sale.service.dept.DeptPerfService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,4 +44,15 @@ public class DeptPerfController {
         deptPerfService.edit(deptPerfDto);
     }
 
+
+    /**
+     * 月报表
+     *
+     * @return
+     */
+    @PostMapping("/monthlyReporting")
+    public List<JSONObject> monthlyReporting(@RequestBody DeptPerfSelectDto dto) {
+        return deptPerfService.monthlyReporting(dto);
+    }
+
 }

+ 57 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/DeptPerfReporting.java

@@ -0,0 +1,57 @@
+package com.fjhx.sale.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Setter
+@Getter
+public class DeptPerfReporting {
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+    /**
+     * 部门名称
+     */
+    private String deptName;
+    /**
+     * 组Id
+     */
+    private Long groupId;
+    /**
+     * 组名称
+     */
+    private String groupName;
+    /**
+     * 业务员名称
+     */
+    private String saleUserName;
+    /**
+     * 销售订单合计
+     */
+    private BigDecimal sumContractAmount;
+    /**
+     * 聚水谭合计
+     */
+    private BigDecimal sumJstAmount;
+    /**
+     * 月合计
+     */
+    private BigDecimal sumAmount;
+    /**
+     * 月目标金额
+     */
+    private BigDecimal targetAmount;
+    /**
+     * 完成率
+     */
+    private BigDecimal finishRate;
+    /**
+     * 排名
+     */
+    private Integer ranking;
+
+    private String dayStr;
+}

+ 9 - 0
hx-sale/src/main/java/com/fjhx/sale/mapper/dept/DeptPerfMapper.java

@@ -1,7 +1,9 @@
 package com.fjhx.sale.mapper.dept;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.sale.entity.DeptPerfReporting;
 import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.dto.DeptPerfSelectDto;
 import com.fjhx.sale.entity.dept.po.DeptPerf;
 import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
 import org.apache.ibatis.annotations.Param;
@@ -23,4 +25,11 @@ public interface DeptPerfMapper extends BaseMapper<DeptPerf> {
      */
     List<DeptPerfVo> getList(@Param("dto") DeptPerfDto dto);
 
+    /**
+     * 月报表
+     */
+    List<DeptPerfReporting> monthlyReporting(@Param("dto") DeptPerfSelectDto dto);
+
+    List<DeptPerfReporting> getDayRepo(@Param("dto") DeptPerfSelectDto dto);
+
 }

+ 6 - 0
hx-sale/src/main/java/com/fjhx/sale/service/dept/DeptPerfService.java

@@ -1,6 +1,8 @@
 package com.fjhx.sale.service.dept;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.dto.DeptPerfSelectDto;
 import com.fjhx.sale.entity.dept.po.DeptPerf;
 import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
 import com.ruoyi.common.core.service.BaseService;
@@ -27,4 +29,8 @@ public interface DeptPerfService extends BaseService<DeptPerf> {
      */
     void edit(DeptPerfDto deptPerfDto);
 
+    /**
+     * 月报表
+     */
+    List<JSONObject> monthlyReporting(DeptPerfSelectDto dto);
 }

+ 128 - 1
hx-sale/src/main/java/com/fjhx/sale/service/dept/impl/DeptPerfServiceImpl.java

@@ -1,17 +1,29 @@
 package com.fjhx.sale.service.dept.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.utils.Assert;
+import com.fjhx.sale.entity.DeptPerfReporting;
 import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.dto.DeptPerfSelectDto;
 import com.fjhx.sale.entity.dept.po.DeptPerf;
 import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
 import com.fjhx.sale.mapper.dept.DeptPerfMapper;
 import com.fjhx.sale.service.dept.DeptPerfService;
+import com.ruoyi.common.exception.ServiceException;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -47,4 +59,119 @@ public class DeptPerfServiceImpl extends ServiceImpl<DeptPerfMapper, DeptPerf> i
         this.saveOrUpdate(dto);
     }
 
+    /**
+     * 月报表
+     */
+    @Override
+    public List<JSONObject> monthlyReporting(DeptPerfSelectDto dto) {
+        Date date = dto.getBeginTime();
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String format = sdf.format(date);
+
+        String[] split = format.split("-");
+
+        int years = Integer.valueOf(split[0]);
+        int month = Integer.valueOf(split[1]);
+
+        List<DeptPerfReporting> dayRepo = baseMapper.getDayRepo(dto);
+        Map<Long, List<DeptPerfReporting>> dayRepoMap = dayRepo.stream().collect(Collectors.groupingBy(DeptPerfReporting::getDeptId));
+
+
+        List<DeptPerfReporting> deptPerfReports = baseMapper.monthlyReporting(dto);
+
+        //获取组目标金额
+        Map<Long, DeptPerf> deptPerfMap = this.mapKEntity(DeptPerf::getGroupId, q -> q.eq(DeptPerf::getYears, years));
+
+        for (DeptPerfReporting deptPerfReporting : deptPerfReports) {
+            //月金额求和
+            deptPerfReporting.setSumAmount(deptPerfReporting.getSumContractAmount().add(deptPerfReporting.getSumJstAmount()));
+
+            //赋值目标金额
+            DeptPerf deptPerf = deptPerfMap.get(deptPerfReporting.getGroupId());
+            if (ObjectUtil.isNotEmpty(deptPerf)) {
+                BigDecimal targetAmount = getTargetAmount(deptPerf, month);
+                deptPerfReporting.setTargetAmount(targetAmount);
+            }
+
+            //赋值完成率
+            BigDecimal targetAmount = deptPerfReporting.getTargetAmount();
+            if (ObjectUtil.isNotEmpty(targetAmount) && targetAmount.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal sumAmount = deptPerfReporting.getSumAmount();
+                BigDecimal multiply = sumAmount.divide(targetAmount, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(0.1));
+                deptPerfReporting.setFinishRate(multiply);
+            }
+
+        }
+
+        //排序
+        Collections.sort(deptPerfReports, new Comparator<DeptPerfReporting>() {
+            @Override
+            public int compare(DeptPerfReporting p1, DeptPerfReporting p2) {
+                return p2.getSumAmount().compareTo(p1.getSumAmount()); // 按年龄字段进行排序
+            }
+        });
+        //赋值排名
+        for (int i = 0; i < deptPerfReports.size(); i++) {
+            DeptPerfReporting deptPerfReporting = deptPerfReports.get(i);
+            deptPerfReporting.setRanking(i + 1);
+        }
+
+
+        //赋值每日信息
+        List<JSONObject> reData = new ArrayList<>();
+
+        for (DeptPerfReporting deptPerfReport : deptPerfReports) {
+            List<DeptPerfReporting> deptPerfReportList = dayRepoMap.getOrDefault(deptPerfReport.getGroupId(), new ArrayList<>());
+
+            Map<String, DeptPerfReporting> collect = deptPerfReportList.stream().collect(Collectors.toMap(DeptPerfReporting::getDayStr, Function.identity()));
+
+            String s = JSONObject.toJSONString(deptPerfReport);
+            JSONObject parse = JSONObject.parse(s);
+
+            List<DateTime> dateTimes = DateUtil.rangeToList(dto.getBeginTime(), dto.getEndTime(), DateField.DAY_OF_MONTH, 1);
+            for (DateTime dateTime : dateTimes) {
+                String dayStr = sdf.format(dateTime);
+                DeptPerfReporting deptPerfRepoList = collect.getOrDefault(dayStr, new DeptPerfReporting());
+
+                parse.put(dayStr, deptPerfRepoList);
+            }
+            reData.add(parse);
+        }
+
+
+        return reData;
+    }
+
+    private BigDecimal getTargetAmount(DeptPerf deptPerf, int month) {
+        switch (month) {
+            case 1:
+                return deptPerf.getJanuary();
+            case 2:
+                return deptPerf.getFebruary();
+            case 3:
+                return deptPerf.getMarch();
+            case 4:
+                return deptPerf.getApril();
+            case 5:
+                return deptPerf.getMay();
+            case 6:
+                return deptPerf.getJune();
+            case 7:
+                return deptPerf.getJuly();
+            case 8:
+                return deptPerf.getAugust();
+            case 9:
+                return deptPerf.getSeptember();
+            case 10:
+                return deptPerf.getOctober();
+            case 11:
+                return deptPerf.getNovember();
+            case 12:
+                return deptPerf.getDecember();
+            default:
+                throw new ServiceException("未知月份:" + month);
+        }
+    }
+
 }

+ 57 - 0
hx-sale/src/main/resources/mapper/dept/DeptPerfMapper.xml

@@ -29,4 +29,61 @@
               AND gr.jst_distributor !=''
     </select>
 
+    <select id="monthlyReporting" resultType="com.fjhx.sale.entity.DeptPerfReporting">
+        SELECT t1.*,
+               IFNULL(sum(c.amount), 0)         AS sumContractAmount,
+               IFNULL(sum(joi.paid_amount), 0)  AS sumJstAmount,
+               (select GROUP_CONCAT(nick_name)
+                from sys_user su
+                         join sys_user_role sur on sur.user_id = su.user_id
+                         join sys_role sr on sr.role_id = sur.role_id
+                where su.dept_id = t1.groupId
+                  and sr.role_key = 'salesman') AS saleUserName
+        FROM (SELECT de.dept_id,
+                     de.dept_name,
+                     gr.dept_id   AS groupId,
+                     gr.dept_name AS groupName
+              FROM sys_dept gr
+                       LEFT JOIN sys_dept de ON gr.parent_id = de.dept_id
+              WHERE gr.type != 0
+                    AND FIND_IN_SET( 100, gr.ancestors )
+                    AND NOT gr.jst_distributor IS NULL
+                    AND gr.jst_distributor != ''
+              GROUP BY
+                  gr.dept_id) t1
+                 LEFT JOIN contract c ON c.dept_id = t1.groupId AND
+                                         DATE_FORMAT(c.create_time, '%Y-%m') = DATE_FORMAT(#{dto.beginTime}, '%Y-%m')
+                 LEFT JOIN jst_order_info joi ON joi.dept_id = t1.groupId AND DATE_FORMAT(joi.created, '%Y-%m') =
+                                                                              DATE_FORMAT(#{dto.beginTime}, '%Y-%m')
+        GROUP BY t1.groupId
+    </select>
+    <select id="getDayRepo" resultType="com.fjhx.sale.entity.DeptPerfReporting">
+        SELECT t1.dept_id,
+               t1.dayStr,
+               sum(sumAmount)                       AS sumContractAmount,
+               sum(sumJstAmount)                    AS sumJstAmount,
+               (sum(sumAmount) + sum(jstSumAmount)) AS sumAmount
+        FROM (SELECT c.dept_id,
+                     DATE_FORMAT(c.create_time, '%Y-%m-%d') AS dayStr,
+                     sum(c.amount)                          AS sumAmount,
+                     NULL                                   AS sumJstAmount
+              FROM contract c
+              WHERE DATE_FORMAT(c.create_time, '%Y-%m') = DATE_FORMAT(#{dto.beginTime}, '%Y-%m')
+                AND NOT c.dept_id IS NULL
+              GROUP BY c.dept_id,
+                       DATE_FORMAT(c.create_time, '%Y-%m-%d')
+              UNION ALL
+              SELECT joi.dept_id,
+                     DATE_FORMAT(joi.created, '%Y-%m-%d') AS dayStr,
+                     NULL                                 AS sumAmount,
+                     sum(joi.amount)                      AS sumJstAmount
+              FROM jst_order_info joi
+              WHERE DATE_FORMAT(joi.created, '%Y-%m') = DATE_FORMAT(#{dto.beginTime}, '%Y-%m')
+                AND NOT joi.dept_id IS NULL
+              GROUP BY joi.dept_id,
+                       DATE_FORMAT(joi.created, '%Y-%m-%d')) t1
+        GROUP BY t1.dept_id,
+                 t1.dayStr
+    </select>
+
 </mapper>