最近要實作一個自動派單功能,就是將訂單平均分配給現有的員工(固定排序)
例如:[A,B,C,D]
如果A分配到訂單則將他放到末尾[B,C,D,A]
如果這時有新員工E加入則在保持當前排序的情況下插入最后[B,C,D,E,A]
order 表
id status staff_id
status 欄位 (1已派單 2完成訂單)
staff 表
id name is_del
當前SQL為:
SELECT
staff.id
FROM
`ims_carwash_staff` AS staff
LEFT JOIN `ims_carwash_order` AS `order`
ON staff.id = order.staff_id
AND order.order_status = 1
WHERE staff.is_del = 0
GROUP BY staff.id
ORDER BY COUNT(order.id) ASC ;
但是存在問題:如果A員工在B員工還未分配到訂單(status = 1)時完成了任務(status = 2)則訂單又會分配給A員工
uj5u.com熱心網友回復:
你的意思是不是沒有單的優先,然后如果有已經完成單的其次,再根據員工工號/姓名排?如果是這樣就在排序里處理:假設order_status為0無單,1有單,2完成,先查詢出已經完成的單數再排序(可以是全部,也可以是最近一段時間的)
select top 1 * from xxx
order by order_status, 完成單數, 員工工號或姓名
uj5u.com熱心網友回復:
你說的這種辦法我考慮過 但是如果A B C的完成訂單數已經到10單了 這時候新員工D來了 那么系統會先補齊D員工的10單
uj5u.com熱心網友回復:
首先是看大家有沒有單,然后才考慮歷史單,而且歷史單可以限定時段,比如1個月內的,根據周期來調整,新員工進來也可以考慮權重,加多一個引數進去就可以了
uj5u.com熱心網友回復:
你這實時的要求有些微妙,難道一分鐘前把一個任務分派給A后,一分鐘后把任務就分給E了?
SELECT *
FROM
(SELECT ID,1 AS SORT_ID
FROM STAFF A
WHERE NOT EXISTS (SELECT 1 FROM ORDER WHERE A.STAFF_ID=STAFF_ID AND STATUS=1)
AND IS_DEL=0
UNION ALL
SELECT ID,2 AS SORT_ID
FROM STAFF A
WHERE EXISTS (SELECT 1 FROM ORDER WHERE A.STAFF_ID=STAFF_ID AND STATUS=1)
AND IS_DEL=0) AS A
ORDER BY SORT_ID,ID
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/43039.html
標籤:疑難問題
