一 前端
1 路由
{
path: '/task',
component: Layout,
redirect: '/task/distribute',
name: '任务管理',
alwaysShow: true,
meta: { title: '任务管理', icon: 'example' },
children: [
{
path: 'distribute',
name: '任务管理',
component: () => import('@/views/task/distribute'),
meta: { title: '任务分配', icon: 'table' }
}
]
},
2 页面
<template>
<div class="app-container">
<el-form label-width="120px">
<el-form-item label="医院次数">
<el-input v-model="taskDistributionVo.count1" />
</el-form-item>
<el-form-item label="公司次数">
<el-input v-model="taskDistributionVo.count2" />
</el-form-item>
<el-form-item label="药房次数">
<el-input v-model="taskDistributionVo.count3" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="taskDistribution">任务分配</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
// 引入接口定义的 js 文件
import taskDistribution from "@/api/taskDistribution";
export default {
data() {
return {
taskDistributionVo: {}
};
},
methods: {
// 添加
taskDistribution() {
taskDistribution
.taskDistribution(this.taskDistributionVo)
.then(response => {
// 提示
this.$message({
type: "success",
message: "任务分配成功!"
});
this.taskDistributionVo = {};
});
}
}
};
</script>
3 api
import request from '@/utils/request'
export default {
// 任务分配
taskDistribution(taskDistributionVo) {
return request({
url: `/admin/task/distributeTask`,
method: 'post',
data: taskDistributionVo
})
},
}
二 后端
1 前端传过来的数据
/**
* @className: TaskDistributionVo
* @description: 任务分配请求
* @date: 2021/10/17
* @author: cakin
*/
@Data
public class TaskDistributionVo {
@ApiModelProperty(value = "医院拜访次数")
private int count1;
@ApiModelProperty(value = "商业拜访次数")
private int count2;
@ApiModelProperty(value = "药房拜访次数")
private int count3;
}
2 实体类
/**
* @className: 任务
* @description: 任务实体
* @date: 2021/10/4
* @author: cakin
*/
@Data
@ApiModel(description = "Task")
public class Task extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "名称")
@TableField("NAME")
private String name;
@ApiModelProperty(value = "所在省")
@TableField("PROVINCE")
private String province;
@ApiModelProperty(value = "所在市")
@TableField("CITY")
private String city;
@ApiModelProperty(value = "所在区")
@TableField("DISTRICT")
private String district;
@ApiModelProperty(value = "业务类别")
@TableField("TYPE")
private Integer type;
@ApiModelProperty(value = "拜访次数")
@TableField("COUNT")
private Integer count;
}
3 控制器
@Api(tags = "任务管理")
@RestController
@RequestMapping("/admin/task")
@CrossOrigin
public class TaskController {
// 注入service
@Autowired
private TaskService taskService;
// 1 分配任务
@PostMapping("distributeTask")
public Result distributeTask(@RequestBody TaskDistributionVo taskDistributionVo) {
taskService.distributeTask(taskDistributionVo);
return Result.ok();
}
}
4 服务接口
/**
* @className: TaskService
* @description: 任务接口
* @date: 2021/10/4
* @author: cakin
*/
public interface TaskService extends IService<Task> {
/**
* @className: TaskService
* @description: 任务分配
* @date: 2021/10/17
* @author: cakin
*/
void distributeTask(TaskDistributionVo taskDistributionVo);
}
5 服务实现
/**
* @className: TaskServiceImpl
* @description: 任务实现类
* @date: 2021/10/4
* @author: cakin
*/
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
@Autowired
private HospitalService hospitalService;
@Autowired
private CompanyService companyService;
@Autowired
private PharmacyService pharmacyService;
/**
* @className: TaskService
* @description: 任务分配
* @date: 2021/10/17
* @author: cakin
*/
@Override
public void distributeTask(TaskDistributionVo taskDistributionVo) {
List<Task> taskList = new ArrayList<>();
// 清空任务
this.getBaseMapper().clearTask();
// 初始化任务
initTask(taskDistributionVo, taskList);
this.saveBatch(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);
}
}
}
6 数据访问层
/**
* @className: TaskMapper
* @description: 任务数据访问
* @date: 2021/10/4
* @author: cakin
*/
public interface TaskMapper extends BaseMapper<Task> {
// 清空指定表
@Update("truncate table task")
void clearTask();
}
三 测试
1 页面输入
2 数据库输出
mysql> select sum(count) from task;
+------------+
| sum(count) |
+------------+
| 160 |
+------------+
1 row in set (0.00 sec)
mysql> select * from task;
+----------------------------------+--------+----------+--------+----------+------+-------+---------------------+---------------------+------------+
| ID | NAME | PROVINCE | CITY | DISTRICT | TYPE | COUNT | CREATE_TIME | UPDATE_TIME | IS_DELETED |
+----------------------------------+--------+----------+--------+----------+------+-------+---------------------+---------------------+------------+
| 04525d4f5f74d6d7c0ab0315042aa6ef | 医院16 | 北京 | 直辖市 | 西城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 19373c04d96aaf207774d00fdfd95573 | 药房2 | 北京 | 直辖市 | 东城区 | 3 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 19c23a4003c84597adbffe64802e2bb3 | 药房1 | 北京 | 直辖市 | 西城区 | 3 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 1c0d0de4045eeedf3143262748239036 | 医院15 | 北京 | 直辖市 | 东城区 | 1 | 4 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 1d6546940eee8a6fa4f84c2fdee3517f | 医院12 | 北京 | 直辖市 | 西城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 1f22a2ab6f83772ec3bb5b0b4fbc61ba | 医院8 | 北京 | 直辖市 | 北城区 | 1 | 4 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 1fe9eaadaf455709aedd8832ce2c1c5e | 公司4 | 北京 | 直辖市 | 西城区 | 2 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 2f8f1eba28367892c14cdccf886f9645 | 医院1 | 北京 | 直辖市 | 西城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 2fb8356220288f5df939e456548dbbbf | 医院4 | 北京 | 直辖市 | 东城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 38a457258b5e7d39dddc3aeaa7a2db7e | 医院11 | 北京 | 直辖市 | 南城区 | 1 | 4 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 4915557b155d1b30aaa3764e7f539680 | 医院17 | 北京 | 直辖市 | 北城区 | 1 | 4 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 4f490c58fb2783f6f36c0ea7b30f8768 | 药房4 | 北京 | 直辖市 | 北城区 | 3 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 770b60d3bd75cdcc5769f0981ecc3377 | 医院17 | 北京 | 直辖市 | 东城区 | 1 | 4 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 86f8fd5d2e48ab3a0cded2d8203601b0 | 公司2 | 北京 | 直辖市 | 西城区 | 2 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| 9f6dc674e16d349b768ed9c6a976246c | 公司5 | 北京 | 直辖市 | 西城区 | 2 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| a328f2da0c68c4684fdf33648c0d235c | 公司3 | 北京 | 直辖市 | 东城区 | 2 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| a497a8b7ea11e55fbc0d4c47d04368b8 | 医院2 | 北京 | 直辖市 | 东城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| affc94aeed60c7c54e177c4900694a28 | 医院7 | 北京 | 直辖市 | 北城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| c4e09567843f5a211ba0163414435c8b | 药房3 | 北京 | 直辖市 | 东城区 | 3 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| d200d06bb369fc054f888a81cd38453a | 医院3 | 北京 | 直辖市 | 西城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| d79729ae067f9ad94f525727d38815e7 | 医院6 | 北京 | 直辖市 | 西城区 | 1 | 5 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| dc35fa89b9d201525febf12b85e6f208 | 药房5 | 北京 | 直辖市 | 西城区 | 3 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
| ef5e61b9c49436fde342dece7e327d9c | 公司1 | 北京 | 直辖市 | 东城区 | 2 | 10 | 2021-10-17 11:31:28 | 2021-10-17 11:31:28 | 0 |
+----------------------------------+--------+----------+--------+----------+------+-------+---------------------+---------------------+------------+
23 rows in set (0.00 sec)