350 lines
16 KiB
Python
350 lines
16 KiB
Python
# 基础信息
|
||
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)
|