662 lines
34 KiB
Python
662 lines
34 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 queryLastSaasInfo(cellPhone):
|
||
""" 函数功能:手机号查询最近一次购买saas明细 """
|
||
|
||
api = 'http://manage.f6yc.com/hive-admin/yida/order/queryLastSaasInfo?cellPhone=' + cellPhone
|
||
|
||
headers = {
|
||
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
|
||
}
|
||
res = requests.post(api,headers=headers)
|
||
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 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()
|
||
def queryDetailByOrgId(orgId):
|
||
""" 函数功能:自动发券查询门店上次成交价 """
|
||
|
||
api = 'http://manage.f6yc.com/hive-admin/yida/org/queryDetailByOrgId?orgId=' + orgId
|
||
|
||
headers = {
|
||
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
|
||
}
|
||
res = requests.post(api,headers=headers)
|
||
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 queryskuList():
|
||
""" 函数功能:按照商品分类查询商品列表接口 """
|
||
|
||
api = 'http://manage.f6yc.com/hive-admin/yida/sku/category/query?category=4'
|
||
|
||
headers = {
|
||
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
|
||
}
|
||
|
||
res = requests.post(api,headers=headers)
|
||
return res.json()
|
||
|
||
def couponAvailableQuery(cellPhone,groupId,skuList,passportId):
|
||
""" 函数功能:在当前选择场景下查询手机号可以使用的优惠券 http://manage.f6yc.com/hive-admin/ """
|
||
|
||
api = f'http://manage.f6yc.com/hive-admin/yida/coupon/available/query?passportId={passportId}&cellPhone={cellPhone}&groupId={groupId}&skuList' + str(skuList)
|
||
|
||
headers = {
|
||
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
|
||
}
|
||
|
||
res = requests.post(api,headers=headers)
|
||
return res.json()
|
||
|
||
def queryPriceInfoBySkuId(orgId,skuId,saasUpdate):
|
||
""" 函数功能:商品价格查询"""
|
||
|
||
api = f'http://manage.f6yc.com/hive-admin/yida/sku/queryPriceInfoBySkuId?orgId={orgId}&skuId={skuId}&saasUpdate={saasUpdate}'
|
||
|
||
headers = {
|
||
"token":"af88h9KvLQrdvVhFhS8zD1yWx9cu"
|
||
}
|
||
|
||
res = requests.post(api,headers=headers)
|
||
return res.json()
|
||
|
||
def read_instances_new(token, formUuid, page, n,CREATE_FROM, CREATE_TO):
|
||
""" 函数功能:读取流程表单的所有数据 """
|
||
|
||
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_RTPWHV37ENXPQUZHTL25",
|
||
"systemToken": "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
|
||
"userId": "yida_pub_account", # 超级管理员账号
|
||
"language": "zh_CN",
|
||
"formUuid": formUuid,
|
||
"createFromTimeGMT":CREATE_FROM,
|
||
"createToTimeGMT":CREATE_TO
|
||
# "searchFieldJson": json.dumps(searchField), # 如果增加上这一项会要求升级宜搭存储
|
||
# "instanceStatus": "RUNNING"
|
||
}
|
||
|
||
res = requests.post(api, headers=headers, json=formData)
|
||
return res.json()
|
||
|
||
def updateFormDataJson (token, formUuid, updateFormDataJson):
|
||
""" 函数功能:更新表单数据 """
|
||
|
||
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_RTPWHV37ENXPQUZHTL25",
|
||
"systemToken": "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
|
||
"userId": "yida_pub_account", # 超级管理员账号
|
||
"language": "zh_CN",
|
||
"formInstanceId": formUuid,
|
||
"updateFormDataJson":updateFormDataJson
|
||
}
|
||
|
||
res = requests.put(api, headers=headers, json=formData)
|
||
return res.json()
|
||
|
||
from datetime import datetime
|
||
import time
|
||
def get_time_range_minute(n):
|
||
""" 获取近n分钟的时间戳(单位是毫秒)"""
|
||
|
||
def delay_time(time_str, years=0, months=0, days=0, hours=0, minutes=0, seconds=0):
|
||
if type(time_str) == str:
|
||
time_str = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')
|
||
ret = time_str + relativedelta(years=years, months=months, days=days, hours=hours, minutes=minutes, seconds=seconds)
|
||
return ret
|
||
|
||
# 获得当前时间
|
||
now_time = datetime.now()
|
||
endTime = int(time.mktime(time.strptime(now_time.strftime('%Y/%m/%d %H:%M:%S'), '%Y/%m/%d %H:%M:%S'))) * 1000 - 1000
|
||
# n小时前的时间
|
||
ret2 = delay_time(now_time, minutes=-n)
|
||
startTime = int(time.mktime(time.strptime(ret2.strftime('%Y/%m/%d %H:%M:%S'), '%Y/%m/%d %H:%M:%S'))) * 1000
|
||
|
||
# print(f'时间区间:[{startTime}-{endTime}]')
|
||
return startTime, endTime
|
||
|
||
def timeStamp(timeNum):
|
||
""" 函数功能:将时间戳(毫秒) 转化为时间日期格式"""
|
||
timeStamp = float(timeNum/1000)
|
||
timeArray = time.localtime(timeStamp)
|
||
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
|
||
return otherStyleTime
|
||
# 4320分钟时间间隔
|
||
CREATE_FROM, CREATE_TO = [timeStamp(t) for t in get_time_range_minute(4320)]
|
||
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()
|
||
FORMID_NEW = "FORM-0A966I81N40CV1B48U18UBZAA8R92STJC7IJL9"
|
||
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)
|
||
|
||
""" 处理流程开始 """
|
||
FORMID = "FORM-0A966I81N40CV1B48U18UBZAA8R92STJC7IJL9" # 【测试版本】批量自动发券
|
||
# 读取续约流程表单
|
||
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-6470221a-82ec-4bdd-a873-245ee47a5605": # check
|
||
print("开始处理!")
|
||
# 读取NGV明细
|
||
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_TWO = "FORM-6L966171O3RB70TJDB75R6RBI31V2NNACKCJLF1" # 商品ID券ID关系表
|
||
all_skuId = {}
|
||
all_couponTemplateId = {}
|
||
textField_ljwon3vt = {}
|
||
textField_ljxv26ip = {}
|
||
list_new = 0
|
||
tableField_data_new = {}
|
||
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_TWO in form_data_TWO.get('data'):
|
||
all_skuId[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_nt0h72h']
|
||
all_couponTemplateId[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_47og525']
|
||
textField_ljwon3vt[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_ljwon3vt']
|
||
textField_ljxv26ip[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_ljxv26ip']
|
||
""" 开始分别读取数据并填充数据进行创建 """
|
||
for data in form_data['data'][v]['data']['tableField_ljcfpjg4']:
|
||
# 基础字段预设
|
||
data_new = {}
|
||
data_new['textField_ljibuzgd'] = ""
|
||
data_new['textField_ljibuzge'] = ""
|
||
try:
|
||
# 获取门店编码对应的信息
|
||
result = data_NGV[data_NGV['org_code'] == data['textField_ljcfpjg6']]
|
||
result = result.reset_index()
|
||
# 获取手机号+判断手机号是否在公司名下
|
||
# 获取手机号+判断手机号是否在公司名下
|
||
if data["textField_ljcfpjg8"] =="": # 手机号未填写,默认填充ngv中对应的手机号
|
||
data_new['textField_ljibuzgl'] = result['contact_mobile'][0]
|
||
else:
|
||
data_new['textField_ljibuzgl'] = data["textField_ljcfpjg8"]
|
||
cellPhone_group_name = queryCompanies(data_new['textField_ljibuzgl'])
|
||
groupName_all = {}
|
||
for data_two in cellPhone_group_name['data']['groupList']:
|
||
groupName_all[data_two["groupName"]]=data_two["groupId"]
|
||
try:
|
||
if len(cellPhone_group_name['data']['groupList']) > 0:
|
||
pass
|
||
else:
|
||
data_new['textField_ljibuzgl'] = data["textField_ljcfpjg8"]
|
||
data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] + "F6中不存在该手机号;"
|
||
except:
|
||
data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] + "F6中不存在该手机号;"
|
||
|
||
if result['group_name'][0] not in groupName_all:
|
||
data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] + "联系电话与门店编码关系错误;"
|
||
# # 本次成交年限(1、2、3) selectField_ljicmdwn
|
||
# if data["selectField_ljicmdwn"] =="1" or data["selectField_ljicmdwn"] =="2" or data["selectField_ljicmdwn"] =="3":
|
||
# data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] + "本次成交年限填写错误,请填写【1、2、3】;"
|
||
# 获取公司名称+门店名称+门店版本+到期日+门店编码
|
||
data_new['textField_ljibuzgm'] = result['group_name'][0]
|
||
data_new['textField_ljibuzgh'] = result['org_name'][0]
|
||
data_new['textField_ljibuzgi'] = result['saas_edition_fmt'][0]
|
||
data_new['textField_ljibuzgf'] = result['expiry_time'][0]
|
||
data_new['textField_ljibuzgn'] = result['org_code'][0]
|
||
# 获取上次成交价 textField_ljibuzgg
|
||
OrgId_list = queryDetailByOrgId(result['id_own_org'][0])
|
||
data_new['textField_ljibuzgg'] = OrgId_list['data']['lastSaasOrderPrice']/OrgId_list['data']['lastTransactionYear']
|
||
# 获取提前续约立减额 textField_ljibuzgj
|
||
try:
|
||
queryPriceInfoBySkuIdnew = queryPriceInfoBySkuId(result['id_own_org'][0],all_skuId[result['saas_edition_fmt'][0] + "1"],"false")
|
||
data_new['textField_ljibuzgj'] = queryPriceInfoBySkuIdnew['data']['renewalDiscountAmount']
|
||
except:
|
||
data_new['textField_ljibuzgj'] = "0"
|
||
# 版本续约金额
|
||
data_new['textField_lk6g6e2l'] = textField_ljwon3vt[result['saas_edition_fmt'][0] + "1"] # 版本续约金额
|
||
# 申请优惠券金额 numberField_ljwn6n7w_value 判断优惠券申请金额是否填写,如果没有填写则进行填充
|
||
# 本次成交价 numberField_ljwn6n7w_value 判断本次成交价是否填写,如果没有填写则进行填充
|
||
if data["numberField_ljwn6n7w_value"] != "":
|
||
data_new['textField_ljibuzgk'] = data["numberField_ljwn6n7w_value"]
|
||
if int(data["numberField_ljwn6n7w_value"]) <= 0:
|
||
data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] + "本次成交价需要大于0,或者为空;"
|
||
elif data["numberField_ljwn6n7w_value"] == "": # 判断本次成交价是否填写,如果没有填写则进行填充 默认取 上次成交价
|
||
data_new['textField_ljibuzgk'] = data_new['textField_ljibuzgg']
|
||
else:
|
||
data_new['textField_ljibuzgk'] =data["numberField_ljwn6n7w_value"]
|
||
|
||
# 获取申请优惠券金额 textField_ljibuzgp 申请优惠券金额= 版本价格-提前立减额-本次成交价
|
||
data_new['textField_ljibuzgp'] = int(data_new['textField_lk6g6e2l']) - int(data_new['textField_ljibuzgj']) - int(data_new['textField_ljibuzgk'])
|
||
|
||
# # 获取本次成交价格 textField_ljibuzgk
|
||
# if data["numberField_ljwn6n7w_value"] =="":
|
||
# data_new['textField_ljibuzgk'] = int(textField_ljwon3vt[result['saas_edition_fmt'][0] + "1"]) - int(data_new['textField_ljibuzgp'])- int(data_new['textField_ljibuzgj'])
|
||
# else:
|
||
# data_new['textField_ljibuzgk'] = int(textField_ljwon3vt[result['saas_edition_fmt'][0] + "1"]) - int(data_new['textField_ljibuzgp']) - int(data_new['textField_ljibuzgj'])
|
||
# 获取已有优惠券
|
||
passportId=int(cellPhone_group_name['data']['passportId'])
|
||
cellPhone=int(data_new['textField_ljibuzgl'])
|
||
groupId = int(result['id_own_group'][0])
|
||
skuList = queryskuList()
|
||
couponAvailableQuery_list = couponAvailableQuery(cellPhone,groupId,skuList,passportId)
|
||
for data_ONE in couponAvailableQuery_list['data']:
|
||
if "续约优惠券" in data_ONE ['couponName']:
|
||
data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] +"存在未使用的续约优惠券;"
|
||
data_new['textField_ljibuzge'] = data_new['textField_ljibuzge'] + data_ONE ['couponName'] + ":"+ str(data_ONE ['couponValue']) +";"
|
||
# 是否低于限价 radioField_ljxz9ho5 是否发券 radioField_ljibuzgc 版本限价 textField_lk6hj6sw
|
||
data_new['textField_lk6hj6sw'] = textField_ljxv26ip[result['saas_edition_fmt'][0] + "1"]
|
||
if int(data_new['textField_ljibuzgk']) < int(textField_ljxv26ip[result['saas_edition_fmt'][0] + "1"]):
|
||
data_new['radioField_ljxz9ho5'] = "是"
|
||
# data_new['radioField_ljibuzgc'] = "否"
|
||
else:
|
||
data_new['radioField_ljxz9ho5'] = "否"
|
||
# 是否的低于上次成交价 radioField_ljxz9ho6 是否发券 radioField_ljibuzgc
|
||
if int(data_new['textField_ljibuzgk']) < int(data_new['textField_ljibuzgg']):
|
||
data_new['radioField_ljxz9ho6'] = "是"
|
||
# data_new['radioField_ljibuzgc'] = "否"
|
||
else:
|
||
data_new['radioField_ljxz9ho6'] = "否"
|
||
if int(data_new['textField_ljibuzgj']) > 0:
|
||
data_new['textField_ljibuzgd'] = "存在提前续约立减额,不是30天内过期客户!"
|
||
if int(data_new['textField_ljibuzgp']) <= 0:
|
||
data_new['textField_ljibuzgd'] = "申请优惠金额需要大于0元!"
|
||
# # 集合 textField_ljy172na
|
||
# data_new['textField_ljy172na'] = str({
|
||
# "cellPhone":data_new["textField_ljibuzgl"], # 收劵人手机号码
|
||
# "dingDingId":form_data['data'][v]['originator']['userId'], # 申请人钉钉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] + "1"], # 劵模板ID
|
||
# "couponAmount":int(data_new["textField_ljibuzgp"]), # 劵金额,>0
|
||
# "grantGroup":1, # 1:发送到公司+人,0:发送到人
|
||
# "groupId":result['id_own_group'][0], # 发放公司ID,发在公司下=true是有值
|
||
# "skuId":all_skuId[result['saas_edition_fmt'][0] + "1"], # 商品id
|
||
# "orgId":result['id_own_org'][0], # 门店ID,(申请续约劵并且降级时必填)
|
||
# "demotion":0, # 降级(是:1,否:0)
|
||
# "demotionSaaSEdition":0 # 降级版本,门店降级时必填
|
||
# }]
|
||
# })
|
||
# data_new['textField_ljy172na'] = data_new['textField_ljy172na'].replace("'", '"')
|
||
|
||
# data_new['textField_ljy172na'] = data_new['textField_ljy172na'].replace(" ", "")
|
||
except:
|
||
data_new['textField_ljibuzgd'] = "数据读取异常:" + data_new['textField_ljibuzgd']
|
||
# CHECK结果校验 textField_ljibuzgd
|
||
if data_new['textField_ljibuzgd'] == "":
|
||
data_new['textField_ljibuzgd'] = "正确"
|
||
list_new = list_new + 1
|
||
# 回传结果
|
||
if list_new == 1:
|
||
tableField_data_new['tableField_ljibuzgq'] = [data_new]
|
||
else:
|
||
tableField_data_new['tableField_ljibuzgq'].append(data_new)
|
||
res=aggree_approval(token=TOKEN, taskId=taskId, processInstanceId=form_data['data'][v]['processInstanceId'],res_new ="2268275546837446",formDataJson=tableField_data_new)
|
||
print(form_data['data'][v]['processInstanceId'],res.json())
|
||
time.sleep(2)
|
||
elif taskId_new=="sid-23822834-234a-b12a-dfea-a6ad1acc8c1b": # API自动发券
|
||
print("开始处理发券!")
|
||
# 读取NGV明细
|
||
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_TWO = "FORM-6L966171O3RB70TJDB75R6RBI31V2NNACKCJLF1" # 商品ID券ID关系表
|
||
all_skuId = {}
|
||
all_couponTemplateId = {}
|
||
textField_ljwon3vt = {}
|
||
textField_ljxv26ip = {}
|
||
list_new = 0
|
||
succeed_all = 0
|
||
all_all= 0
|
||
tableField_data_new = {}
|
||
data_new = {}
|
||
data_check = {}
|
||
formDataJson_check = {}
|
||
code_new = ""
|
||
formDataJson_check['textField_ljcfpjgd'] = ""
|
||
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_TWO in form_data_TWO.get('data'):
|
||
all_skuId[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_nt0h72h']
|
||
all_couponTemplateId[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_47og525']
|
||
textField_ljwon3vt[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_ljwon3vt']
|
||
textField_ljxv26ip[data_TWO['formData']['textField_vmqmrm1'] + data_TWO['formData']['textField_cfm11ut']] = data_TWO['formData']['textField_ljxv26ip']
|
||
FORMID = "FORM-XHA66881FHMAR0F07GT4Y59GGA972DD6B5OHLB" # [流程]自动化优惠券(+多年)
|
||
# 读取[流程]自动化优惠券(+多年)
|
||
form_data_new = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100,CREATE_FROM=CREATE_FROM, CREATE_TO=CREATE_TO)
|
||
PAGES = form_data_new.get('totalCount')//100 + 1
|
||
ALL_DATA_code = []
|
||
""" 获取全量数据 """
|
||
for i in range(1, PAGES+1):
|
||
form_data_new = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100,CREATE_FROM=CREATE_FROM, CREATE_TO=CREATE_TO)
|
||
for data_one in form_data_new.get('data'):
|
||
try:
|
||
for j in range(0,len(data_one['data']['tableField_l1w05znp'])):
|
||
ALL_DATA_code.append(str(data_one['data']['tableField_l1w05znp'][j]['selectField_l1wxjd8l']) + "+" + str(data_one['data']['tableField_l1w05znp'][j]['textField_l5j0ym23']))
|
||
except:
|
||
pass
|
||
print(f'读取到 [[流程]自动化优惠券(+多年)表中 {len(ALL_DATA_code)} 条数据!')
|
||
for data in form_data['data'][v]['data']['tableField_ljibuzgq']: # -----------------------------------------------
|
||
updateFormDataJson_check = {}
|
||
# 获取门店编码对应的信息
|
||
result = data_NGV[data_NGV['org_code'] == data['textField_ljibuzgn']]
|
||
result = result.reset_index()
|
||
# 读取[流程]自动化优惠券(+多年)中存在该门店发券流程,避免重复发券
|
||
if str(data['textField_ljibuzgn']) + "+" + str(all_couponTemplateId[result['saas_edition_fmt'][0] + "1"]) in ALL_DATA_code:
|
||
# updateFormDataJson_check['textField_ljibuzgd'] = data['textField_ljibuzgd'] + "[流程]自动化优惠券(+多年)中存在该门店发券流程!;"
|
||
# updateFormDataJson_check['radioField_ljxz9ho5'] = "否"
|
||
# FORMID = "FORM-0A966I81N40CV1B48U18UBZAA8R92STJC7IJL9" # 【测试版本】批量自动发券
|
||
# res=updateFormDataJson(TOKEN, FORMID, updateFormDataJson_check)
|
||
# print(res.json)
|
||
code_new = code_new + data["textField_ljibuzgl"] + ";"
|
||
else:
|
||
# res=aggree_approval(token=TOKEN, taskId=taskId, processInstanceId=form_data['data'][v]['processInstanceId'],res_new ="2268275546837446",formDataJson=tableField_data_new)
|
||
# print(form_data['data'][v]['processInstanceId'],res.json())
|
||
# for data_ONE in couponAvailableQuery_list['data']:
|
||
# if "续约优惠券" in data_ONE ['couponName']:
|
||
# data_new['textField_ljibuzgd'] = data_new['textField_ljibuzgd'] +"存在未使用的续约优惠券;"
|
||
# data_new['textField_ljibuzge'] = data_new['textField_ljibuzge'] + data_ONE ['couponName'] + ":"+ str(data_ONE ['couponValue']) +";"
|
||
# check_all = check_all + 1
|
||
|
||
data_new['textField_ljy172na'] = str({
|
||
"cellPhone":data["textField_ljibuzgl"], # 收劵人手机号码
|
||
"dingDingId":form_data['data'][v]['originator']['userId'], # 申请人钉钉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] + "1"], # 劵模板ID
|
||
"couponAmount":int(float(data["textField_ljibuzgp"])), # 劵金额,>0
|
||
"grantGroup":1, # 1:发送到公司+人,0:发送到人
|
||
"groupId":result['id_own_group'][0], # 发放公司ID,发在公司下=true是有值
|
||
"skuId":all_skuId[result['saas_edition_fmt'][0] + "1"], # 商品id
|
||
"orgId":result['id_own_org'][0], # 门店ID,(申请续约劵并且降级时必填)
|
||
"demotion":0, # 降级(是:1,否:0)
|
||
"demotionSaaSEdition":0 # 降级版本,门店降级时必填
|
||
}]
|
||
})
|
||
data_list = {
|
||
'textField_ljchgz1f':data['textField_ljibuzgn'], # 门店编码
|
||
'textField_ljchgz1i':data_new['textField_ljy172na'], # 数据集
|
||
'textField_ljchgz1h':data['textField_ljibuzgd'], # check结果
|
||
'textField_ljy1x9kb':form_data['data'][v]['processInstanceId'], # 关联表单id
|
||
'textField_ljf6nf7s':data['radioField_ljibuzgc'] # 是否发券
|
||
}
|
||
ALL_formData = []
|
||
ALL_formData.append(json.dumps(data_list, cls=NpEncoder))
|
||
FORMID_NEW = "FORM-JD8668C1MFBC3ND4BWO736T7G5Q7318IC0YJLA" # 【测试版本】自动触发明细表
|
||
res = Batch_creation(FORMID_NEW,TOKEN,ALL_formData)
|
||
print(res)
|
||
time.sleep(2)
|
||
all_all = all_all + 1
|
||
if data['textField_ljibuzgd'] == "正确" and data['radioField_ljibuzgc'] == "是":
|
||
succeed_all = succeed_all + 1
|
||
fail_all = all_all - succeed_all
|
||
if len(code_new)>0:
|
||
txt_all = f"发送成功:{succeed_all}条;发送失败:{fail_all}条;{code_new}在[流程]自动化优惠券(+多年)中有申请记录!"
|
||
else:
|
||
txt_all = f"发送成功:{succeed_all}条;发送失败:{fail_all}条;"
|
||
formDataJson_check = {
|
||
'textField_ljcfpjgd':txt_all
|
||
}
|
||
res=aggree_approval(token=TOKEN, taskId=taskId, processInstanceId=form_data['data'][v]['processInstanceId'],res_new ="2268275546837446",formDataJson=formDataJson_check)
|
||
print(form_data['data'][v]['processInstanceId'],res.json())
|
||
time.sleep(2) |