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

141 lines
7.1 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 auto_provider_settle_cron_job(ns={}):
"""
供应商自动结算
*更改供应商的结算周期后应手动处理计算数据,api:auto_supplier_settle_cron_job
:param ns:
:return:
"""
response = {"status": False}
resp_data = []
db = DBPools()
# 供应商
sql_where = {}
sql_where["parentid"] = "mIWUHBeeDM8mwAFPIQ8pS"
sql_where['org_type'] = 4
sql_where['del_flg'] = 0
async with db.sqlorContext('kboss') as sor:
# 获取供应商list
organization = await sor.R("organization", sql_where)
if not organization:
response["msg"] = f"get organization is None,please check db. orgid:{ns['orgid']}"
return response
# 获取结算日期
dt = await get_business_date()
info(f"获取结算日期:{dt}")
date_obj = datetime.datetime.strptime(dt, "%Y-%m-%d").date()
for i in organization:
# 获取供应商详情
provider_data = await sor.R('provider', {'orgid': i['id'], "del_flg": 0})
if not provider_data:
continue
else:
provider_data = provider_data[0]
# 判断日期是否是供应商的结算日
if await is_provider_settle_date(dt, provider_data['orgid']):
provider_data["organization_data"] = i
provider_data['bill_end_date'] = dt
# 算出区间
if provider_data['settle_mode'] == '1':
provider_data['bill_start_date'] = (date_obj - dateutil.relativedelta.relativedelta(days=1)).strftime("%Y-%m-%d")
provider_data['bill_end_date'] = provider_data['bill_start_date']
elif provider_data['settle_mode'] == '2':
provider_data['bill_start_date'] = (date_obj - dateutil.relativedelta.relativedelta(weeks=1)).strftime("%Y-%m-%d")
elif provider_data['settle_mode'] == '3':
provider_data['bill_start_date'] = (date_obj - dateutil.relativedelta.relativedelta(months=1)).strftime("%Y-%m-%d")
elif provider_data['settle_mode'] == '4':
provider_data['bill_start_date'] = (date_obj - dateutil.relativedelta.relativedelta(months=3)).strftime("%Y-%m-%d")
elif provider_data['settle_mode'] == '5':
provider_data['bill_start_date'] = (date_obj - dateutil.relativedelta.relativedelta(years=1)).strftime("%Y-%m-%d")
else:
provider_data.pop('bill_end_date')
err = f"get provider settle_mode error ,please check db.settle_mode:{provider_data['settle_mode']}"
info("判断日期是否是供应商的结算日erro:{}".format(err))
continue
if provider_data['discount_mode'] == '1':
provider_data["provider_settle_type"] = "折扣"
elif provider_data['rebate_mode'] == '1':
provider_data["provider_settle_type"] = "返佣"
elif provider_data['floorprice_mode'] == '1':
provider_data["provider_settle_type"] = "底价"
else:
provider_data["provider_settle_type"] = "未知知结算方式"
provider_data["provider_id"] = i['id']
resp_data.append(provider_data)
if resp_data:
_i = 0
# 入库:
for i in resp_data:
sql_data = {
"id": uuid(),
"user_id": None, # '操作人id',
"name": i["organization_data"]['orgname'], # '供应商名称
"orgid": i["organization_data"]["parentid"], # '机构id',
"provider_id": i["provider_id"], # '供应商id',
"settle_mode": i["settle_mode"], # '结算方式1:按周期结算2:按月结算3:按季结算4:按年结算
"provider_settle_type": i["provider_settle_type"], # '供应商结算方式,折扣,返佣,底价',
"apv_id": None, # '审批id',
"bill_start_date": i["bill_start_date"], # '周期开始日期',
"bill_end_date": i["bill_end_date"], # '周期结束日期',
"money": None, # '周期结算额',
"detail_status": 0, # '详单状态0:未生成1:已生成',
"apv_start_time": None, # '审核发起时间',
"apv_end_time": None, # '审核结束时间',
"status": 0, # '审核状态0:待审核1:审核中2:同意3:拒绝4:撤销',
"settle_status": 0, # '账单状态0:未结账1:已结账2:结账失败',
"update_time": None, # '更新时间',
"del_flg": 0,
"create_at": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"update_at": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
try:
await sor.C('provider_settle_data', sql_data)
_i += 1
except Exception as e:
if " for key " in str(e):
response['status'] = True
response['msg'] = response.get("msg", "") + " " + i["name"] + i["bill_start_date"] + " " + i["bill_end_date"] + f"重复入库"
else:
response['status'] = True
response['msg'] = response.get("msg", "") + " " + i["provider_id"] + f"入库失败error:{e}"
continue
response['status'] = True
response["msg"] = response.get("msg", "") + " " + i["provider_id"] + "入库成功,"
if not _i:
response['status'] = True
response['msg'] = response.get("msg", "") + " " + "暂无入库"
return response
# 获取手机号
userreacs = await sor.R('users', {'username': "kyy_财务", 'del_flg': '0'})
if not userreacs:
response["msg"] = response.get("msg", "") + " 获取手机号为空"
return response
else:
response["msg"] = response.get("msg", "") + f" 获取手机号成功:{userreacs[0]['mobile']}"
# 发送短信
data = {"name": ','.join([i["name"] for i in resp_data])}
try:
nss = await send_vcode(userreacs[0]['mobile'], "供应商结算提醒", data)
except Exception as e:
info(f"发送短信失败:{e}")
nss = False
if nss:
response["status"] = True
response["msg"] = response.get("msg", "") + " 短信发送成功"
else:
response["status"] = False
response["msg"] = response.get("msg", "") + f" 短信发送失败:{nss}"
else:
response['status'] = True
response["msg"] = "未找到待结算的供应商"
return response
ret = await auto_provider_settle_cron_job(params_kw)
return ret