Files
F6--/其它系统脚本/yida_zidongfaquan.py
2026-01-30 11:28:35 +08:00

350 lines
16 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 基础信息
import pandas as pd
import numpy as np
import requests
import json
import time
import re
import sys
from datetime import datetime
from dateutil.relativedelta import relativedelta
from pathlib import Path
from urllib.parse import quote
from datetime import date, timedelta
import datetime
from io import BytesIO
ROOT = Path('.').absolute() # 当前工作目录
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_processes_instances(token, formUuid, page, n):
""" 函数功能:读取流程表单的所有数据 """
api = f'https://api.dingtalk.com/v1.0/yida/processes/instances?pageNumber={page}&pageSize={n}'
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), # 如果增加上这一项会要求升级宜搭存储
"instanceStatus": "RUNNING" # 运行中
}
res = requests.post(api, headers=headers, json=formData)
return res.json()
def get_approval_records(token: str, processInstanceId: str):
""" 函数功能:获取流程表单的审批记录 """
appType = "APP_UYZ0KG6L0CCNV80GZ66O"
systemToken = "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2"
userId = "yida_pub_account"
api = f'https://api.dingtalk.com/v1.0/yida/processes/operationRecords?appType={appType}&systemToken={systemToken}&userId={userId}&language=zh_CN&processInstanceId={processInstanceId}'
headers = {
"Content-Type": "application/json",
"x-acs-dingtalk-access-token": token
}
res = requests.get(api, headers=headers)
# print('获取流程表单的审批记录')
return res.json()
def aggree_approval(token: str, taskId: str, processInstanceId: str,res_new,formDataJson):
""" 函数功能:同意审批节点 """
api = f'https://api.dingtalk.com/v1.0/yida/tasks/execute'
headers = {
"Content-Type": "application/json",
"x-acs-dingtalk-access-token": token
}
payload = {
"outResult": "AGREE",
"appType": "APP_UYZ0KG6L0CCNV80GZ66O",
"systemToken": "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
"remark": "同意(接口自动)",
"formDataJson": json.dumps(formDataJson),
"processInstanceId": processInstanceId,
# "userId": "yida_pub_account",
"userId": res_new,
"language": "zh_CN",
"taskId": int(taskId)
}
res = requests.post(api, headers=headers, json=payload)
# print('同意审批节点')
return res
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 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 Batch_creation(FORMID,TOKEN,ALL_formData):
""" 获取组件信息 """
api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'
headers = {
"Content-Type": "application/json",
"x-acs-dingtalk-access-token": TOKEN
}
payload = {
# "formDataJson" : json.dumps(formData, cls=NpEncoder),
"noExecuteExpression" : "false",
"formUuid" : FORMID,
"appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
"asynchronousExecution" : "false",
"systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
"keepRunningAfterException" : "true",
"userId" : "yida_pub_account",
"formDataJsonList" : ALL_formData,
# "formDataJsonList" : json.dumps(ALL_formData, cls=NpEncoder),
}
res = requests.post(api, headers=headers, json=payload)
return res.json()
def queryCompanies(cellPhone):
""" 函数功能:自动发券查询手机号所处公司 """
api = 'http://manage.f6yc.com/hive-admin/yida/account/query?cellPhone=' + cellPhone
headers = {
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
}
res = requests.post(api,headers=headers)
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)
# '''获取表内控件信息 '''
# FORMID_NEW = "FORM-XHA66881AUMBJR6171OZXBSJD7F929XA7HCJLX"
# component_list = component(FORMID_NEW,TOKEN)
# for i in range(len(component_list['result'])):
# componentName = component_list['result'][i]['componentName']
# name_value = component_list['result'][i]['label']['value']
# fieldId = component_list['result'][i]['fieldId']
# print("'",fieldId,"':","data[",name_value,"][i],#",name_value)
""" 处理流程开始 """
TOKEN = generateToken()
FORMID = "FORM-MFA66S91S4YBY5D36RN1JB2SD8V13CX4OFCJL3" # 【客成专用】批量自动发券
# 读取续约流程表单
form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
PAGES = form_data.get('totalCount')//100 + 1
""" 获取全量数据 """
for i in range(1, PAGES+1):
form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)
for v in range(0,len(form_data.get('data'))):
# 获取当前所处节点
res_new = get_approval_records(token=TOKEN, processInstanceId=form_data['data'][v]['processInstanceId'])
records_new = res_new.get('result')
# 获取审批节点的 taskId
records_new = [item for item in records_new if item.get('type') == "TODO"]
taskId_new = records_new[0]['activityId']
taskId = records_new[0]['taskId']
if taskId_new=="sid-1b527e18-2053-657f-cdfd-5530aefcc5b7":
print("开始处理!")
""" 读取相关数据 """
'''读取商品和券信息'''
FORMID_TWO = "FORM-6L966171O3RB70TJDB75R6RBI31V2NNACKCJLF1" # 商品ID券ID关系表
all_skuId = {}
all_couponTemplateId = {}
form_data_TWO = read_instances(token=TOKEN, formUuid=FORMID_TWO, page=1, n=100)
PAGES_TWO = form_data_TWO.get('totalCount')//100 + 1
for a in range(1, PAGES_TWO+1):
form_data_TWO = read_instances(token=TOKEN, formUuid=FORMID_TWO, page=a, n=100)
for data in form_data_TWO.get('data'):
all_skuId[data['formData']['textField_vmqmrm1'] + data['formData']['textField_cfm11ut']] = data['formData']['textField_nt0h72h']
all_couponTemplateId[data['formData']['textField_vmqmrm1'] + data['formData']['textField_cfm11ut']] = data['formData']['textField_47og525']
# print(len(all_skuId),len(all_couponTemplateId))
import psycopg2
import pandas as pd
# 获得连接
conn = psycopg2.connect(database="f6_bi", user="BASIC$ro_caowei", password="!ro_caowei123", host="hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com", port="80")
# 获得游标对象,一个游标对象可以对数据库进行执行操作
cursor = conn.cursor()
import datetime
now_time = datetime.datetime.now()
yes_time = now_time + datetime.timedelta(days=-1)
yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期
# sql语句 建表
sql =f"""SELECT * FROM "public"."holo_ads_report_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}';"""
# 执行语句
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)
# 关闭数据库连接
cursor.close()
conn.close()
FORMID_ONE = "FORM-XHA66881AUMBJR6171OZXBSJD7F929XA7HCJLX" # 【禁止提交】自动触发明细表
all_CODE = {}
form_data_ONE = read_instances(token=TOKEN, formUuid=FORMID_ONE, page=1, n=100)
PAGES_ONE = form_data_ONE.get('totalCount')//100 + 1
for F in range(1, PAGES_ONE+1):
form_data_ONE = read_instances(token=TOKEN, formUuid=FORMID_ONE, page=F, n=100)
for data in form_data_ONE.get('data'):
if data['formData']['textField_ljchgz1h'] =="同意":
all_CODE[data['formData']['textField_ljchgz1f']] = data['formData']['textField_ljchgz1f']
""" 开始分别读取数据并填充数据进行创建 """
succeed_all = 0
fail_all = 0
txt_code_all = ""
for data in form_data['data'][v]['data']['tableField_ljcfpjg4']:
result = data_NGV[data_NGV['org_code'] == data['textField_ljcfpjg6']]
result = result.reset_index()
ALL_formData = []
data_new = {}
try:
cellPhone_group_name = queryCompanies(data["textField_ljcfpjg8"])
groupName_all = {}
for data_two in cellPhone_group_name['data']['groupList']:
groupName_all[data_two["groupName"]]=data_two["groupId"]
except:
data_new['textField_ljchgz1h'] = "F6中不存在该手机号!"
try:
data_new = {
'textField_ljchgz12':data["textField_ljcfpjg8"],#"cellPhone"
'textField_ljchgz16':"2268275546837446",#"dingDingId"
'textField_ljchgz17':2,#"stage"
'textField_ljchgz18':1,#"couponApplyType"
'textField_ljchgz19':all_couponTemplateId[result['saas_edition_fmt'][0] + data['textField_ljcgefye']],#"couponTemplateId"
'textField_ljchgz1a':data["textField_ljcfpjg5"],#"couponAmount"
'textField_ljchgz1b':1,#"grantGroup"
'textField_ljchgz1c':result['id_own_group'][0],#"groupId"
'textField_ljchgz1d':all_skuId[result['saas_edition_fmt'][0] + data['textField_ljcgefye']],#"skuId"
'textField_ljchgz1e':result['id_own_org'][0],#"orgId"
'textField_ljchgz13':0,#"demotion"
'textField_ljchgz14':0,#"demotionSaaSEdition"
'textField_ljchgz15':data["textField_ljcfpjg7"],#"公司名称"
'textField_ljchgz1f':data["textField_ljcfpjg6"],#"门店编码"
# 'textField_ljchgz1i':data["数据集"][i],#"数据集"
'textField_ljchgz1h':"同意",#"check结果"
}
data_new['textField_ljchgz1i'] = str({
"cellPhone":data["textField_ljcfpjg8"], # 收劵人手机号码
"dingDingId":"2268275546837446", # 申请人钉钉ID
"stage":2, # 所属阶段(新签:1,续约:2
"couponApplyType":1, # 优惠券申请类型;新签:saas优惠劵申请:1,短信优惠劵申请:2,人工服务优惠劵申请:3;续约:saas续约优惠劵申请:1,saas升级优惠劵申请:2,短信优惠劵申请:3,人工服务优惠劵申请:4(暂不支持)
"detailList":[{ # 发劵明细列表
"couponTemplateId":all_couponTemplateId[result['saas_edition_fmt'][0] + data['textField_ljcgefye']], # 劵模板ID
"couponAmount":int(data["textField_ljcfpjg5"]), # 劵金额,>0
"grantGroup":1, # 1:发送到公司+人,0:发送到人
"groupId":result['id_own_group'][0], # 发放公司ID,发在公司下=true是有值
"skuId":all_skuId[result['saas_edition_fmt'][0] + data['textField_ljcgefye']], # 商品id
"orgId":result['id_own_org'][0], # 门店ID,(申请续约劵并且降级时必填)
"demotion":0, # 降级(是:1,否:0
"demotionSaaSEdition":0 # 降级版本,门店降级时必填
}]
})
data_new['textField_ljchgz1i'] = data_new['textField_ljchgz1i'].replace("'", '"')
data_new['textField_ljchgz1i'] = data_new['textField_ljchgz1i'].replace(" ", "")
if data["textField_ljcfpjg7"] != result['group_name'][0]:
data_new['textField_ljchgz1h'] = "公司名称与门店编码对应的group_name关系错误!"
if data["textField_ljcfpjg7"] not in groupName_all:
data_new['textField_ljchgz1h'] = "联系电话与公司名称对应的contact_mobile关系错误!"
except:
data_new['textField_ljchgz1h'] = "数据异常无法创建集合数据!"
if data["textField_ljcfpjg6"] in all_CODE:
data_new['textField_ljchgz1h'] = "已经发过券了,请勿重复发券!"
if data_new['textField_ljchgz1h'] == "同意":
succeed_all = succeed_all + 1
else:
fail_all = fail_all + 1
try:
txt_code_all = txt_code_all &","& data["textField_ljcfpjg7"]
except:
pass
ALL_formData.append(json.dumps(data_new, cls=NpEncoder))
FORMID_NEW = "FORM-XHA66881AUMBJR6171OZXBSJD7F929XA7HCJLX" # 【禁止提交】自动触发明细表
res = Batch_creation(FORMID_NEW,TOKEN,ALL_formData)
print(res)
time.sleep(2)
txt_all = f"发送成功:{succeed_all}条;发送失败:{fail_all}条;{txt_code_all}"
res=aggree_approval(token=TOKEN, taskId=taskId, processInstanceId=form_data['data'][v]['processInstanceId'],res_new ="2268275546837446",formDataJson={"textField_ljcfpjgd":txt_all})
print(form_data['data'][v]['processInstanceId'],res.json())
time.sleep(2)