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