kboss/b/provider_settle/apv_callback_provider_settle.dspy
2025-07-16 14:27:17 +08:00

120 lines
4.9 KiB
Plaintext
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.

async def apv_callback_provider_settle(ns={}):
"""
供应商结算入账审批回调
:param ns:
:return:
"""
info(f"apv_callback_provider_settle_data::{ns}")
response = {"status": False}
apv_callback_data = {}
now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
apv_callback_data['apv_id'] = ns['apv_id']
apv_callback_data['status'] = ns['status']
except Exception as e:
response["msg"] = "args is error,please check:{}".format(e)
return response
status_type = {
"start": 1,
"agree": 2,
"refuse": 3,
"terminate": 4
}
provider_settle_type_dict = {
'折扣': '0',
'返佣': '1',
'低价': '2'
}
db = DBPools()
async with db.sqlorContext('kboss') as sor:
# 更新状态记录
apv_callback_data['update_time'] = datetime.datetime.now()
apv_callback_data['status'] = status_type.get(apv_callback_data['status'], -1)
sql = "update provider_settle_data set status = ${status}$,update_time = ${update_time}$ where apv_id = ${apv_id}$"
d = await sor.sqlExe(sql, apv_callback_data)
if not d:
response["msg"] = "更新失败"
return response
if apv_callback_data['status'] != 2:
response['msg'] = "审批未通过,不入账"
return response
# 拿到记账数据
provider_data = await sor.R('provider_settle_data', {'apv_id': apv_callback_data['apv_id'], "del_flg": 0})
if not provider_data:
response["msg"] = "未找到该供应商结算数据"
return response
for i in provider_data:
args = []
if i['settle_status'] == 1:
info("已经全部成功记账,不再重复记账")
continue
try:
i['money'] = round(i['money'] / 100, 2)
i['money_2'] = round(i['money_2'] / 100, 2)
i['money_1'] = round(i['money_1'] / 100, 2)
i['money_0'] = round(i['money_0'] / 100, 2)
except Exception as e:
info("总额计算失败:{}".format(e))
sql_data = {'settle_status': 2, 'id': i["id"], "update_time": now_time}
await sor.U('provider_settle_data', sql_data)
continue
if i['settle_status'] == 0:
if i['money_2'] != 0:
args.append([i['money_2'], '2'])
if i['money_1'] != 0:
args.append([i['money_1'], '1'])
if i['money_0'] != 0:
args.append([i['money_0'], '0'])
elif i['settle_status'] == 2:
if i['failure_id']:
failure_id = i['failure_id'].split(',')
for f in failure_id:
args.append([i['money_{}'.format(f)], f])
else:
info("失败记账状态异常failure_id:{}".format(i['failure_id']))
continue
else:
info("记账状态异常settle_status:{}".format(i['settle_status']))
continue
if not args:
sql_data = {'settle_status': 1, 'id': i["id"], "update_time": now_time}
await sor.U('provider_settle_data', sql_data)
continue
orgid = i['orgid']
provider_id = i['provider_id']
settle_mode = i['settle_mode']
failure_id = []
for a in args:
# 记账
try:
settle_log = {
'accounting_orgid': orgid,
'providerid': provider_id, # 供应商id
'settle_date': await get_business_date(sor=None),
'settle_mode': settle_mode, # 供应商 销售结算方式
'sale_mode': a[1], # 0折扣 1返佣 2低价
'settle_amt': a[0], # 金额
'business_op': 'SETTLE'
}
ai = SettleAccounting(settle_log)
rets = await ai.accounting(sor)
if isinstance(rets, bool):
info(f"记账成功:{i['id']},sale_mode:{a[1]}")
except Exception as e:
info(f"记账失败,供应商id:{i['id']},sale_mode:{a[1]},error:{e}")
failure_id.append(a[1])
if failure_id:
sql_data = {'settle_status': 2, 'failure_id': ','.join(failure_id), 'id': i["id"], "update_time": now_time}
else:
sql_data = {'settle_status': 1, 'failure_id': None, 'id': i["id"], "update_time": now_time}
await sor.U('provider_settle_data', sql_data)
return {"status": True, "msg": "success"}
response["msg"] = "sql error,please check"
return response
ret = await apv_callback_provider_settle(params_kw)
return ret