|
@@ -0,0 +1,241 @@
|
|
|
+package com.qunzhixinxi.hnqz.admin.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.EnableEnum;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.ExportType;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageStatusEnum;
|
|
|
+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.api.entity.WmPackageTaskTypeQty;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackageStatus;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTask;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.model.excel.WmScorePackageSubInfoExcelModel;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.model.excel.WmTaskDetailExcelModel;
|
|
|
+import com.qunzhixinxi.hnqz.admin.aspect.ExportGuard;
|
|
|
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
|
|
|
+import com.qunzhixinxi.hnqz.admin.event.TaskDetailExportEvent;
|
|
|
+import com.qunzhixinxi.hnqz.admin.manager.WmPackageExportScope;
|
|
|
+import com.qunzhixinxi.hnqz.admin.manager.WmPackageManager;
|
|
|
+import com.qunzhixinxi.hnqz.admin.mapper.SysUserMapper;
|
|
|
+import com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageMapper;
|
|
|
+import com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageStatusMapper;
|
|
|
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskMapper;
|
|
|
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageExportService;
|
|
|
+import com.qunzhixinxi.hnqz.admin.service.WmTaskDetailExportService;
|
|
|
+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 lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 个人任务明细数据导出服务 impl
|
|
|
+ *
|
|
|
+ * @author snows
|
|
|
+ * @date 2025/08/05
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class WmTaskDetailExportServiceImpl implements WmTaskDetailExportService {
|
|
|
+ private final WmScorePackageMapper scorePackageMapper;
|
|
|
+ private final WmTaskMapper taskMapper;
|
|
|
+ private final SysUserMapper userMapper;
|
|
|
+ private final WmScorePackageStatusMapper scorePackageStatusMapper;
|
|
|
+ private final WmScorePackageExportService scorePackageExportService;
|
|
|
+ private final UpmsConfig upmsConfig;
|
|
|
+ private final RedisUtils redisUtils;
|
|
|
+ private final ExportUtils exportUtils;
|
|
|
+
|
|
|
+ Map<Integer, String> quarterMap =
|
|
|
+ Map.ofEntries(
|
|
|
+ Map.entry(1, "一季度"), Map.entry(2, "二季度"), Map.entry(3, "三季度"), Map.entry(4, "四季度"));
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 异步导出
|
|
|
+ *
|
|
|
+ * @param user 用户
|
|
|
+ * @param roles 角色
|
|
|
+ * @param startDate 开始日期
|
|
|
+ * @param endDate 结束日期
|
|
|
+ * @return {@link Boolean } 是否成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @ExportGuard(type = "TASK_DETAIL")
|
|
|
+ public Boolean asyncExport(HnqzUser user, List<Integer> roles, LocalDate startDate, LocalDate endDate) {
|
|
|
+ redisUtils.setExportStarting(ExportType.TASK_DETAIL, user.getId());
|
|
|
+
|
|
|
+ SpringContextHolder.getApplicationContext().publishEvent(new TaskDetailExportEvent(user, roles, startDate, endDate));
|
|
|
+ return Boolean.TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导出积分包
|
|
|
+ *
|
|
|
+ * @param user 用户
|
|
|
+ * @param roles 角色
|
|
|
+ * @param startDate 开始日期
|
|
|
+ * @param endDate 结束日期
|
|
|
+ * @return {@link Boolean } 是否成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean export(HnqzUser user, List<Integer> roles, LocalDate startDate, LocalDate endDate) {
|
|
|
+ redisUtils.checkExportGlobalAllows(upmsConfig.getAsyncExportLimit());
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取数据
|
|
|
+ List<WmTaskDetailExcelModel> data = this.getExportData(user, roles, startDate, endDate);
|
|
|
+
|
|
|
+ // 导出
|
|
|
+ String resultValue = exportUtils.WriteExportExcel(ExportType.TASK_DETAIL, data, WmTaskDetailExcelModel.class, user);
|
|
|
+ return !StrUtil.startWith(resultValue, "ERROR");
|
|
|
+ } finally {
|
|
|
+ redisUtils.releaseExportGlobalAllows();
|
|
|
+ redisUtils.cleanupGenerating(ExportType.TASK_DETAIL, user.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取导出数据
|
|
|
+ *
|
|
|
+ * @param user 用户
|
|
|
+ * @param roles 角色
|
|
|
+ * @param startDate 开始日期
|
|
|
+ * @param endDate 结束日期
|
|
|
+ * @return {@link List }<{@link WmScorePackageSubInfoExcelModel }> 结果
|
|
|
+ * @see WmPackageManager#exportPkgInfo(LocalDate, LocalDate) 参考代码(存在冗余待合并)
|
|
|
+ */
|
|
|
+ private List<WmTaskDetailExcelModel> getExportData(HnqzUser user, List<Integer> roles, LocalDate startDate, LocalDate endDate) {
|
|
|
+ WmPackageExportScope scope = scorePackageExportService.getWmPackageExportScope(user, roles, startDate, endDate);
|
|
|
+ Map<Integer, SysDept> service = scope.getService();
|
|
|
+ Map<String, WmDaDrugEntDrugtable> drugtableMap = scope.getDrugtableMap();
|
|
|
+ List<String> cPkgIds = scope.getCPkgIds();
|
|
|
+ List<WmScorePackage> childrenPkgs = scope.getChildrenPkgs();
|
|
|
+ Map<Integer, List<WmPackageTaskTypeQty>> pttMap = scope.getPttMap();
|
|
|
+
|
|
|
+ // 获取区域的上级包
|
|
|
+ List<String> parentIds = childrenPkgs.stream()
|
|
|
+ .map(WmScorePackage::getRelationScoreId)
|
|
|
+ .distinct()
|
|
|
+ .sorted()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ Map<String, WmScorePackage> parentPackageMap = scorePackageMapper
|
|
|
+ .selectList(
|
|
|
+ Wrappers.<WmScorePackage>lambdaQuery()
|
|
|
+ .eq(WmScorePackage::getEnableFlag, EnableEnum.ENABLE.val())
|
|
|
+ .in(WmScorePackage::getId, parentIds))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
|
|
|
+
|
|
|
+ // 获取全部的任务
|
|
|
+ List<WmTask> tasks = taskMapper.selectList(
|
|
|
+ Wrappers.<WmTask>lambdaQuery()
|
|
|
+ .in(WmTask::getScorePackageId, cPkgIds));
|
|
|
+
|
|
|
+ // 获取所有执行包领取记录
|
|
|
+ List<WmScorePackageStatus> scorePackageStatuses = scorePackageStatusMapper.selectList(
|
|
|
+ Wrappers.<WmScorePackageStatus>lambdaQuery()
|
|
|
+ .in(WmScorePackageStatus::getPackageId, cPkgIds)
|
|
|
+ .eq(WmScorePackageStatus::getStatus, PackageStatusEnum.APPROVED.val()));
|
|
|
+
|
|
|
+ Set<String> userIds = scorePackageStatuses.stream()
|
|
|
+ .map(WmScorePackageStatus::getUserId)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 获取所有任务的user
|
|
|
+ List<SysUser> users = userMapper.selectBatchIds(userIds);
|
|
|
+ Map<Integer, SysUser> userMap = users.stream()
|
|
|
+ .collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
|
|
|
+
|
|
|
+ // 转换为每个执行包对应的接包人信息
|
|
|
+ Map<String, SysUser> packageUserMap = scorePackageStatuses.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ WmScorePackageStatus::getPackageId,
|
|
|
+ ps -> userMap.get(Integer.parseInt(ps.getUserId())),
|
|
|
+ (u1, u2) -> u1));
|
|
|
+
|
|
|
+ // 根据包id分组
|
|
|
+ Map<String, List<WmTask>> pkg2TaskListMap = tasks.stream()
|
|
|
+ .collect(Collectors.groupingBy(WmTask::getScorePackageId));
|
|
|
+
|
|
|
+ return childrenPkgs.parallelStream()
|
|
|
+ .map(pkg -> buildTaskExcelModel(pkg, service, parentPackageMap, drugtableMap,
|
|
|
+ packageUserMap, pkg2TaskListMap))
|
|
|
+ .flatMap(Collection::stream)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建每个执行包下任务的Excel模型数据
|
|
|
+ */
|
|
|
+ private List<WmTaskDetailExcelModel> buildTaskExcelModel(
|
|
|
+ WmScorePackage pkg,
|
|
|
+ Map<Integer, SysDept> service,
|
|
|
+ Map<String, WmScorePackage> parentPackageMap,
|
|
|
+ Map<String, WmDaDrugEntDrugtable> drugtableMap,
|
|
|
+ Map<String, SysUser> packageUserMap,
|
|
|
+ Map<String, List<WmTask>> pkg2TaskListMap) {
|
|
|
+
|
|
|
+ List<WmTaskDetailExcelModel> models = new ArrayList<>();
|
|
|
+
|
|
|
+ List<WmTask> tasks = pkg2TaskListMap.get(pkg.getId());
|
|
|
+ for (int i = 0; i < tasks.size(); i++) {
|
|
|
+ WmTask task = tasks.get(i);
|
|
|
+
|
|
|
+ WmTaskDetailExcelModel model = new WmTaskDetailExcelModel();
|
|
|
+
|
|
|
+ // 市场服务供应商名称
|
|
|
+ SysDept s = service.get(Integer.parseInt(pkg.getDeptId()));
|
|
|
+ model.setServiceName(s != null ? s.getName() : "");
|
|
|
+
|
|
|
+ // 执行包
|
|
|
+ model.setPkgId(pkg.getId());
|
|
|
+ model.setPkgName(pkg.getScorePackageName());
|
|
|
+
|
|
|
+ // 父级包
|
|
|
+ WmScorePackage parentPackage = parentPackageMap.get(pkg.getRelationScoreId());
|
|
|
+ model.setParentPkgName(parentPackage != null ? parentPackage.getScorePackageName() : "");
|
|
|
+
|
|
|
+ // 执行包年度、季度
|
|
|
+ model.setYear(String.format("%d年", pkg.getCreateTime().getYear()));
|
|
|
+ model.setQuarter(quarterMap.get(pkg.getCreateTime().getMonthValue() / 3 + 1));
|
|
|
+
|
|
|
+ // 产品&生产企业
|
|
|
+ WmDaDrugEntDrugtable drugtable = drugtableMap.get(pkg.getDrugtable()[0]);
|
|
|
+ model.setDrugnameTy(drugtable == null ? "未分配产品" : drugtable.getDrugnameTy());
|
|
|
+ model.setDrugEntName(drugtable == null ? "未知" : drugtable.getDrugEntName());
|
|
|
+
|
|
|
+ SysUser taskUser = packageUserMap.get(pkg.getId());
|
|
|
+ // 接包人姓名
|
|
|
+ model.setTaskUserName(taskUser != null ? taskUser.getRealname() : "");
|
|
|
+ // 接包人电话
|
|
|
+ model.setTaskUserPhone(taskUser != null ? taskUser.getPhone() : "");
|
|
|
+
|
|
|
+ // 任务ID、任务类型
|
|
|
+ model.setTaskId(task.getId());
|
|
|
+ model.setTaskName(task.getTaskTypeName());
|
|
|
+ model.setTaskStatus(task.getTaskStatus());
|
|
|
+ model.setTaskCreateTime(DateUtil.formatLocalDateTime(task.getCreateTime()));
|
|
|
+ model.setRejectReason(task.getTaskStatusInfo());
|
|
|
+ models.add(model);
|
|
|
+ }
|
|
|
+
|
|
|
+ return models;
|
|
|
+ }
|
|
|
+}
|