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