Selaa lähdekoodia

1.表修改
2.大中型撰写节点提交时更新产品完成时间,初审节点回退时清空完成时间
3.大中型统计报表查询市场部效率值

GouGengquan 5 kuukautta sitten
vanhempi
commit
d1eba94b36

+ 40 - 0
biz-base/src/main/java/com/dayou/controller/MajorStatisticalStatementController.java

@@ -253,4 +253,44 @@ public class MajorStatisticalStatementController extends BaseController{
         return RestResponse.data(majorStatisticalStatementService.getMajorDepPerformanceOverviewVO(dto));
     }
 
+    /**
+     * 市场部效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    @GetMapping("/market/dep/getEfficiencyVO")
+    public RestResponse<List<MajorMarketEfficiencyVO>> getMajorMarketDepEfficiencyVO(MajorStatisticalSelectDTO dto) {
+        return RestResponse.data(majorStatisticalStatementService.getMajorsMarketDepEfficiencyVO(dto));
+    }
+
+    /**
+     * 市场部效率导出
+     * @param dto 查询dto
+     */
+    @GetMapping("/market/dep/getEfficiencyVO/export")
+    public void majorMarketDepEfficiencyVOExport(MajorStatisticalSelectDTO dto, HttpServletResponse response) throws IOException {
+        List<MajorMarketEfficiencyVO> result = majorStatisticalStatementService.getMajorsMarketDepEfficiencyVO(dto);
+        exportPlus(response, "市场部效率值表", result, MajorMarketEfficiencyVO.class);
+    }
+
+    /**
+     * 客户经理效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    @GetMapping("/market/per/getEfficiencyVO")
+    public RestResponse<List<MajorMarketEfficiencyVO>> getMajorMarketPerEfficiencyVO(MajorStatisticalSelectDTO dto) {
+        return RestResponse.data(majorStatisticalStatementService.getMajorMarketPerEfficiencyVO(dto));
+    }
+
+    /**
+     * 客户经理效率导出
+     * @param dto 查询dto
+     */
+    @GetMapping("/market/per/getEfficiencyVO/export")
+    public void majorMarketPerEfficiencyVOExport(MajorStatisticalSelectDTO dto, HttpServletResponse response) throws IOException {
+        List<MajorMarketEfficiencyVO> result = majorStatisticalStatementService.getMajorMarketPerEfficiencyVO(dto);
+        exportPlus(response, "客户经理效率值表", result, MajorMarketEfficiencyVO.class);
+    }
+
 }

+ 15 - 0
dao/src/main/java/com/dayou/mapper/MajorStatisticalStatementMapper.java

@@ -1,6 +1,7 @@
 package com.dayou.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dayou.dto.AssetsStatisticalSelectDTO;
 import com.dayou.dto.MajorStatisticalSelectDTO;
 import com.dayou.vo.*;
 import org.apache.ibatis.annotations.Param;
@@ -117,4 +118,18 @@ public interface MajorStatisticalStatementMapper {
      * @return List<MajorEvaluateEfficiencyVO>
      */
     List<MajorDepPerformanceOverviewVO> getMajorDepPerformanceOverviewVO(@Param("dto") MajorStatisticalSelectDTO dto);
+
+    /**
+     * 市场部效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    List<MajorMarketEfficiencyVO> getMajorsMarketDepEfficiencyVO(@Param("dto") MajorStatisticalSelectDTO dto);
+
+    /**
+     * 客户经理效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    List<MajorMarketEfficiencyVO> getMajorMarketPerEfficiencyVO(@Param("dto") MajorStatisticalSelectDTO dto);
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 43 - 43
dao/src/main/resources/mapper/AssetsStatisticalStatementMapper.xml


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 92 - 19
dao/src/main/resources/mapper/MajorStatisticalStatementMapper.xml


+ 3 - 0
domain/src/main/java/com/dayou/entity/MajorProduction.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.dayou.annotation.*;
 import com.dayou.common.BaseEntity;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -336,4 +337,6 @@ public class MajorProduction extends BaseEntity {
     @TableField(exist = false)
     private String businessObjectType;
 
+    private LocalDateTime productionTime;
+
 }

+ 181 - 0
domain/src/main/java/com/dayou/vo/MajorMarketEfficiencyVO.java

@@ -0,0 +1,181 @@
+package com.dayou.vo;
+
+import com.dayou.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class MajorMarketEfficiencyVO {
+
+    /**
+     * 部门id
+     */
+    private Long departmentId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 员工姓名
+     */
+    @Excel(name = "员工姓名")
+    private String userName;
+
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称")
+    private String departmentName;
+
+    /**
+     * 当期部门接单量
+     */
+    @Excel(name = "当期下单量")
+    private Integer currentPeriodOrderVolume;
+
+    /**
+     * 同比接单数量
+     */
+    @Excel(name = "同比下单增减率(%)")
+    @JsonProperty("YoYOrderVolume")
+    private Double YoYOrderVolume;
+
+    /**
+     * 环比接单数量
+     */
+    @Excel(name = "环比下单增减率(%)")
+    @JsonProperty("QoQOrderVolume")
+    private Double QoQOrderVolume;
+
+    /**
+     * 当期预评出具数量(意见书)
+     */
+    @Excel(name = "当期预评出具数量")
+    private Integer currentPeriodStatementVolume;
+
+    /**
+     * 同比预评出具数量
+     */
+    @Excel(name = "同比预评出具增减率(%)")
+    @JsonProperty("YoYStatementVolume")
+    private Double YoYStatementVolume;
+
+    /**
+     * 环比预评出具数量
+     */
+    @Excel(name = "环比预评出具增减率(%)")
+    @JsonProperty("QoQStatementVolume")
+    private Double QoQStatementVolume;
+
+    /**
+     * 当期报告(评估报告、咨询报告、意见函)出具数量
+     */
+    @Excel(name = "当期报告出具数量")
+    private Integer currentPeriodReportVolume;
+
+    /**
+     * 同比报告(评估报告、咨询报告、意见函)出具数量
+     */
+    @Excel(name = "同比报告出具增减率(%)")
+    @JsonProperty("YoYReportVolume")
+    private Double YoYReportVolume;
+
+    /**
+     * 环比报告(评估报告、咨询报告、意见函)出具数量
+     */
+    @Excel(name = "环比报告出具增减率(%)")
+    @JsonProperty("QoQReportVolume")
+    private Double QoQReportVolume;
+
+    /**
+     * 当期应收款
+     */
+    @Excel(name = "当期应收款")
+    private Double currentPeriodShouldAmountSum;
+
+    /**
+     * 同比应收款
+     */
+    @Excel(name = "同比应收款增减率(%)")
+    @JsonProperty("YoYShouldAmountSum")
+    private Double YoYShouldAmountSum;
+
+    /**
+     * 环比应收款
+     */
+    @Excel(name = "环比应收款增减率(%)")
+    @JsonProperty("QoQShouldAmountSum")
+    private Double QoQShouldAmountSum;
+
+    /**
+     * 当期实收款
+     */
+    @Excel(name = "当期实收款")
+    private Double currentPeriodRealAmountSum;
+
+    /**
+     * 同比实收款
+     */
+    @Excel(name = "同比实收款增减率(%)")
+    @JsonProperty("YoYRealAmountSum")
+    private Double YoYRealAmountSum;
+
+    /**
+     * 环比实收款
+     */
+    @Excel(name = "环比实收款增减率(%)")
+    @JsonProperty("QoQRealAmountSum")
+    private Double QoQRealAmountSum;
+
+    /**
+     * 实收款总计
+     */
+    @Excel(name = "实收款总计")
+    private Double totalRealAmountSum;
+
+    /**
+     * 当期出单率
+     */
+    @Excel(name = "当期出单率")
+    private Double currentPeriodOrderHasReportVolume;
+
+    /**
+     * 同比出单率(报告数/接单数)
+     */
+    @Excel(name = "同比出单率")
+    @JsonProperty("YoYOrderHasReportVolume")
+    private Double YoYOrderHasReportVolume;
+
+    /**
+     * 环比出单率(报告数/接单数)
+     */
+    @Excel(name = "环比出单率")
+    @JsonProperty("QoQOrderHasReportVolume")
+    private Double QoQOrderHasReportVolume;
+
+    /**
+     * 当期实收款订单数
+     */
+    private Integer currentPeriodRealAmountOrderCount;
+
+    /**
+     * 死单率A(%)
+     */
+    @Excel(name = "死单率A(%)")
+    private Double deadOrderVolumeA;
+
+    /**
+     * 死单率B(%)
+     */
+    @Excel(name = "死单率B(%)")
+    private Double deadOrderVolumeB;
+
+    /**
+     * 死单率C(%)
+     */
+    @Excel(name = "死单率C(%)")
+    private Double deadOrderVolumeC;
+
+}

+ 14 - 0
service/src/main/java/com/dayou/service/IMajorStatisticalStatementService.java

@@ -116,4 +116,18 @@ public interface IMajorStatisticalStatementService {
      * @return List<MajorEvaluateEfficiencyVO>
      */
     List<MajorDepPerformanceOverviewVO> getMajorDepPerformanceOverviewVO(MajorStatisticalSelectDTO dto);
+
+    /**
+     * 市场部效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    List<MajorMarketEfficiencyVO> getMajorsMarketDepEfficiencyVO(MajorStatisticalSelectDTO dto);
+
+    /**
+     * 客户经理效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    List<MajorMarketEfficiencyVO> getMajorMarketPerEfficiencyVO(MajorStatisticalSelectDTO dto);
 }

+ 210 - 0
service/src/main/java/com/dayou/service/impl/MajorStatisticalStatementServiceImpl.java

@@ -494,6 +494,216 @@ public class MajorStatisticalStatementServiceImpl implements IMajorStatisticalSt
     }
 
     /**
+     * 市场部效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    @Override
+    public List<MajorMarketEfficiencyVO> getMajorsMarketDepEfficiencyVO(MajorStatisticalSelectDTO dto) {
+        List<MajorMarketEfficiencyVO> efficiencyVOList = majorStatisticalStatementMapper.getMajorsMarketDepEfficiencyVO(dto);
+
+        // 循环计算每个部门的同比、环比
+        for (MajorMarketEfficiencyVO efficiencyVO : efficiencyVOList) {
+
+            // 计算当期出单率
+            if (efficiencyVO.getCurrentPeriodReportVolume() > 0 && efficiencyVO.getCurrentPeriodOrderVolume() > 0) { // 当期出报告书大于0
+                efficiencyVO.setCurrentPeriodOrderHasReportVolume((efficiencyVO.getCurrentPeriodReportVolume().doubleValue() / efficiencyVO.getCurrentPeriodOrderVolume().doubleValue()));
+            } else {
+                efficiencyVO.setCurrentPeriodOrderHasReportVolume(0.0);
+            }
+            // 计算同比出单率
+            if (efficiencyVO.getYoYReportVolume() > 0) {
+                efficiencyVO.setYoYOrderHasReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderHasReportVolume() - (efficiencyVO.getYoYReportVolume() / efficiencyVO.getYoYOrderVolume())) / (efficiencyVO.getYoYReportVolume() / efficiencyVO.getYoYOrderVolume()) * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+            }
+            // 计算环比出单率
+            if (efficiencyVO.getQoQReportVolume() > 0) {
+                efficiencyVO.setQoQOrderHasReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderHasReportVolume() - (efficiencyVO.getQoQReportVolume() / efficiencyVO.getQoQOrderVolume())) / (efficiencyVO.getQoQReportVolume() / efficiencyVO.getQoQOrderVolume()) * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+            }
+            efficiencyVO.setCurrentPeriodOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+
+            // 同比计算(同比增长率 = (当期数据 - 去年同期数据) / 去年同期数据 * 100%) (保留两位小数)
+            if (efficiencyVO.getYoYOrderVolume() > 0) {
+                efficiencyVO.setYoYOrderVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getYoYOrderVolume()) / efficiencyVO.getYoYOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYOrderVolume((double) (efficiencyVO.getCurrentPeriodOrderVolume() * 100));
+            }
+            if (efficiencyVO.getYoYStatementVolume() > 0) {
+                efficiencyVO.setYoYStatementVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodStatementVolume() - efficiencyVO.getYoYStatementVolume()) / efficiencyVO.getYoYStatementVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYStatementVolume((double) (efficiencyVO.getCurrentPeriodStatementVolume() * 100));
+            }
+            if (efficiencyVO.getYoYReportVolume() > 0) {
+                efficiencyVO.setYoYReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodReportVolume() - efficiencyVO.getYoYReportVolume()) / efficiencyVO.getYoYReportVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYReportVolume((double) (efficiencyVO.getCurrentPeriodReportVolume() * 100));
+            }
+            if (efficiencyVO.getYoYShouldAmountSum() > 0) {
+                efficiencyVO.setYoYShouldAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodShouldAmountSum() - efficiencyVO.getYoYShouldAmountSum()) / efficiencyVO.getYoYShouldAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYShouldAmountSum(efficiencyVO.getCurrentPeriodShouldAmountSum() * 100);
+            }
+            if (efficiencyVO.getYoYRealAmountSum() > 0) {
+                efficiencyVO.setYoYRealAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodRealAmountSum() - efficiencyVO.getYoYRealAmountSum()) / efficiencyVO.getYoYRealAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYRealAmountSum(efficiencyVO.getCurrentPeriodRealAmountSum() * 100);
+            }
+
+            // 环比计算(环比增长率 = (当期数据 - 前一期数据) / 前一期数据 * 100%) (保留两位小数)
+            if (efficiencyVO.getQoQOrderVolume() > 0) {
+                efficiencyVO.setQoQOrderVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getQoQOrderVolume()) / efficiencyVO.getQoQOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQOrderVolume((double) (efficiencyVO.getCurrentPeriodOrderVolume() * 100));
+            }
+            if (efficiencyVO.getQoQStatementVolume() > 0) {
+                efficiencyVO.setQoQStatementVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodStatementVolume() - efficiencyVO.getQoQStatementVolume()) / efficiencyVO.getQoQStatementVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQStatementVolume((double) (efficiencyVO.getCurrentPeriodStatementVolume() * 100));
+            }
+            if (efficiencyVO.getQoQReportVolume() > 0) {
+                efficiencyVO.setQoQReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodReportVolume() - efficiencyVO.getQoQReportVolume()) / efficiencyVO.getQoQReportVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQReportVolume((double) (efficiencyVO.getCurrentPeriodReportVolume() * 100));
+            }
+            if (efficiencyVO.getQoQShouldAmountSum() > 0) {
+                efficiencyVO.setQoQShouldAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodShouldAmountSum() - efficiencyVO.getQoQShouldAmountSum()) / efficiencyVO.getQoQShouldAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQShouldAmountSum(efficiencyVO.getCurrentPeriodShouldAmountSum() * 100);
+            }
+            if (efficiencyVO.getQoQRealAmountSum() > 0) {
+                efficiencyVO.setQoQRealAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodRealAmountSum() - efficiencyVO.getQoQRealAmountSum()) / efficiencyVO.getQoQRealAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQRealAmountSum(efficiencyVO.getCurrentPeriodRealAmountSum() * 100);
+            }
+
+            /*
+             * 计算死单率
+             * 死单率A = (下单数-出报告数) / (下单数)
+             * 死单率B = (下单数-出预评数) / (下单数)
+             * 死单率C = (下单数-收费项目数) / 下单数
+             */
+            if (efficiencyVO.getCurrentPeriodOrderVolume() > 0) {
+                efficiencyVO.setDeadOrderVolumeA(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodReportVolume()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+                efficiencyVO.setDeadOrderVolumeB(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodStatementVolume()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+                efficiencyVO.setDeadOrderVolumeC(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodRealAmountOrderCount()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setDeadOrderVolumeA(0.0);
+                efficiencyVO.setDeadOrderVolumeB(0.0);
+                efficiencyVO.setDeadOrderVolumeC(0.0);
+            }
+        }
+        return efficiencyVOList;
+    }
+
+    /**
+     * 客户经理效率查询
+     * @param dto 查询dto
+     * @return List<MajorMarketEfficiencyVO>
+     */
+    @Override
+    public List<MajorMarketEfficiencyVO> getMajorMarketPerEfficiencyVO(MajorStatisticalSelectDTO dto) {
+        List<MajorMarketEfficiencyVO> efficiencyVOList = majorStatisticalStatementMapper.getMajorMarketPerEfficiencyVO(dto);
+
+        // 循环计算每个部门的同比、环比
+        for (MajorMarketEfficiencyVO efficiencyVO : efficiencyVOList) {
+
+            // 计算当期出单率
+            if (efficiencyVO.getCurrentPeriodReportVolume() > 0 && efficiencyVO.getCurrentPeriodOrderVolume() > 0) { // 当期出报告书大于0
+                efficiencyVO.setCurrentPeriodOrderHasReportVolume((efficiencyVO.getCurrentPeriodReportVolume().doubleValue() / efficiencyVO.getCurrentPeriodOrderVolume().doubleValue()));
+            } else {
+                efficiencyVO.setCurrentPeriodOrderHasReportVolume(0.0);
+            }
+            // 计算同比出单率
+            if (efficiencyVO.getYoYReportVolume() > 0) {
+                efficiencyVO.setYoYOrderHasReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderHasReportVolume() - (efficiencyVO.getYoYReportVolume() / efficiencyVO.getYoYOrderVolume())) / (efficiencyVO.getYoYReportVolume() / efficiencyVO.getYoYOrderVolume()) * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+            }
+            // 计算环比出单率
+            if (efficiencyVO.getQoQReportVolume() > 0) {
+                efficiencyVO.setQoQOrderHasReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderHasReportVolume() - (efficiencyVO.getQoQReportVolume() / efficiencyVO.getQoQOrderVolume())) / (efficiencyVO.getQoQReportVolume() / efficiencyVO.getQoQOrderVolume()) * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+            }
+            efficiencyVO.setCurrentPeriodOrderHasReportVolume(NumberUtil.round(efficiencyVO.getCurrentPeriodOrderHasReportVolume() * 100, 2).doubleValue());
+
+            // 同比计算(同比增长率 = (当期数据 - 去年同期数据) / 去年同期数据 * 100%) (保留两位小数)
+            if (efficiencyVO.getYoYOrderVolume() > 0) {
+                efficiencyVO.setYoYOrderVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getYoYOrderVolume()) / efficiencyVO.getYoYOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYOrderVolume((double) (efficiencyVO.getCurrentPeriodOrderVolume() * 100));
+            }
+            if (efficiencyVO.getYoYStatementVolume() > 0) {
+                efficiencyVO.setYoYStatementVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodStatementVolume() - efficiencyVO.getYoYStatementVolume()) / efficiencyVO.getYoYStatementVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYStatementVolume((double) (efficiencyVO.getCurrentPeriodStatementVolume() * 100));
+            }
+            if (efficiencyVO.getYoYReportVolume() > 0) {
+                efficiencyVO.setYoYReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodReportVolume() - efficiencyVO.getYoYReportVolume()) / efficiencyVO.getYoYReportVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYReportVolume((double) (efficiencyVO.getCurrentPeriodReportVolume() * 100));
+            }
+            if (efficiencyVO.getYoYShouldAmountSum() > 0) {
+                efficiencyVO.setYoYShouldAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodShouldAmountSum() - efficiencyVO.getYoYShouldAmountSum()) / efficiencyVO.getYoYShouldAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYShouldAmountSum(efficiencyVO.getCurrentPeriodShouldAmountSum() * 100);
+            }
+            if (efficiencyVO.getYoYRealAmountSum() > 0) {
+                efficiencyVO.setYoYRealAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodRealAmountSum() - efficiencyVO.getYoYRealAmountSum()) / efficiencyVO.getYoYRealAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setYoYRealAmountSum(efficiencyVO.getCurrentPeriodRealAmountSum() * 100);
+            }
+
+            // 环比计算(环比增长率 = (当期数据 - 前一期数据) / 前一期数据 * 100%) (保留两位小数)
+            if (efficiencyVO.getQoQOrderVolume() > 0) {
+                efficiencyVO.setQoQOrderVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getQoQOrderVolume()) / efficiencyVO.getQoQOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQOrderVolume((double) (efficiencyVO.getCurrentPeriodOrderVolume() * 100));
+            }
+            if (efficiencyVO.getQoQStatementVolume() > 0) {
+                efficiencyVO.setQoQStatementVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodStatementVolume() - efficiencyVO.getQoQStatementVolume()) / efficiencyVO.getQoQStatementVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQStatementVolume((double) (efficiencyVO.getCurrentPeriodStatementVolume() * 100));
+            }
+            if (efficiencyVO.getQoQReportVolume() > 0) {
+                efficiencyVO.setQoQReportVolume(NumberUtil.round((efficiencyVO.getCurrentPeriodReportVolume() - efficiencyVO.getQoQReportVolume()) / efficiencyVO.getQoQReportVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQReportVolume((double) (efficiencyVO.getCurrentPeriodReportVolume() * 100));
+            }
+            if (efficiencyVO.getQoQShouldAmountSum() > 0) {
+                efficiencyVO.setQoQShouldAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodShouldAmountSum() - efficiencyVO.getQoQShouldAmountSum()) / efficiencyVO.getQoQShouldAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQShouldAmountSum(efficiencyVO.getCurrentPeriodShouldAmountSum() * 100);
+            }
+            if (efficiencyVO.getQoQRealAmountSum() > 0) {
+                efficiencyVO.setQoQRealAmountSum(NumberUtil.round((efficiencyVO.getCurrentPeriodRealAmountSum() - efficiencyVO.getQoQRealAmountSum()) / efficiencyVO.getQoQRealAmountSum() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setQoQRealAmountSum(efficiencyVO.getCurrentPeriodRealAmountSum() * 100);
+            }
+
+            /*
+             * 计算死单率
+             * 死单率A = (下单数-出报告数) / (下单数)
+             * 死单率B = (下单数-出预评数) / (下单数)
+             * 死单率C = (下单数-收费项目数) / 下单数
+             */
+            if (efficiencyVO.getCurrentPeriodOrderVolume() > 0) {
+                efficiencyVO.setDeadOrderVolumeA(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodReportVolume()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+                efficiencyVO.setDeadOrderVolumeB(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodStatementVolume()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+                efficiencyVO.setDeadOrderVolumeC(NumberUtil.round((double) (efficiencyVO.getCurrentPeriodOrderVolume() - efficiencyVO.getCurrentPeriodRealAmountOrderCount()) / efficiencyVO.getCurrentPeriodOrderVolume() * 100, 2).doubleValue());
+            } else {
+                efficiencyVO.setDeadOrderVolumeA(0.0);
+                efficiencyVO.setDeadOrderVolumeB(0.0);
+                efficiencyVO.setDeadOrderVolumeC(0.0);
+            }
+        }
+        return efficiencyVOList;
+    }
+
+    /**
      * 设置项目参与人
      * @param majorLedgerVOList 台账集合
      * @return List<MajorLedgerVO>

+ 74 - 8
service/src/main/java/com/dayou/workflow/handler/MajorNodeHandler.java

@@ -16,9 +16,7 @@ import com.dayou.enums.workflow.HandlerPermissionEnum;
 import com.dayou.enums.workflow.WorkflowNodeEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.*;
-import com.dayou.service.IProductionFundService;
-import com.dayou.service.IUserPostService;
-import com.dayou.service.IUserService;
+import com.dayou.service.*;
 import com.dayou.service.workflow.IWorkFlowNodeInstanceService;
 import com.dayou.service.workflow.IWorkNodeService;
 import com.dayou.service.workflow.IWorkTaskRecordService;
@@ -27,13 +25,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.dayou.enums.ProductionEnum.STATEMENT;
+import static com.dayou.enums.ProductionEnum.*;
+import static com.dayou.enums.ProductionEnum.LETTER;
 import static com.dayou.enums.TakeNumberEnum.LAND_NUMBER;
 import static com.dayou.enums.workflow.NodeStateEnum.PENDING;
 import static com.dayou.enums.workflow.NodeStateEnum.SKIP;
@@ -72,6 +68,12 @@ public class MajorNodeHandler extends WorkNodeProcessable {
     private IProductionFundService productionFundService;
 
     @Autowired
+    IMajorTargetService majorTargetService;
+
+    @Autowired
+    IMajorProductionService productionService;
+
+    @Autowired
     private IUserService userService;
 
 
@@ -133,6 +135,9 @@ public class MajorNodeHandler extends WorkNodeProcessable {
             else {
                 addNextInstanceNode(currentInstanceNode,nextWorkNode, workNodeCommit.getNextHandlerId(),workNodeCommit.getBusinessSubId(),workNodeCommit.getBusinessMinId());
             }
+            currentInstanceNode.setBusinessSubId(workNodeCommit.getBusinessSubId());
+            currentInstanceNode.setBusinessMinId(workNodeCommit.getBusinessMinId());
+            afterForward(currentInstanceNode);
             return Boolean.TRUE;
         }
         return Boolean.FALSE;
@@ -231,6 +236,8 @@ public class MajorNodeHandler extends WorkNodeProcessable {
         if (currentNode.getNodeCode().equals(STATEMENT_FEEDBACK.name())){
             majorProductionMapper.cancelDelivery(currentNode.getBusinessId(),currentNode.getBusinessSubId(),STATEMENT.name());
         }
+        // 清除产品完成时间
+        cleanProductionTime(currentNode);
         return super.goBack(commit);
     }
 
@@ -273,4 +280,63 @@ public class MajorNodeHandler extends WorkNodeProcessable {
             }
         });
     }
+
+    /**
+     * 节点完成后操作
+     * @param currentInstanceNode 实例信息
+     */
+    @Override
+    public void afterForward(WorkFlowNodeInstance currentInstanceNode) {
+        // 撰写节点完成后,更新产品完成时间
+        // 通用的更新wrapper
+        LambdaUpdateWrapper<MajorProduction> productionTimeUpdateWrapper = new LambdaUpdateWrapper<MajorProduction>()
+                .set(MajorProduction::getProductionTime, new Date())
+                .eq(BaseEntity::getDeleted, false);
+        switch (WorkflowNodeEnum.valueOf(currentInstanceNode.getNodeCode())){
+            // 撰写意见书
+            case GENERATE_STATEMENT:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, STATEMENT.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessSubId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+            // 撰写报告报告
+            case WRITE_REPORT:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, REPORT.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessMinId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+            // 撰写复评函
+            case WRITE_LETTER:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, LETTER.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessMinId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+        }
+    }
+
+    /**
+     * 根据节点判断是否清除产品完成时间
+     * @param currentInstanceNode 当前节点
+     */
+    public void cleanProductionTime(WorkFlowNodeInstance currentInstanceNode) {
+        // 判断是否是从审核节点退回到撰写节点,是的话需要清空产品的productionTime
+        // 通用的更新wrapper
+        LambdaUpdateWrapper<MajorProduction> productionTimeUpdateWrapper = new LambdaUpdateWrapper<MajorProduction>()
+                .set(MajorProduction::getProductionTime, null)
+                .eq(BaseEntity::getDeleted, false);
+        switch (WorkflowNodeEnum.valueOf(currentInstanceNode.getNodeCode())){
+            // 撰写意见书
+            case CHECK_STATEMENT:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, STATEMENT.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessSubId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+            // 撰写报告报告
+            case CHECK_REPORT:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, REPORT.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessMinId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+            // 撰写复评函
+            case CHECK_LETTER:
+                productionTimeUpdateWrapper.eq(MajorProduction::getProduction, LETTER.getCode()).eq(MajorProduction::getReportNo, currentInstanceNode.getBusinessMinId());
+                productionService.update(productionTimeUpdateWrapper);
+                break;
+        }
+    }
 }

+ 12 - 1
sql/update_sql.sql

@@ -798,4 +798,15 @@ ALTER TABLE personal_production ADD KEY `idx_production_time` (`production_time`
   未更新到test-env
  */
 #  新增索引
-ALTER TABLE order_fund ADD KEY `idx_created` (`created`) USING BTREE;
+ALTER TABLE order_fund ADD KEY `idx_created` (`created`) USING BTREE;
+
+/**
+  日期:2025-02-25
+  修改人:苟耕铨
+  未更新到test-env
+ */
+#  新增索引
+ALTER TABLE assets_production ADD KEY `idx_create_production_date` (`create_production_date`) USING BTREE;
+ALTER TABLE `major` ADD market_department_id bigint(20) NULL COMMENT '市场部门id(下单部门id)';
+ALTER TABLE `major_production` ADD production_time datetime NULL COMMENT '产品完成时间';
+ALTER TABLE major_production ADD KEY `idx_production_time` (`production_time`) USING BTREE;