指令派发算法

This commit is contained in:
曹磊 2025-11-26 16:11:43 +08:00
parent 8575b943f2
commit 78fd641f74
3 changed files with 105 additions and 60 deletions

View File

@ -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);
}

View File

@ -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 &lt;=DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')
where start_time >=DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
and start_time &lt;=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 &lt; #{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>

View File

@ -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);
}
}