呼叫中心工單系統

呼叫中心工單系統Ticket system又稱爲工單管理系統(還能夠稱爲問題工單系統,事務工單系統,事務追蹤系統issue tracking system,支持工單系統support ticket system)),它是一種網絡軟件系統,根據不一樣組織,部門和外部客戶的需求,來由針對的管理,維護和追蹤一系列的問題和請求。一個完善功能的工單系統 又能夠稱爲幫助臺系統。
網訊兆通呼叫中心工單系統通常被普遍用於客戶幫助支持服務,客戶售後服務,企業IT支持服務,呼叫中心等,用來建立,掛 起,解決用戶,客戶,合做夥伴或企業內部職員提交的事務請求。規範化,統一化和清晰化的處理和管理事務。一個完整的工單系統還須要配套擁有一個幫助文檔知 識庫(Knowledge base),裏面包含客戶的一些常見受理問題相關信息,常見問題的處理方式,和一些其餘的幫助文檔等。一個工單系統就像一個問題追蹤器,能很清晰的追蹤, 處理和歸檔內外的問題事務請求,標準化服務追蹤用戶。
網訊工單系統處理的支持請求能夠分爲不少種,同時也會根據事務的不一樣狀況用優先級以區分不一樣程度和重要性的支持請求。優先級能夠分爲緊急,高,中和低。事務類型能夠大體分爲,問題,事務,故障和任務。
不 同事務類型能夠包含本身的私有屬性,如故障能夠包含多個事務(多個事務可能由一個故障引發的,或者說一個故障致使多個事務的產生),任務會擁有一個到期時 間(一個任務須要在到期時間前處理完成)。同時能夠根據不一樣企業組織的需求增長分類來對工單種類進行細分,從而有針對的分配合適的任務給合適的管理人員進 行處理。
做爲服務於企業和組織的工單系統,其系統內部須要有一套完善的業務流程體系,以知足企業和組織在使用中和操做中的任務分配,事務處理,流程自動化等。
下面舉個例子來明確該體系所應包含的內容以及一個工單系統流程具體的操做方式:
一、一個客戶支持職員接到一個電話,或者一個事務提交請求(可能在網頁上提交也多是發送電子郵件),其內容是關於一個具體的問題。一些工單系統提供自動迴應和提醒。
二、一個服務職員確認該問題的真實性,並經過工單系統或電話收集該客戶關於該問題的全部信息。獲取該用戶的一些必要信息。
三、該服務職員在工單系統中建立該問題,或由客戶提交自動在系統自動建立該問題工單,並錄入全部關於該問題的相關信息。
四、在處理進程中,工單會經歷若干狀態,直到已解決該問題,工單的內容會隨着問題處理的進度而進行相應的更新。並會發送相應的提醒給請求客戶。
五、當一個工單被解決後,該工單在系統中會被標記成已解決,並做爲該客戶用戶事務的歸檔以便後續追蹤和查閱。
從以上簡單的流程能夠看到,一個優秀的工單系統須要擁有完善的業務流程體系和自定義引擎來方便最終用戶和管理人員進行高效的平常操做。
網訊兆通呼叫中心工單系統的標準化服務
一、一個工單系統須要有一套標準化體系,來使工單系統全部的操做,處理,管理和維護所有知足和履行該標準化的內容,避免服務拖延,服務延遲,避免下降服務質量和資源浪費。
服務目標能讓工單系統的工單處理操做和相關服務知足服務目標協議,當在實際服務中,有工單處理威脅而不能知足該服務目標時,會及時作出提醒,以讓系統管理人員進行及時處理。
二、協同操做,工單系統應該是一個能讓多個客戶服務職員協同合做處理客戶支持請求工單的系統,所以是否高效的進行處理和管理成爲判斷一個工單系統好壞的關鍵。
在工單系統內須要對不一樣角色的人員進行分類,一般採用組和部門(組織)的方式進行分類區分,以便經過業務流程體系來進行自動分配任務。
例如能夠將處理技術的客戶服務職員所有歸屬到一個叫作技術組的客服組中,而後經過業務流程體系功能未來源爲技術的支持請求所有讓該組的人進行受理。
也可讓專職人員專門負責某個部門或某個組織的請求事務處理,追蹤和解決。
協同操做不只限於事務的分配,還在於事務的調度和轉發,例如一個客戶服務職員可能在處理中能力不足,須要有更多經驗的管理人員來協同處理,因此他應該能夠將工單分配給另外一我的員進行處理。
網訊兆通呼叫中心工單系統的附屬功能:
一個全面的工單系統應該是由多種附屬功能結合而成的,從而成爲一個完善,強大集中的功能應用,下面列出了部分功能是一個優秀的工單系統所能擴展的:
一、在線交談功能:基於工單系統事務的交談,交談內容歸檔爲工單內容
二、統計報告:統計工單系統內的工單處理,操做狀況,便於改進和分析

三、支持渠道的擴展:多種客戶支持渠道方便客戶提交工單問題和支持請求 java


需求: apache

最近要實現一個自動派單功能,就是若是有任務來了,那麼任務平均分配給現有的員工,若是以前取了任務的員工下次來任務時就分配給下一個,若是有新員工則將員工添加到隊列的最後,若是有員工離職就將員工信息從隊列裏移除。 網絡

 

實現: ide

1.寫一個定時任務,定時將任務放入任務隊列中TaskQueue,並將員工放入User隊列中,若是員工已存在則不添加,若是新員工則加入隊列中,若是員工不存在了就從隊列中移除。 ui

2.寫一個線程,從任務隊列中取任務,若是任務不存在則阻塞,取到任務後,將該任務派給下一個員工,並將該員工添加到員工隊列末尾,這樣達到按員工次序分配任務。 this

3.實現一個任務隊列,若是在取任務時任務不存在則阻塞。 spa

4.實現一個員工隊列,在取下一個員工後將該員工從列頭移到列尾,而且能夠將新員工加入到隊列未尾,能夠將不存在的員工從隊列中移除。 .net

 

核心代碼: 線程

 

Java代碼   收藏代碼
  1. import java.util.Collection;  
  2. import java.util.concurrent.BlockingQueue;  
  3. import java.util.concurrent.LinkedBlockingDeque;  
  4.   
  5. /** 
  6.  * 任務隊列 
  7.  * 若是在取任務時沒有任務,則阻塞 
  8.  * @author dg 
  9.  * 
  10.  */  
  11. public class TaskQueue {  
  12.       
  13.     private static TaskQueue instance;  
  14.       
  15.     private static BlockingQueue queue = null;  
  16.       
  17.     private TaskQueue(){  
  18.         queue = new LinkedBlockingDeque();  
  19.     }  
  20.       
  21.     public static TaskQueue getInstance(){  
  22.         if(instance == null){  
  23.             instance = new TaskQueue();  
  24.         }  
  25.         return instance;  
  26.     }  
  27.       
  28.     /** 
  29.      * 獲取隊列大小 
  30.      * @return  
  31.      */  
  32.     public static int getSize(){  
  33.         return queue.size();  
  34.     }  
  35.       
  36.     /** 
  37.      * 放入隊列中 
  38.      * @param msg 
  39.      */  
  40.     public void put(Object obj){  
  41.         if(obj != null){  
  42.             try {  
  43.                 queue.put(obj);  
  44.             } catch (InterruptedException e) {  
  45.                 e.printStackTrace();  
  46.             }  
  47.         }  
  48.     }  
  49.       
  50.     /** 
  51.      * 放入隊列中 
  52.      * @param msg 
  53.      */  
  54.     public void putAll(Collection objs){  
  55.         if(objs != null){  
  56.             queue.addAll(objs);  
  57.         }  
  58.     }  
  59.       
  60.     /** 
  61.      * 從隊列中取出一個 
  62.      * @return  
  63.      */  
  64.     public Object take(){  
  65.         try {  
  66.             Object obj = queue.take();    
  67.             return obj;  
  68.         } catch (InterruptedException e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.         return null;  
  72.     }  
  73.   
  74. }  

 

 

 

Java代碼   收藏代碼
  1. /** 
  2.  * 存放即將被派任務的員工 
  3.  * 每次取出員工時不移除該員工,而是將其放到隊列末尾 
  4.  * 若是員工已不存在,將其移除 
  5.  * @author dg 
  6.  * 
  7.  */  
  8. public class UserQueue {  
  9.       
  10.     private static UserQueue instance = null;  
  11.     private static BlockingQueue<User> queue = null;  
  12.       
  13.     private UserQueue(){  
  14.         queue =  new LinkedBlockingDeque<User>();  
  15.     }  
  16.       
  17.     public static UserQueue getInstance(){  
  18.         if(instance == null){  
  19.             instance = new UserQueue();  
  20.         }  
  21.         return instance;  
  22.     }  
  23.   
  24.     /** 
  25.      * 取下一個員工 
  26.      * @return 
  27.      */  
  28.     public User takeNext(){  
  29.         User user = null;  
  30.         try {  
  31.             user = queue.take();  
  32.             this.put(user);  
  33.         } catch (InterruptedException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.         return user;  
  37.     }  
  38.       
  39.     /** 
  40.      * 將新員工放入隊列中未尾 
  41.      */  
  42.     public void put(User user){  
  43.         if(queue.contains(user)){  
  44.             return;  
  45.         }else{  
  46.             try {  
  47.                 queue.put(user);  
  48.             } catch (InterruptedException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         }  
  52.     }  
  53.       
  54.     public void putAll(Collection<User> users){  
  55.         for(User user : users){  
  56.             this.put(user);  
  57.         }  
  58.     }  
  59.       
  60.     /** 
  61.      * 將已不存在的員工移除 
  62.      */  
  63.     public void remove(User user){  
  64.         if(queue.contains(user)){  
  65.             queue.remove(user);  
  66.         }  
  67.     }  
  68.       
  69.     /** 
  70.      * 獲取目前隊列中全部的user 
  71.      * @return 
  72.      */  
  73.     public Object[] getAllUsers(){  
  74.         Object[] obj = queue.toArray();  
  75.         return obj;  
  76.     }  
  77.       
  78.     /** 
  79.      * @param args 
  80.      */  
  81.     public static void main(String[] args) {  
  82.         User user1 = new User();  
  83.         user1.setUid(1);  
  84.         user1.setAccount("11");  
  85.           
  86.         User user2 = new User();  
  87.         user2.setUid(1);  
  88.         user2.setAccount("11");  
  89.           
  90.         User user3 = new User();  
  91.         user3.setUid(3);  
  92.         user3.setAccount("11");  
  93.           
  94.         User user4 = new User();  
  95.         user4.setUid(4);  
  96.         user4.setAccount("444");  
  97.           
  98.         User user5 = new User();  
  99.         user5.setUid(5);  
  100.         user5.setAccount("555");  
  101.           
  102.         UserQueue.getInstance().put(user1);  
  103.         UserQueue.getInstance().put(user2);  
  104.         UserQueue.getInstance().put(user3);  
  105.         UserQueue.getInstance().put(user4);  
  106.         UserQueue.getInstance().put(user5);  
  107.           
  108.         for(int i = 0 ; i < 20; i++){  
  109.             System.out.println(UserQueue.getInstance().takeNext().getUid());  
  110.             if(i == 5){  
  111.                 UserQueue.getInstance().remove(user2);  
  112.             }  
  113.         }  
  114.           
  115.         Object[] users = UserQueue.getInstance().getAllUsers();  
  116.         System.out.println("=======");  
  117.         for(Object user:users){  
  118.             System.out.println(((User)user).getUid());  
  119.         }  
  120.     }  
  121.   
  122. }  

 

對於要實現User對象的比較,首先要重寫equals方法.如下是我重寫的User的equals方法 對象

Java代碼   收藏代碼
  1. public boolean equals(Object obj) {  
  2.         if(!(obj instanceof User)){  
  3.             return false;  
  4.         }  
  5.         User u = (User)obj;  
  6.         return (u.getAccount().equals(account) && u.getUid().equals(uid));  
  7.     }  

 

Java代碼   收藏代碼
  1. import java.util.List;  
  2. import java.util.TimerTask;  
  3.   
  4. import org.apache.log4j.Logger;  
  5.   
  6. import com.cms.common.ServiceUtil;  
  7. import com.cms.common.SysConfig;  
  8. import com.cms.entity.ClientRecord;  
  9. import com.cms.entity.User;  
  10. import com.cms.service.ClientService;  
  11.   
  12. /** 
  13.  * 定時將客戶意向放入任務隊列 
  14.  * 而且從新成功員工隊列  
  15.  * @author dg 
  16.  * 
  17.  */  
  18. public class GenerateTask extends TimerTask {  
  19.       
  20.     private static Logger logger = Logger.getLogger(GenerateTask.class);  
  21.     private ClientService clientService = (ClientService)ServiceUtil.getService("clientService");  
  22.   
  23.     public void run() {  
  24.         try {  
  25.             String autoTaskRoleIds = SysConfig.getStrValue("autotask.roleid");  
  26.             if(autoTaskRoleIds == null || autoTaskRoleIds.trim().equals("")   
  27.                     || autoTaskRoleIds.split(",").length == 0){  
  28.                 logger.error("自動派單角色未設置");  
  29.                 return;  
  30.             }  
  31.             //取所有名單  
  32.             List<User> userList = clientService.getAllAutoTaskUsers(autoTaskRoleIds.split(","));  
  33.             if(userList == null || userList.size() == 0){  
  34.                 logger.error("目前還未有業務員沒法派單");  
  35.                 return;  
  36.             }  
  37.             //將已不存在的用戶移除  
  38.             Object[] users = UserQueue.getInstance().getAllUsers();  
  39.             for(Object user : users){  
  40.                 if(!userList.contains(user)){  
  41.                     UserQueue.getInstance().remove((User)user);  
  42.                 }  
  43.             }  
  44.             //從新生成名單  
  45.             UserQueue.getInstance().putAll(userList);  
  46.             //生成任務  
  47.             List<ClientRecord> recordList = clientService.getAllUnAssignRecord();  
  48.             TaskQueue.getInstance().putAll(recordList);  
  49.         } catch (Throwable t) {  
  50.             logger.error("自動派單任務異常!" ,t);  
  51.         }finally{  
  52.             logger.info("這次任務執行完畢!");  
  53.         }  
  54.     }  
  55. }  

 

Java代碼   收藏代碼
  1. import org.apache.log4j.Logger;  
  2.   
  3. import com.cms.common.ServiceUtil;  
  4. import com.cms.entity.ClientRecord;  
  5. import com.cms.entity.User;  
  6. import com.cms.schedule.TaskQueue;  
  7. import com.cms.schedule.UserQueue;  
  8. import com.cms.service.ClientService;  
  9.   
  10. /** 
  11.  * 從任務隊列裏取到任務,自動派單給業務員 
  12.  * @author dg 
  13.  * 
  14.  */  
  15. public class AutoDispatchTaskThread implements Runnable{  
  16.       
  17.     private static Logger logger = Logger.getLogger(AutoDispatchTaskThread.class);  
  18.     private ClientService clientService = (ClientService)ServiceUtil.getService("clientService");  
  19.       
  20.     private boolean stop = false;  
  21.   
  22.     @Override  
  23.     public void run() {  
  24.         try{  
  25.             while(!stop){  
  26.                 ClientRecord record = (ClientRecord)TaskQueue.getInstance().take();  
  27.                 User user = UserQueue.getInstance().takeNext();  
  28.                 clientService.assginRecord(record.getRid(), user.getUid());  
  29.             }  
  30.         }catch(Throwable t){  
  31.             logger.error(t.getMessage(),t);  
  32.         }  
  33.     }  
相關文章
相關標籤/搜索