1. 程式人生 > 其它 >flask售後評分系統

flask售後評分系統

做軟體行業的公司,一般都有專業的售前售後團隊,還有客服團隊,客服處理使用者反饋的問題,會形成工單,然後工單會有一大堆工單流程,涉及工單的內部人員,可能會有賠付啥的,當然,這是有專業的售前、售後、客服團隊。

但,我相信,有好大一部分是沒有售後團隊的,或者研發就是售後,有測試團隊的,那測試肯定是首當其衝的售後團隊,使用者有啥問題,產品直接把測試拖到群裡就ok~~~~~相信很多公司和我們一樣。

既然沒有專業的售後團隊,所有人都肯定不想去搞這售後,所以,要想讓售後維護下去,那就得有獎勵,比如把專案獎金部分拿來獎勵處理售後的人員。

問題來了,怎麼去分配這部分獎勵呢??

要做好售後獎勵分配,需要關注哪些要素?我這模擬了半個月,總結了一些,希望有需要的可以參考參考。

以下是我們實施售後評分系統的基礎調研理論:

************************************************************************************************************

專案售後獎懲制度

一、售後主要打分引數

售後主要有幾個引數:

  1. 響應速度

從使用者通過QQ、微信、電話等反饋問題開始到售後人員回覆問題,這段時間稱為響應時間,響應時間越短,客戶滿意度會越好。

  1. 問題複雜程度

使用者反饋的問題,有簡單的,比如使用問題,也有比較複雜的,比如環境問題,或者是很難復現的BUG。按照問題的複雜情況分為:簡單、一般、複雜、疑難4種等級。

  1. 問題解決時長

售後接受到問題到解決上線了這個問題,這段時間稱為解決時間,不同複雜程度解決時間消耗不一樣。按照解決時長分為:當日解決、24小時內解決、72小時內解決、164小時內解決(7日)。

  1. 問題解決程度

根據問題的複雜程度或其他原因,問題是存在解決程度的,比如先臨時解決使用者先能正常使用起來,再抽時間徹底解決。所以分了幾個標準:徹底解決(該問題不會再出現)、通用解決(該問題同樣的操作步驟不會再出現,但其他情況或其他人可能還會出現)、臨時解決(該問題下次還會出現,只能採用同樣辦法避免)

  1. 客戶滿意度

問題解決後,使用者對該問題解決情況綜合評價

二、售後分數計算規則

按照售後的引數,賦予不同的分數,各項引數標準分數為100分,大於100分為獎勵分,低於100分為懲罰分數:

以上引數表格說明一下:

比如複雜程度為“簡單”,嚴重程度為“致命”,解決時間為“當日”的情況下,得分為110分,但如果解決時間大於24小時小於72小時,則得分為-40分。我們認為這個售後問題是很簡單的,但又是致命的,對客戶來說很重要,對我們解決耗時很短,但若問題解決時間還大於24小時,我們認為解決速度是存在問題的,所以要扣除分數作為懲罰。當然,若問題很複雜,則解決時間肯定會變長,所以,隨著問題的複雜性提高,扣除分數基本不會存在,這樣也算比較合理的規則。再比如,如果這個問題被客戶投訴了,則客戶滿意度這一項會直接得分-100分,如果使用者主動表揚,則得分150分。

有了這樣的基礎表格,我們就可以計算這個問題的總得分了,我們按照各項引數佔比來計算:解決時長佔比40%,解決程度佔比30%,客戶滿意度佔比30%,響應時長主要用於扣除懲罰計算。

計算公式:

三、售後獎勵分配規則

一個問題的提出到解決,是有很多人一起參與的,一個專案又是有多人蔘與的,我們按照專案來區分,同一專案內部獨立計算,比如黑龍江的售後,則只計算參與了黑龍江售後的人員。同一個問題有響應人員(發起人員或接受人員)、解決人員、參與人員。該問題的分數也按照比例分配這些人員。我們人為一個問題的發起人會全程參與這個問題直到問題解決,所以響應人員佔比要多一點,同樣,參與人員可能是零星參與,所以參與人員比例要少一點。當然,不可能做到絕對公平:

問題響應人員(一人):55%

問題解決人員(一人):35%

問題參與人員(多人):10%

四、售後獎勵扣除規則

有獎勵就有懲罰,根據引數我們做了扣分規則,但還不夠,響應速度需要主觀來判斷,所以做了單獨的規則:

響應時間在工作日非工作日期間是有區別的,工作日期間應該要響應快一點,非工作日期間,可能會看到問題慢一點,當然直接電話除外:

  1. 工作日期間:
    1. 響應時間<0.5h:不扣除
    2. 0.5h<響應時間<2h: 扣除2%
    3. 響應時間>2h:扣除5%
  2. 非工作日期間:
    1. 響應時間<1h:不扣除
    2. 1h<響應時間<2h: 扣除2%
    3. 響應時間>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語句。

計算後的資料:

售後問題得分頁面:

最後,可以根據這些個人得分資料,可以再做一個排行榜,可以按照專案、個人、月度、年度來排~~

有不懂得或有建議的,歡迎留言。