指令派发算法
This commit is contained in:
parent
8575b943f2
commit
78fd641f74
|
|
@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.nu.modules.directive.order.entity.Orders;
|
import com.nu.modules.directive.order.entity.Orders;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -14,7 +15,7 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public interface OrdersMapper extends BaseMapper<Orders> {
|
public interface OrdersMapper extends BaseMapper<Orders> {
|
||||||
List<Orders> queryDataPoolList(Orders orders);
|
List<Orders> queryDataPoolList(Orders orders);
|
||||||
List<Orders> getEmpPermissionAndOnline(@Param("directiveIds") String directiveIds,@Param("employeeIds") String employeeIds);
|
List<Orders> getEmpPermissionAndOnline(@Param("directiveIds") String directiveIds,@Param("employeeIds") String employeeIds,@Param("startTime") Date startTime);
|
||||||
Orders getEmpOrderly(@Param("customerId") String customerId);
|
Orders getEmpOrderly(@Param("customerId") String customerId);
|
||||||
List<Orders> getPermissionEmps(@Param("directiveIds") String directiveIds);
|
List<Orders> getPermissionEmps(@Param("directiveIds") String directiveIds);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,34 +4,37 @@
|
||||||
|
|
||||||
<select id="queryDataPoolList" resultType="com.nu.modules.directive.order.entity.Orders">
|
<select id="queryDataPoolList" resultType="com.nu.modules.directive.order.entity.Orders">
|
||||||
select
|
select
|
||||||
id as poolId,
|
a.id as poolId,
|
||||||
biz_id as bizId,
|
a.biz_id as bizId,
|
||||||
nu_id as nuId,
|
a.nu_id as nuId,
|
||||||
nu_name as nuName,
|
a.nu_name as nuName,
|
||||||
customer_id as customerId,
|
a.customer_id as customerId,
|
||||||
customer_name as customerName,
|
a.customer_name as customerName,
|
||||||
directive_id as directiveId,
|
a.directive_id as directiveId,
|
||||||
directive_name as directiveName,
|
a.directive_name as directiveName,
|
||||||
cycle_type_id as cycleTypeId,
|
a.cycle_type_id as cycleTypeId,
|
||||||
cycle_type as cycleType,
|
a.cycle_type as cycleType,
|
||||||
cycle_value as cycleValue,
|
a.cycle_value as cycleValue,
|
||||||
preview_file as previewFile,
|
a.preview_file as previewFile,
|
||||||
net_preview_file as netPeviewFile,
|
a.net_preview_file as netPeviewFile,
|
||||||
preview_file_small as previewFileSmall,
|
a.preview_file_small as previewFileSmall,
|
||||||
net_preview_file_small as netPreviewFileSmall,
|
a.net_preview_file_small as netPreviewFileSmall,
|
||||||
mp3_file as mp3File,
|
a.mp3_file as mp3File,
|
||||||
net_mp3_file as netMp3File,
|
a.net_mp3_file as netMp3File,
|
||||||
mp4_file as mp4File,
|
a.mp4_file as mp4File,
|
||||||
net_mp4_file as netMp4File,
|
a.net_mp4_file as netMp4File,
|
||||||
service_duration as serviceDuration,
|
a.service_duration as serviceDuration,
|
||||||
service_content as serviceContent,
|
a.service_content as serviceContent,
|
||||||
package_id as packageId,
|
a.package_id as packageId,
|
||||||
package_name as packageName,
|
a.package_name as packageName,
|
||||||
iz_package as izPackage,
|
a.iz_package as izPackage,
|
||||||
start_time as startTime,
|
a.start_time as startTime,
|
||||||
end_time as endTime
|
a.end_time as endTime,
|
||||||
from nu_biz_nu_directive_data_pool
|
(case when b.orderly is null then 2 else 1 end) as orderEmp
|
||||||
where iz_orders = 'N'
|
from nu_biz_nu_directive_data_pool a
|
||||||
|
left join nu_biz_elder_info b on a.customer_id = b.id
|
||||||
|
where a.iz_orders = 'N'
|
||||||
|
order by a.start_time,orderEmp,a.nu_id
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getEmpPermissionAndOnline" resultType="com.nu.modules.directive.order.entity.Orders">
|
<select id="getEmpPermissionAndOnline" resultType="com.nu.modules.directive.order.entity.Orders">
|
||||||
|
|
@ -50,7 +53,7 @@
|
||||||
from nu_biz_employees_info a
|
from nu_biz_employees_info a
|
||||||
inner join nu_biz_employees_servcie_tags b on a.id = b.employees_id
|
inner join nu_biz_employees_servcie_tags b on a.id = b.employees_id
|
||||||
inner join nu_service_tag c on c.id = b.tags_id
|
inner join nu_service_tag c on c.id = b.tags_id
|
||||||
inner join nu_servtag_directive d on d.tags_id = c.id
|
inner join nu_servtag_directive d on d.tag_id = c.id
|
||||||
left join (
|
left join (
|
||||||
select employee_id,count(*) as orderNum,
|
select employee_id,count(*) as orderNum,
|
||||||
sum(service_duration) as totalDuration,
|
sum(service_duration) as totalDuration,
|
||||||
|
|
@ -58,14 +61,15 @@
|
||||||
max(start_time) as maxTime,
|
max(start_time) as maxTime,
|
||||||
sum(case when iz_finish='N' then 1 else 0 end) as ownCn
|
sum(case when iz_finish='N' then 1 else 0 end) as ownCn
|
||||||
from nu_biz_nu_directive_order_sub
|
from nu_biz_nu_directive_order_sub
|
||||||
where begin_time >=DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
|
where start_time >=DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
|
||||||
and end_time <=DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')
|
and start_time <=DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')
|
||||||
group by employee_id
|
group by employee_id
|
||||||
) e on a.id = e.employee_id
|
) e on a.id = e.employee_id
|
||||||
left join (
|
left join (
|
||||||
select employee_id,count(*) as orderNum
|
select employee_id,sum(case when iz_finish='N' then 1 else 0 end) as orderNum
|
||||||
from nu_biz_nu_directive_order_sub
|
from nu_biz_nu_directive_order_sub
|
||||||
where start_time = #{startTime}
|
where start_time = #{startTime}
|
||||||
|
or (start_time < #{startTime} and end_time > #{startTime})
|
||||||
group by employee_id
|
group by employee_id
|
||||||
) f on a.id = f.employee_id
|
) f on a.id = f.employee_id
|
||||||
where a.del_flag = '0'
|
where a.del_flag = '0'
|
||||||
|
|
@ -75,13 +79,15 @@
|
||||||
and c.iz_enabled = 'Y'
|
and c.iz_enabled = 'Y'
|
||||||
<if test="directiveIds != null and directiveIds != ''">
|
<if test="directiveIds != null and directiveIds != ''">
|
||||||
AND d.directive_id in
|
AND d.directive_id in
|
||||||
<foreach collection="directiveIds" item="directiveId" open="(" separator="," close=")">
|
<foreach item="directiveId" index="index" collection="directiveIds.split(',')"
|
||||||
|
open="(" separator="," close=")">
|
||||||
#{directiveId}
|
#{directiveId}
|
||||||
</foreach>
|
</foreach>
|
||||||
</if>
|
</if>
|
||||||
<if test="employeeIds != null and employeeIds != ''">
|
<if test="employeeIds != null and employeeIds != ''">
|
||||||
AND a.id in
|
AND a.id in
|
||||||
<foreach collection="employeeIds" item="employeeId" open="(" separator="," close=")">
|
<foreach item="employeeId" index="index" collection="employeeIds.split(',')"
|
||||||
|
open="(" separator="," close=")">
|
||||||
#{employeeId}
|
#{employeeId}
|
||||||
</foreach>
|
</foreach>
|
||||||
</if>
|
</if>
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,8 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -34,24 +32,28 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
* @param directiveId
|
* @param directiveId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private List<Orders> getEmpPermissionAndOnline(String directiveId,String employeeIds){
|
private List<Orders> getEmpPermissionAndOnline(String directiveId, String employeeIds, Date startTime){
|
||||||
return baseMapper.getEmpPermissionAndOnline(directiveId,employeeIds);
|
return baseMapper.getEmpPermissionAndOnline(directiveId,employeeIds,startTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取次长者指定所有护理员
|
* 获取长者指定所有护理员
|
||||||
* @param customerId
|
* @param customerId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Map<String,String> getEmpOrderly(String customerId){
|
private Map<String,String> getEmpOrderly(String customerId){
|
||||||
Map<String, String> map = null;
|
Map<String, String> map = null;
|
||||||
Orders orders = baseMapper.getEmpOrderly(customerId);
|
Orders orders = baseMapper.getEmpOrderly(customerId);
|
||||||
String empIds = orders.getEmployeeIds();
|
if(orders!=null){
|
||||||
String[] pairs = empIds.split(",");
|
String empIds = orders.getEmployeeIds();
|
||||||
if(pairs.length>0){
|
if(empIds!=null&&!empIds.equals("")){
|
||||||
map = new HashMap<>();
|
String[] pairs = empIds.split(",");
|
||||||
for (String pair : pairs) {
|
if(pairs.length>0){
|
||||||
map.put(pair, pair);
|
map = new HashMap<>();
|
||||||
|
for (String pair : pairs) {
|
||||||
|
map.put(pair, pair);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
|
|
@ -76,11 +78,12 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
* @param orders
|
* @param orders
|
||||||
*/
|
*/
|
||||||
private void generateOrdersSub(Orders orders){
|
private void generateOrdersSub(Orders orders){
|
||||||
|
System.out.println("护理单元:"+orders.getNuId()+",服务时间"+orders.getStartTime());
|
||||||
List<OrdersSub> ordersSubList = ordersSubService.queryDataPoolSubList(orders);
|
List<OrdersSub> ordersSubList = ordersSubService.queryDataPoolSubList(orders);
|
||||||
if(orders.getIzPackage().equals("N")){
|
if(orders.getIzPackage().equals("N")){
|
||||||
OrdersSub ordersSub = ordersSubList.get(0);
|
OrdersSub ordersSub = ordersSubList.get(0);
|
||||||
//获取满足条件的员工
|
//获取满足条件的员工
|
||||||
Orders employee = employeeScreening(ordersSub.getDirectiveId(),orders.getCustomerId(),null);
|
Orders employee = employeeScreening(ordersSub.getDirectiveId(),orders.getCustomerId(),null,orders.getStartTime());
|
||||||
if(employee!=null){
|
if(employee!=null){
|
||||||
orders.setEmployeeId(employee.getEmployeeId());
|
orders.setEmployeeId(employee.getEmployeeId());
|
||||||
orders.setEmployeeName(employee.getEmployeeName());
|
orders.setEmployeeName(employee.getEmployeeName());
|
||||||
|
|
@ -94,13 +97,17 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
ordersSub.setIzStart("N");
|
ordersSub.setIzStart("N");
|
||||||
ordersSub.setIzFinish("N");
|
ordersSub.setIzFinish("N");
|
||||||
ordersSubService.save(ordersSub);//生成工单子表
|
ordersSubService.save(ordersSub);//生成工单子表
|
||||||
|
System.out.println("护理单元:"+orders.getNuId()+",服务时间:"+orders.getStartTime()+",服务员工:"+employee.getEmployeeName()+",获得积分:"+employee.getLevel());
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("");
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
String directiveIds = ordersSubList.stream().map(OrdersSub::getDirectiveId).collect(Collectors.joining(","));
|
String directiveIds = ordersSubList.stream().map(OrdersSub::getDirectiveId).collect(Collectors.joining(","));
|
||||||
List<Orders> emps = baseMapper.getPermissionEmps(directiveIds);//获取服务标签中的员工和数量
|
List<Orders> emps = baseMapper.getPermissionEmps(directiveIds);//获取服务标签中的员工和数量
|
||||||
emps.removeIf(data -> data.getOwnCn() < ordersSubList.size());//删除没有权限的数据
|
emps.removeIf(data -> data.getOwnCn() < ordersSubList.size());//删除没有权限的数据
|
||||||
String employeeIds = emps.stream().map(Orders::getEmployeeId).collect(Collectors.joining(","));
|
String employeeIds = emps.stream().map(Orders::getEmployeeId).collect(Collectors.joining(","));
|
||||||
Orders employee = employeeScreening(directiveIds,orders.getCustomerId(),employeeIds);
|
Orders employee = employeeScreening(directiveIds,orders.getCustomerId(),employeeIds,orders.getStartTime());
|
||||||
if(employee!=null){
|
if(employee!=null){
|
||||||
orders.setEmployeeId(employee.getEmployeeId());
|
orders.setEmployeeId(employee.getEmployeeId());
|
||||||
orders.setEmployeeName(employee.getEmployeeName());
|
orders.setEmployeeName(employee.getEmployeeName());
|
||||||
|
|
@ -117,6 +124,11 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
ordersSub.setIzFinish("N");
|
ordersSub.setIzFinish("N");
|
||||||
ordersSubService.save(ordersSub);//生成工单子表
|
ordersSubService.save(ordersSub);//生成工单子表
|
||||||
}
|
}
|
||||||
|
|
||||||
|
System.out.println("护理单元:"+orders.getNuId()+",服务时间:"+orders.getStartTime()+",服务员工:"+employee.getEmployeeName()+",获得积分:"+employee.getLevel());
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -126,38 +138,61 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
* 获取满足条件的员工
|
* 获取满足条件的员工
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Orders employeeScreening(String directiveIds,String customerId,String employeeIds){
|
private Orders employeeScreening(String directiveIds,String customerId,String employeeIds,Date startTime){
|
||||||
List<Orders> empList = getEmpPermissionAndOnline(directiveIds,employeeIds);
|
|
||||||
|
List<Orders> empList = getEmpPermissionAndOnline(directiveIds,employeeIds,startTime);
|
||||||
Map<String,String> orderlyMap = getEmpOrderly(customerId);
|
Map<String,String> orderlyMap = getEmpOrderly(customerId);
|
||||||
if(empList.size()>0){
|
if(empList.size()>0){
|
||||||
for(int i=0;i<empList.size();i++){
|
for(int i=0;i<empList.size();i++){
|
||||||
Orders emp = empList.get(i);
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工信息:"+emp.getEmployeeName()+","+emp.getOrderCap()+","+emp.getOrderNum()+","+emp.getTotalDuration()+","+emp.getTotalComPrice()+","+emp.getMaxTime()+","+emp.getOwnCn()+","+emp.getIzFree());
|
||||||
String employeeId = emp.getEmployeeId();
|
String employeeId = emp.getEmployeeId();
|
||||||
if(emp.getIzFree().equals(1)){
|
if(emp.getIzFree().equals(1)){
|
||||||
Integer empLevel = emp.getLevel();
|
Integer empLevel = emp.getLevel();
|
||||||
empLevel = empLevel + 3; //提高3等级
|
empLevel = empLevel + empList.size()*5; //提高5N等级
|
||||||
emp.setLevel(empLevel);
|
emp.setLevel(empLevel);
|
||||||
}
|
}
|
||||||
|
System.out.println("员工获取空闲积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
if(orderlyMap!=null){
|
if(orderlyMap!=null){
|
||||||
String orderlyId = orderlyMap.get(employeeId);
|
String orderlyId = orderlyMap.get(employeeId);
|
||||||
if(orderlyId!=null&&!orderlyId.equals("")){
|
if(orderlyId!=null&&!orderlyId.equals("")){
|
||||||
Integer empLevel = emp.getLevel();
|
Integer empLevel = emp.getLevel();
|
||||||
empLevel = empLevel + 2; //提高2等级
|
empLevel = empLevel + empList.size()*3; //提高4N等级
|
||||||
emp.setLevel(empLevel);
|
emp.setLevel(empLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
System.out.println("员工获取指定护理积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
}
|
}
|
||||||
|
|
||||||
//通过工单次数排序数据来设置优先级
|
//通过工单次数排序数据来设置优先级
|
||||||
sortByNumAndSetLevel(empList);
|
sortByNumAndSetLevel(empList);
|
||||||
|
for(int i=0;i<empList.size();i++){
|
||||||
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工获取工单数积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
|
}
|
||||||
//通过总收益排序数据来设置优先级
|
//通过总收益排序数据来设置优先级
|
||||||
sortByPriceAndSetLevel(empList);
|
sortByPriceAndSetLevel(empList);
|
||||||
|
for(int i=0;i<empList.size();i++){
|
||||||
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工获取工单收益积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
|
}
|
||||||
//通过服务时长排序数据来设置优先级
|
//通过服务时长排序数据来设置优先级
|
||||||
sortByDurationAndSetLevel(empList);
|
sortByDurationAndSetLevel(empList);
|
||||||
|
for(int i=0;i<empList.size();i++){
|
||||||
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工获取服务时长积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
|
}
|
||||||
//通过最后一次接收派单时间排序数据来设置优先级
|
//通过最后一次接收派单时间排序数据来设置优先级
|
||||||
sortByMaxTimeAndSetLevel(empList);
|
sortByMaxTimeAndSetLevel(empList);
|
||||||
|
for(int i=0;i<empList.size();i++){
|
||||||
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工获取派单时间积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
|
}
|
||||||
//按优先级排序数据
|
//按优先级排序数据
|
||||||
sortByLevel(empList);
|
sortByLevel(empList);
|
||||||
|
for(int i=0;i<empList.size();i++){
|
||||||
|
Orders emp = empList.get(i);
|
||||||
|
System.out.println("员工获取总积分信息:"+emp.getEmployeeId()+"-"+emp.getEmployeeName()+"["+emp.getLevel()+"]");
|
||||||
|
}
|
||||||
//获取员工信息
|
//获取员工信息
|
||||||
return empList.get(0);
|
return empList.get(0);
|
||||||
}
|
}
|
||||||
|
|
@ -235,9 +270,12 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
* @param empList
|
* @param empList
|
||||||
*/
|
*/
|
||||||
public void sortByMaxTimeAndSetLevel(List<Orders> empList) {
|
public void sortByMaxTimeAndSetLevel(List<Orders> empList) {
|
||||||
// 根据totalDuration倒序排序,并为level顺序赋值
|
// 根据maxTime倒序排序,并为level顺序赋值
|
||||||
List<Orders> sortedEmployees = empList.stream()
|
List<Orders> sortedEmployees = empList.stream()
|
||||||
.sorted(Comparator.comparing(Orders::getMaxTime).reversed())
|
.sorted(Comparator.comparing(
|
||||||
|
Orders::getMaxTime,
|
||||||
|
Comparator.nullsLast(Comparator.reverseOrder())
|
||||||
|
))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
// 为level字段顺序赋值1,2,3...
|
// 为level字段顺序赋值1,2,3...
|
||||||
|
|
@ -258,9 +296,9 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||||
*/
|
*/
|
||||||
public void sortByLevel(List<Orders> empList) {
|
public void sortByLevel(List<Orders> empList) {
|
||||||
for (int i = 0; i < empList.size(); i++) {
|
for (int i = 0; i < empList.size(); i++) {
|
||||||
//工单超出接单上限,将4级
|
//工单超出接单上限,降4N级
|
||||||
if(empList.get(i).getOrderNum()>=empList.get(i).getOrderCap()){
|
if(empList.get(i).getOwnCn()>=empList.get(i).getOrderCap()){
|
||||||
Integer levle = empList.get(i).getLevel()-4;
|
Integer levle = empList.get(i).getLevel()-empList.size()*4;
|
||||||
empList.get(i).setLevel(levle);
|
empList.get(i).setLevel(levle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue