141 lines
7.1 KiB
Plaintext
141 lines
7.1 KiB
Plaintext
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
|