5h4%d_Afe
z@4~-L8#iw`P_WN^=YjLDe&ftrC-Jz^rp?!Z>%aq)*CD|7-F(fpXWl!(X&7N;%#qPb
z#{BHfpI0#DrSDC>`VfwI&YwOy^}>(NzxLukzx$otd{mWgkhEiiSmlqnVR|g`+AWeg
z%ngC}!26JUV5f8JZaE5F2%vP*w^USTFM{g2cTmtAEEJN~tl;Vh{_nggX?yfcaG
z>ULiyLf(T14l;qsMDUPp7Qu>Ugu466#Y1>aSQUdM%^vcLR08d|_3g|}$x<%c4;>It
z1FqC_An+yHC^bANLz=ua8A#i<1txvv-y_W5qv(9vpAjFxF**j8Q1^spm>F!xJ3xR1
z%5K39y}pAuu_jGh*zjU5+34NsnSpgfJ`MW(G6t=o6-Zt}KKim`gaiQ8NcK38I|{
zi*xW0;siZGNU!cj?I^2Hmw2jx&f+)zob
zB3lXbKX2c_`d1iB;!60i7_WNajV8oTo9Hl3k_oHfVue=hk^}(MPCsjPCF!-MBO@yP
zf26J;9!A4DN*eMXVe{7!`O}Y^d=M6Xe+!zztTB$}a>LO95M!%`L%#tUAS8-`rXM;d
zqTFM!pw+>!8IPwz-=@EUsx^EEL~`_ONJE(hNImR#hTnb0OT!?O
z)8Bpo`gv#YA}8J$-gYTnOUKdFzc=EL-S4*>D$!LGfUXX9uDU^-Qcwwf)N@d&>g+~c
zFe69ooNY@tL}rPl4J;H0)`@`&7z^r19*R00rv
z6hfN5#R_%UUPH+fFF1Y-K5%0ib|$O%%Q$CVPH$IzesBWJn(f45Nc9pQt#*D
zN`_}o-~^v80IK(MmHIYb7~_1JW+>xWHHD^Ly6X8n$4J!`yy+nt_G=FKwd~b~u$yX7nLtE->yVIt!VK_y~L;#IlB?_LOEAZiD%B|0m~baZt7c)pa01l!53(}mvWDv
z2nr#69X)={mR#zM?qjECB&}VI3y^`Sd7`KV>^=Rsn%YXdO+fXJ7DMfo*q^|jiFfCU
zcpT;c9t~G-`|v~~3a1{B{VLgJu0 next_month_start and '补收预收承包金' in i['fukuanshiyou']:
+ i['flag_m'] = 0
+ continue
+ if pay_amount:
+ i['flag'] = 1
+ if '补收预收承包金' in i['fukuanshiyou'] or i['lydunjiao'] == "趸交":
+ i['flag_m'] = 0
+ continue
+ if '承包金' in i['fukuanshiyou']:
+ # 承包金实际需要缴纳的
+ if pay_amount < i['money'] - i['pay']:
+ # 修改 i['pay'] 充值金额,推送修改
+ i['pay'] += pay_amount
+ i['no_money'] = i['money'] - i['pay']
+ i['flag_m'] = pay_amount
+ pay_amount = 0
+
+ else:
+ pay_amount -= (i['money'] - i['pay'])
+ i['flag_m'] = (i['money'] - i['pay'])
+ i['pay'] = i['money']
+ i['no_money'] = 0
+
+ else:
+ if i['money'] != i['pay']:
+ # 根据未支付的金额,扣除总金额
+ df = i['money'] - i['pay']
+ if pay_amount < df:
+ # 修改 i['pay'] 充值金额,推送修改
+ i['pay'] += pay_amount
+ i['no_money'] = i['money'] - i['pay']
+ i['flag_m'] = pay_amount
+ pay_amount = 0
+
+ else:
+ pay_amount -= df
+ i['pay'] = i['money']
+ i['no_money'] = 0
+ i['flag_m'] = df
+ # 根据抵扣规则,更新未支付的数据,将清缴数据新增至已收付明细
+ else:
+ is_specialized = 1
+ # 初始化结果字典
+ result = {}
+ # 处理每个项目
+ for item in data['paymentdetails']:
+ # 分割类型和日期
+ expense_type = item[:-7]
+ date = item[-7:]
+
+ # 更新专项收取字典
+ if date not in result:
+ result[date] = []
+ result[date].append(expense_type)
+ # 创建一个新的字典来存储过滤后的专项收取数据
+ filtered_details = {}
+ # 遍历未收付数据
+ for month, value in details.items():
+ # 跳过非月份的键(如'amount')
+ if month not in result:
+ continue
+
+ # 初始化一个列表来存储满足条件的data项
+ filtered_data = [item for item in value['data'] if item['fukuanshiyou'] in result[month]]
+
+ # 如果filtered_data非空,则添加到filtered_details中,并可以选择性地包含其他字段
+ if filtered_data:
+ # 注意:这里我们保留了'data'和其他可能需要的字段(如'de', '_th_amount', 'hz')
+ filtered_details[month] = {k: v for k, v in value.items() if k in ['data', 'de', '_th_amount', 'hz']}
+ # 但是,'data'字段已经被更新为filtered_data
+ filtered_details[month]['data'] = filtered_data
+ dates = [month for month in dates if month in result]
+ if next_month in dates:
+ # _tmp = filtered_details[next_month]['data']
+ _tmp = filtered_details.get(next_month, {}).get('data', [])
+ if _tmp:
+ _tmp = sorted(_tmp, key=lambda x: x['sort'])
+ for i in _tmp:
+ if pay_amount:
+ i['flag'] = 1
+ if i['money'] != i['pay']:
+ # 根据未支付的金额,扣除总金额
+ df = i['money'] - i['pay']
+ if pay_amount < df:
+ # 修改 i['pay'] 充值金额,推送修改
+ i['pay'] += pay_amount
+ i['no_money'] = i['money'] - i['pay']
+ i['flag_m'] = pay_amount
+ pay_amount = 0
+ else:
+ pay_amount -= df
+ i['pay'] = i['money']
+ i['no_money'] = 0
+ i['flag_m'] = df
+ if now_month in dates:
+ _tmp = filtered_details[now_month]['data']
+ _tmp = sorted(_tmp, key=lambda x: x['sort'])
+ for i in _tmp:
+ if pay_amount:
+ i['flag'] = 1
+ if i['money'] != i['pay']:
+ # 根据未支付的金额,扣除总金额
+ df = i['money'] - i['pay']
+ if pay_amount < df:
+ # 修改 i['pay'] 充值金额,推送修改
+ i['pay'] += pay_amount
+ i['no_money'] = i['money'] - i['pay']
+ i['flag_m'] = pay_amount
+ pay_amount = 0
+ else:
+ pay_amount -= df
+ i['pay'] = i['money']
+ i['no_money'] = 0
+ i['flag_m'] = df
+ for i in dates:
+ if i == next_month or i == now_month:
+ continue
+ _tmp = filtered_details[i]['data']
+ _tmp = sorted(_tmp, key=lambda x: x['sort'])
+ for i in _tmp:
+ if pay_amount:
+ i['flag'] = 1
+ if i['money'] != i['pay']:
+ # 根据未支付的金额,扣除总金额
+ df = i['money'] - i['pay']
+ if pay_amount < df:
+ # 修改 i['pay'] 充值金额,推送修改
+ i['pay'] += pay_amount
+ i['no_money'] = i['money'] - i['pay']
+ i['flag_m'] = pay_amount
+ pay_amount = 0
+ else:
+ pay_amount -= df
+ i['pay'] = i['money']
+ i['no_money'] = 0
+ i['flag_m'] = df
+ # 根据抵扣规则,更新未支付的数据,将清缴数据新增至已收付明细
+ logger.info(f"更新未收付{details,is_specialized}")
+ update_unpay(details,is_specialized)
+ # 未收付更新完后,更新个人账户余额update_info
+ logger.info(f"更新个人账户余额update_info")
+ update_info(data['pay_amount'], pay_amount, balance['balance'], data)
+ lock.release()
+ logger.info(f"结束========")
+
+def rsa_long_decrypt(priv_key, msg, length=256):
+ """
+ 1024bit的证书用128,2048bit证书用256位
+ """
+ try:
+ privobj = PKCS1_v1_5.new(priv_key)
+ res = []
+ b64_msg = base64.b64decode(msg)
+ for i in range(0, len(b64_msg), length):
+ chunk = b64_msg[i:i + length]
+ decrypted_chunk = privobj.decrypt(chunk, 'xyz').decode('GBK')
+ res.append(decrypted_chunk)
+ except Exception as e:
+ logger.error(f"解密回调失败:{e}")
+ return None
+ return "".join(res)
+
+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:
+ logger.error(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)
+ # print("==========================获取企微TOKEN============================",res)
+ 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)
+ # print("==========================获取企微附加信息============================", res)
+ val = ""
+ logger.info(f"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)
+ # print("==========================获取企微userid============================", res)
+ return res['userid']
+
+def find_pay_details(id, paymentdetails):
+ # 查询某人未收付明细
+ can_submit = 0
+ for item in paymentdetails:
+ url = f'{base_path}/api/v5/app/entry/data/list'
+ month = item[-7:]
+ logger.info(f"month{month}")
+ filter_data = {
+ "app_id": cw_app,
+ "entry_id": uncollected_id,
+ "limit": 100,
+ "filter": {
+ "rel": "and",
+ "cond": [
+ {
+ "field": "id_card",
+ "method": "eq",
+ "value": [id]
+ },
+ {
+ "field": "month1",
+ "method": "eq",
+ "value": [month]
+ },
+ {
+ "field": "fukuanshiyou",
+ "method": "eq",
+ "value": ["安全统筹"]
+ }
+ ]
+ }
+ }
+
+ logger.info(f"发起安全统筹支付前开始查询未收付{filter_data}")
+ uncollected_data = turn_page(url, filter_data)
+ if uncollected_data == []:
+ logger.info(f"未查询到安全统筹未收付{uncollected_data}")
+ return 0
+ else:
+ logger.info(f"查询到安全统筹未收付{uncollected_data}")
+ return 1
\ No newline at end of file