任务分配问题排序和重排实现
生活随笔
收集整理的這篇文章主要介紹了
任务分配问题排序和重排实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一?需求
實現下面流程中的第1步和第2步
二?核心代碼實現
package com.baiyee.sdgt.obj.service.impl;import com.baiyee.sdgt.model.obj.*; import com.baiyee.sdgt.obj.mapper.TaskMapper; import com.baiyee.sdgt.obj.service.CompanyService; import com.baiyee.sdgt.obj.service.HospitalService; import com.baiyee.sdgt.obj.service.PharmacyService; import com.baiyee.sdgt.obj.service.TaskService; import com.baiyee.sdgt.vo.obj.TaskDistributionVo; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.ArrayList; import java.util.Collections; import java.util.List;/** * @className: TaskServiceImpl * @description: 任務實現類 * @date: 2021/10/4 * @author: cakin */ @Service public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {@Autowiredprivate HospitalService hospitalService;@Autowiredprivate CompanyService companyService;@Autowiredprivate PharmacyService pharmacyService;/*** @className: TaskService* @description: 任務分配* @date: 2021/10/17* @author: cakin*/@Overridepublic void distributeTask(TaskDistributionVo taskDistributionVo) {List<Task> taskList = new ArrayList<>();// 清空任務this.getBaseMapper().clearTask();// 初始化任務initTask(taskDistributionVo, taskList);this.saveBatch(taskList);// 按照省、市、區排序QueryWrapper<Task> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("PROVINCE", "CITY", "DISTRICT", "COUNT");List<Task> tasks = this.getBaseMapper().selectList(queryWrapper);List<Segment> segments = new ArrayList<>();// 初始化分段initSegment(tasks, segments);// 依據 maxCount 對 segments 降序Collections.sort(segments);List<Task> taskAfterSortList = new ArrayList<>();// 對 tasks 進行重排,重排結果保存到 taskAfterSortListreSortTask(tasks, segments, taskAfterSortList);// 重排后System.out.println("重排后:");for (Task task : taskAfterSortList) {System.out.println(task);}}/*** 功能描述:對 tasks 進行重排** @author cakin* @date 2021/10/18* @param tasks 待排序任務* @return segments 排序分段*/private void reSortTask(List<Task> tasks, List<Segment> segments, List<Task> taskAfterSortList) {for (Segment segment : segments) {int from = segment.getFrom();int end = segment.getEnd();for (int i = from; i <= end; i++){taskAfterSortList.add(tasks.get(i));}}}/*** 功能描述:初始化分段** @author cakin* @date 2021/10/18* @param tasks 待重排的任務* @param segments 排序分段*/private void initSegment(List<Task> tasks, List<Segment> segments) {for (int i = 0; i < tasks.size(); i++) {int headIndex = i;int tailIndex = i + 1;Task tasktHead = tasks.get(headIndex);if (tailIndex == tasks.size()) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(headIndex);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);break;}while (true) {Task taskTail;if (tailIndex != tasks.size()) {taskTail = tasks.get(tailIndex);if (!tasktHead.getDistrict().equals(taskTail.getDistrict())) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tailIndex - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tailIndex - 1;break;}} else {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tasks.size() - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tasks.size() - 1;break;}tailIndex++;}}}/*** 功能描述:初始化任務列表** @author 貝醫* @date 2021/10/18* @param taskDistributionVo 前端傳過來的任務* @param taskList 分解后的任務*/private void initTask(TaskDistributionVo taskDistributionVo, List<Task> taskList) {// 醫院拜訪次數int count1 = taskDistributionVo.getCount1();List<Hospital> hospitalList = hospitalService.list();// 平均每一個醫院拜訪次數int avgHospitalCount = count1 / hospitalList.size();int plusHospitalCount = count1 % hospitalList.size();for (Hospital hospital : hospitalList) {Task task = new Task();task.setName(hospital.getName());task.setProvince(hospital.getProvince());task.setCity(hospital.getCity());task.setDistrict(hospital.getDistrict());task.setType(1);if (plusHospitalCount > 0) {task.setCount(avgHospitalCount + 1);plusHospitalCount--;} else {task.setCount(avgHospitalCount);}taskList.add(task);}// 公司拜訪次數int count2 = taskDistributionVo.getCount2();List<Company> companyList = companyService.list();// 平均每一個公司拜訪次數int avgCompanyCount = count2 / companyList.size();int plusCompanyCount = count2 % companyList.size();for (Company company : companyList) {Task task = new Task();task.setName(company.getName());task.setProvince(company.getProvince());task.setCity(company.getCity());task.setDistrict(company.getDistrict());task.setType(2);if (plusCompanyCount > 0) {task.setCount(avgCompanyCount + 1);plusCompanyCount--;} else {task.setCount(avgCompanyCount);}taskList.add(task);}// 藥房拜訪次數int count3 = taskDistributionVo.getCount3();List<Pharmacy> pharmacyList = pharmacyService.list();// 平均每一個藥房拜訪次數int avgPharmacyCount = count3 / pharmacyList.size();int plusPharmacyCount = count3 % pharmacyList.size();for (Pharmacy pharmacy : pharmacyList) {Task task = new Task();task.setName(pharmacy.getName());task.setProvince(pharmacy.getProvince());task.setCity(pharmacy.getCity());task.setDistrict(pharmacy.getDistrict());task.setType(3);if (plusPharmacyCount > 0) {task.setCount(avgPharmacyCount + 1);plusPharmacyCount--;} else {task.setCount(avgPharmacyCount);}taskList.add(task);}} }三?測試
1?總體任務通過頁面設置
?2?細化排序后的結果(小組內按省、市、區、次數排序,大組按次數排序)
Task(name=公司4, province=北京, city=直轄市, district=西城區, type=2, count=10) Task(name=公司2, province=北京, city=直轄市, district=西城區, type=2, count=10) Task(name=公司5, province=北京, city=直轄市, district=西城區, type=2, count=10) Task(name=藥房1, province=北京, city=直轄市, district=西城區, type=3, count=8) Task(name=藥房5, province=北京, city=直轄市, district=西城區, type=3, count=8) Task(name=醫院1, province=北京, city=直轄市, district=西城區, type=1, count=5) Task(name=醫院3, province=北京, city=直轄市, district=西城區, type=1, count=5) Task(name=醫院16, province=北京, city=直轄市, district=西城區, type=1, count=5) Task(name=醫院12, province=北京, city=直轄市, district=西城區, type=1, count=5) Task(name=醫院6, province=北京, city=直轄市, district=西城區, type=1, count=5)Task(name=公司1, province=北京, city=直轄市, district=東城區, type=2, count=10) Task(name=公司3, province=北京, city=直轄市, district=東城區, type=2, count=10) Task(name=藥房2, province=北京, city=直轄市, district=東城區, type=3, count=8) Task(name=藥房3, province=北京, city=直轄市, district=東城區, type=3, count=8) Task(name=醫院2, province=北京, city=直轄市, district=東城區, type=1, count=5) Task(name=醫院4, province=北京, city=直轄市, district=東城區, type=1, count=5) Task(name=醫院17, province=北京, city=直轄市, district=東城區, type=1, count=4) Task(name=醫院15, province=北京, city=直轄市, district=東城區, type=1, count=4)Task(name=藥房4, province=北京, city=直轄市, district=北城區, type=3, count=8) Task(name=醫院7, province=北京, city=直轄市, district=北城區, type=1, count=5) Task(name=醫院17, province=北京, city=直轄市, district=北城區, type=1, count=4) Task(name=醫院8, province=北京, city=直轄市, district=北城區, type=1, count=4)Task(name=醫院11, province=北京, city=直轄市, district=南城區, type=1, count=4)總結
以上是生活随笔為你收集整理的任务分配问题排序和重排实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件学报--一个很好的论文参考网站
- 下一篇: 介绍一款CD4066四双向模拟开关的测试