From d8ad5605a031477c252e029149a4735a1a20ffbd Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 11 七月 2025 20:46:27 +0800 Subject: [PATCH] 保洁巡检本周代码 --- ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java | 726 +++++++++++++++++++++++++++--------------------------- 1 files changed, 363 insertions(+), 363 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java index a7616b4..2b3f0cd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java @@ -1,363 +1,363 @@ -package com.ruoyi.web.controller.task; - - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.utils.CodeGenerateUtils; -import com.ruoyi.system.mapper.TCleanerMapper; -import com.ruoyi.system.model.*; -import com.ruoyi.system.service.*; -import javafx.concurrent.Task; -import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.formula.functions.T; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -/** - * @author xiaochen - * @date 2025/6/11 18:39 - */ -@Slf4j -@Component -public class TaskUtil { - - // 项目部权重标识 - private static final String PROJECT_DEPT_WEIGHT = ":PROJECT_DEPT_WEIGHT"; - // 保洁员权重标识 - private static final String CLEANER_WEIGHT = ":CLEANER_WEIGHT"; - // 重复点位标识 - private static final String REPEAT_LOCATION = ":REPEAT_LOCATION"; - - @Autowired - private RedisCache redisCache; - @Autowired - private TTemplateService templateService; - @Autowired - private TTemplateDetailService templateDetailService; - @Autowired - private TProjectDeptService projectDeptService; - @Autowired - private TCleanerService cleanerService; - @Autowired - private TLocationService locationService; - @Autowired - private TLocationTypeService locationTypeService; - @Autowired - private ISysUserService sysUserService; - @Autowired - private TTaskCleanService taskCleanService; - @Autowired - private TTemplateCountService templateCountService; - - - // 每一个小时执行一次 -// @Scheduled(cron = "0 0 0 * * ?") - @Scheduled(fixedRate = 1500000000) - public void dayOfCreateInspection() { - try { - - // 查询任务模板 - List<TTemplate> list = templateService.list(); - if (CollectionUtils.isEmpty(list)) { - return; - } - list.forEach(template -> { - // 创建任务 - createInspection(template); - }); - - // 查询前一天为执行的所有任务,改成已超时状态 - List<TTask> taskCleanList = taskCleanService.list(Wrappers.lambdaQuery(TTask.class) - .like(TTask::getImplementTime, LocalDate.now().minusDays(1)) - .eq(TTask::getStatus, 1)); - if (!CollectionUtils.isEmpty(taskCleanList)) { - taskCleanList.forEach(task -> { - task.setStatus(2); - }); - taskCleanService.updateBatchById(taskCleanList); - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void createInspection(TTemplate template) { - // 查询所有的模板详情 - List<TTemplateDetail> list = templateDetailService.list(Wrappers.lambdaQuery(TTemplateDetail.class) - .eq(TTemplateDetail::getTemplateId, template.getId())); - if (CollectionUtils.isEmpty(list)) { - return; - } - // 通过模板id查询员工巡检员 - List<SysUser> sysUsers = sysUserService.selectUserByTempLateId(template.getId()); - // 创建任务 - for (TTemplateDetail detail : list) { - // 计算周期 - int cycle = detail.getCycle(); - switch (detail.getCycleType()){ - case 2: - cycle = cycle * 7; - break; - case 3: - cycle = cycle * 30; - break; - case 4: - cycle = cycle * 90; - break; - case 5: - cycle = cycle * 365; - break; - } - - // 拿到保洁抽查次数 - int num1 = detail.getNum1(); - // 拿到项目部数 - int num2 = detail.getNum2(); - // 拿到每日重复点位 - int num3 = detail.getNum3(); - // 获取点位类型的占比 - String num4 = detail.getNum4(); - - // 未绑定员工 - if(CollectionUtils.isEmpty(sysUsers)){ - continue; - } - - int taskCount = 0; - for (SysUser sysUser : sysUsers) { - List<TProjectDept> projectDeptLists = new ArrayList<>(); - if(sysUser.getDeptType() == 1){ - TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId()); - if("0".equals(projectDept.getParentId())){ - projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) - .eq(TProjectDept::getParentId, projectDept.getId())); - }else { - projectDeptLists.add(projectDept); - } - }else { - projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) - .ne(TProjectDept::getParentId,0)); - } - List<String> proDeptIds = projectDeptLists.stream().map(TProjectDept::getId).collect(Collectors.toList()); - - // 获取项目部在该模板详情中的权重 - List<String> projectDeptIds = redisCache.getCacheList(detail.getId() + PROJECT_DEPT_WEIGHT); - // 获取项目部列表 - List<TProjectDept> projectDeptList; - if(CollectionUtils.isEmpty(projectDeptIds)){ - projectDeptList = projectDeptLists; - }else { - projectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) - .ne(TProjectDept::getParentId,0) - .in(TProjectDept::getId, proDeptIds) - .notIn(TProjectDept::getId, projectDeptIds)); - // 所过所有的项目部都被抽取了,则重新抽取,并且清空项目部权重 - if(CollectionUtils.isEmpty(projectDeptList)){ - projectDeptList = projectDeptLists; - redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); - } - } - // 如果可抽取的项目部数不足,先抽取余下项目部后,再清空权重,重新抽取 - List<TProjectDept> projectDepts = randomSelection(projectDeptList, num2); - if(projectDepts.size() < num2){ - List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); - List<TProjectDept> projectDeptList1 = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) - .notIn(TProjectDept::getId, proIds) - .ne(TProjectDept::getParentId,0)); - redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); - List<TProjectDept> projectDepts1 = randomSelection(projectDeptList1, num2 - projectDepts.size()); - List<String> proIds1 = projectDepts1.stream().map(TProjectDept::getId).collect(Collectors.toList()); - // 将已抽取的项目部id保存到redis中 - redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds1); - projectDepts.addAll(projectDepts1); - }else { - List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); - // 将已抽取的项目部id保存到redis中 - redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds); - } - List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); - - // 拿到抽取的项目部下的所有保洁员 -// List<TProjectDept> tProjectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) -// .in(TProjectDept::getId, proIds)); - // 获取片区id - List<String> areaIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); - if(CollectionUtils.isEmpty(areaIds)){ - return; - } - - // 计算每天需要抽取多少个保洁员 - long count = cleanerService.count(Wrappers.lambdaQuery(TCleaner.class) - .in(TCleaner::getProjectId, areaIds)); - int cleanerSums = num1 * Integer.parseInt(count + ""); - // 获取每天需要抽取的保洁员数,向上取整 - if (cleanerSums < cycle){ - cleanerSums = cycle; - } - int dayCleanerCount = cleanerSums / cycle; - - if((cycle == detail.getCurrentValue()) && cleanerSums % cycle != 0){ - dayCleanerCount++; - } - - // 获取保洁员权重 - List<String> cleanerIds = redisCache.getCacheList(detail.getId() + CLEANER_WEIGHT); - // 获取保洁员列表 - List<TCleaner> cleaners; - if(CollectionUtils.isEmpty(cleanerIds)){ - cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) - .in(TCleaner::getProjectId, areaIds)); - }else { - cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) - .in(TCleaner::getProjectId, areaIds) - .notIn(TCleaner::getId, cleanerIds)); - if(CollectionUtils.isEmpty(cleaners)){ - cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) - .in(TCleaner::getProjectId, areaIds)); - redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); - } - } - - // 抽取保洁员 - List<TCleaner> tCleaners = randomSelection(cleaners, dayCleanerCount); - if(CollectionUtils.isEmpty(tCleaners)){ - log.error("没有可抽取的保洁员,模板id为:{}",detail.getId()); - continue; - } - if(tCleaners.size() < dayCleanerCount){ - List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); - List<TCleaner> cleaners1 = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) - .in(TCleaner::getProjectId, areaIds) - .notIn(TCleaner::getId, cleanIds)); - redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); - List<TCleaner> tCleaners1 = randomSelection(cleaners1, dayCleanerCount - tCleaners.size()); - List<String> cleanIds1 = tCleaners1.stream().map(TCleaner::getId).collect(Collectors.toList()); - // 将已抽取的保洁员id保存到redis中 - cleanIds1.addAll(cleanIds); - redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds1); - tCleaners.addAll(tCleaners1); - }else { - List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); - redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds); - } - - // 通过保洁员id查询点位 - List<String> cleanersIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); - List<TLocation> locationList = locationService.list(Wrappers.lambdaQuery(TLocation.class) - .in(TLocation::getLocationCleaner, cleanersIds)); - // 查询点位类型 - JSONArray jsonArray = JSONObject.parseArray(num4); - List<TLocation> tLocationList = new ArrayList<>(); - for (Object o : jsonArray) { - JSONObject jsonObject = JSONObject.parseObject(o.toString()); - String id = jsonObject.getString("id"); - BigDecimal value = jsonObject.getBigDecimal("value"); - List<TLocation> locations = locationList.stream().filter(tLocation -> tLocation.getLocationType().equals(id)).collect(Collectors.toList()); - if(!CollectionUtils.isEmpty(locations)){ - BigDecimal bigDecimal = new BigDecimal(locations.size()).multiply(value.divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN)).setScale(0, BigDecimal.ROUND_UP); - int locationCount = bigDecimal.intValue(); - if(locationCount > 0){ - List<TLocation> tLocations = randomSelection(locations, locationCount); - tLocationList.addAll(tLocations); - } - } - } - tLocationList = tLocationList.stream().distinct().collect(Collectors.toList()); - // 抽取重复点位 - Integer currentValue = detail.getCurrentValue(); - if(currentValue != cycle){ - // 周期天数加一 - detail.setCurrentValue(currentValue + 1); - // 获取重复点位 - Set<TLocation> repeatLocation = redisCache.getCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION); - if(!CollectionUtils.isEmpty(repeatLocation)){ - List<TLocation> locations = randomSelection(new ArrayList<>(tLocationList), num3); - tLocationList.addAll(locations); - } - Set<TLocation> locationSet = new HashSet<>(tLocationList); - redisCache.setCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION, locationSet); - - }else { - // 设置当前周期为0 - detail.setCurrentValue(0); - // 将重复点位置空 - redisCache.deleteObject(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION); - // 将项目部权重置空 - redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); - // 将保洁员权重置空 - redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); - } - - // 创建任务 - List<TTask> tasks = new ArrayList<>(); - for (TLocation tLocation : tLocationList) { - TTask task = new TTask(); - // 获取保洁员 - tCleaners.stream().filter(tCleaner -> tCleaner.getId().equals(tLocation.getLocationCleaner())).findFirst().ifPresent(tCleaner -> { - task.setProjectId(tCleaner.getProjectId()); - task.setCleanerId(tCleaner.getId()); - }); - // 获取巡检员 - task.setPatrolInspector(sysUser.getUserId().toString()); - task.setPatrolInspectorDept(sysUser.getDeptId()); - task.setUserId(sysUser.getUserId()); - task.setStatus(1); - task.setLocationId(tLocation.getId()); - task.setImplementTime(LocalDateTime.now().plusDays(1)); - task.setTaskType(1); - task.setTemplateId(detail.getTemplateId()); - String nameAndCode = CodeGenerateUtils.generateVolumeSn(); - task.setTaskName(nameAndCode); - task.setTaskCode(nameAndCode); - tasks.add(task); - } - - // 添加应生成任务数量 - TTemplateCount templateCount = new TTemplateCount(); - templateCount.setTemplateId(detail.getTemplateId()); - templateCount.setTaskCount(tLocationList.size()* cycle); - templateCount.setUserId(sysUser.getUserId()); - templateCountService.save(templateCount); - - taskCleanService.saveBatch(tasks); - taskCount = taskCount + tasks.size(); - } - template.setTaskCount(taskCount); - templateService.updateById(template); - templateDetailService.updateById(detail); - } - } - - /** - * 从集合中随机抽取数量 - * @param list - * @param size - * @return - * @param <T> - */ - private static <T> List<T> randomSelection(List<T> list, int size) { - List<T> selected = new ArrayList<>(); - int length = list.size(); - for (int i = 0; i < size; i++) { - Collections.shuffle(list); - // 如果需求的大小超过了集合的长度,则只能取到集合的全部元素 - int subListSize = Math.min(size - selected.size(), length); - selected.addAll(list.subList(0, subListSize)); - } - return selected; - } - -} +//package com.ruoyi.web.controller.task; +// +// +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import com.baomidou.mybatisplus.core.toolkit.Wrappers; +//import com.ruoyi.common.core.domain.entity.SysUser; +//import com.ruoyi.common.core.redis.RedisCache; +//import com.ruoyi.common.utils.CodeGenerateUtils; +//import com.ruoyi.system.mapper.TCleanerMapper; +//import com.ruoyi.system.model.*; +//import com.ruoyi.system.service.*; +//import javafx.concurrent.Task; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.poi.ss.formula.functions.T; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Component; +//import org.springframework.util.CollectionUtils; +// +//import java.math.BigDecimal; +//import java.text.SimpleDateFormat; +//import java.time.LocalDate; +//import java.time.LocalDateTime; +//import java.util.*; +//import java.util.stream.Collectors; +// +///** +// * @author xiaochen +// * @date 2025/6/11 18:39 +// */ +//@Slf4j +//@Component +//public class TaskUtil { +// +// // 项目部权重标识 +// private static final String PROJECT_DEPT_WEIGHT = ":PROJECT_DEPT_WEIGHT"; +// // 保洁员权重标识 +// private static final String CLEANER_WEIGHT = ":CLEANER_WEIGHT"; +// // 重复点位标识 +// private static final String REPEAT_LOCATION = ":REPEAT_LOCATION"; +// +// @Autowired +// private RedisCache redisCache; +// @Autowired +// private TTemplateService templateService; +// @Autowired +// private TTemplateDetailService templateDetailService; +// @Autowired +// private TProjectDeptService projectDeptService; +// @Autowired +// private TCleanerService cleanerService; +// @Autowired +// private TLocationService locationService; +// @Autowired +// private TLocationTypeService locationTypeService; +// @Autowired +// private ISysUserService sysUserService; +// @Autowired +// private TTaskCleanService taskCleanService; +// @Autowired +// private TTemplateCountService templateCountService; +// +// +// // 每一个小时执行一次 +//// @Scheduled(cron = "0 0 0 * * ?") +//// @Scheduled(fixedRate = 1500000000) +// public void dayOfCreateInspection() { +// try { +// +// // 查询任务模板 +// List<TTemplate> list = templateService.list(); +// if (CollectionUtils.isEmpty(list)) { +// return; +// } +// list.forEach(template -> { +// // 创建任务 +// createInspection(template); +// }); +// +// // 查询前一天为执行的所有任务,改成已超时状态 +// List<TTask> taskCleanList = taskCleanService.list(Wrappers.lambdaQuery(TTask.class) +// .like(TTask::getImplementTime, LocalDate.now().minusDays(1)) +// .eq(TTask::getStatus, 1)); +// if (!CollectionUtils.isEmpty(taskCleanList)) { +// taskCleanList.forEach(task -> { +// task.setStatus(2); +// }); +// taskCleanService.updateBatchById(taskCleanList); +// } +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// public void createInspection(TTemplate template) { +// // 查询所有的模板详情 +// List<TTemplateDetail> list = templateDetailService.list(Wrappers.lambdaQuery(TTemplateDetail.class) +// .eq(TTemplateDetail::getTemplateId, template.getId())); +// if (CollectionUtils.isEmpty(list)) { +// return; +// } +// // 通过模板id查询员工巡检员 +// List<SysUser> sysUsers = sysUserService.selectUserByTempLateId(template.getId()); +// // 创建任务 +// for (TTemplateDetail detail : list) { +// // 计算周期 +// int cycle = detail.getCycle(); +// switch (detail.getCycleType()){ +// case 2: +// cycle = cycle * 7; +// break; +// case 3: +// cycle = cycle * 30; +// break; +// case 4: +// cycle = cycle * 90; +// break; +// case 5: +// cycle = cycle * 365; +// break; +// } +// +// // 拿到保洁抽查次数 +// int num1 = detail.getNum1(); +// // 拿到项目部数 +// int num2 = detail.getNum2(); +// // 拿到每日重复点位 +// int num3 = detail.getNum3(); +// // 获取点位类型的占比 +// String num4 = detail.getNum4(); +// +// // 未绑定员工 +// if(CollectionUtils.isEmpty(sysUsers)){ +// continue; +// } +// +// int taskCount = 0; +// for (SysUser sysUser : sysUsers) { +// List<TProjectDept> projectDeptLists = new ArrayList<>(); +// if(sysUser.getDeptType() == 1){ +// TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId()); +// if("0".equals(projectDept.getParentId())){ +// projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) +// .eq(TProjectDept::getParentId, projectDept.getId())); +// }else { +// projectDeptLists.add(projectDept); +// } +// }else { +// projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) +// .ne(TProjectDept::getParentId,0)); +// } +// List<String> proDeptIds = projectDeptLists.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// +// // 获取项目部在该模板详情中的权重 +// List<String> projectDeptIds = redisCache.getCacheList(detail.getId() + PROJECT_DEPT_WEIGHT); +// // 获取项目部列表 +// List<TProjectDept> projectDeptList; +// if(CollectionUtils.isEmpty(projectDeptIds)){ +// projectDeptList = projectDeptLists; +// }else { +// projectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) +// .ne(TProjectDept::getParentId,0) +// .in(TProjectDept::getId, proDeptIds) +// .notIn(TProjectDept::getId, projectDeptIds)); +// // 所过所有的项目部都被抽取了,则重新抽取,并且清空项目部权重 +// if(CollectionUtils.isEmpty(projectDeptList)){ +// projectDeptList = projectDeptLists; +// redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); +// } +// } +// // 如果可抽取的项目部数不足,先抽取余下项目部后,再清空权重,重新抽取 +// List<TProjectDept> projectDepts = randomSelection(projectDeptList, num2); +// if(projectDepts.size() < num2){ +// List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// List<TProjectDept> projectDeptList1 = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) +// .notIn(TProjectDept::getId, proIds) +// .ne(TProjectDept::getParentId,0)); +// redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); +// List<TProjectDept> projectDepts1 = randomSelection(projectDeptList1, num2 - projectDepts.size()); +// List<String> proIds1 = projectDepts1.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// // 将已抽取的项目部id保存到redis中 +// redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds1); +// projectDepts.addAll(projectDepts1); +// }else { +// List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// // 将已抽取的项目部id保存到redis中 +// redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds); +// } +// List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// +// // 拿到抽取的项目部下的所有保洁员 +//// List<TProjectDept> tProjectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class) +//// .in(TProjectDept::getId, proIds)); +// // 获取片区id +// List<String> areaIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList()); +// if(CollectionUtils.isEmpty(areaIds)){ +// return; +// } +// +// // 计算每天需要抽取多少个保洁员 +// long count = cleanerService.count(Wrappers.lambdaQuery(TCleaner.class) +// .in(TCleaner::getProjectId, areaIds)); +// int cleanerSums = num1 * Integer.parseInt(count + ""); +// // 获取每天需要抽取的保洁员数,向上取整 +// if (cleanerSums < cycle){ +// cleanerSums = cycle; +// } +// int dayCleanerCount = cleanerSums / cycle; +// +// if((cycle == detail.getCurrentValue()) && cleanerSums % cycle != 0){ +// dayCleanerCount++; +// } +// +// // 获取保洁员权重 +// List<String> cleanerIds = redisCache.getCacheList(detail.getId() + CLEANER_WEIGHT); +// // 获取保洁员列表 +// List<TCleaner> cleaners; +// if(CollectionUtils.isEmpty(cleanerIds)){ +// cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) +// .in(TCleaner::getProjectId, areaIds)); +// }else { +// cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) +// .in(TCleaner::getProjectId, areaIds) +// .notIn(TCleaner::getId, cleanerIds)); +// if(CollectionUtils.isEmpty(cleaners)){ +// cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) +// .in(TCleaner::getProjectId, areaIds)); +// redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); +// } +// } +// +// // 抽取保洁员 +// List<TCleaner> tCleaners = randomSelection(cleaners, dayCleanerCount); +// if(CollectionUtils.isEmpty(tCleaners)){ +// log.error("没有可抽取的保洁员,模板id为:{}",detail.getId()); +// continue; +// } +// if(tCleaners.size() < dayCleanerCount){ +// List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); +// List<TCleaner> cleaners1 = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class) +// .in(TCleaner::getProjectId, areaIds) +// .notIn(TCleaner::getId, cleanIds)); +// redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); +// List<TCleaner> tCleaners1 = randomSelection(cleaners1, dayCleanerCount - tCleaners.size()); +// List<String> cleanIds1 = tCleaners1.stream().map(TCleaner::getId).collect(Collectors.toList()); +// // 将已抽取的保洁员id保存到redis中 +// cleanIds1.addAll(cleanIds); +// redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds1); +// tCleaners.addAll(tCleaners1); +// }else { +// List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); +// redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds); +// } +// +// // 通过保洁员id查询点位 +// List<String> cleanersIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList()); +// List<TLocation> locationList = locationService.list(Wrappers.lambdaQuery(TLocation.class) +// .in(TLocation::getLocationCleaner, cleanersIds)); +// // 查询点位类型 +// JSONArray jsonArray = JSONObject.parseArray(num4); +// List<TLocation> tLocationList = new ArrayList<>(); +// for (Object o : jsonArray) { +// JSONObject jsonObject = JSONObject.parseObject(o.toString()); +// String id = jsonObject.getString("id"); +// BigDecimal value = jsonObject.getBigDecimal("value"); +// List<TLocation> locations = locationList.stream().filter(tLocation -> tLocation.getLocationType().equals(id)).collect(Collectors.toList()); +// if(!CollectionUtils.isEmpty(locations)){ +// BigDecimal bigDecimal = new BigDecimal(locations.size()).multiply(value.divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN)).setScale(0, BigDecimal.ROUND_UP); +// int locationCount = bigDecimal.intValue(); +// if(locationCount > 0){ +// List<TLocation> tLocations = randomSelection(locations, locationCount); +// tLocationList.addAll(tLocations); +// } +// } +// } +// tLocationList = tLocationList.stream().distinct().collect(Collectors.toList()); +// // 抽取重复点位 +// Integer currentValue = detail.getCurrentValue(); +// if(currentValue != cycle){ +// // 周期天数加一 +// detail.setCurrentValue(currentValue + 1); +// // 获取重复点位 +// Set<TLocation> repeatLocation = redisCache.getCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION); +// if(!CollectionUtils.isEmpty(repeatLocation)){ +// List<TLocation> locations = randomSelection(new ArrayList<>(tLocationList), num3); +// tLocationList.addAll(locations); +// } +// Set<TLocation> locationSet = new HashSet<>(tLocationList); +// redisCache.setCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION, locationSet); +// +// }else { +// // 设置当前周期为0 +// detail.setCurrentValue(0); +// // 将重复点位置空 +// redisCache.deleteObject(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION); +// // 将项目部权重置空 +// redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT); +// // 将保洁员权重置空 +// redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT); +// } +// +// // 创建任务 +// List<TTask> tasks = new ArrayList<>(); +// for (TLocation tLocation : tLocationList) { +// TTask task = new TTask(); +// // 获取保洁员 +// tCleaners.stream().filter(tCleaner -> tCleaner.getId().equals(tLocation.getLocationCleaner())).findFirst().ifPresent(tCleaner -> { +// task.setProjectId(tCleaner.getProjectId()); +// task.setCleanerId(tCleaner.getId()); +// }); +// // 获取巡检员 +// task.setPatrolInspector(sysUser.getUserId().toString()); +// task.setPatrolInspectorDept(sysUser.getDeptId()); +// task.setUserId(sysUser.getUserId()); +// task.setStatus(1); +// task.setLocationId(tLocation.getId()); +// task.setImplementTime(LocalDateTime.now().plusDays(1)); +// task.setTaskType(1); +// task.setTemplateId(detail.getTemplateId()); +// String nameAndCode = CodeGenerateUtils.generateVolumeSn(); +// task.setTaskName(nameAndCode); +// task.setTaskCode(nameAndCode); +// tasks.add(task); +// } +// +// // 添加应生成任务数量 +// TTemplateCount templateCount = new TTemplateCount(); +// templateCount.setTemplateId(detail.getTemplateId()); +// templateCount.setTaskCount(tLocationList.size()* cycle); +// templateCount.setUserId(sysUser.getUserId()); +// templateCountService.save(templateCount); +// +// taskCleanService.saveBatch(tasks); +// taskCount = taskCount + tasks.size(); +// } +// template.setTaskCount(taskCount); +// templateService.updateById(template); +// templateDetailService.updateById(detail); +// } +// } +// +// /** +// * 从集合中随机抽取数量 +// * @param list +// * @param size +// * @return +// * @param <T> +// */ +// private static <T> List<T> randomSelection(List<T> list, int size) { +// List<T> selected = new ArrayList<>(); +// int length = list.size(); +// for (int i = 0; i < size; i++) { +// Collections.shuffle(list); +// // 如果需求的大小超过了集合的长度,则只能取到集合的全部元素 +// int subListSize = Math.min(size - selected.size(), length); +// selected.addAll(list.subList(0, subListSize)); +// } +// return selected; +// } +// +//} -- Gitblit v1.7.1