소스 검색

Merge branch 'refs/heads/feat-250729-moreExports' into feat-20250730-userexport

# Conflicts:
#	hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/ExportType.java
lixuesong 4 일 전
부모
커밋
5e74d06d5a
25개의 변경된 파일1456개의 추가작업 그리고 402개의 파일을 삭제
  1. 5 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/CommonConstants.java
  2. 1 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/ExportType.java
  3. 30 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/TaskCheck.java
  4. 30 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/TaskSupervisionApproval.java
  5. 4 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmSupervisionDto.java
  6. 26 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskCheckConverter.java
  7. 239 63
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskCheckHistoryExcelModel.java
  8. 26 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskSupervisionApprovalConverter.java
  9. 24 168
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/init/InitController.java
  10. 3 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/supervision/WmSupervisionController.java
  11. 26 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/event/TaskCheckSupExportEvent.java
  12. 37 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/TaskCheckSupExportEventListener.java
  13. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysStatisticManager.java
  14. 29 10
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/WmSupervisionManager.java
  15. 7 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskMapper.java
  16. 10 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSupervisionMapper.java
  17. 4 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskService.java
  18. 19 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSupervisionService.java
  19. 69 146
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserExportServiceImpl.java
  20. 5 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java
  21. 50 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskSupervisionServiceImpl.java
  22. 93 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/ExportUtils.java
  23. 35 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/RedisUtils.java
  24. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskMapper.xml
  25. 671 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskSupervisionMapper.xml

+ 5 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/CommonConstants.java

@@ -82,4 +82,9 @@ public interface CommonConstants {
 	 */
 	String IMAGE_CODE_TYPE = "blockPuzzle";
 
+	/**
+	 * 报告文件有效期
+	 */
+	long DEF_REPORT_TTL = 7L * 24 * 60 * 60 * 1000;
+
 }

+ 1 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/ExportType.java

@@ -16,6 +16,7 @@ import lombok.Getter;
 public enum ExportType {
 
 	USER("USER", "人员信息"),
+	CHECK_SUP("CHECK_SUP", "审核监督信息"),
 	SCORE_PACKAGE_SUB("SCORE_PACKAGE_SUB", "个人执行包数据");
 
 	/**

+ 30 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/TaskCheck.java

@@ -0,0 +1,30 @@
+package com.qunzhixinxi.hnqz.admin.api.constant.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * {@code TargetType}
+ * <p>
+ * Task Check 枚举
+ *
+ */
+@Getter
+@AllArgsConstructor
+public enum TaskCheck {
+
+	REJECTED(0, "拒绝"),
+	PASSED(1, "通过");
+
+	@EnumValue
+	private final int code;
+
+	private final String desc;
+
+	@Override
+    public String toString() {
+        return desc;
+    }
+
+}

+ 30 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/TaskSupervisionApproval.java

@@ -0,0 +1,30 @@
+package com.qunzhixinxi.hnqz.admin.api.constant.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * {@code TargetType}
+ * <p>
+ * Task Check 枚举
+ *
+ */
+@Getter
+@AllArgsConstructor
+public enum TaskSupervisionApproval {
+
+	REJECTED(0, "不同意"),
+	PASSED(1, "同意");
+
+	@EnumValue
+	private final int code;
+
+	private final String desc;
+
+	@Override
+    public String toString() {
+        return desc;
+    }
+
+}

+ 4 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmSupervisionDto.java

@@ -54,6 +54,8 @@ public final class WmSupervisionDto {
 
         private LocalDate[] period;
 
+        private LocalDate[] taskPeriod;
+
         private Boolean supervision;
 
         @NotNull(message = "页码必填")
@@ -277,6 +279,8 @@ public final class WmSupervisionDto {
 
         private LocalDate[] pkgPeriod;
 
+        private LocalDate[] taskPeriod;
+
         private String skuName;
 
         private String mahName;

+ 26 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskCheckConverter.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.api.model.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskCheck;
+
+public class TaskCheckConverter implements Converter<TaskCheck> {
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return TaskCheck.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(TaskCheck value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        return new WriteCellData<>(value != null ? value.getDesc() : "");
+    }
+}

+ 239 - 63
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskCheckHistoryExcelModel.java

@@ -2,6 +2,9 @@ package com.qunzhixinxi.hnqz.admin.api.model.excel;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskCheck;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskSupervisionApproval;
+
 import lombok.Data;
 
 /**
@@ -11,110 +14,283 @@ import lombok.Data;
  * @date 2025-01-06 11:24
  */
 @Data
-@ColumnWidth(64)
+@ColumnWidth(16)
 public class TaskCheckHistoryExcelModel {
 
     @ExcelProperty("任务ID")
     private String taskId;
 
-    @ExcelProperty("任务编号")
-    private String taskNumber;
+    @ExcelProperty("区域")
+    private String divisionName;
 
-    @ExcelProperty("执行人")
-    private String salesName;
+    @ExcelProperty("省简称")
+    private String provAbbr;
 
-    @ExcelProperty("执行人所在企业")
-    private String vendorName;
+    @ExcelProperty("市场服务供应商公司名称")
+    private String csoName;
 
-    @ExcelProperty("区域")
-    private String area;
+    @ExcelProperty("省区下发执行包名称")
+    private String scorePackageName;
 
-    @ExcelProperty("执行包名称")
-    private String pkgName;
+    @ExcelProperty("执行包ID")
+    private String scorePackageId;
 
-    @ExcelProperty("任务内容ID")
-    private String taskContentId;
+    @ExcelProperty("执行包年度")
+    private String packageYear;
+
+    @ExcelProperty("执行包开始时间")
+    private String packageStartTime;
+
+    @ExcelProperty("执行包结束时间")
+    private String packageEndTime;
+
+    @ExcelProperty("任务编号")
+    private String taskNumber;
 
     @ExcelProperty("任务类型")
-    private String taskType;
+    private String taskTypeName;
+
+    @ExcelProperty("系统单项任务对应积分")
+    private String taskScore;
+
+    @ExcelProperty("本服务任务对应产品")
+    private String drugnameTy;
+
+    @ExcelProperty("本服务任务对应产品生产企业")
+    private String drugEntName;
 
-    @ExcelProperty("产品名称(通用名)")
-    private String skuName;
+    @ExcelProperty("服务供应商业务员姓名")
+    private String workerRealname;
 
-    @ExcelProperty("生产企业")
-    private String mahName;
+    @ExcelProperty("服务提交时间")
+    private String taskCreateTime;
 
-    // 服务商
-    @ExcelProperty("服务商负责人审核时间")
-    private String vendorCheckTime;
+    @ExcelProperty("服务商管理员名称")
+    private String vendorRealname;
 
-    @ExcelProperty("服务商负责人是否通过")
-    private String vendorCheckResult;
+    @ExcelProperty("服务审核时间")
+    private String vendorUpdateTime;
 
-    @ExcelProperty("服务商负责人审核意见")
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck vendorCheckResult;
+
+    @ExcelProperty("通过/拒绝原因")
     private String vendorCheckMsg;
 
-    // 地市
-    @ExcelProperty("事业部地市经理审核时间")
-    private String cityCheckTime;
+    @ExcelProperty("地市经理姓名")
+    private String cityRealname;
+
+    @ExcelProperty("服务审核时间")
+    private String cityUpdateTime;
 
-    @ExcelProperty("事业部地市经理是否通过")
-    private String cityCheckResult;
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck cityCheckResult;
 
-    @ExcelProperty("事业部地市经理审核意见")
+    @ExcelProperty("通过/拒绝原因")
     private String cityCheckMsg;
 
-    // 区域
-    @ExcelProperty("事业部区域经理审核时间")
-    private String areaCheckTime;
+    @ExcelProperty("区域经理姓名")
+    private String divisionRealname;
+
+    @ExcelProperty("服务审核时间")
+    private String divisionUpdateTime;
+
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck divisionCheckResult;
 
-    @ExcelProperty("事业部区域经理是否通过")
-    private String areaCheckResult;
+    @ExcelProperty("通过/拒绝原因")
+    private String divisionCheckMsg;
 
-    @ExcelProperty("事业部区域经理审核意见")
-    private String areaCheckMsg;
+    @ExcelProperty("市场组经理姓名")
+    private String marketingRealname;
 
-    // 市场组
-    @ExcelProperty("事业部市场组审核时间")
-    private String mktCheckTime;
+    @ExcelProperty("服务审核时间")
+    private String marketingUpdateTime;
 
-    @ExcelProperty("事业部市场组是否通过")
-    private String mktCheckResult;
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck marketingCheckResult;
 
-    @ExcelProperty("事业部市场组审核意见")
-    private String mktCheckMsg;
+    @ExcelProperty("通过/拒绝原因")
+    private String marketingCheckMsg;
 
-    // 商务组
-    @ExcelProperty("事业部商务组是否通过")
-    private String bizCheckTime;
+    @ExcelProperty("商务组经理姓名")
+    private String bizRealname;
 
-    @ExcelProperty("事业部商务组是否通过")
-    private String bizCheckResult;
+    @ExcelProperty("服务审核时间")
+    private String bizUpdateTime;
 
-    @ExcelProperty("事业部商务组审核意见")
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck bizCheckResult;
+
+    @ExcelProperty("通过/拒绝原因")
     private String bizCheckMsg;
 
-    // 分管领导
-    @ExcelProperty("事业部分管销售领导审核时间")
-    private String subMgrCheckTime;
+    @ExcelProperty("分管领导姓名")
+    private String submgrRealname;
+
+    @ExcelProperty("服务审核时间")
+    private String submgrUpdateTime;
 
-    @ExcelProperty("事业部分管销售领导是否通过")
-    private String subMgrCheckResult;
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck submgrCheckResult;
 
-    @ExcelProperty("事业部分管销售领导审核意见")
-    private String subMgrCheckMsg;
+    @ExcelProperty("通过/拒绝原因")
+    private String submgrCheckMsg;
 
-    // 总经理
-    @ExcelProperty("事业部总经理审核时间")
-    private String mgrCheckTime;
+    @ExcelProperty("总负责领导姓名")
+    private String mgrRealname;
 
-    @ExcelProperty("事业部总经理是否通过")
-    private String mgrCheckResult;
+    @ExcelProperty("服务审核时间")
+    private String mgrUpdateTime;
 
-    @ExcelProperty("事业部总经理导审核意见")
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck mgrCheckResult;
+
+    @ExcelProperty("通过/拒绝原因")
     private String mgrCheckMsg;
 
+    @ExcelProperty("生产企业财务监督员")
+    private String factoryFinanceRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryFinanceCreateTime;
+
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck factoryFinanceSupRes;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryFinanceRemarks;
+
+    @ExcelProperty("生产企业财务负责人")
+    private String factoryFinanceLeaderRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryFinanceLeaderCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval factoryFinanceLeaderAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryFinanceLeaderRemarks;
+
+    @ExcelProperty("生产企业财务分管领导")
+    private String factoryFinanceSubmgrRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryFinanceSubmgrCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval factoryFinanceSubmgrAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryFinanceSubmgrRemarks;
+
+    @ExcelProperty("生产企业销售监督员")
+    private String factoryBizRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryBizCreateTime;
+
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck factoryBizSupRes;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryBizRemarks;
+
+    @ExcelProperty("生产企业销售负责人")
+    private String factoryBizLeaderRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryBizLeaderCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval factoryBizLeaderAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryBizLeaderRemarks;
+
+    @ExcelProperty("生产企业销售分管领导")
+    private String factoryBizSubmgrRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String factoryBizSubmgrCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval factoryBizSubmgrAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String factoryBizSubmgrRemarks;
+
+    @ExcelProperty("营销合规监督员")
+    private String lawyerRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String lawyerCreateTime;
+
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck lawyerSupRes;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String lawyerRemarks;
+
+    @ExcelProperty("营销合规监督负责人")
+    private String lawyerLeaderRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String lawyerLeaderCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval lawyerLeaderAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String lawyerLeaderRemarks;
+
+    @ExcelProperty("营销合规监督分管领导")
+    private String lawyerSubmgrRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String lawyerSubmgrCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval lawyerSubmgrAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String lawyerSubmgrRemarks;
+
+    @ExcelProperty("营销财务监督员")
+    private String financeRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String financeCreateTime;
+
+    @ExcelProperty(value = "审核意见", converter = TaskCheckConverter.class)
+    private TaskCheck financeSupRes;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String financeRemarks;
+
+    @ExcelProperty("营销财务负责人")
+    private String financeLeaderRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String financeLeaderCreateTime;
+
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval financeLeaderAdviceResult;
+
+    @ExcelProperty("通过/拒绝原因")
+    private String financeLeaderRemarks;
+
+    @ExcelProperty("营销财务监督分管领导")
+    private String financeSubmgrRealname;
+
+    @ExcelProperty("监督检查时间")
+    private String financeSubmgrCreateTime;
 
+    @ExcelProperty(value = "监督意见", converter = TaskSupervisionApprovalConverter.class)
+    private TaskSupervisionApproval financeSubmgrAdviceResult;
 
+    @ExcelProperty("通过/拒绝原因")
+    private String financeSubmgrRemarks;
 
 }

+ 26 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskSupervisionApprovalConverter.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.api.model.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskSupervisionApproval;
+
+public class TaskSupervisionApprovalConverter implements Converter<TaskSupervisionApproval> {
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return TaskSupervisionApproval.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(TaskSupervisionApproval value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        return new WriteCellData<>(value != null ? value.getDesc() : "");
+    }
+}

+ 24 - 168
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/init/InitController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.text.StrPool;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
@@ -51,6 +52,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.TargetDept1Mapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmPackageTaskTypeQtyMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskSupervisionMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysAreaEntityService;
 import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeCheckHistoryService;
@@ -64,6 +66,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmPackageTaskTypeQtyService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSupervisionService;
 import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
 import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils.EnvType;
 import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils.TargetFile;
@@ -73,6 +76,9 @@ import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.oss.OssProperties;
 import com.qunzhixinxi.hnqz.common.oss.service.OssTemplate;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -80,6 +86,8 @@ import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalUnit;
 import java.util.Arrays;
 import java.util.Objects;
 import java.util.TreeMap;
@@ -175,6 +183,7 @@ public class InitController {
   private final SysRoleService roleService;
   private final SysChainNodeCheckHisNode43TempMapper node43TempMapper;
   private final TargetDept1Mapper targetDept1Mapper;
+  private final WmTaskSupervisionService wmTaskSupervisionService;
 
   @Inner(value = false)
   @GetMapping(value = "/cnbg/task/check/stat")
@@ -1457,180 +1466,27 @@ public class InitController {
     return R.ok(r);
   }
 
-  @Inner(value = false)
-  @ResponseExcel(
+  /* @ResponseExcel(
       name = "taskCheckHistoryExcel",
-      sheets = {@Sheet(sheetName = "审核信息")})
+      sheets = {@Sheet(sheetName = "审核信息")}) */
   @GetMapping(value = "/cnbg/init/task/check/his/export")
-  public List<TaskCheckHistoryExcelModel> exportTaskCheckHistoryExcel() {
-
-    // 获取全部的审核信息
-    List<SysCheckChainNodeCheckHistory> his = checkChainNodeCheckHistoryService.list();
-
-    if (CollUtil.isEmpty(his)) {
-      return Collections.emptyList();
+  public List<TaskCheckHistoryExcelModel> exportTaskCheckHistoryExcel(
+    @RequestParam(value = "taskPeriod", required = true) LocalDate[] taskPeriod) {
+    
+    if(taskPeriod == null || taskPeriod.length < 2 || taskPeriod[1].minus(31, ChronoUnit.DAYS).isAfter(taskPeriod[0])) {
+      throw new RuntimeException("合法的任务导出区间是一个月");
     }
 
-    ListOperations operations = redisTemplate.opsForList();
-    // 从缓存中获取用户信息
-    List<SysUser> users = operations.range(CacheConstants.USER_KEY, 0, -1);
-    Map<Integer, SysUser> userMap =
-        users.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
-
-    // 从缓存中获取企业信息
-    List<SysDept> depts = operations.range(CacheConstants.DEPT_KEY, 0, -1);
-    Map<Integer, SysDept> deptMap =
-        depts.stream().collect(Collectors.toMap(SysDept::getDeptId, Function.identity()));
-
-    // 从缓存中获取商品信息
-    List<WmDaDrugEntDrugtable> drugs = operations.range(CacheConstants.DRUG_KEY, 0, -1);
-    Map<String, WmDaDrugEntDrugtable> drugtableMap =
-        drugs.stream().collect(Collectors.toMap(WmDaDrugEntDrugtable::getId, Function.identity()));
-
-    // 丛缓存中获取任务类型
-    List<WmTaskType> range = operations.range(CacheConstants.TASK_TYPE_KEY, 0, -1);
-    Map<String, WmTaskType> taskTypeMap =
-        range.stream().collect(Collectors.toMap(WmTaskType::getId, Function.identity()));
-
-    List<WmScorePackage> pkgs = wmScorePackageService.list();
-
-    Map<String, WmScorePackage> pkgMap =
-        pkgs.stream().collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
-
-    Map<Integer, List<SysCheckChainNodeCheckHistory>> taskId2HisMap =
-        his.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
-
-    List<WmTask> tasks = taskService.list();
-    Map<String, WmTask> taskMap =
-        tasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));
-
-    // 获取任务
-    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-    List<TaskCheckHistoryExcelModel> collect =
-        taskId2HisMap.entrySet().parallelStream()
-            .map(
-                entry -> {
-                  Integer key = entry.getKey();
-
-                  WmTask task = taskMap.get(key.toString());
-
-                  if (task == null) {
-                    return null;
-                  }
-
-                  TaskCheckHistoryExcelModel model = new TaskCheckHistoryExcelModel();
-                  model.setTaskId(task.getId());
-                  model.setTaskNumber(task.getTaskNumber());
-
-                  String taskUserId = task.getTaskUserId();
-                  SysUser sysUser = userMap.get(Integer.parseInt(taskUserId));
-
-                  if (sysUser != null) {
-                    model.setSalesName(sysUser.getRealname());
-                    SysDept dept = deptMap.get(sysUser.getDeptId());
-                    model.setVendorName(dept.getName());
-                  } else {
-                    model.setSalesName("");
-                    model.setVendorName("");
-                  }
-
-                  model.setArea("");
-                  model.setTaskContentId(task.getTaskContentId());
-                  WmTaskType wmTaskType = taskTypeMap.get(task.getTaskTypeId());
-                  model.setTaskType(wmTaskType == null ? "" : wmTaskType.getTaskTypeName());
-
-                  WmScorePackage wmScorePackage = pkgMap.get(task.getScorePackageId());
-
-                  model.setPkgName(wmScorePackage.getScorePackageName());
-
-                  String drugId = wmScorePackage.getDrugtable()[0];
-
-                  WmDaDrugEntDrugtable drugtable = drugtableMap.get(drugId);
-
-                  model.setSkuName(drugtable.getDrugnameTy());
-                  model.setMahName(drugtable.getDrugEntName());
-
-                  Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2CheckMap =
-                      entry.getValue().stream()
-                          .collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
-
-                  // 服务商
-                  List<SysCheckChainNodeCheckHistory> vendor = nodeId2CheckMap.get(1);
-
-                  if (CollUtil.isNotEmpty(vendor)) {
-
-                    Map<String, String> info = getInfo(vendor, dtf);
-
-                    model.setVendorCheckTime(info.get("time"));
-                    model.setVendorCheckResult(info.get("result"));
-                    model.setVendorCheckMsg(info.get("msg"));
-                  }
-
-                  // 地市
-                  List<SysCheckChainNodeCheckHistory> city = nodeId2CheckMap.get(2);
-
-                  if (CollUtil.isNotEmpty(city)) {
-                    Map<String, String> info = getInfo(city, dtf);
-                    model.setCityCheckTime(info.get("time"));
-                    model.setCityCheckResult(info.get("result"));
-                    model.setCityCheckMsg(info.get("msg"));
-                  }
-
-                  // 区域
-                  List<SysCheckChainNodeCheckHistory> area = nodeId2CheckMap.get(3);
-
-                  if (CollUtil.isNotEmpty(area)) {
-                    Map<String, String> info = getInfo(area, dtf);
-                    model.setAreaCheckTime(info.get("time"));
-                    model.setAreaCheckResult(info.get("result"));
-                    model.setAreaCheckMsg(info.get("msg"));
-                  }
-
-                  // 市场
-                  List<SysCheckChainNodeCheckHistory> mkt = nodeId2CheckMap.get(8);
-
-                  if (CollUtil.isNotEmpty(mkt)) {
-                    Map<String, String> info = getInfo(mkt, dtf);
-                    model.setMktCheckTime(info.get("time"));
-                    model.setMktCheckResult(info.get("result"));
-                    model.setMktCheckMsg(info.get("msg"));
-                  }
-
-                  // 商务
-                  List<SysCheckChainNodeCheckHistory> biz = nodeId2CheckMap.get(9);
-
-                  if (CollUtil.isNotEmpty(biz)) {
-                    Map<String, String> info = getInfo(biz, dtf);
-                    model.setBizCheckTime(info.get("time"));
-                    model.setBizCheckResult(info.get("result"));
-                    model.setBizCheckMsg(info.get("msg"));
-                  }
-
-                  // 分管领导
-                  List<SysCheckChainNodeCheckHistory> subMgr = nodeId2CheckMap.get(5);
+    if(!CollUtil.contains(SecurityUtils.getRoles(),53)) {
+      throw new RuntimeException("没有导出审核监督明细的权限");
+    }
 
-                  if (CollUtil.isNotEmpty(subMgr)) {
-                    Map<String, String> info = getInfo(subMgr, dtf);
-                    model.setSubMgrCheckTime(info.get("time"));
-                    model.setSubMgrCheckResult(info.get("result"));
-                    model.setSubMgrCheckMsg(info.get("msg"));
-                  }
-
-                  // 总经理
-                  List<SysCheckChainNodeCheckHistory> mgr = nodeId2CheckMap.get(6);
-
-                  if (CollUtil.isNotEmpty(mgr)) {
-                    Map<String, String> info = getInfo(mgr, dtf);
-                    model.setMgrCheckTime(info.get("time"));
-                    model.setMgrCheckResult(info.get("result"));
-                    model.setMgrCheckMsg(info.get("msg"));
-                  }
-
-                  return model;
-                })
-            .collect(Collectors.toList());
+    // sync
+    // return wmTaskSupervisionService.selectTaskSupProcess(SecurityUtils.getUser(), taskPeriod);
 
-    return collect;
+    // async
+    wmTaskSupervisionService.asyncExportTaskCheckSup(SecurityUtils.getUser(), taskPeriod);
+    return List.of();
   }
 
   private Map<String, String> getInfo(

+ 3 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/supervision/WmSupervisionController.java

@@ -172,10 +172,11 @@ public class WmSupervisionController {
   @GetMapping(value = "/supervision/report/export")
   public R<Map<String, String>> exportSupervisionReportPDF(
       @RequestParam(value = "entId") Integer entId,
-      @RequestParam(value = "period", required = false) LocalDate[] period)
+      @RequestParam(value = "period", required = false) LocalDate[] period,
+      @RequestParam(value = "taskPeriod", required = false) LocalDate[] taskPeriod)
       throws Exception {
 
     return R.ok(
-        supervisionManager.exportSupervisionReportPDF(entId, period, SecurityUtils.getUser()));
+        supervisionManager.exportSupervisionReportPDF(entId, period, SecurityUtils.getUser(), taskPeriod));
   }
 }

+ 26 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/event/TaskCheckSupExportEvent.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.event;
+
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.time.LocalDate;
+
+/**
+ * 任务审核监督导出事件
+ *
+ */
+@Getter
+@AllArgsConstructor
+public class TaskCheckSupExportEvent {
+
+	/**
+	 * 用户
+	 */
+	private HnqzUser user;
+
+	/**
+	 * 查询参数
+	 */
+	private LocalDate[] taskPeriod;
+}

+ 37 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/TaskCheckSupExportEventListener.java

@@ -0,0 +1,37 @@
+package com.qunzhixinxi.hnqz.admin.listener;
+
+import com.qunzhixinxi.hnqz.admin.event.TaskCheckSupExportEvent;
+import com.qunzhixinxi.hnqz.admin.event.UserExportEvent;
+import com.qunzhixinxi.hnqz.admin.service.SysUserExportService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSupervisionService;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.scheduling.annotation.Async;
+
+/**
+ * 任务审核监督导出事件监听器
+ *
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Configuration
+public class TaskCheckSupExportEventListener {
+
+	private final WmTaskSupervisionService wmTaskSupervisionService;
+
+	/**
+	 * 推送事件
+	 *
+	 * @param event 事件
+	 */
+	@Async
+	@Order
+	@EventListener(TaskCheckSupExportEvent.class)
+	public void pushEvent(TaskCheckSupExportEvent event) {
+		wmTaskSupervisionService.selectTaskSupProcess(event.getUser(), event.getTaskPeriod());
+	}
+}

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysStatisticManager.java

@@ -1230,7 +1230,7 @@ public class SysStatisticManager {
 
                 List<String> pkgIds = pkgs.stream().map(WmScorePackage::getId).distinct().sorted().collect(Collectors.toList());
                 // 获取子集包中的所有任务
-                List<WmTask> tasks = taskService.listAvailableTaskForSupervision1(pkgIds.stream().mapToInt(Integer::valueOf).boxed().distinct().sorted().collect(Collectors.toList()), Collections.emptyList());
+                List<WmTask> tasks = taskService.listAvailableTaskForSupervision1(pkgIds.stream().mapToInt(Integer::valueOf).boxed().distinct().sorted().collect(Collectors.toList()), Collections.emptyList(), null, null);
                 // List<WmTask> tasks = taskService.list(Wrappers.<WmTask>lambdaQuery().in(WmTask::getScorePackageId, pkgIds).eq(WmTask::getTaskStatus, "3"));
                 // 获取监察记录(不可编辑的是监察过的)
                 List<WmTaskSupervision> supervisions = taskSupervisionService.list(Wrappers.<WmTaskSupervision>lambdaQuery()

+ 29 - 10
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/WmSupervisionManager.java

@@ -3,6 +3,7 @@ package com.qunzhixinxi.hnqz.admin.manager;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.lang.Pair;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdUtil;
@@ -67,6 +68,7 @@ import java.io.File;
 import java.nio.file.Files;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1269,11 +1271,12 @@ public class WmSupervisionManager {
 
     int taskBatch = 10000;
     int lastIdx = pkgIds.size() > taskBatch ? taskBatch : pkgIds.size();
-    List<WmTaskSupervision> allSupervisions = taskSupervisionService.getSupervisionByPkgIds(pkgIds.subList(0, lastIdx));
+    Pair<LocalDateTime, LocalDateTime> taskTimeRange = getTimeRange(query.getTaskPeriod());
+    List<WmTaskSupervision> allSupervisions = taskSupervisionService.getSupervisionByPkgIds(pkgIds.subList(0, lastIdx), taskTimeRange.getKey(), taskTimeRange.getValue());
     if (pkgIds.size() > taskBatch) {
         while(lastIdx < pkgIds.size()) {
             allSupervisions.addAll(taskSupervisionService.getSupervisionByPkgIds(
-                pkgIds.subList(lastIdx, Math.min(lastIdx + taskBatch, pkgIds.size()))));
+                pkgIds.subList(lastIdx, Math.min(lastIdx + taskBatch, pkgIds.size())), taskTimeRange.getKey(), taskTimeRange.getValue()));
             lastIdx += taskBatch;
         }
     }
@@ -1618,11 +1621,12 @@ public class WmSupervisionManager {
             .sorted()
             .collect(Collectors.toList());
 
+    Pair<LocalDateTime, LocalDateTime> taskTimeRange = getTimeRange(query.getTaskPeriod());
     // 获取子集包中的所有任务
     List<WmTask> tasks =
         taskService.listAvailableTaskForSupervision1(
             pkgIds,
-            Collections.emptyList());
+            Collections.emptyList(), taskTimeRange.getKey(), taskTimeRange.getValue());
 
     if (CollUtil.isEmpty(tasks)) {
       return page;
@@ -1630,7 +1634,7 @@ public class WmSupervisionManager {
 
     // 积分包内已经监督的任务
     List<WmTaskSupervision> list1 =
-        taskSupervisionService.getSupervisionByPkgIds(pkgIds.stream().map(i -> i.toString()).collect(Collectors.toList()));
+        taskSupervisionService.getSupervisionByPkgIds(pkgIds.stream().map(i -> i.toString()).collect(Collectors.toList()), taskTimeRange.getKey(), taskTimeRange.getValue());
     list1 = list1.stream().filter(ts -> ts.getSupervisionId() != null).collect(Collectors.toList());
     list1.sort((a, b) -> b.getCreateTime().compareTo(a.getCreateTime()));
 
@@ -1687,7 +1691,9 @@ public class WmSupervisionManager {
                 query.getTaskNumber(),
                 pkgIds,
                 null,
-                roles);
+                roles,
+                taskTimeRange.getKey(),
+                taskTimeRange.getValue());
       }
     }
     // 服务商
@@ -1731,7 +1737,9 @@ public class WmSupervisionManager {
                 .list(
                     Wrappers.<WmTaskSupervisionAdvice>lambdaQuery()
                         .eq(WmTaskSupervisionAdvice::getDelFlag, false)
-                        .eq(WmTaskSupervisionAdvice::getCreateBy, user.getUsername()))
+                        .eq(WmTaskSupervisionAdvice::getCreateBy, user.getUsername())
+                        .ge(taskTimeRange.getKey() != null, WmTaskSupervisionAdvice::getCreateTime, taskTimeRange.getKey())
+                        )
                 .stream()
                 .mapToLong(WmTaskSupervisionAdvice::getTaskSupervisionId)
                 .boxed()
@@ -1912,6 +1920,16 @@ public class WmSupervisionManager {
     return page;
   }
 
+private Pair<LocalDateTime, LocalDateTime> getTimeRange(LocalDate[] period) {
+    LocalDateTime beginTime = null;
+    LocalDateTime endTime = null;
+    if (ArrayUtil.isNotEmpty(period)) {
+        beginTime = period.length > 0 ? LocalDateTime.of(period[0], LocalTime.MIN) : null;
+        endTime = period.length > 1 ? LocalDateTime.of(period[1], LocalTime.MAX) : null;
+    }
+    return Pair.of(beginTime, endTime);
+}
+
 private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage query, List<Integer> userIds1,
         List<String> taskIds) {
     Page<WmTask> taskPage = null;
@@ -2068,7 +2086,7 @@ private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage qu
    * @return 本地路径
    */
   public Map<String, String> exportSupervisionReportPDF(
-      Integer entId, LocalDate[] period, HnqzUser user) throws Exception {
+      Integer entId, LocalDate[] period, HnqzUser user, LocalDate[] taskPeriod) throws Exception {
 
     Map<String, String> envPaths = OsEnvUtils.getEachEnvPaths();
     // 生成本地路径
@@ -2081,7 +2099,7 @@ private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage qu
             + ".pdf";
 
     // 封装报告数据
-    Object[][] datas = buildSupervisionReportDatas(entId, period, user);
+    Object[][] datas = buildSupervisionReportDatas(entId, period, user, taskPeriod);
 
     PdfUtils.generateSupervisionReport(
         targetPath,
@@ -2099,7 +2117,7 @@ private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage qu
     return uploaded;
   }
 
-  private Object[][] buildSupervisionReportDatas(Integer entId, LocalDate[] period, HnqzUser user) {
+  private Object[][] buildSupervisionReportDatas(Integer entId, LocalDate[] period, HnqzUser user, LocalDate[] taskPeriod) {
 
     // 获取企业
     SysDept service = deptService.getById(entId);
@@ -2151,6 +2169,7 @@ private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage qu
 //            Wrappers.<WmTask>lambdaQuery().in(WmTask::getScorePackageId, pkgMap.keySet()));
 
     // 获取子集包中的所有任务
+    Pair<LocalDateTime, LocalDateTime> taskTimeRange = getTimeRange(taskPeriod);
     List<WmTask> tasks =
         taskService.listAvailableTaskForSupervision1(
             pkgMap.keySet().stream()
@@ -2159,7 +2178,7 @@ private Page<WmTask> getReviewTaskPage(WmSupervisionDto.OnTaskSupervisionPage qu
                 .distinct()
                 .sorted()
                 .collect(Collectors.toList()),
-            Collections.emptyList());
+            Collections.emptyList(), taskTimeRange.getKey(), taskTimeRange.getValue());
 
     Map<String, WmTask> tid2EntityMap =
         tasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));

+ 7 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskMapper.java

@@ -237,7 +237,9 @@ public interface WmTaskMapper extends DataScopeMapper<WmTask> {
    */
   List<WmTask> listAvailableTaskForSupervision1(
       @Param(value = "pkgIds") Collection<String> pkgIds,
-      @Param(value = "ignoreIds") Collection<Integer> ignoreIds);
+      @Param(value = "ignoreIds") Collection<Integer> ignoreIds,
+      @Param(value = "taskBeginTime") LocalDateTime taskBeginTime,
+      @Param(value = "taskEndTime") LocalDateTime taskEndTime);
 
   Page<WmTask> listAvailableTaskForSupervision2(
       Page<WmTask> page,
@@ -247,7 +249,10 @@ public interface WmTaskMapper extends DataScopeMapper<WmTask> {
       @Param(value = "taskId") String taskId,
       @Param(value = "taskNumber") String taskNumber,
       @Param(value = "ignoreIds") Collection<Integer> ignoreIds,
-      @Param(value = "roles") List<Integer> roles);
+      @Param(value = "roles") List<Integer> roles,
+      @Param(value = "taskBeginTime") LocalDateTime taskBeginTime,
+      @Param(value = "taskEndTime") LocalDateTime taskEndTime
+      );
 
   @Select(value = "SELECT t.* FROM wm_task t WHERE t.score_package_id =#{pkgId} FOR UPDATE")
   List<WmTask> selectForUpdateByPkgId(@Param("pkgId") String pkgId);

+ 10 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSupervisionMapper.java

@@ -2,7 +2,9 @@ package com.qunzhixinxi.hnqz.admin.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSupervision;
+import com.qunzhixinxi.hnqz.admin.api.model.excel.TaskCheckHistoryExcelModel;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 import org.apache.ibatis.annotations.Mapper;
@@ -15,5 +17,12 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface WmTaskSupervisionMapper extends BaseMapper<WmTaskSupervision> {
 
-    List<WmTaskSupervision> selectByPkgIds(@Param("pkgIds") List<String> pkgIds);
+    List<WmTaskSupervision> selectByPkgIds(@Param("pkgIds") List<String> pkgIds,
+                                            @Param("taskBeginTime") LocalDateTime taskBeginTime,
+                                            @Param("taskEndTime") LocalDateTime taskEndTime);
+
+    List<TaskCheckHistoryExcelModel> selectTaskSupProcess(
+        @Param("taskBeginTime") LocalDateTime taskBeginTime,
+        @Param("taskEndTime") LocalDateTime taskEndTime
+    );
 }

+ 4 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskService.java

@@ -233,12 +233,14 @@ public interface WmTaskService extends IService<WmTask> {
      */
     List<WmTask> listAvailableTaskForSupervision(Integer pkgId, Collection<Integer> ignoreIds);
 
-    List<WmTask> listAvailableTaskForSupervision1(Collection<Integer> pkgIds, Collection<Integer> ignoreIds);
+    List<WmTask> listAvailableTaskForSupervision1(Collection<Integer> pkgIds, Collection<Integer> ignoreIds, LocalDateTime taskBeginTime, LocalDateTime taskEndTime);
 
     List<Map<String, Object>> listTaskInfo(List<WmTask> taskList, String pkgId);
 
 
     List<WmTask> listPkgTasks(String pkgId);
 
-    Page<WmTask> listAvailableTaskForSupervision2(Page<WmTask> page, Collection<Integer> userIds1, String taskTypeId, String taskId, String taskNumber, Collection<Integer> pkgIds, Collection<Integer> ignoreIds, List<Integer> roles);
+    Page<WmTask> listAvailableTaskForSupervision2(Page<WmTask> page, Collection<Integer> userIds1, String taskTypeId, String taskId, String taskNumber, Collection<Integer> pkgIds, Collection<Integer> ignoreIds, List<Integer> roles,
+        LocalDateTime taskBeginTime, LocalDateTime taskEndTime
+    );
 }

+ 19 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSupervisionService.java

@@ -1,10 +1,13 @@
 package com.qunzhixinxi.hnqz.admin.service;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qunzhixinxi.hnqz.admin.api.dto.WmSupervisionDto;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSupervision;
+import com.qunzhixinxi.hnqz.admin.api.model.excel.TaskCheckHistoryExcelModel;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 
 /**
@@ -47,6 +50,21 @@ public interface WmTaskSupervisionService extends IService<WmTaskSupervision> {
      * @param pkgIds
      * @return
      */
-    List<WmTaskSupervision> getSupervisionByPkgIds(List<String> pkgIds);
+    List<WmTaskSupervision> getSupervisionByPkgIds(List<String> pkgIds, LocalDateTime taskBeginTime, LocalDateTime taskEndTime);
+
+    /**
+     * 导出审核监察明细
+     * @param user
+     * @param taskPeriod
+     * @return
+     */
+    List<TaskCheckHistoryExcelModel> selectTaskSupProcess(HnqzUser user,  LocalDate[] taskPeriod);
+
+    /**
+     * 异步导出
+     * @param user
+     * @param taskPeriod
+     */
+    void asyncExportTaskCheckSup(HnqzUser user, LocalDate[] taskPeriod);
 }
 

+ 69 - 146
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserExportServiceImpl.java

@@ -32,7 +32,10 @@ import com.qunzhixinxi.hnqz.admin.mapper.SysUserRoleMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysFileService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserExportService;
+import com.qunzhixinxi.hnqz.admin.util.ExportUtils;
 import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
+import com.qunzhixinxi.hnqz.admin.util.RedisUtils;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.SpringContextHolder;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
@@ -77,15 +80,10 @@ public class SysUserExportServiceImpl implements SysUserExportService {
 	private final SysUserAreaService userAreaService;
 	private final SysDeptMapper deptMapper;
 	private final SysUserCertificateMapper userCertificateMapper;
-	private final SysFileService fileService;
 	private final UpmsConfig upmsConfig;
 	private final RetryTemplate retryTemplate;
-
-	private static final long DEF_REPORT_TTL = 7L * 24 * 60 * 60 * 1000;
-	private static final String ERROR_MSG_UNKNOWN = "ERROR_未知错误,请联系管理员";
-	private static final String ERROR_MSG_NO_DATA = "ERROR_没有数据";
-	private static final String ERROR_MSG_UPLOAD_FAIL = "ERROR_上传OSS失败";
-
+	private final RedisUtils redisUtils;
+	private final ExportUtils exportUtils;
 
 	/**
 	 * 异步导出
@@ -99,34 +97,10 @@ public class SysUserExportServiceImpl implements SysUserExportService {
 	@Override
 	@ExportGuard(type = "USER")
 	public Boolean asyncExport(HnqzUser user, List<Integer> roles, SysUserDTO.OnList query) {
-		return retryTemplate.execute(retryContext -> {
-			log.info("人员异步导出第{}次重试", retryContext.getRetryCount());
-
-			// 使用Redis原子操作实现限流
-			String key = CacheConstants.ASYNC_EXPORT_LIMIT_KEY;
-			Long increment = redisTemplate.opsForValue().increment(key);
-
-			// 设置key的过期时间,避免计数器无限增长
-			if (increment != null && increment.equals(1L)) {
-				redisTemplate.expire(key, 1, TimeUnit.MINUTES);
-			}
-
-			// 检查是否超过限流阈值
-			if (increment != null && increment > upmsConfig.getAsyncExportLimit()) {
-				// 超过限流阈值时,减少计数器并抛出异常
-				redisTemplate.opsForValue().decrement(key);
-				throw new BizException("系统繁忙,请稍后再试");
-			}
-
-			// 缓存key
-			String cacheKey = String.format(CacheConstants.ASYNC_EXPORT_CACHE, ExportType.USER.getType(), user.getId());
-			// 更新状态为生成中
-			redisTemplate.opsForValue().set(cacheKey, WmReportOpt.WmReportOptStatus.GENERATING.name(), DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
-
-			SpringContextHolder.getApplicationContext().publishEvent(new UserExportEvent(user, roles, query));
-			return Boolean.TRUE;
-		});
 
+		redisUtils.setExportStarting(ExportType.USER, user.getId());
+		SpringContextHolder.getApplicationContext().publishEvent(new UserExportEvent(user, roles, query));
+		return true;	
 	}
 
 	/**
@@ -139,114 +113,76 @@ public class SysUserExportServiceImpl implements SysUserExportService {
 	 */
 	@Override
 	public Boolean export(HnqzUser user, List<Integer> roles, SysUserDTO.OnList query) {
-		// 缓存key
-		String key = String.format(CacheConstants.ASYNC_EXPORT_CACHE, ExportType.USER.getType(), user.getId());
-
-		// 临时文件路径
-		String tempPath = OsEnvUtils.getEachEnvPaths().get(OsEnvUtils.TargetFile.TEMP.getName());
-		// 缓存文件名
-		String fileName = "人员_" + DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN)
-				.format(LocalDateTime.now()) + RandomStringUtils.randomNumeric(6) + ".xlsx";
-		String fullPath = tempPath + fileName;
-
 		try {
-			// 查询用户列表
-			List<SysUser> users = this.listUsers(user, roles, query);
+			return retryTemplate.execute(retryContext -> {
+				log.info("人员异步导出第{}次重试", retryContext.getRetryCount());
 
-			if (CollUtil.isEmpty(users)) {
-				log.info("用户列表为空");
-				redisTemplate.opsForValue().set(key, ERROR_MSG_NO_DATA, DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
-				return Boolean.FALSE;
-			}
+				redisUtils.checkExportGlobalAllows(upmsConfig.getAsyncExportLimit());
 
-			// 构建Excel数据并导出
-			String resultValue = buildAndExportExcel(users, fullPath, fileName, user);
-			redisTemplate.opsForValue().set(key, resultValue, DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
+				// 查询用户列表 构建Excel数据
+				List<SysUser> users = this.listUsers(user, roles, query);
+				List<SysUserExcelModel> data = buildExcelModel(users);
 
-			return !StrUtil.startWith(resultValue, "ERROR");
-		} finally {
-			// 清理临时文件
-			cleanupTempFile(fullPath);
+				// 导出
+				String resultValue = exportUtils.WriteExportExcel(ExportType.USER, data, SysUserExcelModel.class, user);
+				return !StrUtil.startWith(resultValue, "ERROR");
+			});
 
-			// 删除限流key
-			String limitKey = CacheConstants.ASYNC_EXPORT_LIMIT_KEY;
-			redisTemplate.delete(limitKey);
+		} finally {
+			// 释放全局限流
+			redisTemplate.opsForValue().decrement(CacheConstants.ASYNC_EXPORT_LIMIT_KEY);
 		}
 	}
+	
 
-	/**
-	 * 构建Excel数据并导出到文件
-	 *
-	 * @param users 用户列表
-	 * @param fullPath 完整文件路径
-	 * @param fileName 文件名
-	 * @param user 当前用户
-	 * @return 结果值(URL或错误信息)
-	 */
-	private String buildAndExportExcel(List<SysUser> users, String fullPath, String fileName, HnqzUser user) {
-		try {
-			// 查询企业信息
-			Map<Integer, SysDept> deptMap = queryDeptInfo(users);
-
-			// 查询角色信息
-			Map<Integer, String> roleMap = queryRoleInfo(users);
-			Map<Integer, List<SysUserRole>> userRolesMap = queryUserRoles(users);
-
-			// 查询备案信息
-			Map<Integer, Long> userCertMap = queryCertificateInfo(users);
-
-			// 转为excel列表
-			List<SysUserExcelModel> excelModels = users.stream().map(u -> {
-				SysUserExcelModel excelModel = BeanUtil.copyProperties(u, SysUserExcelModel.class, "lockFlag");
-				excelModel.setRealName(u.getRealname());
-				excelModel.setPhoneNumber(u.getPhone());
-				// 锁定状态
-				excelModel.setLockFlag("0".equals(u.getLockFlag()) ? "活跃" : "休眠");
-				// 创建时间
-				excelModel.setCreateTime(u.getCreateTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
-
-				// 派工方
-				SysDept dept = deptMap.get(u.getDeptId());
-				if (dept != null) {
-					excelModel.setDeptName(dept.getName());
-				}
-
-				// 角色
-				List<SysUserRole> userRoleList = userRolesMap.get(u.getUserId());
-				if (CollUtil.isNotEmpty(userRoleList)) {
-					String roleNames = userRoleList.stream()
-							.map(userRole -> roleMap.getOrDefault(userRole.getRoleId(), ""))
-							.collect(Collectors.joining(","));
-					excelModel.setRoleList(roleNames);
-				}
-
-				// 备案状态
-				long certCount = userCertMap.getOrDefault(u.getUserId(), 0L);
-				excelModel.setCertificateFlag(certCount > 0 ? "是" : "否");
-
-				return excelModel;
-			}).collect(Collectors.toList());
-
-			// 写入excel文件
-			EasyExcel.write(fullPath, SysUserExcelModel.class).sheet("人员")
-					.doWrite(excelModels);
-			log.info("人员导出生成缓存文件:{}", fullPath);
-
-			// 上传oss
-			try (FileInputStream inputStream = new FileInputStream(fullPath)) {
-				Map<String, String> uploadResult = fileService.upload(inputStream, fileName, fileName, user.getUsername());
-				log.info("人员导出生成oss文件:{}", uploadResult);
-
-				if (CollUtil.isNotEmpty(uploadResult)) {
-					return uploadResult.get("url");
-				} else {
-					return ERROR_MSG_UPLOAD_FAIL;
-				}
-			}
-		} catch (Exception e) {
-			log.error("人员导出失败", e);
-			return ERROR_MSG_UNKNOWN;
+	private List<SysUserExcelModel> buildExcelModel(List<SysUser> users) {
+		if (CollUtil.isEmpty(users)) {
+			log.info("用户列表为空");
+			return List.of();
 		}
+		// 查询企业信息
+		Map<Integer, SysDept> deptMap = queryDeptInfo(users);
+
+		// 查询角色信息
+		Map<Integer, String> roleMap = queryRoleInfo(users);
+		Map<Integer, List<SysUserRole>> userRolesMap = queryUserRoles(users);
+
+		// 查询备案信息
+		Map<Integer, Long> userCertMap = queryCertificateInfo(users);
+
+		// 转为excel列表
+		List<SysUserExcelModel> excelModels = users.stream().map(u -> {
+			SysUserExcelModel excelModel = BeanUtil.copyProperties(u, SysUserExcelModel.class, "lockFlag");
+			excelModel.setRealName(u.getRealname());
+			excelModel.setPhoneNumber(u.getPhone());
+			// 锁定状态
+			excelModel.setLockFlag("0".equals(u.getLockFlag()) ? "活跃" : "休眠");
+			// 创建时间
+			excelModel.setCreateTime(u.getCreateTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
+
+			// 派工方
+			SysDept dept = deptMap.get(u.getDeptId());
+			if (dept != null) {
+				excelModel.setDeptName(dept.getName());
+			}
+
+			// 角色
+			List<SysUserRole> userRoleList = userRolesMap.get(u.getUserId());
+			if (CollUtil.isNotEmpty(userRoleList)) {
+				String roleNames = userRoleList.stream()
+						.map(userRole -> roleMap.getOrDefault(userRole.getRoleId(), ""))
+						.collect(Collectors.joining(","));
+				excelModel.setRoleList(roleNames);
+			}
+
+			// 备案状态
+			long certCount = userCertMap.getOrDefault(u.getUserId(), 0L);
+			excelModel.setCertificateFlag(certCount > 0 ? "是" : "否");
+
+			return excelModel;
+		}).collect(Collectors.toList());
+
+		return excelModels;
 	}
 
 	/**
@@ -304,19 +240,6 @@ public class SysUserExportServiceImpl implements SysUserExportService {
 				.collect(Collectors.groupingBy(SysUserCertificate::getUserId, Collectors.counting()));
 	}
 
-	/**
-	 * 清理临时文件
-	 */
-	private void cleanupTempFile(String fullPath) {
-		try {
-			File file = new File(fullPath);
-			if (file.exists()) {
-				file.delete();
-			}
-		} catch (Exception e) {
-			log.warn("删除临时文件失败: {}", fullPath, e);
-		}
-	}
 
 
 	/**

+ 5 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java

@@ -2932,17 +2932,18 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
      * @return 监督任务列表
      */
     @Override
-    public List<WmTask> listAvailableTaskForSupervision1(Collection<Integer> pkgIds, Collection<Integer> ignoreIds) {
+    public List<WmTask> listAvailableTaskForSupervision1(Collection<Integer> pkgIds, Collection<Integer> ignoreIds, LocalDateTime taskBeginTime, LocalDateTime taskEndTime) {
         return this.baseMapper.listAvailableTaskForSupervision1(pkgIds.stream().map(
             Object::toString).collect(
-            Collectors.toList()), ignoreIds);
+            Collectors.toList()), ignoreIds, taskBeginTime, taskEndTime);
     }
 
     @Override
-    public Page<WmTask> listAvailableTaskForSupervision2(Page<WmTask> page, Collection<Integer> userIds1, String taskTypeId, String taskId, String taskNumber, Collection<Integer> pkgIds, Collection<Integer> ignoreIds, List<Integer> roles) {
+    public Page<WmTask> listAvailableTaskForSupervision2(Page<WmTask> page, Collection<Integer> userIds1, String taskTypeId, String taskId, String taskNumber, Collection<Integer> pkgIds, Collection<Integer> ignoreIds, List<Integer> roles,
+            LocalDateTime taskBeginTime, LocalDateTime taskEndTime) {
         return baseMapper.listAvailableTaskForSupervision2(page, pkgIds.stream().map(
             Object::toString).collect(
-            Collectors.toList()), userIds1, taskTypeId, taskId, taskNumber, ignoreIds, roles);
+            Collectors.toList()), userIds1, taskTypeId, taskId, taskNumber, ignoreIds, roles, taskBeginTime, taskEndTime);
     }
 
     @Override

+ 50 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskSupervisionServiceImpl.java

@@ -4,18 +4,31 @@ import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.ExportType;
 import com.qunzhixinxi.hnqz.admin.api.dto.WmSupervisionDto;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSupervision;
+import com.qunzhixinxi.hnqz.admin.api.model.excel.TaskCheckHistoryExcelModel;
+import com.qunzhixinxi.hnqz.admin.aspect.ExportGuard;
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
+import com.qunzhixinxi.hnqz.admin.event.TaskCheckSupExportEvent;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskSupervisionMapper;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskSupervisionService;
+import com.qunzhixinxi.hnqz.admin.util.ExportUtils;
+import com.qunzhixinxi.hnqz.admin.util.RedisUtils;
+import com.qunzhixinxi.hnqz.common.core.util.SpringContextHolder;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.retry.support.RetryTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -29,6 +42,12 @@ import java.util.List;
 @AllArgsConstructor
 public class WmTaskSupervisionServiceImpl extends ServiceImpl<WmTaskSupervisionMapper, WmTaskSupervision> implements WmTaskSupervisionService {
 
+    private final WmTaskSupervisionMapper wmTaskSupervisionMapper;
+	private final RetryTemplate retryTemplate;
+	private final RedisUtils redisUtils;
+	private final UpmsConfig upmsConfig;
+    private final ExportUtils exportUtils;
+
     /**
      * 创建审核
      *
@@ -117,8 +136,37 @@ public class WmTaskSupervisionServiceImpl extends ServiceImpl<WmTaskSupervisionM
     }
 
     @Override
-    public List<WmTaskSupervision> getSupervisionByPkgIds(List<String> pkgIds) {
-        return this.baseMapper.selectByPkgIds(pkgIds);
+    public List<WmTaskSupervision> getSupervisionByPkgIds(List<String> pkgIds, LocalDateTime taskBeginTime, LocalDateTime taskEndTime) {
+        return this.baseMapper.selectByPkgIds(pkgIds, taskBeginTime, taskEndTime);
+    }
+
+    @Override
+    @ExportGuard(type = "CHECK_SUP")
+    public void asyncExportTaskCheckSup(HnqzUser user, LocalDate[] taskPeriod) {
+
+        redisUtils.setExportStarting(ExportType.CHECK_SUP, user.getId());
+        SpringContextHolder.getApplicationContext().publishEvent(new TaskCheckSupExportEvent(user, taskPeriod));
     }
 
+    @Override
+    public List<TaskCheckHistoryExcelModel> selectTaskSupProcess(HnqzUser user,  LocalDate[] taskPeriod) {
+        List<TaskCheckHistoryExcelModel> t = List.of();
+        try {
+            t = retryTemplate.execute(retryContext -> {
+                log.info("人员异步导出第{}次重试", retryContext.getRetryCount());
+
+                redisUtils.checkExportGlobalAllows(upmsConfig.getAsyncExportLimit());
+                List<TaskCheckHistoryExcelModel> data = 
+                    wmTaskSupervisionMapper.selectTaskSupProcess(LocalDateTime.of(taskPeriod[0], LocalTime.MIN), LocalDateTime.of(taskPeriod[1], LocalTime.MAX));
+                // 导出
+                exportUtils.WriteExportExcel(ExportType.CHECK_SUP, data, TaskCheckHistoryExcelModel.class, user);
+
+                return data;
+            });
+		} finally {
+            redisUtils.releaseExportGlobalAllows();
+		}
+
+        return t;
+    }
 }

+ 93 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/ExportUtils.java

@@ -0,0 +1,93 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import com.alibaba.excel.EasyExcel;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.ExportType;
+import com.qunzhixinxi.hnqz.admin.service.SysFileService;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+/**
+ * async export 工具类
+ *
+ */
+@Slf4j
+@Component
+public final class ExportUtils {
+
+  @Resource private RedisTemplate<String, Object> redisTemplate;
+  @Resource private SysFileService fileService;
+
+  public static final String ERROR_MSG_UNKNOWN = "ERROR_未知错误,请联系管理员";
+	public static final String ERROR_MSG_NO_DATA = "ERROR_没有数据";
+	public static final String ERROR_MSG_UPLOAD_FAIL = "ERROR_上传OSS失败";
+
+	public String WriteExportExcel(ExportType exportType, List<?> data, Class head, HnqzUser user) {
+		// 临时文件路径
+		String tempPath = OsEnvUtils.getEachEnvPaths().get(OsEnvUtils.TargetFile.TEMP.getName());
+		// 缓存文件名
+		String fileName = exportType.getDescription() + DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN)
+				.format(LocalDateTime.now()) + RandomStringUtils.randomNumeric(6) + ".xlsx";
+		String fullPath = tempPath + fileName;
+
+		String ret = ERROR_MSG_UNKNOWN;
+		try {
+			// 写入excel文件
+			EasyExcel.write(fullPath, head).sheet(exportType.getDescription())
+					.doWrite(data);
+			log.info("{}导出生成缓存文件:{}", exportType.getDescription(), fullPath);
+
+			// 上传oss
+			try (FileInputStream inputStream = new FileInputStream(fullPath)) {
+				Map<String, String> uploadResult = fileService.upload(inputStream, fileName, fileName, user.getUsername());
+				log.info("{}导出生成oss文件:{}", exportType.getDescription(), uploadResult);
+
+				if (CollUtil.isNotEmpty(uploadResult)) {
+					ret = uploadResult.get("url");
+				} else {
+					ret = ERROR_MSG_UPLOAD_FAIL;
+				}
+			}
+		} catch (Exception e) {
+			log.error(exportType.getDescription() + "导出失败", e);
+			// 清理临时文件
+			cleanupTempFile(fullPath);
+			ret = ERROR_MSG_UNKNOWN;
+		}
+
+		// 缓存key
+		String key = ExportType.getAsyncExportCache(exportType, user.getId());
+		redisTemplate.opsForValue().set(key, ret, CommonConstants.DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
+		return ret;
+	}
+
+  	/**
+	 * 清理临时文件
+	 */
+	private void cleanupTempFile(String fullPath) {
+		try {
+			File file = new File(fullPath);
+			if (file.exists()) {
+				file.delete();
+			}
+		} catch (Exception e) {
+			log.warn("删除临时文件失败: {}", fullPath, e);
+		}
+	}
+
+}

+ 35 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/RedisUtils.java

@@ -2,6 +2,11 @@ package com.qunzhixinxi.hnqz.admin.util;
 
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.IdUtil;
+
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.ExportType;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import java.time.LocalDateTime;
 import java.util.Collections;
@@ -61,6 +66,36 @@ public final class RedisUtils {
     return new Token(token, value, LocalDateTime.now().plusSeconds(DEF_DURATION));
   }
 
+  public void checkExportGlobalAllows(int max) {
+    // 使用Redis原子操作实现限流
+			String key = CacheConstants.ASYNC_EXPORT_LIMIT_KEY;
+			Long increment = redisTemplate.opsForValue().increment(key);
+
+			// 设置key的过期时间,避免计数器无限增长
+			if (increment != null && increment.equals(1L)) {
+				redisTemplate.expire(key, 1, TimeUnit.MINUTES);
+			}
+
+			// 检查是否超过限流阈值
+			if (increment != null && increment > max) {
+				// 超过限流阈值时,减少计数器并抛出异常
+				redisTemplate.opsForValue().decrement(key);
+				throw new BizException("系统繁忙,请稍后再试");
+			}
+  }
+
+  public void setExportStarting(ExportType exportType, Integer userId) {
+      // 缓存key
+			String cacheKey = ExportType.getAsyncExportCache(exportType, userId);
+			// 更新状态为生成中
+			redisTemplate.opsForValue().set(cacheKey, WmReportOpt.WmReportOptStatus.GENERATING.name(), CommonConstants.DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
+  }
+
+  public void releaseExportGlobalAllows() {
+      // 释放全局限流
+		  redisTemplate.opsForValue().decrement(CacheConstants.ASYNC_EXPORT_LIMIT_KEY);
+  }
+
   @Data
   @AllArgsConstructor
   public static class Token{

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskMapper.xml

@@ -1412,6 +1412,9 @@
     FROM sys_chain_node_check_his h
     WHERE h.node_id = 6
         AND h.check_result = 1
+        <if test="taskBeginTime != null">
+          AND h.create_time1 &gt;= #{taskBeginTime}
+        </if>
     ) c 
     JOIN wm_task t
     ON c.target_id = t.id
@@ -1420,6 +1423,9 @@
     <where>
       t.task_status = '3'
       AND f2099.target_id is NULL
+      <if test="taskBeginTime != null and taskEndTime != null">
+        AND (t.create_time BETWEEN #{taskBeginTime} AND #{taskEndTime})
+      </if>
       <if test="pkgIds != null and pkgIds.size > 0">
         AND t.score_package_id IN
         <foreach collection="pkgIds" item="id" open="(" separator="," close=")">
@@ -1442,6 +1448,9 @@
     FROM sys_chain_node_check_his h
     WHERE h.node_id = 6
         AND h.check_result = 1
+        <if test="taskBeginTime != null">
+          AND h.create_time1 &gt;= #{taskBeginTime}
+        </if>
     ) c 
     JOIN wm_task t
     ON c.target_id = t.id
@@ -1452,6 +1461,9 @@
     <where>
       t.task_status = '3'
       AND f2099.target_id is NULL
+      <if test="taskBeginTime != null and taskEndTime != null">
+        AND (t.create_time BETWEEN #{taskBeginTime} AND #{taskEndTime})
+      </if>
       <if test="pkgIds != null and pkgIds.size > 0">
         AND t.score_package_id IN
         <foreach collection="pkgIds" item="id" open="(" separator="," close=")">

+ 671 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskSupervisionMapper.xml

@@ -38,6 +38,9 @@
                 FROM sys_chain_node_check_his h
                 WHERE h.node_id = 6
                   AND h.check_result = 1
+                <if test="taskBeginTime != null">
+                  AND h.create_time1 &gt;= #{taskBeginTime}
+                </if>
                 ) c ON c.target_id = t.id
     LEFT JOIN wm_task_sup AS sup ON sup.task_id = t.id
     LEFT JOIN ops_freeze_task f2099 ON f2099.target_id = t.id
@@ -49,7 +52,675 @@
         AND t.score_package_id IN
         <foreach collection="pkgIds" item="pid" open="(" close=")" separator=",">#{pid}</foreach>
       </if>
+      <if test="taskBeginTime != null and taskEndTime != null">
+        AND (t.create_time BETWEEN #{taskBeginTime} AND #{taskEndTime})
+      </if>
     </where>
   </select>
 
+  <resultMap id="wmTaskSupProcessMap" type="com.qunzhixinxi.hnqz.admin.api.model.excel.TaskCheckHistoryExcelModel">
+    <result property="taskId" column="id"/>
+    <result property="divisionName" column="division_name"/>
+    <result property="provAbbr" column="prov_abbr"/>
+    <result property="csoName" column="cso_name"/>
+    <result property="scorePackageName" column="score_package_name"/>
+    <result property="scorePackageId" column="score_package_id"/>
+    <result property="packageYear" column="package_year"/>
+    <result property="packageStartTime" column="package_start_time"/>
+    <result property="packageEndTime" column="package_end_time"/>
+    <result property="taskNumber" column="task_number"/>
+    <result property="taskTypeName" column="task_type_name"/>
+    <result property="taskScore" column="task_score"/>
+    <result property="drugnameTy" column="drugname_ty"/>
+    <result property="drugEntName" column="drug_ent_name"/>
+    <result property="workerRealname" column="worker_realname"/>
+    <result property="taskCreateTime" column="task_create_time"/>
+
+    <result property="vendorRealname" column="vendor_realname"/>
+    <result property="vendorUpdateTime" column="vendor_update_time"/>
+    <result property="vendorCheckResult" column="vendor_check_result"/>
+    <result property="vendorCheckMsg" column="vendor_check_msg"/>
+
+    <result property="cityRealname" column="city_realname"/>
+    <result property="cityUpdateTime" column="city_update_time"/>
+    <result property="cityCheckResult" column="city_check_result"/>
+    <result property="cityCheckMsg" column="city_check_msg"/>
+
+    <result property="divisionRealname" column="division_realname"/>
+    <result property="divisionUpdateTime" column="division_update_time"/>
+    <result property="divisionCheckResult" column="division_check_result"/>
+    <result property="divisionCheckMsg" column="division_check_msg"/>
+
+    <result property="marketingRealname" column="marketing_realname"/>
+    <result property="marketingUpdateTime" column="marketing_update_time"/>
+    <result property="marketingCheckResult" column="marketing_check_result"/>
+    <result property="marketingCheckMsg" column="marketing_check_msg"/>
+
+    <result property="bizRealname" column="biz_realname"/>
+    <result property="bizUpdateTime" column="biz_update_time"/>
+    <result property="bizCheckResult" column="biz_check_result"/>
+    <result property="bizCheckMsg" column="biz_check_msg"/>
+
+    <result property="submgrRealname" column="submgr_realname"/>
+    <result property="submgrUpdateTime" column="submgr_update_time"/>
+    <result property="submgrCheckResult" column="submgr_check_result"/>
+    <result property="submgrCheckMsg" column="submgr_check_msg"/>
+
+    <result property="mgrRealname" column="mgr_realname"/>
+    <result property="mgrUpdateTime" column="mgr_update_time"/>
+    <result property="mgrCheckResult" column="mgr_check_result"/>
+    <result property="mgrCheckMsg" column="mgr_check_msg"/>
+
+    <result property="factoryFinanceRealname" column="factory_finance_realname"/>
+    <result property="factoryFinanceCreateTime" column="factory_finance_create_time"/>
+    <result property="factoryFinanceSupRes" column="factory_finance_sup_res"/>
+    <result property="factoryFinanceRemarks" column="factory_finance_remarks"/>
+
+    <result property="factoryFinanceLeaderRealname" column="factory_finance_leader_realname"/>
+    <result property="factoryFinanceLeaderCreateTime" column="factory_finance_leader_create_time"/>
+    <result property="factoryFinanceLeaderAdviceResult" column="factory_finance_leader_advice_result"/>
+    <result property="factoryFinanceLeaderRemarks" column="factory_finance_leader_remarks"/>
+
+    <result property="factoryFinanceSubmgrRealname" column="factory_finance_submgr_realname"/>
+    <result property="factoryFinanceSubmgrCreateTime" column="factory_finance_submgr_create_time"/>
+    <result property="factoryFinanceSubmgrAdviceResult" column="factory_finance_submgr_advice_result"/>
+    <result property="factoryFinanceSubmgrRemarks" column="factory_finance_submgr_remarks"/>
+
+    <result property="factoryBizRealname" column="factory_biz_realname"/>
+    <result property="factoryBizCreateTime" column="factory_biz_create_time"/>
+    <result property="factoryBizSupRes" column="factory_biz_sup_res"/>
+    <result property="factoryBizRemarks" column="factory_biz_remarks"/>
+
+    <result property="factoryBizLeaderRealname" column="factory_biz_leader_realname"/>
+    <result property="factoryBizLeaderCreateTime" column="factory_biz_leader_create_time"/>
+    <result property="factoryBizLeaderAdviceResult" column="factory_biz_leader_advice_result"/>
+    <result property="factoryBizLeaderRemarks" column="factory_biz_leader_remarks"/>
+
+    <result property="factoryBizSubmgrRealname" column="factory_biz_submgr_realname"/>
+    <result property="factoryBizSubmgrCreateTime" column="factory_biz_submgr_create_time"/>
+    <result property="factoryBizSubmgrAdviceResult" column="factory_biz_submgr_advice_result"/>
+    <result property="factoryBizSubmgrRemarks" column="factory_biz_submgr_remarks"/>
+
+    <result property="lawyerRealname" column="lawyer_realname"/>
+    <result property="lawyerCreateTime" column="lawyer_create_time"/>
+    <result property="lawyerSupRes" column="lawyer_sup_res"/>
+    <result property="lawyerRemarks" column="lawyer_remarks"/>
+
+    <result property="lawyerLeaderRealname" column="lawyer_leader_realname"/>
+    <result property="lawyerLeaderCreateTime" column="lawyer_leader_create_time"/>
+    <result property="lawyerLeaderAdviceResult" column="lawyer_leader_advice_result"/>
+    <result property="lawyerLeaderRemarks" column="lawyer_leader_remarks"/>
+
+    <result property="lawyerSubmgrRealname" column="lawyer_submgr_realname"/>
+    <result property="lawyerSubmgrCreateTime" column="lawyer_submgr_create_time"/>
+    <result property="lawyerSubmgrAdviceResult" column="lawyer_submgr_advice_result"/>
+    <result property="lawyerSubmgrRemarks" column="lawyer_submgr_remarks"/>
+
+    <result property="financeRealname" column="finance_realname"/>
+    <result property="financeCreateTime" column="finance_create_time"/>
+    <result property="financeSupRes" column="finance_sup_res"/>
+    <result property="financeRemarks" column="finance_remarks"/>
+
+    <result property="financeLeaderRealname" column="finance_leader_realname"/>
+    <result property="financeLeaderCreateTime" column="finance_leader_create_time"/>
+    <result property="financeLeaderAdviceResult" column="finance_leader_advice_result"/>
+    <result property="financeLeaderRemarks" column="finance_leader_remarks"/>
+
+    <result property="financeSubmgrRealname" column="finance_submgr_realname"/>
+    <result property="financeSubmgrCreateTime" column="finance_submgr_create_time"/>
+    <result property="financeSubmgrAdviceResult" column="finance_submgr_advice_result"/>
+    <result property="financeSubmgrRemarks" column="finance_submgr_remarks"/>
+  </resultMap>
+
+<select id="selectTaskSupProcess" resultMap="wmTaskSupProcessMap">
+  select
+
+    t.id,
+
+    division.name division_name,
+
+    pp."prov_abbr",
+
+    cso.name cso_name,
+
+    pp.score_package_name,
+
+    pp.id score_package_id,
+
+    year(pp.start_time) package_year,
+
+    pp.start_time package_start_time,
+
+    pp.end_time package_end_time,
+
+    t."task_number",
+
+    ttype.task_type_name,
+
+    t.score task_score,
+
+    drug.drugname_ty,
+
+    drug.drug_ent_name,
+
+    task_user.realname worker_realname,
+
+    t.create_time task_create_time,
+
+    t1.realname vendor_realname,
+
+    t1.update_time vendor_update_time,
+
+    t1.check_result vendor_check_result,
+
+    t1.check_msg vendor_check_msg,
+
+    t2.realname city_realname,
+
+    t2.update_time city_update_time,
+
+    t2.check_result city_check_result,
+
+    t2.check_msg city_check_msg,
+
+    t3.realname division_realname,
+
+    t3.update_time division_update_time,
+
+    t3.check_result division_check_result,
+
+    t3.check_msg division_check_msg,
+
+    t8.realname marketing_realname,
+
+    t8.update_time marketing_update_time,
+
+    t8.check_result marketing_check_result,
+
+    t8.check_msg marketing_check_msg,
+
+    t9.realname biz_realname,
+
+    t9.update_time biz_update_time,
+
+    t9.check_result biz_check_result,
+
+    t9.check_msg biz_check_msg,
+
+    t5.realname submgr_realname,
+
+    t5.update_time submgr_update_time,
+
+    t5.check_result submgr_check_result,
+
+    t5.check_msg submgr_check_msg,
+
+    t6.realname mgr_realname,
+
+    t6.update_time mgr_update_time,
+
+    t6.check_result mgr_check_result,
+
+    t6.check_msg mgr_check_msg,
+
+    sup1."realname" factory_finance_realname,
+
+    sup1."create_time" factory_finance_create_time,
+
+    sup1."sup_res" factory_finance_sup_res,
+
+    sup1.remarks factory_finance_remarks,
+
+    sup11."realname" factory_finance_leader_realname,
+
+    sup11."create_time" factory_finance_leader_create_time,
+
+    sup11."advice_result" factory_finance_leader_advice_result,
+
+    sup11.remarks factory_finance_leader_remarks,
+
+    sup12."realname" factory_finance_submgr_realname,
+
+    sup12."create_time" factory_finance_submgr_create_time,
+
+    sup12."advice_result" factory_finance_submgr_advice_result,
+
+    sup12.remarks factory_finance_submgr_remarks,
+
+    sup2."realname" factory_biz_realname,
+
+    sup2."create_time" factory_biz_create_time,
+
+    sup2."sup_res" factory_biz_sup_res,
+
+    sup2.remarks factory_biz_remarks,
+
+    sup21."realname" factory_biz_leader_realname,
+
+    sup21."create_time" factory_biz_leader_create_time,
+
+    sup21."advice_result" factory_biz_leader_advice_result,
+
+    sup21.remarks factory_biz_leader_remarks,
+
+    sup22."realname" factory_biz_submgr_realname,
+
+    sup22."create_time" factory_biz_submgr_create_time,
+
+    sup22."advice_result" factory_biz_submgr_advice_result,
+
+    sup22.remarks factory_biz_submgr_remarks,
+
+    sup3."realname" lawyer_realname,
+
+    sup3."create_time" lawyer_create_time,
+
+    sup3."sup_res" lawyer_sup_res,
+
+    sup3.remarks lawyer_remarks,
+
+    sup31."realname" lawyer_leader_realname,
+
+    sup31."create_time" lawyer_leader_create_time,
+
+    sup31."advice_result" lawyer_leader_advice_result,
+
+    sup31.remarks lawyer_leader_remarks,
+
+    sup32."realname" lawyer_submgr_realname,
+
+    sup32."create_time" lawyer_submgr_create_time,
+
+    sup32."advice_result" lawyer_submgr_advice_result,
+
+    sup32.remarks lawyer_submgr_remarks,
+
+    sup4."realname" finance_realname,
+
+    sup4."create_time" finance_create_time,
+
+    sup4."sup_res" finance_sup_res,
+
+    sup4.remarks finance_remarks,
+
+    sup41."realname" finance_leader_realname,
+
+    sup41."create_time" finance_leader_create_time,
+
+    sup41."advice_result" finance_leader_advice_result,
+
+    sup41.remarks finance_leader_remarks,
+
+    sup42."realname" finance_submgr_realname,
+
+    sup42."create_time" finance_submgr_create_time,
+
+    sup42."advice_result" finance_submgr_advice_result,
+
+    sup42.remarks finance_submgr_remarks
+
+  from wm_task t
+
+  join wm_task_type ttype
+
+  on t.task_type_id = ttype.id
+
+  join "wm_score_package" p
+
+  on t."score_package_id" = p."id"
+
+  left join "wm_score_package" pp
+
+  on p.relation_score_id = pp.id
+
+  left join sys_dept cso
+
+  on p.dept_id = cso.dept_id
+
+  left join sys_dept division
+
+  on pp.send_package_dept_id = division.dept_id
+
+  left join sys_user task_user
+
+  on t.task_user_id = task_user.user_id
+
+  left join wm_da_drug_ent_drugtable drug
+
+  on p.drugtable = drug.id  
+
+  left join
+
+  (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his
+
+    join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 1 and create_time1 &gt;= #{taskBeginTime} <!-- 服务商 -->
+
+  ) t1
+
+  on t1.target_id = t.id
+
+  left join
+
+  (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his
+
+    join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 2 and create_time1 &gt;= #{taskBeginTime} <!-- 地市 -->
+
+  ) t2
+
+  on t2.target_id = t.id
+
+  left join
+
+  (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 3 and create_time1 &gt;= #{taskBeginTime} <!-- 区域 -->
+
+  ) t3
+
+  on t3.target_id = t.id
+
+  left join
+
+  (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 8 and create_time1 &gt;= #{taskBeginTime} <!-- 市场 -->
+
+  ) t8
+
+    on t8.target_id = t.id
+
+    left join
+
+    (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 9 and create_time1 &gt;= #{taskBeginTime} <!-- 商务 -->
+
+    ) t9
+
+    on t9.target_id = t.id
+
+    left join
+
+    (
+
+    select "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 5 and create_time1 &gt;= #{taskBeginTime} <!-- 分管领导 -->
+
+    ) t5
+
+    on t5.target_id = t.id
+
+    left join
+
+    (
+
+    select distinct "target_id", "check_result", "check_msg", his."update_time1" update_time, u."realname"
+
+    from "sys_chain_node_check_his" his join (select distinct username, realname from sys_user) u
+
+    on u."username" = his."create_by1"
+
+    where "node_id" = 6 and create_time1 &gt;= #{taskBeginTime} <!-- 总经理 -->
+
+    ) t6
+
+    on t6.target_id = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, sup.create_time, sup.sup_res, sup."remarks" from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = sup."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 49 and sup."create_time" &gt;= #{taskBeginTime}  <!-- 厂家财务 -->
+
+    ) sup1
+
+    on sup1."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 57 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'   <!-- 厂家财务负责人 -->
+
+    ) sup11
+
+    on sup11."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 51 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 厂家财务分管领导 -->
+
+    ) sup12
+
+    on sup12."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, sup.create_time, sup.sup_res, sup."remarks" from wm_task_sup sup 
+
+    join sys_user u on u."username" = sup."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 52 and sup."create_time" &gt;= #{taskBeginTime}  <!-- 厂家销售 -->
+
+    ) sup2
+
+    on sup2."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 58 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 厂家销售负责人 -->
+
+    ) sup21
+
+    on sup21."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 61 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 厂家销售分管领导 -->
+
+    ) sup22
+
+    on sup22."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, sup.create_time, sup.sup_res, sup."remarks" from wm_task_sup sup 
+
+    join sys_user u on u."username" = sup."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 53 and sup."create_time" &gt;= #{taskBeginTime}  <!-- 营销合规 -->
+
+    ) sup3
+
+    on sup3."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 60 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 营销合规负责人 -->
+
+    ) sup31
+
+    on sup31."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 54 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 营销合规分管领导 -->
+
+    ) sup32
+
+    on sup32."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, sup.create_time, sup.sup_res, sup."remarks" from wm_task_sup sup 
+
+    join sys_user u on u."username" = sup."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 56 and sup."create_time" &gt;= #{taskBeginTime}  <!-- 营销财务 -->
+
+    ) sup4
+
+    on sup4."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 59 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 营销财务负责人 -->
+
+    ) sup41
+
+    on sup41."task_id" = t.id
+
+    left join
+
+    (
+
+    select sup."task_id", u.realname, adv.create_time, adv.advice_result, adv.remarks  from wm_task_sup sup 
+
+    join wm_task_sup_adv adv on adv.task_supervision_id = sup.sup_id
+
+    join sys_user u on u."username" = adv."create_by"
+
+    join "sys_user_role" ur on u.user_id = ur."user_id"
+
+    where ur."role_id" = 55 and sup."create_time" &gt;= #{taskBeginTime} and adv.del_flag = '0'  <!-- 营销财务分管领导 -->
+
+    ) sup42
+
+    on sup42."task_id" = t.id
+
+
+    where t.create_time &gt;= #{taskBeginTime} and t.create_time &lt;= #{taskEndTime} and t.del_flag = '0'
+      and cso.dept_id &gt; 0 <!-- remove test data -->
+
+ </select>
+
+
+
 </mapper>