flask售後評分系統
做軟體行業的公司,一般都有專業的售前售後團隊,還有客服團隊,客服處理使用者反饋的問題,會形成工單,然後工單會有一大堆工單流程,涉及工單的內部人員,可能會有賠付啥的,當然,這是有專業的售前、售後、客服團隊。
但,我相信,有好大一部分是沒有售後團隊的,或者研發就是售後,有測試團隊的,那測試肯定是首當其衝的售後團隊,使用者有啥問題,產品直接把測試拖到群裡就ok~~~~~相信很多公司和我們一樣。
既然沒有專業的售後團隊,所有人都肯定不想去搞這售後,所以,要想讓售後維護下去,那就得有獎勵,比如把專案獎金部分拿來獎勵處理售後的人員。
問題來了,怎麼去分配這部分獎勵呢??
要做好售後獎勵分配,需要關注哪些要素?我這模擬了半個月,總結了一些,希望有需要的可以參考參考。
以下是我們實施售後評分系統的基礎調研理論:
************************************************************************************************************
專案售後獎懲制度
一、售後主要打分引數
售後主要有幾個引數:
- 響應速度
從使用者通過QQ、微信、電話等反饋問題開始到售後人員回覆問題,這段時間稱為響應時間,響應時間越短,客戶滿意度會越好。
- 問題複雜程度
使用者反饋的問題,有簡單的,比如使用問題,也有比較複雜的,比如環境問題,或者是很難復現的BUG。按照問題的複雜情況分為:簡單、一般、複雜、疑難4種等級。
- 問題解決時長
售後接受到問題到解決上線了這個問題,這段時間稱為解決時間,不同複雜程度解決時間消耗不一樣。按照解決時長分為:當日解決、24小時內解決、72小時內解決、164小時內解決(7日)。
- 問題解決程度
根據問題的複雜程度或其他原因,問題是存在解決程度的,比如先臨時解決使用者先能正常使用起來,再抽時間徹底解決。所以分了幾個標準:徹底解決(該問題不會再出現)、通用解決(該問題同樣的操作步驟不會再出現,但其他情況或其他人可能還會出現)、臨時解決(該問題下次還會出現,只能採用同樣辦法避免)
- 客戶滿意度
問題解決後,使用者對該問題解決情況綜合評價
二、售後分數計算規則
按照售後的引數,賦予不同的分數,各項引數標準分數為100分,大於100分為獎勵分,低於100分為懲罰分數:
以上引數表格說明一下:
比如複雜程度為“簡單”,嚴重程度為“致命”,解決時間為“當日”的情況下,得分為110分,但如果解決時間大於24小時小於72小時,則得分為-40分。我們認為這個售後問題是很簡單的,但又是致命的,對客戶來說很重要,對我們解決耗時很短,但若問題解決時間還大於24小時,我們認為解決速度是存在問題的,所以要扣除分數作為懲罰。當然,若問題很複雜,則解決時間肯定會變長,所以,隨著問題的複雜性提高,扣除分數基本不會存在,這樣也算比較合理的規則。再比如,如果這個問題被客戶投訴了,則客戶滿意度這一項會直接得分-100分,如果使用者主動表揚,則得分150分。
有了這樣的基礎表格,我們就可以計算這個問題的總得分了,我們按照各項引數佔比來計算:解決時長佔比40%,解決程度佔比30%,客戶滿意度佔比30%,響應時長主要用於扣除懲罰計算。
計算公式:
三、售後獎勵分配規則
一個問題的提出到解決,是有很多人一起參與的,一個專案又是有多人蔘與的,我們按照專案來區分,同一專案內部獨立計算,比如黑龍江的售後,則只計算參與了黑龍江售後的人員。同一個問題有響應人員(發起人員或接受人員)、解決人員、參與人員。該問題的分數也按照比例分配這些人員。我們人為一個問題的發起人會全程參與這個問題直到問題解決,所以響應人員佔比要多一點,同樣,參與人員可能是零星參與,所以參與人員比例要少一點。當然,不可能做到絕對公平:
問題響應人員(一人):55%
問題解決人員(一人):35%
問題參與人員(多人):10%
四、售後獎勵扣除規則
有獎勵就有懲罰,根據引數我們做了扣分規則,但還不夠,響應速度需要主觀來判斷,所以做了單獨的規則:
響應時間在工作日非工作日期間是有區別的,工作日期間應該要響應快一點,非工作日期間,可能會看到問題慢一點,當然直接電話除外:
- 工作日期間:
- 響應時間<0.5h:不扣除
- 0.5h<響應時間<2h: 扣除2%
- 響應時間>2h:扣除5%
- 非工作日期間:
- 響應時間<1h:不扣除
- 1h<響應時間<2h: 扣除2%
- 響應時間>2h:扣除5%
以上特殊情況除外,如果他人二次通知在這時間內響應了,也算自己主動響應。這裡的扣除是直接針對獎勵金額,不是針對分數。這裡的扣除比例針對的是參與該專案售後獲得當月獎勵的所有人員。扣除最高為100%,比如當月有20個問題響應時長都是扣除5%,那麼該月的所有人可能就沒有了獎勵。
************************************************************************************************************
現在開始實施:
1.資料庫設計
(1)建立project_manage資料庫
(2)建立pro_collect_problems表,用於問題收集。
CREATE TABLE `pro_collect_problems` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `product_id` int(11) DEFAULT NULL COMMENT '關聯的產品線產品id', `problem_detail` varchar(1000) DEFAULT NULL COMMENT '問題描述', `problem_date` varchar(50) DEFAULT NULL COMMENT '問題發現時間', `problem_type` varchar(255) DEFAULT NULL COMMENT '問題型別:使用問題、環境問題、需求問題、程式碼問題', `problem_complexity` varchar(20) DEFAULT NULL COMMENT '問題複雜程度:簡單、一般、複雜、疑難', `system_type` varchar(50) DEFAULT NULL COMMENT '問題系統型別', `problem_degree` varchar(255) DEFAULT NULL COMMENT '問題嚴重程度:致命、嚴重、一般、輕微、建議', `problem_solution` varchar(1000) DEFAULT NULL COMMENT '問題解決方法', `problem_remark` varchar(1000) DEFAULT NULL COMMENT '解決方案備註資訊', `solve_degree` varchar(255) DEFAULT NULL COMMENT '解決程度:臨時解決(下次還會出現)、通用解決(某種情況不會出現)、徹底解決(不會出現)', `problem_solver` varchar(50) DEFAULT NULL COMMENT '解決人', `other_person` varchar(255) DEFAULT NULL COMMENT '其他參與人', `problem_solve_time` varchar(255) DEFAULT NULL COMMENT '解決時間', `problem_burning_time` varchar(10) DEFAULT NULL COMMENT '解決耗時(解決時間-發現時間)-單位小時,精確一位小數點', `is_holiday` int(2) unsigned DEFAULT '0' COMMENT '是否在節假日發現或解決(1:是;0:否)', `is_general_problem` int(10) DEFAULT '0' COMMENT '是否融媒體共性問題', `customer_evaluation` varchar(255) DEFAULT NULL COMMENT '客戶評價:非常滿意(使用者主動表揚)、滿意、不滿意(使用者有抱怨)、及其不滿意(使用者主動投訴)', `score` varchar(10) DEFAULT '0' COMMENT '售後得分(演算法服務自動計算存入)', `weight_score` varchar(10) DEFAULT '0' COMMENT '加權售後得分', `is_grant_money` int(2) DEFAULT '0' COMMENT '是否發放獎勵', `grant_money_person` varchar(50) DEFAULT '' COMMENT '發放獎勵人員', `grant_money_time` varchar(20) DEFAULT NULL COMMENT '發放獎勵時間', `resolve_str` varchar(1000) DEFAULT NULL COMMENT '已解決融媒體產品id串', `creator` varchar(100) DEFAULT NULL COMMENT '建立人', `creator_department` varchar(255) DEFAULT NULL COMMENT '建立人部門', `creator_phone` varchar(255) DEFAULT NULL COMMENT '建立者手機號', `date_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `date_update` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', `updater` varchar(20) DEFAULT NULL COMMENT '更新人員', `is_disabled` int(11) unsigned zerofill DEFAULT '00000000000' COMMENT '是否刪除', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='問題收集表';
(3)建立problem_solving_time,用於初始化解決時長對應的分數
CREATE TABLE `problem_solving_time` ( `id` int(11) NOT NULL AUTO_INCREMENT, `complexity` varchar(10) NOT NULL COMMENT '問題複雜程度', `severity` varchar(10) NOT NULL COMMENT '問題嚴重程度', `duration` varchar(10) DEFAULT NULL COMMENT '解決時長', `score` varchar(10) DEFAULT NULL COMMENT '分數', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='問題解決時長分數';
(4)建立problem_solving_degree,用於初始化問題解決程度分數
CREATE TABLE `problem_solving_degree` ( `id` int(11) NOT NULL AUTO_INCREMENT, `complexity` varchar(10) NOT NULL COMMENT '問題複雜程度', `severity` varchar(10) NOT NULL COMMENT '問題嚴重程度', `solve_degree` varchar(10) DEFAULT NULL COMMENT '問題解決程度', `score` varchar(10) DEFAULT NULL COMMENT '分數', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='問題解決程度分數';
(5)建立problem_customer_satisfaction,用於初始化使用者滿意度分數
CREATE TABLE `problem_customer_satisfaction` ( `id` int(11) NOT NULL AUTO_INCREMENT, `complexity` varchar(10) NOT NULL COMMENT '問題複雜程度', `severity` varchar(10) NOT NULL COMMENT '問題嚴重程度', `satisfaction` varchar(10) DEFAULT NULL COMMENT '問題解決滿意度', `score` varchar(10) DEFAULT NULL COMMENT '分數', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='客戶滿意度分數';
(6)建立problem_person_score,用於儲存個人得分表
CREATE TABLE `problem_person_score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `problem_id` int(11) NOT NULL COMMENT '問題id', `product_id` int(11) NOT NULL COMMENT '產品id', `name` varchar(10) NOT NULL COMMENT '姓名', `score` varchar(10) NOT NULL COMMENT '分數', `total_score` varchar(10) NOT NULL, `is_issue_money` varchar(5) NOT NULL COMMENT '是否發放獎金', `problem_time` datetime NOT NULL COMMENT '問題生成時間', `update_time` datetime NOT NULL COMMENT '更新時間', PRIMARY KEY (`id`), UNIQUE KEY `pn` (`problem_id`,`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='使用者分數表';
以上建立好表後,我們開始搭建問題收集網站
2.用flask搭建一個網站,這個網站用於記錄售後問題。
搭建這個網站很簡單,可以參考我們常用的測試管理工具,如禪道~
(1)售後列表頁面:
(2)售後填寫頁面:
類似頁面flask搭建很簡單,提交存庫就行,這裡不做程式碼介紹。
3.把我們得計算規則(售後分數計算規則)初始化到資料庫裡,也就是上面我們定義好的規則。
4.計算該問題的總得分
(1)獲取沒有計算的資料
SELECT id, problem_complexity, problem_degree, CASE WHEN problem_burning_time <= 8 THEN '當日' WHEN problem_burning_time <= 24 THEN '24小時' WHEN problem_burning_time <= 72 THEN '72小時' WHEN problem_burning_time > 72 THEN '164小時' END problem_burning_time, CASE WHEN solve_degree LIKE '%徹底解決%' THEN '徹底' WHEN solve_degree LIKE '%通用解決%' THEN '通用' WHEN solve_degree LIKE '%臨時解決%' THEN '臨時' END solve_degree, customer_evaluation FROM `pro_collect_problems` WHERE problem_burning_time IS NOT NULL AND score = '0';
(2)獲取單個id需要計算的資料
SELECT id, problem_complexity, problem_degree, CASE WHEN problem_burning_time <= 8 THEN '當日' WHEN problem_burning_time <= 24 THEN '24小時' WHEN problem_burning_time <= 72 THEN '72小時' WHEN problem_burning_time > 72 THEN '164小時' END problem_burning_time, CASE WHEN solve_degree LIKE '%徹底解決%' THEN '徹底' WHEN solve_degree LIKE '%通用解決%' THEN '通用' WHEN solve_degree LIKE '%臨時解決%' THEN '臨時' END solve_degree, customer_evaluation FROM `pro_collect_problems` WHERE id = '@@@@';
(3)計算問題分數介面
@pas.route('/deal_score', methods=['POST']) def calculation_score_task(): if request.json: try: req_data = request.json user_name = req_data['user_name'] time_stamp = str(req_data['time_stamp']) get_sign = req_data['sign'] sign_str = "#¥………@#@t_21@#%Aa" problem_id = [{'id': req_data['id']}] except Exception as e: print(e) return jsonify({"error": 400, "msg": "引數錯誤!"}), 400 need_to_md5 = user_name + time_stamp + sign_str sign = hashlib.md5(need_to_md5.encode(encoding="UTF-8")).hexdigest() if get_sign == sign: if req_data['id']: sql_result = sql.deal_more_mysql("get_project_manage_id.sql", problem_id) else: sql_result = sql.deal_mysql("get_project_manage.sql") if sql_result: for i in sql_result: p_solve_time = [{'complexity': i[1], 'severity': i[2], 'duration': i[3]}] p_solve_degree = [{'complexity': i[1], 'severity': i[2], 'solve_degree': i[4]}] p_solve_satisfaction = [{'complexity': i[1], 'severity': i[2], 'satisfaction': i[5]}] pst_result = sql.deal_more_mysql("get_problem_solving_time.sql", p_solve_time) psd_result = sql.deal_more_mysql("get_problem_solving_degree.sql", p_solve_degree) pss_result = sql.deal_more_mysql("get_problem_solving_satisfaction.sql", p_solve_satisfaction) score = 0.4 * int(pst_result[0][0]) + 0.3 * int(psd_result[0][0]) + 0.3 * int(pss_result[0][0]) # print('id',id,'--pst-',pst_result[0][0], '--psd-', psd_result[0][0], '--pss-',pss_result[0][0], '--score-',score) update_sql = """UPDATE pro_collect_problems set score = '%s' WHERE id = '%s' LIMIT 1;""" % (score, i[0]) d = pro_sql.Database() d.exec_no_query(update_sql) return jsonify({"success": 200, "msg": "計算完成"}) else: return jsonify({"success": 200, "msg": "暫無資料待計算!"}) else: return jsonify({"error": 400, "msg": "引數錯誤!"}), 400
這裡對介面做了一個驗籤,客服端和後端計算的sign值一樣才能驗籤通過,另外這裡對傳入的問題id做了校驗,如果有id,這計算這個id的分數,如果沒有id,就計算所有需要計算的資料。
這個地方:score = 0.4 * int(pst_result[0][0]) + 0.3 * int(psd_result[0][0]) + 0.3 * int(pss_result[0][0])計算的是佔比:解決時長佔比40%,解決程度佔比30%,客戶滿意度佔比30%。
這個是處理資料的外掛,我用flask一般都用這個---PooledDB :
import pymysql from DBUtils.PooledDB import PooledDB from app.dao import db_config as config class Database: def __init__(self, *db): # mysql資料庫 self.host = config.project_manage['host'] self.port = config.project_manage['port'] self.user = config.project_manage['user'] self.pwd = config.project_manage['passwd'] self.db = config.project_manage['db'] self.charset = config.project_manage['charset'] self.create_pool() def create_pool(self): self.Pool = PooledDB(creator=pymysql, mincached=0, maxcached=10, maxshared=0, maxconnections=0, blocking=True, host=self.host, port=self.port, user=self.user, password=self.pwd, database=self.db, charset=self.charset) def get_connect(self): self.conn = self.Pool.connection() cur = self.conn.cursor() if not cur: raise NameError("資料庫連線不上") else: return cur # 查詢sql def exec_query(self, sql): cur = self.get_connect() cur.execute(sql) re_list = cur.fetchall() cur.close() self.conn.close() return re_list # 非查詢的sql,增刪改 def exec_no_query(self, sql): cur = self.get_connect() re = cur.execute(sql) self.conn.commit() cur.close() self.conn.close() return re # 顯示查詢中的第一條記錄 def show_first(self, sql): cur = self.get_connect() cur.execute(sql) result_first = cur.fetchone() cur.close() self.conn.close() return result_first # 顯示查詢出的所有結果 def show_all(self, sql): cur = self.get_connect() cur.execute(sql) result_all = cur.fetchall() cur.close() self.conn.close() return result_all # if __name__ == "__main__": # # d = Database()
然後自己封裝了一個處理sql指令碼的py檔案:
# coding = utf-8 # 禪道專案度量--讀取sql指令碼 import os from app.dao import project_manage_mysql as mysql pl = os.getcwd().split('cover_app_platform') path_pl = pl[0] + "cover_app_platform\\app\\dao\\project_manage\\" # 讀取sql指令碼 def read_sql(f): """ :param f: 需要讀取sql指令碼的檔案 :return: 返回讀取後的sql語句 """ f_path = path_pl + f try: fi = open(f_path, "r", encoding='UTF-8') fp = fi.readlines() fi.close() sql_script = '' for i in fp: sql_script += i return sql_script except FileNotFoundError as ep: return ep def deal_mysql(f, pa='', u=0): """ :param f: :param pa: list :param u: list :return: """ d = mysql.Database() sql = read_sql(f) if len(pa) != 0: for i in pa: sql = sql.replace('@@@@', str(i)) if u == 0: results = d.show_all(sql) tl = list(results) return tl else: results = d.exec_no_query(sql) return results def deal_more_mysql(f, pa=None): """ :param f: :param pa: list :return: """ if pa is None: pa = [] d = mysql.Database() sql = read_sql(f) sql_new = '' if pa: for i in pa: s = sql.split('\n') for sq in s: sqn = "" for key in i: if key in sq: sq = sq.replace('@@@@', i[key]) sqn = sq + '\n' else: sqn = sq + '\n' sql_new += sqn results = d.show_all(sql_new) tl = list(results) return tl if __name__ == '__main__': par_har = [{'upload_id': '2', 'har_name': '直播流程.har'}] f = "get_locust_debug.sql" r = deal_more_mysql(f, par_har) print(r)
5.計算該問題發起人、解決人、參與人的分數
@pas.route('/deal_personal_score', methods=['POST']) def calculation_score_personal(): if request.json: try: req_data = request.json user_name = req_data['user_name'] time_stamp = req_data['time_stamp'] get_sign = req_data['sign'] sign_str = "co#2332@#@ct_21@#%Aa" problem_id = [{'id': req_data['id']}] except Exception as e: print(e) return jsonify({"error": 400, "msg": "引數錯誤!"}), 400 need_to_md5 = user_name + time_stamp + sign_str sign = hashlib.md5(need_to_md5.encode(encoding="UTF-8")).hexdigest() if get_sign == sign: if req_data['id']: sql_result = sql.deal_more_mysql("get_score_personal_id.sql", problem_id) else: sql_result = sql.deal_mysql("get_score_personal.sql") # sql_result = [(119, 3, '王*紅', '王*紅', None, '100.0', 0, datetime.datetime(2021, 7, 16, 17, 7, 49))] if sql_result: all_personal_data = [] for i in sql_result: personal_data = {} p_score = i[5] p_creator = i[2].split('、') # 55% p_solver = i[3].split('、') # 35% if len(p_solver) >= 2: for ps in p_solver: if ps == p_creator[0]: p_solver.remove(ps) if i[4] is None: p_participants = ''.split('、') else: p_participants = i[4].split('、') # 10% if len(p_participants) >= 1: for pcs in (p_creator + p_solver): for pp in p_participants: if pcs == pp: p_participants.remove(pcs) # 如果建立人和解決人是同一人 if len(p_creator) == len(p_solver) == 1 and p_creator[0] == p_solver[0]: # 如果沒有參與人,當建立人等於解決人等於參與人時,參與人會被移除,此時len(p_participants)等於0 if (len(p_participants) == 1 and p_participants[0] == '') or len(p_participants) == 0: # 計算建立人 佔比100% personal_data[p_creator[0]] = float(p_score) * 1 # 有參與人 else: # 計算建立人 佔比90% personal_data[p_creator[0]] = round(float(p_score) * 0.9, 2) # 計算參與人 佔比10% for spp in p_participants: personal_data[spp] = round(float(p_score) * 0.1 / len(p_participants), 2) # 如果沒有參與人 elif len(p_participants) == 1 and p_participants[0] == '': # 計算建立人 佔比60% personal_data[p_creator[0]] = round(float(p_score) * 0.6, 2) # 計算解決人 佔比40, 多人則均分40% for sp in p_solver: personal_data[sp] = round(float(p_score) * 0.4 / len(p_solver), 2) # 建立人、解決人、參與人都有的情況 else: # 計算建立人 佔比 55% personal_data[p_creator[0]] = round(float(p_score) * 0.55, 2) # 計算解決人 佔比 35% 多人則均分35% for sp in p_solver: personal_data[sp] = round(float(p_score) * 0.35 / len(p_solver), 2) # 計算參與人 佔比10% 多人則均分10% for spp in p_participants: personal_data[spp] = round(float(p_score) * 0.1 / len(p_participants), 2) for pd in personal_data: personal_data_l = {'problem_id': i[0], 'product_id': i[1], 'is_issue_money': i[6], 'problem_time': i[7], 'name': pd, 'total_score': p_score, 'score': personal_data[pd], } all_personal_data.append(personal_data_l) print('執行資料更新開始時間: ', datetime.datetime.now()) d = pro_sql.Database() if req_data['id']: del_sql = "DELETE FROM problem_person_score where problem_id = '%s';" % req_data['id'] d.exec_no_query(del_sql) for s_data in all_personal_data: in_sql = """ INSERT INTO `problem_person_score` ( `problem_id`, `product_id`, `name`, `score`, `total_score`, `is_issue_money`, `problem_time`, `update_time` ) VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'); """ % (s_data['problem_id'], s_data['product_id'], s_data['name'], s_data['score'], s_data['total_score'], s_data['is_issue_money'], s_data['problem_time'], datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),) try: # 插入sql d.exec_no_query(in_sql) except IntegrityError: update_sql = "UPDATE problem_person_score set score = '%s', problem_time = '%s', total_score = '%s', update_time = '%s' " \ "where problem_id = '%s' and name = '%s' LIMIT 1;" % ( s_data['score'], s_data['problem_time'], s_data['total_score'], datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), s_data['problem_id'], s_data['name'] ) # 插入sql出錯則更新sql d.exec_no_query(update_sql) print('執行資料更新結束時間: ', datetime.datetime.now()) return jsonify({"success": 200, "msg": "計算完成"}) else: return jsonify({"success": 200, "msg": "暫無資料待計算!"}) else: return jsonify({"error": 400, "msg": "引數錯誤!"}), 400
這裡主要是演算法判斷有點複雜:
簡單規則理解:
1.一個售後問題,我們定義了三個角色:發起人(填寫人),解決人,參與人
(1)發起人:問題的第一介入人員,也是填寫售後問題的人員,這個角色主要是第一個響應客戶的人員,比較重要,也是推動這個問題解決的人員,所以,發起人只有一個,分數佔比55%。
(2)解決人:解決問題的人員,可以有多個,比如使用者反映的一個問題,可能前段,後端,app段都需要修改,或者android和ios都要修改,所以有多個人,但考慮到解決人員沒有與使用者直接響應,也沒有花時間如推動,分數佔比為35%。
(3)參與人:參與問題解決的人員,可以有多個,可以是參與排查問題的人員,也可以是其他部門協助解決的人員,分數佔比10%。
定義好這些角色後,我們就有幾種情況了:
(1)如果使用者反映的問題被髮起人解決了,那麼發起人則分數佔比100%
(2)如果使用者反映的問題有發起人,有解決人,沒有參與人,則發起人佔比60%,解決人佔比40%
(3)如果使用者反映的問題有發起人,解決人,參與人,則發起人佔比55%,解決人35%,參與人10%。
我們也定義了其他情況:
(1)解決人或參與人若有發起人,則發起人只計算髮起人的比例
(2)參與人裡若有解決人或發起人,也要過濾
(3)當解決人裡有且只有發起人,則發起人算髮起人和解決人分數
如:
(1)發起人(張三),解決人(李四,張三),參與人(李四,張三、王五),則有效的為:發起人(張三),解決人(李四),參與人(王五)
(2)發起人(張三),解決人(張三),參與人(張三),則有效的為:發起人(張三),解決人(張三)
當然,還有其他規則,這些可以自己定義。
然後,這裡我們也判斷了id,如果有id,則只計算這個id的資料,但處理這個id資料前,會先去刪除這個id的資料,重新插入。
資料表定義了判重,一個問題一個使用者只能有一條資料,如果插入時候報錯,則執行update語句。
計算後的資料:
售後問題得分頁面:
最後,可以根據這些個人得分資料,可以再做一個排行榜,可以按照專案、個人、月度、年度來排~~
有不懂得或有建議的,歡迎留言。