From 9798071f68546d5bd0e4e22f37d2d2cf976c46bc Mon Sep 17 00:00:00 2001
From: z66 <1415243231@qq.com>
Date: Mon, 10 Nov 2025 14:11:15 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E8=BD=A6=E5=AE=9D=E6=8E=92=E6=9F=A5?=
=?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8F=8A=E7=BB=AD=E7=BA=A6=E5=BE=85=E5=8A=9E?=
=?UTF-8?q?=E6=B4=BE=E5=8F=91=E6=95=B0=E6=8D=AE=E6=BA=90=E5=8A=A0=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/csv-editor.xml | 14 -
back_ground_module/common_module.py | 112 ++---
back_ground_module/logs/error_task.log | 3 +
config.py | 8 +
test/yida_xuyuedaiban_paifa.py | 627 +++++++++++++++++++++++++
test/续约待办派发.py | 117 +++++
6 files changed, 806 insertions(+), 75 deletions(-)
create mode 100644 test/yida_xuyuedaiban_paifa.py
create mode 100644 test/续约待办派发.py
diff --git a/.idea/csv-editor.xml b/.idea/csv-editor.xml
index ace31cd..bac47a5 100644
--- a/.idea/csv-editor.xml
+++ b/.idea/csv-editor.xml
@@ -31,20 +31,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/back_ground_module/common_module.py b/back_ground_module/common_module.py
index 58f2748..12fa813 100644
--- a/back_ground_module/common_module.py
+++ b/back_ground_module/common_module.py
@@ -25,6 +25,7 @@ class CommonModule:
# 创建一个存储日期的集合,用于去重
self.date_set = set()
self.conn = Config.CONN_INFO
+ self.renewal_conn = Config.CONN_INFO_RENEWAL
def time_to_UTC(self, time_input):
"""
@@ -123,7 +124,7 @@ class CommonModule:
return data_NGV
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取NGV明细失败: {e}")
return None
def get_yichang_details(self, days_back=1):
@@ -170,11 +171,49 @@ class CommonModule:
return data_yichang
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取异常明细时出错: {e}")
+ return None
+
+ def get_renewal_details(self, ):
+ """
+ 从固定的数据库中获取续约待办数据
+ """
+ try:
+ # 获得连接
+ conn = psycopg2.connect(**self.renewal_conn)
+ cursor = conn.cursor()
+
+ # 获取指定天数前的日期
+ now_time = datetime.now()
+ yes_time = now_time + timedelta(days=-2)
+ yes_time_nyr = int(yes_time.strftime('%Y%m%d')) # 获取前两天日期
+
+ # 获取指定天数前的日期
+ today = date.today()
+ days_to_add = 120
+ future_date = str(today + timedelta(days=days_to_add))
+
+ print("距离今天还有{}天的日期是:{}".format(days_to_add, future_date))
+
+ sql = f"""SELECT * FROM "public"."holo_ads_report_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}' and "expiry_time" like '%{future_date}%';"""
+ # 执行语句并获取结果集
+ cursor.execute(sql)
+ rows = cursor.fetchall()
+ all_fields = cursor.description # 获取所有字段名
+
+ # 执行结果转化为dataframe
+ col = [i[0] for i in all_fields]
+ data_NGV = pd.DataFrame(list(rows), columns=col)
+
+ # 关闭数据库连接
+ cursor.close()
+ conn.close()
+
+ return data_NGV
+ except Exception as e:
+ error_task_logger.error(f"获取续约待办数据时出错: {e}")
return None
- def get_saas_data(self):
- pass
def get_jcb_details(self, ):
"""
@@ -260,7 +299,7 @@ class CommonModule:
return data_NGV
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取借车宝NGV明细时出错: {e}")
return None
def get_syxcx_details(self, ):
@@ -313,7 +352,7 @@ class CommonModule:
return data_SY
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取私域小程序数据时出错: {e}")
return None
def get_commission_details(self, ):
@@ -363,12 +402,12 @@ class CommonModule:
return data_commission
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取小六提成数据时出错: {e}")
return None
def get_differentindustries_details(self, ):
"""
- 从f6operation_data_relay数据库中获取小六提成数据。
+ 从f6operation_data_relay数据库中获取异业合作数据。
返回pandas DataFrame。
"""
@@ -413,7 +452,7 @@ class CommonModule:
return data_commission
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取异业合作数据时出错: {e}")
return None
def get_perforamnce_details(self, ):
@@ -467,62 +506,13 @@ class CommonModule:
return data_commission
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取履约表数据时出错: {e}")
return None
- def get_commission_details(self, ):
- """
- 从f6operation_data_relay数据库中获取小六提成数据。
- 返回pandas DataFrame。
- """
-
- try:
- # 获得连接并创建游标
- conn = pymysql.connect(
- host=Config.BI_CONN_host,
- database=Config.BI_CONN_INFO_database,
- user=Config.BI_CONN_INFO_user,
- password=Config.BI_CONN_INFO_password,
- # charset='utf8mb4', # 设置字符集以避免编码问题
- # cursorclass=pymysql.cursors.DictCursor # 返回字典形式的结果
- )
- cursor = conn.cursor()
-
- # 获取指定天数前的日期
- # now_time = datetime.now()
- # target_time = now_time + timedelta(days=-days_back)
-
- # SQL 查询语句
- sql = f"""
- SELECT * FROM JianDaoYun_DailyVisit_Commission;
- """
-
- # 执行查询并获取结果
- cursor.execute(sql)
- rows = cursor.fetchall() # pymysql 的 DictCursor 会返回字典列表
-
- # 将结果转换为 DataFrame
- if rows: # 如果有数据
- data_commission = pd.DataFrame(rows)
- else: # 如果没有数据,返回空 DataFrame
- data_commission = pd.DataFrame()
- # 关闭游标
- cursor.close()
- headers = [
- "门店id", "提成类型_二级分类", "提成基数(本月)", "提成基数(上月)", "公司id", "门店编码", "门店名称"
- ]
-
- data_commission.columns = headers
-
- return data_commission
-
- except Exception as e:
- print(f"Error occurred: {e}")
- return None
def get_GroupNotification_details(self, ):
"""
- 从f6operation_data_relay数据库中获取小六提成数据。
+ 从f6operation_data_relay数据库中获取短信数据支撑数据。
返回pandas DataFrame。
"""
@@ -568,7 +558,7 @@ class CommonModule:
return data_commission
except Exception as e:
- print(f"Error occurred: {e}")
+ error_task_logger.error(f"获取短信数据支撑数据时出错: {e}")
return None
from datetime import datetime, timedelta, UTC, timezone
diff --git a/back_ground_module/logs/error_task.log b/back_ground_module/logs/error_task.log
index 5aec961..5d34629 100644
--- a/back_ground_module/logs/error_task.log
+++ b/back_ground_module/logs/error_task.log
@@ -8525,3 +8525,6 @@ Traceback (most recent call last):
File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\range.py", line 417, in get_loc
raise KeyError(key)
KeyError: 'org_code'
+2025-11-10 09:33:28,889 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:获取接车宝数据失败,返回None
+2025-11-10 09:34:26,005 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:获取接车宝数据失败,返回None
+2025-11-10 09:44:51,934 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:获取接车宝数据失败,返回None
diff --git a/config.py b/config.py
index f3fddc9..c169270 100644
--- a/config.py
+++ b/config.py
@@ -13,6 +13,14 @@ class Config:
"port": "80"
} # SaaS-NGV 数据库链接配置-postgresql
+ CONN_INFO_RENEWAL = {
+ "database": "f6_bi",
+ "user": "LTAI5tMJsijFA9BS1R6uBpUT",
+ "password": "PajEQMIRWNRcipd8mYvlud2KHWJr6N",
+ "host": "hgpostcn-cn-m1e4gikbu00l-cn-shanghai.hologres.aliyuncs.com",
+ "port": "80"
+ } # 续约回访数据库链接配置-postgresql
+
HS_DB_Config = {
'host': "f6-public.rwlb.rds.aliyuncs.com",
'user': "rw_operation_data_relay",
diff --git a/test/yida_xuyuedaiban_paifa.py b/test/yida_xuyuedaiban_paifa.py
new file mode 100644
index 0000000..67b68d9
--- /dev/null
+++ b/test/yida_xuyuedaiban_paifa.py
@@ -0,0 +1,627 @@
+import datetime
+starttime = datetime.datetime.now()
+
+# -*- coding: utf-8 -*-
+import psycopg2
+import pandas as pd
+from datetime import date, timedelta
+# 获得连接
+# conn = psycopg2.connect(database="f6_bi", user="BASIC$ro_caowei", password="!ro_caowei123", host="hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com", port="80")
+conn = psycopg2.connect(database="f6_bi", user="LTAI5tMJsijFA9BS1R6uBpUT", password="PajEQMIRWNRcipd8mYvlud2KHWJr6N", host="hgpostcn-cn-m1e4gikbu00l-cn-shanghai.hologres.aliyuncs.com", port="80")
+
+# 获得游标对象,一个游标对象可以对数据库进行执行操作
+cursor = conn.cursor()
+
+import datetime
+now_time = datetime.datetime.now()
+yes_time = now_time + datetime.timedelta(days=-2)
+yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期
+
+today = date.today()
+days_to_add = 120
+future_date = str(today + timedelta(days=days_to_add))
+# 输出结果
+print("距离今天还有{}天的日期是:{}".format(days_to_add, future_date))
+# sql语句 建表
+sql =f"""SELECT * FROM "public"."holo_ads_report_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}' and "expiry_time" like '%{future_date}%';"""
+# 执行语句
+cursor.execute(sql)
+# 获取结果集的每一行
+rows = cursor.fetchall()
+# 获取所有字段名
+all_fields = cursor.description
+#执行结果转化为dataframe
+col = []
+for i in all_fields:
+ col.append(i[0])
+data_NGV = pd.DataFrame(list(rows),columns=col)
+# data_NGV.to_excel(r'C:\Users\admin\Desktop\NGV明细.xlsx')
+# 关闭数据库连接
+cursor.close()
+conn.close()
+
+# 基础函数配置
+import pandas as pd
+import pandas as pd
+import requests
+from pathlib import Path
+from urllib.parse import quote
+import json
+import numpy as np
+import time
+from datetime import date, timedelta
+
+ROOT = Path('.').absolute() # 当前工作目录
+textField_lrzoowld = "正常" # 运行状态
+textField_lrzoowlb = "" # 信息说明
+def generateToken() -> str:
+ """ 生成 token """
+
+ token_api = 'https://api.dingtalk.com/v1.0/oauth2/accessToken'
+
+ # 该信息在钉钉开放应用中
+ data = {
+ "appKey": "ding5kqocon5s9oph5uq",
+ "appSecret": 'HL1jgsIIfLAC0eTH0A1m4mwxUDqbgsiPeCCGGE3ocM6qJBTIW7Ivt9drxF_Z4Kb_'
+ }
+
+ res = requests.post(token_api, json=data)
+ token = res.json()['accessToken']
+
+ return token
+
+def read_instances(token, formUuid, page, n):
+ """ 函数功能:读取普通表单的所有数据 """
+
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ formData = {
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "userId" : "yida_pub_account",
+ "language" : "zh_CN",
+ "formUuid" : formUuid,
+ "currentPage" : page,
+ "pageSize" : n
+ }
+
+ res = requests.post(api, headers=headers, json=formData)
+ return res.json()
+
+def read_delete(token, formInstanceId):
+ """ 函数功能:调用本接口删除表单数据。 """
+
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ formData = {
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "userId" : "yida_pub_account",
+ "language" : "zh_CN",
+ "formInstanceId" : formInstanceId
+ }
+
+ res = requests.delete(api, headers=headers, json=formData)
+ return res.json()
+
+def read_new(FORMID,formData):
+ """ 通过实例id 获取表单内容 """
+ api = f'https://api.dingtalk.com/v1.0/yida/forms/instances'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": TOKEN
+ }
+ payload = {
+ "formUuid" : FORMID,
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "formDataJson" : json.dumps(formData, cls=NpEncoder),
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "language" : "zh_CN",
+ "userId" : "yida_pub_account"
+ }
+
+ res = requests.post(api, headers=headers, json=payload)
+ print(res.json())
+
+ return res.json()
+
+def component(FORMID,TOKEN):
+ """ 获取组件信息 """
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": TOKEN
+ }
+ payload = {
+ "formUuid" : FORMID,
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ # "formDataJson" : json.dumps(formData, cls=NpEncoder),
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ # "language" : "zh_CN",
+ "userId" : "yida_pub_account"
+ }
+
+ res = requests.get(api, headers=headers, json=payload)
+
+ return res.json()
+def initiate_process(TOKEN,formData):
+ """ 发起宜搭审批流程 """
+ api = f'https://api.dingtalk.com//v1.0/yida/processes/instances/start'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": TOKEN
+ }
+ payload = {
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "userId" : "yida_pub_account",
+ "language" : "zh_CN",
+ "formUuid" : "FORM-PE866MD1MJMU0WGLYRFLYEN5YN9L1I55Z7ZUK22",
+ "formDataJson" : json.dumps(formData, cls=NpEncoder),
+ "processCode" : "TPROC--PE866MD1MJMU0WGLYRFLYEN5YN9L1885Z7ZUK32",
+ }
+
+ res = requests.post(api, headers=headers, json=payload)
+ return res.json()
+
+def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):
+ """ 批量删除表单实例 """
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": TOKEN
+ }
+
+ payload = {
+ "formUuid" : FORMID,
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "asynchronousExecution" : "true",
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "formInstanceIdList" : json.dumps(ALL_DATA_instance, cls=NpEncoder),
+ "userId" : "yida_pub_account",
+ "executeExpression" : "false" # 不触发
+ }
+
+ res = requests.post(api, headers=headers, json=payload)
+ return res.json()
+
+def delete_in(TOKEN,formInstanceIdList):
+ """ 逐条删除表单实例 """
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": TOKEN
+ }
+ res = requests.delete(api, headers=headers)
+ return res.json()
+
+def read_instances_ngv(token, formUuid, page, n,searchField):
+ """ 函数功能:读取普通表单的所有数据 """
+
+ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ formData = {
+ "appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
+ "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
+ "userId" : "yida_pub_account",
+ "language" : "zh_CN",
+ "formUuid" : formUuid,
+ "searchFieldJson": json.dumps(searchField),
+ "currentPage" : page,
+ "pageSize" : n
+ }
+
+ res = requests.post(api, headers=headers, json=formData)
+ return res.json()
+
+class NpEncoder(json.JSONEncoder):
+ def default(self, obj):
+ if isinstance(obj, np.integer):
+ return int(obj)
+ elif isinstance(obj, np.floating):
+ return float(obj)
+ elif isinstance(obj, np.ndarray):
+ return obj.tolist()
+ else:
+ return super(NpEncoder, self).default(obj)
+
+import binascii
+import time
+import random
+from pyDes import des, CBC, PAD_PKCS5
+import requests
+
+def des_encrypt(s):
+ """
+ DES 加密
+ :param s: 原始字符串
+ :return: 加密后字符串,16进制
+ """
+ secret_key = 'HwdMBW8o'
+ iv = secret_key
+ k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+ en = k.encrypt(s, padmode=PAD_PKCS5)
+ return binascii.b2a_base64(en, newline=False)
+
+
+def des_descrypt(s):
+ """
+ DES 解密
+ :param s: 加密后的字符串,16进制
+ :return: 解密后的字符串
+ """
+ secret_key = 'HwdMBW8o'
+ iv = secret_key
+ k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+ de = k.decrypt(binascii.a2b_base64(s), padmode=PAD_PKCS5)
+ return de
+
+TOKEN = generateToken()
+'''读取省市小六技术专家区域客服区域客成 '''
+FORMID = "FORM-8C7E8036770B495D99862638F87FA8BFOEEN" #省市小六技术专家区域客服区域客成
+try:
+ # 读取流程表单数据
+ form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
+ PAGES = form_data.get('totalCount')//100 + 1
+ textField_gif29wy = {}
+ textField_3athky8 = {}
+ textField_3hgho1m = {}
+ textField_nc7gskc = {}
+ """ 获取全量数据 """
+ for i in range(1, PAGES+1):
+ # form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100, searchField={'textField_l7if5ff9': '否'})
+ form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)
+ for data in form_data.get('data'):
+ textField_gif29wy[data['formData']['textField_m3hchxc']]=data['formData']['textField_gif29wy'] #区域客成id # 根据市做判断
+ textField_3athky8[data['formData']['textField_m3hchxc']]=data['formData']['textField_3athky8'] #区域客服id
+ # textField_3hgho1m[data['formData']['textField_3hgho1m']]=data['formData']['textField_3hgho1m'] #小六id
+ # textField_nc7gskc[data['formData']['textField_nc7gskc']]=data['formData']['textField_nc7gskc'] #技术专家id
+ print(f'读取到省市小六技术专家区域客服区域客成表单中 {len(textField_gif29wy)} 条数据!')
+
+
+ '''遍历数据进行新建'''
+ data_NGV = data_NGV.astype('string')
+ data_NGV = data_NGV.fillna('',inplace=False)
+ group_grade = {
+ "普通客户(VIP)":10,
+ "重要客户(SVIP)":20,
+ "区域KA(MVP)":30,
+ "全国KA(FMVP)":50
+ }
+ # 过滤数据
+ for i in range(0,len(data_NGV["date_fmt"])):
+ try:
+ t = time.time()
+ ts = int(round(t * 1000))
+ randint = random.randint(100000000, 999999999)
+ req = data_NGV['id_own_org'][i] + "_" + str(ts) + "_" + str(randint)
+ str_en = des_encrypt(req)
+ req_new = str_en.decode('utf-8')
+
+ url = f"http://manage.f6yc.com/hive-admin/py/yida/renewal/orgInfo"
+ data = {
+ 'req':req_new,
+ 't':ts,
+ 'r':randint
+ }
+ res = requests.post(url,data=data)
+ formData = res.json()['data']['yidaFormData']
+ # 过期日期的时间戳
+ expire_timestamp = int(formData['dateField_ksirro5l'])/1000
+
+ # 获取距离过期日期前120天,前90天,前60天,前30天的日期
+ expire_date = datetime.datetime.fromtimestamp(expire_timestamp)
+ before_90_days = expire_date - datetime.timedelta(days=90)
+ before_60_days = expire_date - datetime.timedelta(days=60)
+ before_30_days = expire_date - datetime.timedelta(days=30)
+ # print(formData)
+ formData['dateField_ljzefdm4'] = str(int(before_90_days.timestamp()*1000)) # 90天限制日期
+ formData['dateField_ljzefdm5'] = str(int(before_60_days.timestamp()*1000)) # 60天限制日期
+ formData['dateField_ljzefdm6'] = str(int(before_30_days.timestamp()*1000)) # 30天限制日期
+
+
+ employeeField_kykw5ege = str(formData['employeeField_kykw5ege'])
+ employeeField_ksydghrd = str(formData['employeeField_ksydghrd'])
+ formData['employeeField_ljz6gvwc'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{textField_3athky8[formData['textField_kuj8nx01']]}']" # 区域客成+区域客服
+ # formData['employeeField_ljz6416i'] = f"[{textField_gif29wy[formData['textField_kuj8nx01']]}, {employeeField_kykw5ege}]" # 区域客成+小六
+ formData['employeeField_ljz6416i'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{employeeField_kykw5ege}']" # 区域客成+小六
+ formData['employeeField_ljz6416j'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{employeeField_ksydghrd}']" # 区域客成+技术专家
+ formData['employeeField_ljz6gvwd'] = textField_3athky8[formData['textField_kuj8nx01']] # 区域客服
+ formData['employeeField_ksydght0'] = textField_gif29wy[formData['textField_kuj8nx01']] # 区域客成
+
+ if employeeField_kykw5ege =="1824534815658365" or employeeField_kykw5ege =="0627252740652855":
+ if employeeField_ksydghrd =="":
+ employeeField_kykw5ege = '0627252740652855'
+ formData['employeeField_ljz6gvwc'] = '0627252740652855' # 区域客成+区域客服
+ formData['employeeField_ljz6416i'] = '0627252740652855' # 区域客成+小六
+ formData['employeeField_ljz6416j'] = '0627252740652855' # 区域客成+技术专家
+ formData['employeeField_ljz6gvwd'] = '0627252740652855' # 区域客服
+ formData['employeeField_ksydght0'] = '0627252740652855' # 区域客成
+ formData['employeeField_kykw5ege'] = '0627252740652855' # 专属运营顾问
+ formData['employeeField_ksirro5o'] = '0627252740652855' # 续约绩效归属人
+ else:
+ employeeField_kykw5ege = employeeField_ksydghrd
+ formData['employeeField_ljz6gvwc'] = employeeField_ksydghrd # 区域客成+区域客服
+ formData['employeeField_ljz6416i'] = employeeField_ksydghrd # 区域客成+小六
+ formData['employeeField_ljz6416j'] = employeeField_ksydghrd # 区域客成+技术专家
+ formData['employeeField_ljz6gvwd'] = employeeField_ksydghrd # 区域客服
+ formData['employeeField_ksydght0'] = employeeField_ksydghrd # 区域客成
+ formData['employeeField_kykw5ege'] = employeeField_ksydghrd # 专属运营顾问
+ formData['employeeField_ksirro5o'] = employeeField_ksydghrd # 续约绩效归属人
+ if formData['textField_kycfic6o'] == "区域KA(MVP)" or formData['textField_kycfic6o'] == "全国KA(FMVP)":
+ formData['employeeField_ljz6gvwc'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
+ formData['employeeField_ljz6416i'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
+ formData['employeeField_ljz6416j'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
+ formData['employeeField_ljz6gvwd'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
+ try:
+ formData['textField_ksirro5g'] = group_grade[data_NGV['group_grade'][i]]
+ formData['textField_kycfic6o'] = data_NGV['group_grade'][i]
+ except:
+ pass
+ try:
+ formData['textField_liwg9trm'] = res.json()['data']['franchiseGroupInfo']['groupName']
+ except:
+ pass
+ # 富文本 超链接 NGV
+ try:
+ form_data_ngv = read_instances_ngv(token=TOKEN, formUuid="FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91", page=1, n=100, searchField={'textField_l8nc9f2': data_NGV['id_own_org'][i]})
+ formData['editorField_m3gn517y'] = ["root",{},["p",{},["span",{"data-type":"text"},["span",{"data-type":"leaf"},""]],["a",{"href":"https://f6car.aliwork.com/APP_UYZ0KG6L0CCNV80GZ66O/formDetail/FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91?formInstId="+form_data_ngv['data'][0]['formInstanceId']+"&isAdmin=true"},["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},"点击查看门店NGV"]]],["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},""]]]] # 富文本 超链接 NGV
+ except:
+ pass
+ res_new = initiate_process(TOKEN,formData)
+ time.sleep(2)
+ print(res_new)
+
+ # 回传信息-------------------------------------------------------------------------------------------------------------
+ default_new = True
+ a_len = 1
+ while default_new:
+ t = time.time()
+ ts = int(round(t * 1000))
+ randint = random.randint(100000000, 999999999)
+ req = res_new['result'] + "|" + formData['textField_kuntp6fk'] + "|" + formData['textField_kuntp6fl']+ "|" + formData['employeeField_kykw5ege'] + "_" + str(ts) + "_" + str(randint)
+ str_en = des_encrypt(req)
+ print(str_en.decode('utf-8'))
+ req_new = str_en.decode('utf-8')
+ url = f"http://manage.f6yc.com/hive-admin/py/yida/renewal/insertRenewalFormsData"
+ data = {
+ 'req':req_new,
+ 't':ts,
+ 'r':randint
+ }
+ res = requests.post(url,data=data)
+ res.json()
+
+ if res.json()['message'] == "SUCCESS":
+ default_new = False
+ a_len = a_len + 1
+ if a_len > 5:
+ default_new = False
+ time.sleep(1)
+ '''校验是否新建正常'''
+ FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
+
+ if a_len < 5:
+ print("数据新建成功!")
+ else:
+ def start_instance_process(token: str, name):
+
+ """发送宜搭表单 -- 发起流程表单
+
+ Args:
+ token
+ data:需要发送的数据字典
+ """
+
+ yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start"
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ send_data = {
+ "textField_l9fe0uiw": name,
+ "textField_l9fe0uiv": name
+ }
+
+ payload = {
+ "appType": "APP_TNVBVZ3K8G56HG03Z45Q",
+ "systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
+ "userId": "yida_pub_account",# 超级管理员账号
+ "language": "zh_CN",
+ "formUuid": "FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2",
+ "formDataJson": json.dumps(send_data),
+ "processCode":"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2"
+ }
+
+ res = requests.post(yida_api, headers=headers, json=payload)
+ return res
+ try:
+ name = f"[流程]续约服务流程 新建后接口回传失败,请检查!{data_NGV['id_own_org'][i]}"
+ res_yujing = start_instance_process(TOKEN,name)
+ except:
+ textField_lrzoowld = "异常" # 运行状态
+ textField_lrzoowlb = "[流程]续约服务流程 新建后接口回传失败,请检查" # 信息说明
+ except:
+ '''校验是否新建正常'''
+ FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
+ def start_instance_process(token: str, name):
+
+ """发送宜搭表单 -- 发起流程表单
+
+ Args:
+ token
+ data:需要发送的数据字典
+ """
+
+ yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start"
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ send_data = {
+ "textField_l9fe0uiw": name,
+ "textField_l9fe0uiv": name
+ }
+
+ payload = {
+ "appType": "APP_TNVBVZ3K8G56HG03Z45Q",
+ "systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
+ "userId": "yida_pub_account",# 超级管理员账号
+ "language": "zh_CN",
+ "formUuid": "FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2",
+ "formDataJson": json.dumps(send_data),
+ "processCode":"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2"
+ }
+
+ res = requests.post(yida_api, headers=headers, json=payload)
+ return res
+ try:
+ name = f"[流程]续约服务流程 未成功新建,请检查!{data_NGV['id_own_org'][i]}"
+ res_yujing = start_instance_process(TOKEN,name)
+ textField_lrzoowld = "异常" # 运行状态
+ textField_lrzoowlb = "[流程]续约服务流程 未成功新建,请检查" # 信息说明
+ except:
+ pass
+except:
+ '''校验是否新建正常'''
+ FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
+ def start_instance_process(token: str, name):
+
+ """发送宜搭表单 -- 发起流程表单
+
+ Args:
+ token
+ data:需要发送的数据字典
+ """
+
+ yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start"
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ send_data = {
+ "textField_l9fe0uiw": name,
+ "textField_l9fe0uiv": name
+ }
+
+ payload = {
+ "appType": "APP_TNVBVZ3K8G56HG03Z45Q",
+ "systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
+ "userId": "yida_pub_account",# 超级管理员账号
+ "language": "zh_CN",
+ "formUuid": "FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2",
+ "formDataJson": json.dumps(send_data),
+ "processCode":"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2"
+ }
+
+ res = requests.post(yida_api, headers=headers, json=payload)
+ return res
+ try:
+ name = f"[流程]续约服务流程 表单数据读取失败,请检查!{data_NGV['id_own_org'][i]}"
+ res_yujing = start_instance_process(TOKEN,name)
+ except:
+ textField_lrzoowld = "异常" # 运行状态
+ textField_lrzoowlb = "[流程]续约服务流程 表单数据读取失败,请检查" # 信息说明
+
+try:
+ import requests
+ import json
+ import numpy as np
+ def generateToken() -> str:
+ """ 生成 token """
+
+ token_api = 'https://api.dingtalk.com/v1.0/oauth2/accessToken'
+
+ # 该信息在钉钉开放应用中
+ data = {
+ "appKey": "ding5kqocon5s9oph5uq",
+ "appSecret": 'HL1jgsIIfLAC0eTH0A1m4mwxUDqbgsiPeCCGGE3ocM6qJBTIW7Ivt9drxF_Z4Kb_'
+ }
+
+ res = requests.post(token_api, json=data)
+ token = res.json()['accessToken']
+
+ return token
+
+ def start_instance_process(token: str, send_data):
+
+ """发送宜搭表单 -- 发起流程表单
+
+ Args:
+ token
+ data:需要发送的数据字典
+ """
+
+ yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start"
+
+ headers = {
+ "Content-Type": "application/json",
+ "x-acs-dingtalk-access-token": token
+ }
+
+ payload = {
+ "appType": "APP_TNVBVZ3K8G56HG03Z45Q",
+ "systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
+ "userId": "yida_pub_account",# 超级管理员账号
+ "language": "zh_CN",
+ "formUuid": "FORM-96D58EF2219240C7B1F55F9CA463CD2D4MGC",
+ "formDataJson": json.dumps(send_data),
+ "processCode":"TPROC--5Q966D918T1I1AZM68NASC6TS13P3QOL3PZRLC"
+ }
+
+ res = requests.post(yida_api, headers=headers, json=payload)
+ return res
+
+ class NpEncoder(json.JSONEncoder):
+ def default(self, obj):
+ if isinstance(obj, np.integer):
+ return int(obj)
+ elif isinstance(obj, np.floating):
+ return float(obj)
+ elif isinstance(obj, np.ndarray):
+ return obj.tolist()
+ else:
+ return super(NpEncoder, self).default(obj)
+ '''校验是否正常运行'''
+ TOKEN = generateToken()
+ import datetime
+ endtime = datetime.datetime.now()
+ implement = (endtime - starttime).seconds
+ send_data = {
+ "textField_ls01al4o": implement, #运行耗时
+ "textField_lrzoowl8": "yida_xuyuedaiban_paifa", # 程序名称
+ "textField_lrzoowl9": "每天早上9点重新派发续约跟进任务", # 功能简述
+ "textField_lrzoowld": textField_lrzoowld, # 运行状态
+ "textField_lrzoowlb": textField_lrzoowlb # 信息说明
+ }
+ res_yujing = start_instance_process(TOKEN,send_data)
+except:
+ pass
+
+
diff --git a/test/续约待办派发.py b/test/续约待办派发.py
new file mode 100644
index 0000000..d1458b8
--- /dev/null
+++ b/test/续约待办派发.py
@@ -0,0 +1,117 @@
+# 标准库
+import os
+import time
+import random
+import json
+import binascii
+from datetime import date, timedelta, datetime
+from urllib.parse import quote
+from pathlib import Path
+
+# 第三方库
+import numpy as np
+import pandas as pd
+import requests
+from pyDes import des, CBC, PAD_PKCS5
+import mysql.connector
+from mysql.connector import Error
+
+# PostgreSQL(如果你用到了)
+import psycopg2
+
+# 自定义模块
+from config import Config
+from api import API
+from back_ground_module import CommonModule
+from log_config import configure_task_logger, configure_error_task_logger
+
+logger = configure_task_logger()
+error_task_logger = configure_error_task_logger()
+api_instance = API()
+common_module = CommonModule()
+output_dir = "output" # 设置输出目录
+os.makedirs(output_dir, exist_ok=True)
+
+class RenewalToDo:
+ def __init__(self):
+ self.json_list = None
+ self.data_NGV = None
+ self.staff_id_list = None
+ self.NGV_data_list = None
+
+
+ @staticmethod
+ def des_encrypt(s):
+ """
+ DES 加密
+ :param s: 原始字符串
+ :return: 加密后字符串,16进制
+ """
+ secret_key = 'HwdMBW8o'
+ iv = secret_key
+ k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+ en = k.encrypt(s, padmode=PAD_PKCS5)
+ return binascii.b2a_base64(en, newline=False)
+
+ @staticmethod
+ def des_descrypt(s):
+ """
+ DES 解密
+ :param s: 加密后的字符串,16进制
+ :return: 解密后的字符串
+ """
+ secret_key = 'HwdMBW8o'
+ iv = secret_key
+ k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+ de = k.decrypt(binascii.a2b_base64(s), padmode=PAD_PKCS5)
+ return de
+
+ def load_all_data(self):
+ # 获取NGV数据
+ payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "675bb02bd2d53c2034c665e4"}
+ self.NGV_data_list = api_instance.entry_data_list(payload).get("data")
+
+ # 获取简道云员工id
+ payload = {"api_key": "6694d3c4fcb69ca9a111a6c4",
+ "entry_id": "6769204a1902c9341340a1bc",
+ }
+ staff_id = api_instance.entry_data_list(payload)
+ self.staff_id_list = staff_id.get("data") # api请求格式,将数据封装在data字典里
+
+ # 省市区人员关系表
+ payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "676512ac3e54dc3159460c0a"}
+ json_dict = api_instance.entry_data_list(payload)
+ if json_dict and "data" in json_dict:
+ self.json_list = json_dict.get("data")
+ else:
+ print("加载省市区人员关系表失败")
+ self.json_list = []
+
+ # 数据库获取续约回访数据
+ self.data_NGV = common_module.get_renewal_details()
+
+ def process_data(self):
+ """
+
+ :return:
+ """
+
+
+ def main(self):
+ task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ try:
+ logger.info("任务开始")
+ # step1: 获取数据
+ self.load_all_data()
+ logger.info("加载数据完成")
+ # step2:数据处理
+ self.process_data()
+
+ common_module.send_task_status(task_start_time, "续约回访待办")
+ except Exception as e:
+ error_task_logger.error(f"续约回访待办发生错误{e}")
+ common_module.send_task_error(task_start_time, "续约回访待办", str(e))
+
+
+if __name__ == '__main__':
+ RenewalToDo().main()