Browse Source

feat: task check

shc 5 months ago
parent
commit
0fae81b105
18 changed files with 919 additions and 161 deletions
  1. 2 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/CacheConstants.java
  2. 1 1
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/entity/PageParam.java
  3. 68 61
      hnqz-common/hnqz-common-data/src/main/java/com/qunzhixinxi/hnqz/common/data/mybatis/MybatisPlusConfiguration.java
  4. 61 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/drug/WmDrugControllerV2.java
  5. 37 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/WmTaskControllerV2.java
  6. 59 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/WmTaskTypeControllerV2.java
  7. 53 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/vo/TaskReqVO.java
  8. 62 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/vo/TaskRespVO.java
  9. 24 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/user/SysUserControllerV2.java
  10. 219 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/TaskManager.java
  11. 15 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeCheckHistoryMapper.java
  12. 6 5
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserAreaMapper.java
  13. 35 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskV2Mapper.java
  14. 19 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserAreaService.java
  15. 127 80
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserAreaServiceImpl.java
  16. 23 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysCheckChainNodeCheckHistoryMapper.xml
  17. 33 10
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysUserAreaMapper.xml
  18. 75 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskV2Mapper.xml

+ 2 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/CacheConstants.java

@@ -21,6 +21,8 @@ public interface CacheConstants {
   /** 菜单信息缓存 */
   String MENU_DETAILS = "menu_details";
 
+  String USER_AREA_DETAILS = "user_area_details";
+
   /** 用户信息缓存 */
   String USER_DETAILS = "user_details";
 

+ 1 - 1
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/entity/PageParam.java

@@ -34,6 +34,6 @@ public abstract class PageParam implements Serializable {
 
   @NotNull(message = "每页条数不能为空")
   @Min(value = 1, message = "每页条数最小值为 {value}")
-  @Max(value = 100, message = "每页条数最大值为 {value}")
+  @Max(value = 500, message = "每页条数最大值为 {value}")
   private Integer size = PAGE_SIZE;
 }

+ 68 - 61
hnqz-common/hnqz-common-data/src/main/java/com/qunzhixinxi/hnqz/common/data/mybatis/MybatisPlusConfiguration.java

@@ -1,4 +1,3 @@
-
 package com.qunzhixinxi.hnqz.common.data.mybatis;
 
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
@@ -30,69 +29,77 @@ import java.util.List;
 @AutoConfigureAfter(DataSourceAutoConfiguration.class)
 public class MybatisPlusConfiguration {
 
-	/**
-	 * 创建租户维护处理器对象
-	 * @return 处理后的租户维护处理器
-	 */
-	@Bean
-	@ConditionalOnMissingBean
-	public HnqzTenantHandler hnqzTenantHandler() {
-		return new HnqzTenantHandler();
-	}
-
-	/**
-	 * 分页插件
-	 * @param tenantHandler 租户处理器
-	 * @return PaginationInterceptor
-	 */
-	@Bean
-	@ConditionalOnMissingBean
-	@ConditionalOnProperty(name = "mybatisPlus.tenantEnable", havingValue = "true", matchIfMissing = true)
-	public PaginationInterceptor paginationInterceptor(HnqzTenantHandler tenantHandler) {
-		PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
-		List<ISqlParser> sqlParserList = new ArrayList<>();
-		TenantSqlParser tenantSqlParser = new TenantSqlParser();
-		tenantSqlParser.setTenantHandler(tenantHandler);
-		sqlParserList.add(tenantSqlParser);
-		paginationInterceptor.setSqlParserList(sqlParserList);
-		return paginationInterceptor;
-	}
+  /**
+   * 创建租户维护处理器对象
+   *
+   * @return 处理后的租户维护处理器
+   */
+  @Bean
+  @ConditionalOnMissingBean
+  public HnqzTenantHandler hnqzTenantHandler() {
+    return new HnqzTenantHandler();
+  }
 
-	/**
-	 * hnqz 默认数据权限处理
-	 * @return
-	 */
-	@Bean
-	@ConditionalOnMissingBean
-	public DataScopeHandle dataScopeHandle() {
-		return new HnqzDefaultDatascopeHandle();
-	}
+  /**
+   * 分页插件
+   *
+   * @param tenantHandler 租户处理器
+   * @return PaginationInterceptor
+   */
+  @Bean
+  @ConditionalOnMissingBean
+  @ConditionalOnProperty(
+      name = "mybatisPlus.tenantEnable",
+      havingValue = "true",
+      matchIfMissing = true)
+  public PaginationInterceptor paginationInterceptor(HnqzTenantHandler tenantHandler) {
+    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+    List<ISqlParser> sqlParserList = new ArrayList<>();
+    TenantSqlParser tenantSqlParser = new TenantSqlParser();
+    tenantSqlParser.setTenantHandler(tenantHandler);
+    sqlParserList.add(tenantSqlParser);
+    // 超过分页后,默认返回第一页
+    paginationInterceptor.setOverflow(true);
+    paginationInterceptor.setSqlParserList(sqlParserList);
+    return paginationInterceptor;
+  }
 
-	/**
-	 * 数据权限插件
-	 * @return DataScopeInterceptor
-	 */
-	@Bean
-	@ConditionalOnMissingBean
-	@ConditionalOnBean(DataScopeHandle.class)
-	public DataScopeInterceptor dataScopeInterceptor() {
-		return new DataScopeInterceptor(dataScopeHandle());
-	}
+  /**
+   * hnqz 默认数据权限处理
+   *
+   * @return
+   */
+  @Bean
+  @ConditionalOnMissingBean
+  public DataScopeHandle dataScopeHandle() {
+    return new HnqzDefaultDatascopeHandle();
+  }
 
-	@Bean
-	@ConditionalOnBean(DataScopeHandle.class)
-	public DataScopeSqlInjector dataScopeSqlInjector() {
-		return new DataScopeSqlInjector();
-	}
+  /**
+   * 数据权限插件
+   *
+   * @return DataScopeInterceptor
+   */
+  @Bean
+  @ConditionalOnMissingBean
+  @ConditionalOnBean(DataScopeHandle.class)
+  public DataScopeInterceptor dataScopeInterceptor() {
+    return new DataScopeInterceptor(dataScopeHandle());
+  }
 
-	/**
-	 * SQL 日志格式化
-	 *
-	 * @return DruidSqlLogFilter
-	 */
-	@Bean
-	public DruidSqlLogFilter sqlLogFilter() {
-		return new DruidSqlLogFilter();
-	}
+  @Bean
+  @ConditionalOnBean(DataScopeHandle.class)
+  public DataScopeSqlInjector dataScopeSqlInjector() {
+    return new DataScopeSqlInjector();
+  }
 
+  /**
+   * SQL 日志格式化
+   *
+   * @return DruidSqlLogFilter
+   */
+  @Bean
+  public DruidSqlLogFilter sqlLogFilter() {
+    return new DruidSqlLogFilter();
+  }
 }

+ 61 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/drug/WmDrugControllerV2.java

@@ -0,0 +1,61 @@
+package com.qunzhixinxi.hnqz.admin.controller.drug;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEntDrugtable;
+import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 产品前端控制器
+ *
+ * @author jimmy
+ * @date 2025-01-14 17:46
+ */
+@Slf4j
+@RestController
+@RequestMapping("/drug/v2")
+public class WmDrugControllerV2 {
+
+  @Resource private RedisTemplate redisTemplate;
+
+  @Inner(value = false)
+  @GetMapping(value = "/avail")
+  public R<Map<String, List<WmDaDrugEntDrugtable>>> listAvail(
+      @RequestParam(value = "mah", required = false) String mah) {
+
+    List<WmDaDrugEntDrugtable> range =
+        redisTemplate.opsForList().range(CacheConstants.DRUG_KEY, 0, -1);
+
+    if (CollUtil.isEmpty(range)) {
+      return R.ok(Collections.emptyMap());
+    }
+
+    if (StrUtil.isBlank(mah)) {
+      range =
+          range.stream()
+              .filter(drug -> StrUtil.contains(drug.getDrugEntName(), mah))
+              .collect(Collectors.toList());
+    }
+
+    Map<String, List<WmDaDrugEntDrugtable>> collect = range.stream()
+        .collect(Collectors.groupingBy(WmDaDrugEntDrugtable::getDrugEntName));
+
+    return R.ok(collect);
+
+
+  }
+}

+ 37 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/WmTaskControllerV2.java

@@ -0,0 +1,37 @@
+package com.qunzhixinxi.hnqz.admin.controller.task;
+
+import static com.qunzhixinxi.hnqz.common.core.util.R.ok;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskReqVO;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO;
+import com.qunzhixinxi.hnqz.admin.manager.TaskManager;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 任务前端控制器v2
+ *
+ * @author jimmy
+ * @date 2025-01-10 16:06
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "/task/v2")
+public class WmTaskControllerV2 {
+
+  @Resource private TaskManager taskManager;
+
+  @GetMapping(value = "/page")
+  public R<Page<TaskRespVO.ToDirectCheck>> pageTaskToCheck(@Valid TaskReqVO.OnPage query) {
+    Page<TaskRespVO.ToDirectCheck> page =
+        taskManager.pageTaskToCheck(query, SecurityUtils.getUser());
+    return ok(page);
+  }
+}

+ 59 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/WmTaskTypeControllerV2.java

@@ -0,0 +1,59 @@
+package com.qunzhixinxi.hnqz.admin.controller.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author jimmy
+ * @date 2025-01-14 16:30
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "/task/type/v2")
+public class WmTaskTypeControllerV2 {
+
+  @Resource private RedisTemplate redisTemplate;
+
+  @GetMapping("/avail")
+  public R<List<Map<String, Object>>> listAvail(
+      @RequestParam(value = "name", required = false) String name) {
+
+    List<WmTaskType> range = redisTemplate.opsForList().range(CacheConstants.TASK_TYPE_KEY, 0, -1);
+
+    if (CollUtil.isEmpty(range)) {
+      return R.ok(Collections.emptyList());
+    }
+
+    if (StrUtil.isNotBlank(name)) {
+      range = range.stream().filter(tt-> StrUtil.contains(tt.getTaskTypeName(), name)).collect(Collectors.toList());
+    }
+
+    List<Map<String, Object>> collect =
+        range.stream()
+            .map(
+                tt -> {
+                  Map<String, Object> map = new HashMap<>(2);
+                  map.put("id", tt.getId());
+                  map.put("name", tt.getTaskTypeName());
+                  return map;
+                })
+            .collect(Collectors.toList());
+
+    return R.ok(collect);
+  }
+}

+ 53 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/vo/TaskReqVO.java

@@ -0,0 +1,53 @@
+package com.qunzhixinxi.hnqz.admin.controller.task.vo;
+
+import com.qunzhixinxi.hnqz.common.core.entity.PageParam;
+import java.time.LocalDate;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 任务请求vo
+ *
+ * @author jimmy
+ * @date 2025-01-10 16:10
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class TaskReqVO {
+
+  @Data
+  @EqualsAndHashCode(callSuper = false)
+  public static class OnPage extends PageParam {
+
+    // 年度
+    private String year;
+
+    // 季度
+    private String quarter;
+
+    // 服务类型
+    private String taskTypeId;
+
+    // 关联产品名称
+    private String skuName;
+
+    // 服务商名称
+    private Integer vendorId;
+
+    // 推广员
+    private Integer salesId;
+
+    // 生产企业
+    private String mahName;
+
+    // 服务包所属省份
+    private String provAbbr;
+
+    // 审核节点
+    private Integer nodeId;
+
+    // 任务创建日期
+    private LocalDate createTime;
+  }
+}

+ 62 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/vo/TaskRespVO.java

@@ -0,0 +1,62 @@
+package com.qunzhixinxi.hnqz.admin.controller.task.vo;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 任务响应vo
+ *
+ * @author jimmy
+ * @date 2025-01-13 20:45
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class TaskRespVO {
+
+  @Data
+  public static class ToDirectCheck {
+
+    // 任务信息
+    private Integer taskId;
+
+    private String taskNumber;
+
+    private String taskTypeId;
+
+    private String taskScore;
+
+    private String taskStatus;
+
+    private LocalDateTime createTime;
+
+    // 推广员信息
+    private Integer taskUserId;
+
+    private String salesName;
+
+    // 企业信息
+    private Integer entId;
+
+    private String entName;
+
+    // 包信息
+    private String pkgName;
+
+    private String pkgStartTime;
+
+    private String pkgEndTime;
+
+    private String provAbbr;
+
+    // 产品信息
+    private String skuId;
+    private String skuName;
+    private String mahName;
+
+    // 审核信息
+    private List<Map<String, Object>> checkHistoryList;
+  }
+}

+ 24 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/user/SysUserControllerV2.java

@@ -0,0 +1,24 @@
+package com.qunzhixinxi.hnqz.admin.controller.user;
+
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import java.util.List;
+import java.util.Map;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author jimmy
+ * @date 2025-01-14 17:37
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "/user/v2")
+public class SysUserControllerV2 {
+
+
+
+  public R<List<Map<String, String>>> listAvail(){
+    return null;
+  }
+}

+ 219 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/TaskManager.java

@@ -0,0 +1,219 @@
+package com.qunzhixinxi.hnqz.admin.manager;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType.AreaType;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEntDrugtable;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskReqVO;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO.ToDirectCheck;
+import com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeCheckHistoryMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskV2Mapper;
+import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
+import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import org.springframework.data.redis.core.ListOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+/**
+ * 任务管理器
+ *
+ * @author jimmy
+ * @date 2025-01-10 16:14
+ */
+@Service
+public final class TaskManager {
+
+  @Resource private RedisTemplate redisTemplate;
+  @Resource private WmTaskV2Mapper taskMapper;
+  @Resource private SysUserAreaService userAreaService;
+  @Resource private SysCheckChainNodeCheckHistoryMapper checkChainNodeCheckHistoryMapper;
+
+  /**
+   * 分页查询
+   *
+   * @param query 筛选参数
+   * @param user 操作人
+   */
+  public Page<TaskRespVO.ToDirectCheck> pageTaskToCheck(
+      @Valid TaskReqVO.OnPage query, HnqzUser user) {
+
+    // 获取vendor
+    List<Integer> vendorList = getVendorList(query.getVendorId(), user);
+
+    // 计算服务包查询周期
+    Map<String, LocalDate> pkgPeriod = this.calcPkgPeriod(query.getYear(), query.getQuarter());
+    LocalDate issueDate = pkgPeriod.get("issueDate");
+    LocalDate expiryDate = pkgPeriod.get("expiryDate");
+
+    LocalDateTime startTime = null;
+    LocalDateTime endTime = null;
+    LocalDate createTime = query.getCreateTime();
+    if (createTime != null) {
+      startTime = LocalDateTime.of(query.getCreateTime(), LocalTime.MIN);
+      endTime = LocalDateTime.of(query.getCreateTime(), LocalTime.MAX);
+    }
+
+    Page<TaskRespVO.ToDirectCheck> page = new Page<>(query.getCurrent(), query.getSize());
+
+    taskMapper.pageDirectCheck(
+        page,
+        issueDate,
+        expiryDate,
+        startTime,
+        endTime,
+        query.getTaskTypeId(),
+        vendorList,
+        query.getSalesId(),
+        query.getProvAbbr(),
+        query.getNodeId());
+
+    return build(page);
+  }
+
+  // 组装数据
+  private Page<TaskRespVO.ToDirectCheck> build(Page<TaskRespVO.ToDirectCheck> page) {
+
+    List<ToDirectCheck> records = page.getRecords();
+
+    if (CollUtil.isEmpty(records)) {
+      return page;
+    }
+
+    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<Integer> taskIds =
+        records.stream()
+            .mapToInt(ToDirectCheck::getTaskId)
+            .distinct()
+            .sorted()
+            .boxed()
+            .collect(Collectors.toList());
+
+    //    List<Map<String, Object>> taskCheckHis =
+    //        checkChainNodeCheckHistoryMapper.listTaskCheckHis(taskIds);
+    //
+    //    Map<Long, List<Map<String, Object>>> his =
+    //        taskCheckHis.stream().collect(Collectors.groupingBy(r -> (Long) r.get("target_id")));
+
+    records.forEach(
+        record -> {
+          SysUser sysUser = userMap.get(record.getTaskUserId());
+          SysDept dept = deptMap.get(record.getEntId());
+          WmDaDrugEntDrugtable drugtable = drugtableMap.get(record.getSkuId());
+
+          record.setSalesName(sysUser != null ? sysUser.getRealname() : "");
+          record.setEntName(dept.getName());
+          record.setSkuName(drugtable.getDrugnameTy());
+          record.setMahName(drugtable.getDrugEntName());
+
+          // 查询审核记录
+          //          List<Map<String, Object>> maps = his.get((long) record.getTaskId());
+          //          record.setCheckHistoryList(maps);
+        });
+
+    page.setRecords(records);
+    return page;
+  }
+
+  // 获取可见vendor
+  private List<Integer> getVendorList(Integer vendorId, HnqzUser user) {
+
+    // 指定查询企业
+    if (vendorId != null) {
+      return Collections.singletonList(vendorId);
+    }
+
+    if (user == null) {
+      return Collections.emptyList();
+    }
+
+    Integer userId = user.getId();
+    //    int userId = 1;
+
+    return userAreaService.listUserDept((long) userId, AreaType.DISTRICT.getType()).stream()
+        .map(Long::intValue)
+        .collect(Collectors.toList());
+  }
+
+  // 获取当前节点
+  private List<Integer> getCurrentNodeList(Integer nodeId, Integer current, Integer size) {
+
+    Page<Integer> integerPage =
+        checkChainNodeCheckHistoryMapper.pageCurrentNodeList(new Page<>(current, size), nodeId);
+
+    return CollUtil.isEmpty(integerPage.getRecords())
+        ? Collections.emptyList()
+        : integerPage.getRecords();
+  }
+
+  // 计算积分包周期
+  private Map<String, LocalDate> calcPkgPeriod(String yearStr, String quarterStr) {
+
+    LocalDate today = LocalDate.now();
+    LocalDate issue;
+    LocalDate expiry;
+    int year;
+    int month;
+    boolean annual = false;
+
+    // 没有参数 就查询当前日期的全年
+    if (StrUtil.isAllBlank(yearStr, quarterStr)) {
+      year = today.getYear();
+      month = 1;
+      annual = true;
+    } else {
+      year = StrUtil.isBlank(yearStr) ? today.getYear() : Integer.parseInt(yearStr);
+
+      if (StrUtil.isBlank(quarterStr)) {
+        month = 1;
+        annual = true;
+      } else {
+        month = getMonthValue(quarterStr);
+      }
+    }
+
+    issue = LocalDate.of(year, month, 1);
+    expiry = issue.plusMonths(annual ? 12 : 3).minusDays(1);
+    Map<String, LocalDate> pkgPeriod = new HashMap<>(2);
+    pkgPeriod.put("issueDate", issue);
+    pkgPeriod.put("expiryDate", expiry);
+    return pkgPeriod;
+  }
+
+  // 计算季度开始月份
+  private int getMonthValue(String quarterStr) {
+    return Integer.parseInt(quarterStr) * 3 - 2;
+  }
+}

+ 15 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeCheckHistoryMapper.java

@@ -1,8 +1,13 @@
 package com.qunzhixinxi.hnqz.admin.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import java.util.List;
+import java.util.Map;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 审批链节点审核历史
@@ -12,10 +17,16 @@ import org.apache.ibatis.annotations.Mapper;
  * @date 2024/05/22 11:14
  */
 @Mapper
-public interface SysCheckChainNodeCheckHistoryMapper extends BaseMapper<SysCheckChainNodeCheckHistory> {
-
-}
-
+public interface SysCheckChainNodeCheckHistoryMapper
+    extends BaseMapper<SysCheckChainNodeCheckHistory> {
 
+  @Select(
+      value =
+          "SELECT DISTINCT tmp.target_id AS task_id FROM (SELECT h.target_id, MAX(h.node_id) AS node_id FROM sys_chain_node_check_his AS h GROUP BY h.target_id) tmp WHERE tmp.node_id = #{nodeId} ORDER BY task_id ")
+  Page<Integer> pageCurrentNodeList(
+      Page<SysCheckChainNodeCheckHistory> page, @Param("nodeId") Integer nodeId);
 
+  List<Map<String, Object>> getTaskCheckHis(@Param("taskId") Integer taskId);
 
+  List<Map<String, Object>> listTaskCheckHis(@Param("taskIds") List<Integer> taskIds);
+}

+ 6 - 5
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserAreaMapper.java

@@ -18,10 +18,11 @@ import java.util.List;
 @Mapper
 public interface SysUserAreaMapper extends BaseMapper<SysUserArea> {
 
+  List<Long> listAreaUser(@Param(value = "areaIds") Collection<Long> areaIds);
 
-    List<Long> listAreaUser(@Param(value = "areaIds") Collection<Long> areaIds);
-}
-
-
-
+  List<Long> listAreaIdByUserIdAndType(
+      @Param(value = "userId") Long userId, @Param("type") String type);
 
+  List<Long> listEntIdByUserIdAndType(
+      @Param(value = "userId") Long userId, @Param("type") String type);
+}

+ 35 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskV2Mapper.java

@@ -0,0 +1,35 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTask;
+import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 任务mapper
+ *
+ * @author jimmy
+ * @date 2025-01-13 20:42
+ */
+@Mapper
+public interface WmTaskV2Mapper extends BaseMapper<WmTask> {
+
+  Page<TaskRespVO.ToDirectCheck> pageDirectCheck(
+      Page<TaskRespVO.ToDirectCheck> page,
+      @Param("pkgIssueDate") LocalDate pkgIssueDate,
+      @Param("pkgExpiryDate") LocalDate pkgExpiryDay,
+      @Param("taskStartTime") LocalDateTime taskStartTime,
+      @Param("taskEndTime") LocalDateTime taskEndTime,
+      @Param("taskTypeId") String taskTypeId,
+      @Param("vendorIds") List<Integer> vendorIds,
+      @Param("salesId") Integer salesId,
+      @Param("prov") String prov,
+//      @Param("taskIds") List<Integer> taskIds,
+      @Param("nodeId") Integer nodeId
+      );
+}

+ 19 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserAreaService.java

@@ -1,6 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUserArea;
 
 import java.util.Collection;
@@ -31,6 +32,24 @@ public interface SysUserAreaService extends IService<SysUserArea> {
      */
     List<Long> listUserAreas(Long userId);
 
+
+    /**
+     * 查询用户的区域
+     *
+     * @param userId 用户id
+     * @return 区域ID列表
+     */
+    List<Long> listUserAreas(Long userId, String type);
+
+    /**
+     * 查询用户的区域
+     *
+     * @param userId 用户id
+     * @return 区域ID列表
+     */
+    List<Long> listUserDept(Long userId, String type);
+
+
     /**
      * 获取区域的人员
      *

+ 127 - 80
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserAreaServiceImpl.java

@@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUserArea;
 import com.qunzhixinxi.hnqz.admin.mapper.SysUserAreaMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
+import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -26,86 +29,130 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 @AllArgsConstructor
-public class SysUserAreaServiceImpl extends ServiceImpl<SysUserAreaMapper, SysUserArea> implements SysUserAreaService {
-
-
-    /**
-     * 保存关系
-     *
-     * @param userId    用户ID
-     * @param areaCodes 区域列表
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void saveRelation(Long userId, Collection<Long> areaCodes) {
-
-        if (CollUtil.isEmpty(areaCodes)) {
-            log.info("不存在需要绑定的区域");
-            return;
-        }
-
-        LocalDateTime now = LocalDateTime.now();
-        List<SysUserArea> collect = areaCodes.stream().distinct().map(code -> {
-            SysUserArea userArea = new SysUserArea();
-            userArea.setUserId(userId);
-            userArea.setAreaId(code);
-            userArea.setCreateTime(now);
-            return userArea;
-        }).collect(Collectors.toList());
-
-
-        this.saveBatch(collect);
-
-
-    }
-
-    /**
-     * 查询用户的区域
-     *
-     * @param userId 用户id
-     * @return 区域ID列表
-     */
-    @Override
-    public List<Long> listUserAreas(Long userId) {
-        return this.list(Wrappers.<SysUserArea>lambdaQuery().eq(SysUserArea::getUserId, userId)).stream().map(SysUserArea::getAreaId).distinct().sorted().collect(Collectors.toList());
-    }
-
-    /**
-     * 获取区域的人员
-     *
-     * @param areaIds 区域列表
-     * @return 人员列表
-     */
-    @Override
-    public List<Long> listAreaUser(Collection<Long> areaIds) {
-        List<Long> collect = areaIds.stream().sorted().collect(Collectors.toList());
-        return this.list(Wrappers.<SysUserArea>lambdaQuery().in(SysUserArea::getAreaId, collect)).stream().map(SysUserArea::getUserId).distinct().sorted().collect(Collectors.toList());
-    }
-
-    /**
-     * 获取区域的人员
-     *
-     * @param areaIds 区域列表
-     * @return 人员列表
-     */
-    @Override
-    public List<Long> listAreaUser1(Collection<Long> areaIds) {
-        return this.baseMapper.listAreaUser(areaIds);
-    }
-
-    /**
-     * 删除用户的区域
-     *
-     * @param userId 用户ID
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void delUserArea(Long userId) {
-        this.remove(Wrappers.<SysUserArea>lambdaQuery().eq(SysUserArea::getUserId, userId));
+public class SysUserAreaServiceImpl extends ServiceImpl<SysUserAreaMapper, SysUserArea>
+    implements SysUserAreaService {
+
+  /**
+   * 保存关系
+   *
+   * @param userId 用户ID
+   * @param areaCodes 区域列表
+   */
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  @CacheEvict(value = CacheConstants.USER_AREA_DETAILS, allEntries = true)
+  public void saveRelation(Long userId, Collection<Long> areaCodes) {
+
+    if (CollUtil.isEmpty(areaCodes)) {
+      log.info("不存在需要绑定的区域");
+      return;
     }
 
+    LocalDateTime now = LocalDateTime.now();
+    List<SysUserArea> collect =
+        areaCodes.stream()
+            .distinct()
+            .map(
+                code -> {
+                  SysUserArea userArea = new SysUserArea();
+                  userArea.setUserId(userId);
+                  userArea.setAreaId(code);
+                  userArea.setCreateTime(now);
+                  return userArea;
+                })
+            .collect(Collectors.toList());
+
+    this.saveBatch(collect);
+  }
+
+  /**
+   * 查询用户的区域
+   *
+   * @param userId 用户id
+   * @return 区域ID列表
+   */
+  @Override
+  @Cacheable(
+      value = CacheConstants.USER_AREA_DETAILS,
+      key = "#userId  + '_area'",
+      unless = "#result.isEmpty()")
+  public List<Long> listUserAreas(Long userId) {
+    return this.list(Wrappers.<SysUserArea>lambdaQuery().eq(SysUserArea::getUserId, userId))
+        .stream()
+        .map(SysUserArea::getAreaId)
+        .distinct()
+        .sorted()
+        .collect(Collectors.toList());
+  }
+
+  /**
+   * 查询用户的区域
+   *
+   * @param userId 用户id
+   * @param type 区域类别
+   * @return 区域ID列表
+   */
+  @Override
+  @Cacheable(
+      value = CacheConstants.USER_AREA_DETAILS,
+      key = "#userId +'_' + #type + '_area'",
+      unless = "#result.isEmpty()")
+  public List<Long> listUserAreas(Long userId, String type) {
+    return this.baseMapper.listAreaIdByUserIdAndType(userId, type);
+  }
+
+  /**
+   * 查询用户的区域
+   *
+   * @param userId 用户id
+   * @param type 区域类别
+   * @return 区域ID列表
+   */
+  @Cacheable(
+      value = CacheConstants.USER_AREA_DETAILS,
+      key = "#userId +'_' + #type + '_did_area'",
+      unless = "#result.isEmpty()")
+  @Override
+  public List<Long> listUserDept(Long userId, String type) {
+    return this.baseMapper.listEntIdByUserIdAndType(userId, type);
+  }
+
+  /**
+   * 获取区域的人员
+   *
+   * @param areaIds 区域列表
+   * @return 人员列表
+   */
+  @Override
+  public List<Long> listAreaUser(Collection<Long> areaIds) {
+    List<Long> collect = areaIds.stream().sorted().collect(Collectors.toList());
+    return this.list(Wrappers.<SysUserArea>lambdaQuery().in(SysUserArea::getAreaId, collect))
+        .stream()
+        .map(SysUserArea::getUserId)
+        .distinct()
+        .sorted()
+        .collect(Collectors.toList());
+  }
+
+  /**
+   * 获取区域的人员
+   *
+   * @param areaIds 区域列表
+   * @return 人员列表
+   */
+  @Override
+  public List<Long> listAreaUser1(Collection<Long> areaIds) {
+    return this.baseMapper.listAreaUser(areaIds);
+  }
+
+  /**
+   * 删除用户的区域
+   *
+   * @param userId 用户ID
+   */
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public void delUserArea(Long userId) {
+    this.remove(Wrappers.<SysUserArea>lambdaQuery().eq(SysUserArea::getUserId, userId));
+  }
 }
-
-
-
-

+ 23 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysCheckChainNodeCheckHistoryMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeCheckHistoryMapper">
+  <select id="getTaskCheckHis" resultType="map">
+    SELECT *
+    FROM sys_chain_node_check_his AS h
+    WHERE h.target_id = #{taskId}
+    ORDER BY h.his_id DESC
+
+  </select>
+  <select id="listTaskCheckHis" resultType="map">
+    SELECT *
+    FROM sys_chain_node_check_his AS h
+    WHERE h.target_id IN
+    <foreach collection="taskIds" item="taskId" open="(" close=")" separator=",">
+      #{taskId}
+    </foreach>
+    ORDER BY h.his_id DESC
+  </select>
+</mapper>

+ 33 - 10
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysUserAreaMapper.xml

@@ -1,16 +1,39 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qunzhixinxi.hnqz.admin.mapper.SysUserAreaMapper">
 
 
- <select id="listAreaUser" resultType="long">
-   SELECT DISTINCT user_id
-   FROM sys_user_area
-   WHERE
-       area_id IN
-   <foreach collection="areaIds" item="id" open="(" separator="," close=")">
-     #{id}
-   </foreach>
- </select>
+  <select id="listAreaUser" resultType="long">
+    SELECT DISTINCT user_id
+    FROM sys_user_area
+    WHERE
+    area_id IN
+    <foreach collection="areaIds" item="id" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </select>
+
+  <select id="listAreaIdByUserIdAndType" resultType="long">
+    SELECT DISTINCT ua.area_id
+    FROM sys_user_area AS ua
+           LEFT JOIN sys_area AS a ON ua.area_id = a.area_id
+    WHERE a.area_type = #{type}
+      AND ua.user_id = #{userId}
+    ORDER BY ua.area_id
+  </select>
+
+  <select id="listEntIdByUserIdAndType" resultType="long">
+    SELECT DISTINCT ent.ent_id
+    FROM sys_ent_area AS ent
+    WHERE ent.area_id IN (SELECT DISTINCT ua.area_id
+                          FROM sys_user_area AS ua
+                                 LEFT JOIN sys_area AS a ON ua.area_id = a.area_id
+                          WHERE a.area_type = #{type}
+                            AND ua.user_id = #{userId}
+                          ORDER BY ua.area_id)
+    ORDER BY ent.ent_id
+  </select>
+
 </mapper>

+ 75 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskV2Mapper.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qunzhixinxi.hnqz.admin.mapper.WmTaskV2Mapper">
+
+  <resultMap id="wmTaskMap"
+    type="com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO$ToDirectCheck">
+    <id property="taskId" column="id"/>
+    <result property="taskNumber" column="task_number"/>
+    <result property="taskTypeId" column="task_type_id"/>
+    <result property="taskScore" column="score"/>
+    <result property="taskStatus" column="task_status"/>
+    <result property="createTime" column="create_time"/>
+    <result property="taskUserId" column="task_user_id"/>
+    <result property="entId" column="dept_id"/>
+    <result property="pkgName" column="score_package_name"/>
+    <result property="pkgStartTime" column="start_time"/>
+    <result property="pkgEndTime" column="end_time"/>
+    <result property="provAbbr" column="prov_abbr"/>
+    <result property="skuId" column="drugtable"/>
+<!--    <collection property="checkHistoryList" javaType="java.util.ArrayList" ofType="map"-->
+<!--      select="com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeCheckHistoryMapper.getTaskCheckHis"-->
+<!--      column="id"/>-->
+  </resultMap>
+
+
+  <select id="pageDirectCheck" resultMap="wmTaskMap">
+    SELECT t.id,
+    t.task_number,
+    t.task_type_id,
+    t.score,
+    t.task_user_id,
+    t.task_status,
+    t.create_time,
+    pkg.dept_id,
+    pkg.score_package_name,
+    pkg.start_time,
+    pkg.end_time,
+    pkg.prov_abbr,
+    pkg.drugtable
+    FROM wm_task AS t
+    LEFT JOIN wm_score_package AS pkg ON pkg.id = t.score_package_id
+    LEFT JOIN (SELECT DISTINCT tmp.target_id AS task_id
+    FROM (SELECT h.target_id, MAX(h.node_id) AS node_id
+    FROM sys_chain_node_check_his AS h
+    GROUP BY h.target_id) tmp
+    WHERE tmp.node_id = #{nodeId}
+    ORDER BY task_id) AS his
+    ON his.task_id = t.id
+    <where>
+      <if test="pkgIssueDate != null and pkgExpiryDate != null">
+        pkg.start_time &gt;= #{pkgIssueDate} AND pkg.end_time &lt;= #{pkgExpiryDate}
+      </if>
+      <if test="prov != null and prov != ''">
+        AND pkg.prov_abbr =#{prov}
+      </if>
+      <if test="vendorIds != null and vendorIds.size > 0">
+        AND pkg.dept_id IN
+        <foreach collection="vendorIds" item="vid" open="(" close=")" separator=",">
+          #{vid}
+        </foreach>
+      </if>
+      <if test="taskTypeId != null and taskTypeId != ''">
+        AND t.task_type_id = #{taskTypeId}
+      </if>
+      <if test="salesId != null">
+        AND t.task_user_id = #{salesId}
+      </if>
+      <if test="taskStartTime != null and taskEndTime != null">
+        AND (t.create_time BETWEEN #{taskStartTime} AND #{taskEndTime})
+      </if>
+    </where>
+  </select>
+
+</mapper>