Files
jefferyzhao 506dceb0f7 first commit
2025-07-31 15:53:14 +08:00

664 lines
24 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 requests, time, json, uuid, datetime
from config import *
from dateutil.relativedelta import relativedelta
import threading
import urllib3
import json
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
lock = threading.Lock()
def format_uct(origin_date_str):
origin_date_str = origin_date_str.split('.')[0]
utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%S")
local_date = utc_date + datetime.timedelta(hours=8)
local_date_str = datetime.datetime.strftime(local_date, '%Y-%m-%d %H:%M:%S')
return local_date_str
def filter_jdy_ht(id):
"""筛选简道云合同表单中驾驶员对应信息"""
url = f'{base_path}/api/v5/app/entry/data/list'
filter_data = {
"app_id": pay_app,
"entry_id": ht_id,
"limit": 100,
"filter": {
"rel": "and",
"cond": [
{
"field": "shfzhh",
"method": "eq",
"value": [id]
}
]
}
}
ht_detail = turn_page(url, filter_data)
if not ht_detail:
return []
ht_detail = ht_detail[0]
# 机构
jg = ht_detail['jg']
# 分司
fs = ht_detail['fs']
# 商户号
sh = ht_detail['sh']
# 商户号证书
shzs = ht_detail['shxl']
# 姓名
name = ht_detail['name']
# 车牌号
hphm = ht_detail['hphm']
# 分司负责人
fsfz = ht_detail['fsfz']['dept_no'] if ht_detail['fsfz'] else ""
return [jg, fs, sh, shzs, name, hphm, fsfz]
def queryUser(id):
# 查询充值明细
# user = get_user_info(id)
url = f'{base_path}/api/v5/app/entry/data/list'
filter_data = {
"app_id": fu_app,
"entry_id": pay_details_id,
"limit": 100,
"filter": {
"rel": "and",
"cond": [
{
"field": "pay_type",
"method": "eq",
"value": ["微信支付"]
},
{
"field": "id_card",
"method": "eq",
"value": [id]
}
]
}
}
pay_detail = turn_page(url, filter_data)
for i in pay_detail:
i['time'] = format_uct(i['time'])
# 查询个人余额
info = {
"app_id": pay_app,
"entry_id": accout_id,
"filter": {"rel": "and",
"cond": [
{
"field": "id_card",
"method": "eq",
"value": [id]
},
{
"field": "date",
"method": "empty",
}
]}
}
# 查询个人余额账户表 没有新增,有更新
res = req_tool_jdy(url, info)
balance = 0
if res['data']:
balance = res['data'][0]['balance']
balance = float("%.2f" % balance)
return {"balance": balance, "pay_detail": pay_detail}
def get_last_8_hour():
_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time() - 8 * 60 * 60))
return _time
def turn_page(url, data):
"""翻页查询"""
info = []
while 1:
try:
res = req_tool_jdy(url, data)
info += res['data']
if len(res['data']) < 100:
return info
data["data_id"] = res["data"][-1]["_id"]
except Exception as e:
print("turn_page", e, res)
def get_user_info(id, type=None):
"""获取用户信息"""
url = f'{base_path}/api/v5/app/entry/data/list'
if type:
filter_data = {
"app_id": fu_app,
"entry_id": fu_id,
"filter": {
"rel": "and",
"cond": [
{
"field": "id_card",
"method": "eq",
"value": [id]
}
]
}
}
else:
filter_data = {
"app_id": fu_app,
"entry_id": fu_id,
"filter": {
"rel": "and",
"cond": [
{
"field": "user",
"method": "eq",
"value": [id]
}
]
}
}
res = req_tool_jdy(url, filter_data)
if res['data']:
return res['data'][0]
return ''
def query_pay_details(id):
# 查询某人未收付明细
url = f'{base_path}/api/v5/app/entry/data/list'
filter_data = {
"app_id": pay_app,
"entry_id": uncollected_id,
"limit": 100,
"filter": {
"rel": "and",
"cond": [
{
"field": "sijishenfenzhenghao",
"method": "eq",
"value": [id]
},
{
"field": "unpay",
"method": "eq",
"value": [id]
},
]
}
}
uncollected_data = turn_page(url, filter_data)
#按业务编码后13位数字添加排序号
def extract_and_sort(code):
extracted = int(code[-13:])
return extracted
_data = []
for i in uncollected_data:
# flag = False
# for j in ["承包金", "调度费", "保养费", "社保个人费额"]:
# if j == i['fukuanshiyou']:
# flag = True
# break
# if not flag:
# continue
i['jine'] = float("%.2f" % i['jine']) if i['jine'] else 0
i['pay'] = float("%.2f" % i['pay']) if i['pay'] != None and i['pay'] != '' else 0
i['unpay'] = float("%.2f" % i['unpay']) if i['unpay'] != None and i['unpay'] != '' else 0
i['sort'] = 9999
# for j in rule_sort:
# if j in i['fukuanshiyou']:
i['sort'] = extract_and_sort(i['code'])
_data.append(i)
uncollected_data = _data
# uncollected_data = sorted(uncollected_data, key=lambda x: x['createTime'], reverse=True)
uncollected_data = sorted(uncollected_data, key=lambda x: x['sort'], reverse=False)
# 过滤已结清数据
uncollected_data = [i for i in uncollected_data if i['jine'] != i['pay']]
undata = {}
# 按月份归类 uncollected_data
for un in uncollected_data:
if un['yuefen'] in undata.keys():
undata[un['yuefen']]['data'].append(un)
else:
undata[un['yuefen']] = {"data": []}
undata[un['yuefen']]['data'] = [un]
# 按月查询增减项 flowState结束
amount = 0
for un in undata:
_th_amount = 0
del_list = []
filter_data = {
"app_id": hz_app,
"entry_id": hz_id,
"limit": 100,
"filter": {
"rel": "and",
"cond": [
{
"field": "id_card",
"method": "eq",
"value": [id]
},
{
"field": "month",
"method": "eq",
"value": [un]
},
]
}
}
hz_data_list = turn_page(url, filter_data)
# 应付总额 承包金定额=应收承包金-增减项
zj_sum = sum(item['jine'] for item in hz_data_list)
for index, j in enumerate(undata[un]['data']):
j['unpay'] = j['unpay'] if j['unpay'] else j['jine']
if '承包金' in j['fukuanshiyou'] and j['yewubiaodanmingcheng'] == '费税计划':
if j['pay'] - zj_sum == j['jine']:
del_list.append(index)
continue
# 定额 de = 表单中的金额-增减
# 应付金额 jine = 表单中的金额
# 未付金额 unpay = 应付金额-增减-已付金额
j['pay'] = j['pay'] if j['pay'] else 0
undata[un]['de'] = j['jine'] - zj_sum
# j['jine'] = undata[un]['de'] + zj_sum
j['unpay'] = j['jine'] - j['pay']
amount += j['unpay'] if j['unpay'] else j['jine']
_th_amount += j['unpay'] if j['unpay'] else j['jine']
undata[un]['_th_amount'] = _th_amount
undata[un]['hz'] = hz_data_list
for d in del_list:
undata[un]['data'].pop(d)
undata['amount'] = float("%.2f" % amount)
for i in list(undata.keys()):
if i != 'amount' and not undata[i]['data']:
del undata[i]
return undata
def req_tool_jdy(url, data):
headers = {"Authorization": f"Bearer {apikey}"}
while 1:
try:
res = requests.post(url, headers=headers, json=data, timeout=10, verify=False).json()
if "code" in res.keys():
print("req_tool_jdy", res)
time.sleep(2)
continue
return res
except Exception as e:
print(e)
def req_tool_vx(url, data=None, flag=None):
while 1:
try:
if not flag:
res = requests.post(url, json=data, timeout=10, verify=False).json()
else:
res = requests.get(url, timeout=10, verify=False).json()
return res
except Exception as e:
print(e)
def update_unpay(data):
"""更新未收付,添加已收付明细"""
url = f'{base_path}/api/v5/app/entry/data/update'
add_url = f'{base_path}/api/v5/app/entry/data/create'
del_url = f'{base_path}/api/v1/app/{pay_app}/entry/{uncollected_id}/data_delete'
for i in data:
if 'amount' == i:
continue
for j in data[i]['data']:
info = {
"app_id": pay_app,
"entry_id": uncollected_id,
"data_id": j['_id'],
"is_start_trigger": True,
"is_start_workflow": True,
"data": {
"pay": {"value": j['pay']},
"unpay": {"value": j['unpay']},
}
}
req_tool_jdy(url, info)
# 新增已收付明细
if 'flag' in j.keys() and float(j['flag_m']):
if not j['flag_m'] or not float(j['flag_m']):
continue
fs_p = j['fs_p']['dept_no'] if j['fs_p'] else ""
add_info = {
"app_id": pay_app,
"entry_id": received_id,
"is_start_trigger": True,
"is_start_workflow": True,
"data": {
"code": {"value": j['code']}, "type": {"value": "收款"},
"fukuanshiyou": {"value": j['fukuanshiyou']}, "month": {"value": j['yuefen']},
"yewubiaodanmingcheng": {"value": j['yewubiaodanmingcheng']},
"yewubiaodanbianma": {"value": j['yewubiaodanbianma']},
"sijixingming": {"value": j['sijixingming']},
"sijishenfenzhenghao": {"value": j['sijishenfenzhenghao']},
"company_jc": {"value": j['company_jc']}, "xd": {"value": j['xd']},
"sijisuozaigongsi": {"value": j['sijisuozaigongsi']}, "fs": {"value": j['fs']},
"license_plate": {"value": j['license_plate']}, "jine": {"value": j['jine']},
"pay": {"value": j['flag_m']}, "hz_month": {"value": j['hz_month']},
"fs_p": {"value": fs_p}, "bj": {"value": j['bj']}, "status1": {"value": "已清缴"},
"sy": {"value": "个人账户抵扣"}, "status": {"value": "已收款"},
"ys": {"value": j['ys']},
"zhunyingzhenghaoma": {"value": j['zhunyingzhenghaoma']},
"guanlibumen": {"value": j['guanlibumen']},
"guanlibumenfuzeren": {"value": j['guanlibumenfuzeren']['dept_no'] if j['guanlibumenfuzeren'] else ""},
}
}
req_tool_jdy(add_url, add_info)
print("shanchu=========", j['pay'], j['jine'])
if j['sijixingming'] == '姓名':
print(j)
if j['pay'] == j['jine']:
# 未收付已清缴,删除未收付明细
j['sy'] = "个人账户抵扣"
del_info = {
"data_id": j["_id"],
"is_start_trigger": True
}
req_tool_jdy(del_url, del_info)
def update_info(cz, _balcace, balance, user_info):
# 余额 = 累计充值金额-累计抵扣金额
# 本次抵扣=本次充值+本次余额-剩余金额
di = cz + balance - _balcace
"""更新个人账户余额"""
# if pay_amount:
# # 支付完有剩余余额可直接更新
# amount = pay_amount
# else:
# # 查询未收付历史数据
# details = query_pay_details(user_info['user']['username'])
# amount = details['amount']
# amount *= -1
url = f'{base_path}/api/v5/app/entry/data/list'
info = {
"app_id": pay_app,
"entry_id": accout_id,
"filter": {"rel": "and",
"cond": [
{
"field": "id_card",
"method": "eq",
"value": [user_info['id']]
},
{
"field": "date",
"method": "empty"
},
]}
}
# 查询个人余额账户表 没有新增,有更新
res = req_tool_jdy(url, info)
if res['data']:
# 更新
url = f'{base_path}/api/v5/app/entry/data/update'
pay = res['data'][-1]['pay'] + cz
di = di + (res['data'][-1]['deduction'] if res['data'][-1]['deduction'] else 0)
amount = pay - di # 累计充值-累计抵扣
info = {
"app_id": pay_app,
"entry_id": accout_id,
"data_id": res['data'][-1]["_id"],
"is_start_workflow": True,
"is_start_trigger": True,
"data": {
"pay": {"value": pay}, "balance": {"value": amount},
"deduction": {"value": di}
}
}
else:
# 新增
amount = cz - di # 本次充值-本次抵扣
if 'name' in user_info.keys():
name = user_info['name']
else:
name = ""
url = f'{base_path}/api/v5/app/entry/data/create'
info = {
"app_id": pay_app,
"entry_id": accout_id,
"is_start_workflow": True,
"is_start_trigger": True,
"data": {
"id_card": {"value": user_info['id']},
"name": {"value": name},
"pay": {"value": cz},
"deduction": {"value": di},
"balance": {"value": amount},
"jg": {"value": user_info['jg']},
"fs": {"value": user_info['fs']},
"fsfz": {"value": user_info['fsfz']},
"hphm": {"value": user_info['hphm']},
# "zhunyingzhenghaoma": {"value": user_info['zhunyingzhenghaoma']},
# "guanlibumen": {"value": user_info['guanlibumen']},
# "guanlibumenfuzeren": {"value": user_info['guanlibumenfuzeren']['dept_no'] if user_info['guanlibumenfuzeren'] else ""},
}
}
req_tool_jdy(url, info)
def add_payment(data, type=None):
lock.acquire()
print("开始========", data)
print(data, type)
# user = get_user_info(data['id'])
# 充值成功后 回写充值明细
now_month = datetime.datetime.now().strftime("%Y-%m")
now_time = get_last_8_hour()
url = f'{base_path}/api/v5/app/entry/data/create'
if not type:
info = {
"app_id": fu_app,
"entry_id": pay_details_id,
"is_start_workflow": True,
"is_start_trigger": True,
"data": {
"id_card": {"value": data['id']}, "name": {"value": data['name']},
"price": {"value": data['pay_amount']}, "pay_type": {"value": "微信支付"},
"coll_type": {"value": "网银"}, "month": {"value": now_month},
"jg": {"value": data['jg']}, "fs": {"value": data['fs']},
"hphm": {"value": data['hphm']},
"time": {"value": now_time}, "transactionid": {"value": data['transaction_id']}
}
}
if data['fsfz']:
info['data']["fsfz"] = {"value": data['fsfz']}
print("开始回写充值明细",'\n',url,'\n',info,'\n',"=======================================")
req_tool_jdy(url, info)
details = query_pay_details(data['id'])
dates = list(details.keys())
dates.sort()
dates.remove('amount')
pay_amount = data['pay_amount']
# 查询余额
balance = queryUser(data['id'])
pay_amount += balance['balance']
if pay_amount <= 0:
print("余额为0结束========", data)
lock.release()
return
print("执行add_payment", data)
next_month = (datetime.datetime.now().date() - relativedelta(months=-1)).strftime("%Y-%m")
if now_month in dates:
_tmp = details[now_month]['data']
_tmp = sorted(_tmp, key=lambda x: x['sort'])
for i in _tmp:
if pay_amount:
i['flag'] = 1
if '承包金' in i['fukuanshiyou']:
# 承包金实际需要缴纳的
if pay_amount < i['jine'] - i['pay']:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= (i['jine'] - i['pay'])
i['flag_m'] = (i['jine'] - i['pay'])
i['pay'] = i['jine']
i['unpay'] = 0
else:
if i['jine'] != i['pay']:
# 根据未支付的金额,扣除总金额
df = i['jine'] - i['pay']
if pay_amount < df:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= df
i['pay'] = i['jine']
i['unpay'] = 0
i['flag_m'] = df
for i in dates:
if i == next_month or i == now_month:
continue
_tmp = details[i]['data']
_tmp = sorted(_tmp, key=lambda x: x['sort'])
for i in _tmp:
if pay_amount:
i['flag'] = 1
if '承包金' in i['fukuanshiyou']:
# 承包金实际需要缴纳的
if pay_amount < i['jine'] - i['pay']:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= (i['jine'] - i['pay'])
i['flag_m'] = (i['jine'] - i['pay'])
i['pay'] = i['jine']
i['unpay'] = 0
else:
if i['jine'] != i['pay']:
# 根据未支付的金额,扣除总金额
df = i['jine'] - i['pay']
if pay_amount < df:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= df
i['pay'] = i['jine']
i['unpay'] = 0
i['flag_m'] = df
# 根据抵扣规则,更新未支付的数据,将清缴数据新增至已收付明细
if next_month in dates:
_tmp = details[next_month]['data']
_tmp = sorted(_tmp, key=lambda x: x['sort'])
for i in _tmp:
if pay_amount:
i['flag'] = 1
if '承包金' in i['fukuanshiyou']:
# 承包金实际需要缴纳的
if pay_amount < i['jine'] - i['pay']:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= (i['jine'] - i['pay'])
i['flag_m'] = (i['jine'] - i['pay'])
i['pay'] = i['jine']
i['unpay'] = 0
else:
if i['jine'] != i['pay']:
# 根据未支付的金额,扣除总金额
df = i['jine'] - i['pay']
if pay_amount < df:
# 修改 i['pay'] 充值金额,推送修改
i['pay'] += pay_amount
i['unpay'] = i['jine'] - i['pay']
i['flag_m'] = pay_amount
pay_amount = 0
else:
pay_amount -= df
i['pay'] = i['jine']
i['unpay'] = 0
i['flag_m'] = df
print("更新未收付", details)
update_unpay(details)
# 未收付更新完后更新个人账户余额update_info
print("更新个人账户余额update_info")
print(data)
update_info(data['pay_amount'], pay_amount, balance['balance'], data)
lock.release()
print("结束========")
def decode_notify_data(res_json):
try:
ciphertext = res_json['resource']['ciphertext']
nonce = res_json['resource']['nonce']
associated_data = res_json['resource']['associated_data']
cipher = AES.new(v3_SECRET.encode(), AES.MODE_GCM, nonce=nonce.encode())
cipher.update(associated_data.encode())
en_data = b64decode(ciphertext.encode('utf-8'))
auth_tag = en_data[-16:]
_en_data = en_data[:-16]
plaintext = cipher.decrypt_and_verify(_en_data, auth_tag)
decodejson = json.loads(plaintext.decode())
except Exception as e:
print(f"解密回调失败:{e}")
return None
return decodejson
def get_wx_token():
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={SECRET}'
res = req_tool_vx(url, flag=1)
return res['access_token']
def query_wx_fj_info(id):
"""查询企微中的附加信息"""
token = get_wx_token()
url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={token}&userid={id}'
res = req_tool_vx(url, flag=1)
val = ""
print("query_wx_fj_info", res, id)
for i in res['extattr']['attrs']:
if i['name'] == '附加信息':
val = i['value']
return val
def query_wx_userid(code):
"""查询企微中的userid"""
token = get_wx_token()
url = f'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token={token}&code={code}'
res = req_tool_vx(url, flag=1)
return res['userid']