Browse Source

first commit

lijunliang 1 year ago
commit
58d7b926d2

+ 0 - 0
apps/__init__.py


BIN
apps/__pycache__/__init__.cpython-36.pyc


BIN
apps/__pycache__/__init__.cpython-37.pyc


BIN
apps/__pycache__/models.cpython-36.pyc


BIN
apps/__pycache__/models.cpython-37.pyc


BIN
apps/__pycache__/normal_field.cpython-36.pyc


BIN
apps/__pycache__/normal_field.cpython-37.pyc


BIN
apps/__pycache__/send_email.cpython-36.pyc


BIN
apps/__pycache__/send_email.cpython-37.pyc


+ 212 - 0
apps/models.py

@@ -0,0 +1,212 @@
+# coding:utf-8
+from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+from docs.config import mysqlConfig
+
+app = Flask(__name__)
+DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(mysqlConfig.USERNAME, mysqlConfig.PASSWORD, mysqlConfig.HOSTNAME,
+                                                 mysqlConfig.PORT, mysqlConfig.DATABASE)
+app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
+app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+db = SQLAlchemy(app)  # db为继承了SQLALchemy
+
+
+class Customer(db.Model):
+    __tablename__ = 'customer'
+    unique_id = db.Column(db.String(100), primary_key=True, unique=True, comment="呼叫中心用户标识")
+    company = db.Column(db.String(100), comment="公司名称")  # 公司名称..
+    username = db.Column(db.String(100), comment="姓名")  # 姓名..
+    phone = db.Column(db.String(100), comment="联系人电话")  # 联系人电话
+    email = db.Column(db.String(50), comment="邮箱")  # 邮箱..
+    address = db.Column(db.String(200), comment="职位")  # 职位..
+    usernickname = db.Column(db.String(100), comment="用户昵称")  # 用户昵称..
+    product = db.Column(db.String(100), comment="购买的产品类型")  # 购买的产品类型
+    web = db.Column(db.String(50), comment="公司网站")  # 公司网站 ..
+    id = db.Column(db.String(50), comment="用户ID")  # 用户ID..
+    job = db.Column(db.String(255), comment="职位")  # 职位..
+    regtime = db.Column(db.DateTime(), comment="用户注册时间")  # 用户注册时间
+    payorderinfo = db.Column(db.String(255), comment="已支付订单信息")  # 已支付订单信息
+    unpayorderinfo = db.Column(db.String(255), comment="未支付订单类型")  # 未支付订单类型
+    source = db.Column(db.String(500), comment="销售线索来源")  # 销售线索来源
+    keyword = db.Column(db.Text(), comment="订阅关键词")  # 订阅关键词
+    area = db.Column(db.Text(), comment="订阅区域")  # 订阅区域
+    searchkeyword = db.Column(db.Text(), comment="搜索关键词")  # 搜索关键词
+    searcharea = db.Column(db.Text(), comment="搜索区域")  # 搜索区域
+    lastlogintime = db.Column(db.DateTime(), comment="最近一次登录时间")  # 最近一次登录时间
+    lastloginport = db.Column(db.String(50), comment="最近一次登录端口")  # 最近一次登录端口
+    isclickkf = db.Column(db.Integer(), comment="最近一周点击人工客服次数")  # 最近一周点击人工客服次数
+    browsetitle1 = db.Column(db.Text(), comment="最近浏览正文标题1")  # 最近浏览正文标题1
+    browsetitle2 = db.Column(db.Text(), comment="最近浏览正文标题2")  # 最近浏览正文标题2
+    browsetitle3 = db.Column(db.Text(), comment="最近浏览正文标题3")  # 最近浏览正文标题3
+    customerNeeds = db.Column(db.String(1000), comment="客户需求")  # 客户需求
+    customerFocus = db.Column(db.String(3000), comment="客户关注点")  # 客户关注点
+    wantGoods = db.Column(db.String(500), comment="意向产品")  # 意向产品
+    customerBudget = db.Column(db.String(100), comment="客户预算")  # 客户预算
+    rivalCompare = db.Column(db.String(100), comment="友商对比情况")  # 友商对比情况
+    isPolicymaker = db.Column(db.String(100), comment="是否为决策人")  # 是否为决策人
+    secondContactName = db.Column(db.String(100), comment="第二联系人姓名")  # 第二联系人姓名
+    secondContactJob = db.Column(db.String(100), comment="第二联系人职务")  # 第二联系人职务
+    secondContactPhone = db.Column(db.String(100), comment="第二联系人电话")  # 第二联系人电话
+    secondContactEmail = db.Column(db.String(50), comment="第二联系人邮件")  # 第二联系人邮件
+    thirdContactName = db.Column(db.String(100), comment="第三联系人姓名")  # 第三联系人姓名
+    thirdContactJob = db.Column(db.String(100), comment="第三联系人职务")  # 第三联系人职务
+    thirdContactPhone = db.Column(db.String(100), comment="第三联系人电话")  # 第三联系人电话
+    thirdContactEmail = db.Column(db.String(50), comment="第三联系人邮件")  # 第三联系人邮件
+    empNo = db.Column(db.String(50), comment="坐席唯一标识")  # 坐席唯一标识
+    owner = db.Column(db.String(50), comment="坐席名称")  # 坐席名称
+    ownerLeader = db.Column(db.String(50), comment="坐席主管")  # 坐席主管
+    isDelete = db.Column(db.Integer(), default=0, comment="删除")  # 删除
+    lastUpdateTime = db.Column(db.DateTime(), comment="最后同步时间")  # 最后同步时间
+    createTime = db.Column(db.DateTime(), comment="创建时间")  # 创建时间
+    status999 = db.Column(db.String(30), comment="客户状态")  # 客户状态
+    belongTo = db.Column(db.String(300), comment="线索归属")  # 线索归属
+    interfaceBatch = db.Column(db.String(300), comment="接口插入批次")  # 接口插入批次
+    spaceNumber = db.Column(db.String(100), comment="空号")
+    phoneDown = db.Column(db.String(100), comment="停机")
+    purchaseNumber = db.Column(db.String(100), comment="购买数量")
+    testField = db.Column(db.String(100), comment="测试")
+    subscribeArticle = db.Column(db.Text(), comment="最近订阅普通公告")
+    supplementContact = db.Column(db.String(300), comment="补充联系人")
+    belongToIndustry = db.Column(db.String(800), comment="所属行业")
+    recentGeneralNotice = db.Column(db.String(1000), comment="最近订阅普通公告")
+    recentPlanToBuild = db.Column(db.String(1000), comment="最近订阅拟建项目")
+    recentPurchaseIntention = db.Column(db.String(1000), comment="最近订阅采购意向")
+    remarks = db.Column(db.String(255), comment="备注")
+
+
+class CustomerUpdateLogs(db.Model):
+    __tablename__ = 'customerUpdateLogs'
+    logId = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True, comment="日志ID")
+    logCreateTime = db.Column(db.DateTime(), comment="记录时间")
+    updateStatus = db.Column(db.Integer(), comment="更新状态成功or失败")
+    updateType = db.Column(db.String(20), comment="更新类型")
+    changeField = db.Column(db.Text(), comment="更新字段")
+    unique_id = db.Column(db.String(100), comment="呼叫中心用户标识")
+    company = db.Column(db.String(100), comment="公司名称")  # 公司名称..
+    username = db.Column(db.String(100), comment="姓名")  # 姓名..
+    phone = db.Column(db.String(100), comment="联系人电话")  # 联系人电话
+    email = db.Column(db.String(50), comment="邮箱")  # 邮箱..
+    address = db.Column(db.String(200), comment="职位")  # 职位..
+    usernickname = db.Column(db.String(100), comment="用户昵称")  # 用户昵称..
+    product = db.Column(db.String(100), comment="购买的产品类型")  # 购买的产品类型
+    web = db.Column(db.String(50), comment="公司网站")  # 公司网站 ..
+    id = db.Column(db.String(50), comment="用户ID")  # 用户ID..
+    job = db.Column(db.String(255), comment="职位")  # 职位..
+    regtime = db.Column(db.DateTime(), comment="用户注册时间")  # 用户注册时间
+    payorderinfo = db.Column(db.String(255), comment="已支付订单信息")  # 已支付订单信息
+    unpayorderinfo = db.Column(db.String(255), comment="未支付订单类型")  # 未支付订单类型
+    source = db.Column(db.String(500), comment="销售线索来源")  # 销售线索来源
+    keyword = db.Column(db.Text(), comment="订阅关键词")  # 订阅关键词
+    area = db.Column(db.Text(), comment="订阅区域")  # 订阅区域
+    searchkeyword = db.Column(db.Text(), comment="搜索关键词")  # 搜索关键词
+    searcharea = db.Column(db.Text(), comment="搜索区域")  # 搜索区域
+    lastlogintime = db.Column(db.DateTime(), comment="最近一次登录时间")  # 最近一次登录时间
+    lastloginport = db.Column(db.String(50), comment="最近一次登录端口")  # 最近一次登录端口
+    isclickkf = db.Column(db.Integer(), comment="最近一周点击人工客服次数")  # 最近一周点击人工客服次数
+    browsetitle1 = db.Column(db.Text(), comment="最近浏览正文标题1")  # 最近浏览正文标题1
+    browsetitle2 = db.Column(db.Text(), comment="最近浏览正文标题2")  # 最近浏览正文标题2
+    browsetitle3 = db.Column(db.Text(), comment="最近浏览正文标题3")  # 最近浏览正文标题3
+    customerNeeds = db.Column(db.String(1000), comment="客户需求")  # 客户需求
+    customerFocus = db.Column(db.String(3000), comment="客户关注点")  # 客户关注点
+    wantGoods = db.Column(db.String(500), comment="意向产品")  # 意向产品
+    customerBudget = db.Column(db.String(100), comment="客户预算")  # 客户预算
+    rivalCompare = db.Column(db.String(100), comment="友商对比情况")  # 友商对比情况
+    isPolicymaker = db.Column(db.String(100), comment="是否为决策人")  # 是否为决策人
+    secondContactName = db.Column(db.String(100), comment="第二联系人姓名")  # 第二联系人姓名
+    secondContactJob = db.Column(db.String(100), comment="第二联系人职务")  # 第二联系人职务
+    secondContactPhone = db.Column(db.String(100), comment="第二联系人电话")  # 第二联系人电话
+    secondContactEmail = db.Column(db.String(50), comment="第二联系人邮件")  # 第二联系人邮件
+    thirdContactName = db.Column(db.String(100), comment="第三联系人姓名")  # 第三联系人姓名
+    thirdContactJob = db.Column(db.String(100), comment="第三联系人职务")  # 第三联系人职务
+    thirdContactPhone = db.Column(db.String(100), comment="第三联系人电话")  # 第三联系人电话
+    thirdContactEmail = db.Column(db.String(50), comment="第三联系人邮件")  # 第三联系人邮件
+    empNo = db.Column(db.String(50), comment="坐席唯一标识")  # 坐席唯一标识
+    owner = db.Column(db.String(50), comment="坐席名称")  # 坐席名称
+    ownerLeader = db.Column(db.String(50), comment="坐席主管")  # 坐席主管
+    isDelete = db.Column(db.Integer(), default=0, comment="删除")  # 删除
+    lastUpdateTime = db.Column(db.DateTime(), comment="最后同步时间")  # 最后同步时间
+    createTime = db.Column(db.DateTime(), comment="创建时间")  # 创建时间
+    status999 = db.Column(db.String(30), comment="客户状态")  # 客户状态
+    belongTo = db.Column(db.String(300), comment="线索归属")  # 线索归属
+    interfaceBatch = db.Column(db.String(300), comment="接口插入批次")  # 接口插入批次
+    spaceNumber = db.Column(db.String(100), comment="空号")
+    phoneDown = db.Column(db.String(100), comment="停机")
+    purchaseNumber = db.Column(db.String(100), comment="购买数量")
+    testField = db.Column(db.String(100), comment="测试")
+    subscribeArticle = db.Column(db.Text(), comment="最近订阅普通公告")
+    supplementContact = db.Column(db.String(300), comment="补充联系人")
+    belongToIndustry = db.Column(db.String(800), comment="所属行业")
+    recentGeneralNotice = db.Column(db.String(1000), comment="最近订阅普通公告")
+    recentPlanToBuild = db.Column(db.String(1000), comment="最近订阅拟建项目")
+    recentPurchaseIntention = db.Column(db.String(1000), comment="最近订阅采购意向")
+    remarks = db.Column(db.String(255), comment="备注")
+
+
+class CallRecords(db.Model):
+    __tablename__ = 'voice_record'
+    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True, comment="记录ID")
+    createTime = db.Column(db.DateTime(), comment="创建时间")
+    CallSheetID = db.Column(db.String(100), comment="通话记录的ID")
+    CallID = db.Column(db.String(100), comment="通话ID")
+    CustomerName = db.Column(db.String(100), comment="客户名称")
+    CustomerID = db.Column(db.String(100), comment="客户ID")
+    CallType = db.Column(db.String(50), comment="呼叫类型")
+    CallNo = db.Column(db.String(50), comment="主叫号码")
+    CalledNo = db.Column(db.String(50), comment="被叫号码")
+    Ring = db.Column(db.DateTime(), comment="开始呼叫时间")  # 开始呼叫时间
+    RingingTime = db.Column(db.DateTime(), comment="响铃时间")  # 开始呼叫时间
+    Begin = db.Column(db.DateTime(), comment="摘机接通时间")  # 摘机接通时间
+    End = db.Column(db.DateTime(), comment="通话结束时间")
+    CallTimeLength = db.Column(db.String(20), comment="通话时长(单元:秒)")
+    QueueTime = db.Column(db.DateTime(), comment="呼入来电进入技能组时间")
+    Queue = db.Column(db.String(100), comment="呼入来电进入的技能组")
+    QueueId = db.Column(db.String(30), comment="呼入来电进入的技能组号")
+    AccountID = db.Column(db.String(50), comment="账户ID")
+    ActionID = db.Column(db.String(50), comment="请求ID")
+    Agent = db.Column(db.String(50), comment="坐席登录名")
+    Exten = db.Column(db.String(50), comment="坐席工号")
+    State = db.Column(db.String(50), comment="通话记录状态")
+    MonitorFilename = db.Column(db.String(500), comment="录音文件链接地址")
+    RecordFile = db.Column(db.String(500), comment="录音文件名")
+    FileServer = db.Column(db.String(500), comment="录音文件地址")
+    PBX = db.Column(db.String(50), comment="坐席所在的PBX")
+    AgentName = db.Column(db.String(50), comment="坐席姓名")
+    DepartmentName = db.Column(db.String(50), comment="坐席所在部门名称")
+    CallState = db.Column(db.String(50), comment="事件状态")
+    RealState = db.Column(db.String(50), comment="内部处理参数")
+    Province = db.Column(db.String(50), comment="省份")
+    District = db.Column(db.String(50), comment="市区")
+    isInQueue = db.Column(db.String(50), comment="是否进入技能组")
+    IVRKEY = db.Column(db.String(50), comment="ivr按键值")
+    IVRKeyName = db.Column(db.String(50), comment="ivr按键名称")
+    Hanguper = db.Column(db.String(50),
+                         comment="挂断方,caller:主叫,callee:被叫,systemTransfer:系统转接,transferOuter:转接外线,agent:坐席,customer:客户")
+    uptimestamp = db.Column(db.String(50), comment="坐席接起电话的时间戳")
+    DisposalAgentLocal = db.Column(db.String(50), comment="接听坐席的直线号码")
+    LastIVRNode = db.Column(db.String(50), comment="终结节点")
+    Investigate = db.Column(db.String(50), comment="满意度按键值")
+    HangupCause = db.Column(db.String(50), comment="通话拦截原因")
+    HangupCauseDetail = db.Column(db.String(50), comment="外呼防骚扰拦截原因")
+    DoMainName = db.Column(db.String(100), comment="通话服务器域名")
+    TASK_ID = db.Column(db.String(50), comment="表单批量任务ID")
+    FORM_ID = db.Column(db.String(50), comment="表单ID")
+    callrescode = db.Column(db.String(50), comment="表单ID")
+    detail = db.Column(db.String(50), comment="表单ID")
+    OriginalFromCID = db.Column(db.String(50), comment="表单ID")
+    callHistoryId = db.Column(db.Integer(), comment="拨打记录")
+
+
+class CustomerFollowUp(db.Model):
+    __tablename = "customer_follow_up"
+    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True, comment="记录ID")
+    customerId = db.Column(db.String(50), comment="客户唯一id")
+    customerName = db.Column(db.String(300), comment="跟进的客户名称")
+    createTime = db.Column(db.String(300), comment="创建时间")
+    remark = db.Column(db.Text(), comment="手动输入的跟进内容")
+    followRemindTime = db.Column(db.DateTime, comment="跟进计划时间")
+    isNotFollow = db.Column(db.String(20), comment="是否为不再跟进")
+    dataType = db.Column(db.String(50), comment="推送数据类型:followContent: 跟进内容新增, followPlan: 跟进计划变更")
+    dbTypeName = db.Column(db.String(300), comment="所属客户数据库名")
+
+
+db.create_all()

+ 41 - 0
apps/normal_field.py

@@ -0,0 +1,41 @@
+# coding:utf-8
+import datetime
+
+
+def repair_time(body, field):
+    if field not in body:
+        return body
+    this_time = body.get(field, "")
+    try:
+        dd = datetime.datetime.strptime(this_time, "%Y-%m-%d %H:%M:%S")
+        print(type(dd))
+    except Exception as e:
+        print(e)
+        del body[field]
+    return body
+
+
+def repair_int(body, field):
+    if field not in body:
+        return body
+    str_value = body.get(field, "")
+    try:
+        int_value = int(str_value)
+        body[field] = int_value
+    except Exception as e:
+        print(e)
+        del body[field]
+    return body
+
+
+FieldCleanMap = {"time": repair_time, "int": repair_int}
+
+if __name__ == '__main__':
+    times01 = "2022-04-02 10:47:42"
+    body = {'unique_id': '123456', 'phone': '13373929153', 'isDelete': '', 'address': '',
+            'job': '', 'regtime': "2022-04-02 10:47:42", 'lastUpdateTime': "None",
+            'status999': 'status6'}
+    body = repair_time(body, "regtime")
+    body = repair_int(body, "lastUpdateTime")
+    print(body)
+

+ 17 - 0
apps/send_email.py

@@ -0,0 +1,17 @@
+# coding:utf-8
+import time
+import requests
+from loguru import logger
+
+
+def sendMail(content: str):
+    content = content + '<br>' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
+    api_url = 'http://172.17.145.179:19281/_send/_mail'
+    api_parm = {
+        'to': "yaojingge@topnet.net.cn",
+        'title': '客户数据同步异常',
+        'body': content,
+    }
+    response = requests.get(api_url, api_parm)
+    logger.info('邮件发送 ' + response.text)
+

+ 235 - 0
callServer.py

@@ -0,0 +1,235 @@
+# coding:utf-8
+from apps.models import app
+from flask import request
+from apps.models import db
+from apps.models import Customer
+from apps.models import CustomerUpdateLogs
+from apps.models import CallRecords, CustomerFollowUp
+from typing import Dict
+from loguru import logger
+from apps.send_email import sendMail
+from apps.normal_field import FieldCleanMap
+import datetime
+from hashlib import md5
+from docs.config import voice_secret_key
+import json
+import urllib.parse
+import re
+
+logger.add('./logs/runtime_{time}.log', rotation='00:00')
+SpecialField = {"regtime": "time", "lastlogintime": "time", "lastUpdateTime": "time", "isclickkf": "int",
+                "isDelete": "int", "createTime": "time"}
+
+
+def insert_body(json_body: Dict) -> bool:
+    try:
+        customer = Customer(**json_body)
+        db.session.add(customer)
+        db.session.commit()
+    except Exception as e:
+        logger.warning(f"{json_body.get('unique_id')}更新失败--->{e}")
+        db.session.rollback()
+        sendMail(f"{json_body.get('unique_id')}插入失败--->{e}")
+        return False
+    return True
+
+
+def insert2db(db_object: Dict, errcode: str) -> bool:
+    try:
+        db.session.add(db_object)
+        db.session.commit()
+    except Exception as e:
+        print(e)
+        db.session.rollback()
+        sendMail(f"{errcode}插入失败--->{e}")
+        return False
+    return True
+
+
+def update_body(exists_body, json_body: Dict) -> bool:
+    try:
+        for state, value in json_body.items():
+            setattr(exists_body, state, value)
+        db.session.commit()
+    except Exception as e:
+        db.session.rollback()
+        logger.warning(f"{json_body.get('unique_id')}更新失败--->{e}")
+        sendMail(f"{json_body.get('unique_id')}更新失败--->{e}")
+        return False
+    return True
+
+
+def insert_logs(json_body: Dict) -> bool:
+    try:
+        logs = CustomerUpdateLogs(**json_body)
+        db.session.add(logs)
+        db.session.commit()
+    except Exception as e:
+        logger.warning(f"{json_body.get('unique_id')}日志更新失败--->{e}")
+        db.session.rollback()
+        sendMail(f"{json_body.get('unique_id')}日志插入失败--->{e}")
+        return False
+    return True
+
+
+def verify_code(verify_body: dict) -> bool:
+    """
+    请求头密钥验证
+    :param verify_body:
+    :return:
+    """
+    timestamp = verify_body.get("TimestampKey").strip()
+    code = verify_body.get("EncryptionToken").strip()
+    verify_data = str(timestamp) + voice_secret_key
+    real_key = md5(verify_data.encode("utf-8")).hexdigest()
+    if real_key == code:
+        return True
+    return False
+
+
+def replace_pic(body, fields):
+    '''
+    检查替换头像特殊编码
+    :param body:
+    :param fields:
+    :return:
+    '''
+    for field in fields:
+        if body.get(field):
+            body[field] = re.sub(u'[\U00010000-\U0010ffff]', " ", body.get(field, ""))
+    return body
+
+
+@app.route('/', methods=['POST'])
+def tell():
+    if request.method == 'POST':
+        body = dict(request.form)
+        print(body)
+        if "phoneMemo" in body:
+            del body["phoneMemo"]
+        unique_id = body.get("unique_id", "")
+        body = replace_pic(body, ["usernickname", "company", "username"])
+
+        if not unique_id:
+            return "false"
+
+        # 字段类型转换
+        change_fields = []
+
+        for field, f_type in SpecialField.items():
+            body = FieldCleanMap[f_type](body, field)
+
+        # 更新时间
+        body["lastUpdateTime"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+        # 查询
+        exists_body = Customer.query.filter(Customer.unique_id == unique_id).first()
+        if not exists_body:
+            body["createTime"] = body["lastUpdateTime"]
+            state = insert_body(body)
+            body["logCreateTime"] = body["lastUpdateTime"]
+            body["updateStatus"] = 1 if state else 0
+            body["updateType"] = "插入"
+            change_fields = [key for key, value in body.items()]
+            body["changeField"] = ";".join(change_fields)
+            insert_logs(body)
+        else:
+            try:
+                for key, val in body.items():
+                    if str(exists_body.__dict__.get(key)) != str(val):
+                        if key not in ['createTime', 'lastUpdateTime']:
+                            change_fields.append(key)
+            except Exception as e:
+                logger.warning(e)
+            state = update_body(exists_body, body)
+            if change_fields:
+                body["logCreateTime"] = body["lastUpdateTime"]
+                body["updateStatus"] = 1 if state else 0
+                body["updateType"] = "更新"
+                body["changeField"] = ";".join(change_fields)
+                insert_logs(body)
+            else:
+                print("未更新")
+        if not state:
+            return "false"
+        return "200"
+
+
+@app.route('/', methods=['POST'])
+def tell():
+    pass
+
+
+@app.route('/voice', methods=['GET'])
+def voice_sync():
+    time_dict = {"Ring": "time", "RingingTime": "time", "Begin": "time", 'End': "time", 'QueueTime': "time"}
+    if request.method == 'GET':
+        body = dict(request.args)
+        is_real = verify_code(body)
+        if not is_real:
+            return
+        for field, f_type in time_dict.items():
+            body = FieldCleanMap[f_type](body, field)
+        call_sheet_id = body.get("CallSheetID")
+        body = replace_pic(body, ["CustomerName"])
+        callId = body["callId"]
+        if callId:
+            body["callHistoryId"] = callId
+        exists_body = CallRecords.query.filter(CallRecords.CallSheetID == call_sheet_id).first()
+        if exists_body:
+            update_body(exists_body, body)
+            return "succeed"
+        call = CallRecords()
+        this_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+        setattr(call, "createTime", this_time)
+        for attr_key, value in body.items():
+            if attr_key in CallRecords.__dict__:
+                value = value.strip()
+                setattr(call, attr_key, value)
+        state = insert2db(call, f"语音同步失败-->{call_sheet_id}")
+        if not state:
+            return "error"
+        return "succeed"
+
+
+@app.route('/followup', methods=['POST'])
+def followup():
+    TimeStr = {"followRemindTime": "time"}
+    if request.method == 'POST':
+        body = request.get_data()
+        if body is None or body == "":
+            return "200"
+        body = json.loads(body)
+        body = replace_pic(body, ["customerName"])
+
+        convert_body = {}
+        for key, val in body.items():
+            convert_body[key] = urllib.parse.unquote(val)
+        body = convert_body
+        print(body)
+        for field, f_type in SpecialField.items():
+            body = FieldCleanMap[f_type](body, field)
+        customerId = body.get("customerId", "")
+        if not customerId:
+            return "200"
+        try:
+            body["createTime"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+            customerFollowUp = CustomerFollowUp()
+            for attr in ["customerId", "customerName", "createTime", "remark", "followRemindTime", "isNotFollow",
+                         "dataType", "dbTypeName"]:
+                if attr in body:
+                    if attr in TimeStr:
+                        if not body[attr]:
+                            continue
+                    setattr(customerFollowUp, attr, body[attr])
+            state = insert2db(customerFollowUp, f"跟进客户{customerId}状态同步错误")
+            if not state:
+                return "error"
+        except Exception as e:
+            logger.warning(e)
+            return "error"
+        return "200"
+
+
+if __name__ == '__main__':
+    app.run(host="0.0.0.0", port=15001, processes=True)

BIN
docs/__pycache__/config.cpython-37.pyc


+ 15 - 0
docs/config.py

@@ -0,0 +1,15 @@
+# coding:utf-8
+from urllib import parse
+
+
+class MysqlConfig(object):
+    def __init__(self):
+        self.HOSTNAME = '192.168.3.14'
+        self.PORT = '4000'
+        self.DATABASE = 'Call_Accounting'
+        self.USERNAME = 'root'
+        self.PASSWORD = parse.quote_plus('=PDT49#80Z!RVv52_z')
+
+
+mysqlConfig = MysqlConfig()
+voice_secret_key = "f085b6e211"

+ 0 - 0
logs/runtime_2022-08-27_15-10-23_128309.log


+ 25 - 0
requirements.txt

@@ -0,0 +1,25 @@
+certifi==2021.10.8
+charset-normalizer==2.0.12
+click==8.1.3
+Flask==2.1.2
+Flask-SQLAlchemy==2.5.1
+greenlet==1.1.2
+idna==3.3
+importlib-metadata==4.11.3
+itsdangerous==2.1.2
+Jinja2==3.1.2
+loguru==0.6.0
+MarkupSafe==2.1.1
+numpy==1.21.6
+pandas==1.3.5
+pymongo==4.1.1
+PyMySQL==1.0.2
+python-dateutil==2.8.2
+pytz==2022.1
+requests==2.27.1
+six==1.16.0
+SQLAlchemy==1.4.36
+typing_extensions==4.2.0
+urllib3==1.26.9
+Werkzeug==2.1.2
+zipp==3.8.0

+ 24 - 0
test.py

@@ -0,0 +1,24 @@
+# coding:utf-8
+import requests
+from apps.models import CallRecords
+
+# result = requests.get("https://hljys.jydev.jianyu360.com/", data={"快乐": "2", "x": "sdf"})
+
+params = {'CallNo': '02182442803', 'CallSheetID': '10687dee-ee0f-4390-8ebc-39847034deb0', 'CalledNo': '15880278879',
+          'CallID': '1658210924.69586', 'CallType': 'dialout', 'PBX': '1.101.3.101',
+          'RecordFile': 'monitor/1.101.3.101/20220719/20220719-140844_N000000029739_15880278879_915880278879_1658210924.69586.mp3',
+          'Ring': '2022-07-19 14:08:44', 'Begin': '', 'End': '2022-07-19 14:09:45', 'RingingTime': '', 'QueueTime': '',
+          'CallTimeLength': '0', 'Queue': '', 'AccountID': 'N000000029739', 'Agent': '2858', 'Exten': '2858',
+          'AgentName': '周鑫', 'DepartmentName': '总部直销1组', 'DisposalAgentLocal': '',
+          'ActionID': 'Originate0.35279361663415165', 'CallState': 'Hangup', 'State': 'leak',
+          'FileServer': 'http://123.57.133.60:8990', 'Hanguper': 'callee', 'uptimestamp': '1658210924.55055',
+          'CustomerName': '西安朝前智能科技有限公司', 'CustomerID': 'ff9f9f90e91c11eca0691997fb5894d4', 'callrescode': '0',
+          'detail': '0102', 'OriginalFromCID': '02182442803', 'RealState': 'Ringing', 'Province': '福建省',
+          'District': '厦门', 'TimestampKey': '1658210985202', 'EncryptionToken': '6374cf8443374df09a7453343406c2dc',
+          'DoMainName': 'a6alipbxbj03.7x24cc.com',
+          'MonitorFilename': 'https://123.57.133.60:8990/monitor/1.101.3.101/20220719/20220719-140844_N000000029739_15880278879_915880278879_1658210924.69586.mp3'}
+import json
+# result = requests.get("https://hljys.jydev.jianyu360.com/voice",data=json.dump(params))
+result = requests.post("http://127.0.0.1:15001/followup",data=json.dumps(params))
+#
+print(result.text)

+ 75 - 0
update.py

@@ -0,0 +1,75 @@
+# coding:utf-8
+'''
+搬数据脚本
+'''
+import requests
+import pandas as pd
+from pymongo import MongoClient
+from loguru import logger
+
+logger.add('./logs/runtime_{time}.log', rotation='00:00')
+
+s_config = {
+    "host": "192.168.3.71",
+    "port": 3366,
+    "user": "root",
+    "password": "Topnet123",
+    "db": "yunyingData",
+    "charset": "utf8",
+}
+
+client = MongoClient("192.168.3.207:29098")
+m_col = client["qfw"]["user_sale"]
+# sql = DBHelper(s_config)
+if __name__ == '__main__':
+    from docs.config import insert_config
+    import time
+
+    # 18588850589
+    # 13991521248
+
+    # accessToken = "17FD2230024BCBBF3EA3466A4972EFBC"
+    data = pd.read_csv("./docs/06.csv", keep_default_na=False, dtype=str, low_memory=False)
+    data_cluster = data[['公司名称', '姓名', '联系人电话', '联系人邮箱', '职位', '用户昵称', '购买的产品类型', '公司网站',
+                         '客户状态', '所属人', '销售线索来源', '意向购买产品', "创建时间", '最近更新时间']]
+    fields = ["company", "username", "phone", "email", "job", "usernickname", "product", "web",
+              "status999", "empNo", "source", "wantGoods", "createTime", "lastUpdateTime"]
+    status = {"成交客户": "status0", "待签署客户": "status1", "高意向客户": "status2", "意向客户": "status3",
+              "潜在客户": "status4", "销售线索": "status5", "无意向客户": "status6"}
+    people = {"沈炳毅": "1836", "左远达": "2098", "陈鹏": "2109", "郭迪": "2248",
+              "龚文华": "2267", "王鹏": "2330", "王晨旭": "2335", "曾爽爽": "2364",
+              "剑鱼": "2372", "刘凯": "2513", "马佳鑫": "2527", "廉心玲": "2533",
+              "刘樊阳": "2571", "刘振宏": "2646", "明灿": "2709", "贾老师": "8001",
+              "田小亮": "8013", "0002": "8018", "高翔": "8546", "范宗洞": "8884"}
+    data_values = data_cluster.values
+    for row in data_values[:1]:
+        body01 = {}
+        for field, values in zip(fields, row):
+            body01[field] = values
+
+        if body01.get("status999", "") in status:
+            body01["status999"] = status[body01["status999"]]
+        if body01.get("empNo", "") in people:
+            body01["empNo"] = people[body01["empNo"]]
+            body01["owner"] = body01["empNo"]
+        body01["unique_id"] = body01["phone"]
+        # start = time.time()
+        ret = m_col.find({"phone": body01["phone"]}).sort("_id", -1).limit(0)
+        data = {'unique_id': 'test', 'status999': 'status6', 'empNo': '2335', 'owner': '2335',
+                'ownerLeader': '1836', 'company': '上海意满圆生物科技有限公司', 'username': '杨邦兴', 'phone': '13671992411',
+                'email': '', 'address': '', 'usernickname': '杨邦兴', 'product': '', 'web': '',
+                'id': '5f98f5066fa1c2e2068b0', 'job': '经理', 'regtime': '2020-10-28 12:35:18',
+                'payorderinfo': '未购买过剑鱼产品', 'unpayorderinfo': '无未支付订单', 'source': '点击查看采购意向项目信息详情后留资',
+                'keyword': '医疗,糖化,杨浦区', 'area': '', 'searchkeyword': '杨浦区,宝山区,抗原', 'searcharea': '',
+                'lastlogintime': '2022-05-13 11:07:06', 'lastloginport': 'APP', 'isclickkf': None,
+                'browsetitle1': '上海市宝山区中西医结合医院2022年4月至5月政', 'browsetitle2': '中外华东有限公司2022年医疗项目仓储服务资源采购',
+                'browsetitle3': '2022年中国电信上海公司新型冠状病毒抗原检测试剂盒采购项目成交供', 'customerNeeds': '', 'customerFocus': '',
+                'wantGoods': '', 'customerBudget': '', 'rivalCompare': '', 'isPolicymaker': '', 'secondContactName': '',
+                'secondContactJob': '', 'secondContactPhone': '', 'secondContactEmail': '', 'thirdContactName': '',
+                'thirdContactJob': '', 'thirdContactPhone': '', 'thirdContactEmail': ''}
+
+        result = requests.post("http://callcenter.jydev.jianyu360.com/", data=data)
+        # result = requests.post("http://localhost:5001", data=data)
+        print(body01['phone'])
+        if result.text != "200":
+            logger.warning(f"{body01['phone']}")