kboss/b/bill/finance_settlement_submit.dspy
2026-06-18 17:48:01 +08:00

101 lines
3.8 KiB
Plaintext

# -*- coding: utf-8 -*-
"""财务结算单提交审批。"""
import datetime
import json
DBNAME = 'kboss'
async def _finance_phone(sor, orgid):
rows = await sor.sqlExe("""
SELECT u.mobile
FROM users u
LEFT JOIN userrole ur ON u.id=ur.userid
LEFT JOIN role r ON ur.roleid=r.id
WHERE r.role='财务'
AND u.orgid=${orgid}$
AND ur.del_flg='0'
AND r.del_flg='0'
AND u.del_flg='0'
LIMIT 1
""", {'orgid': orgid})
return rows[0]['mobile'] if rows else None
async def finance_settlement_submit(ns={}):
settlement_id = ns.get('settlement_id') or ns.get('id')
userid = ns.get('userid') or ns.get('user_id')
business_name = ns.get('business_name') or '财务结算'
if not settlement_id or not userid:
return {'status': False, 'msg': '缺少 settlement_id 或 userid'}
db = DBPools()
async with db.sqlorContext(DBNAME) as sor:
try:
rows = await sor.R('finance_settlement', {'id': settlement_id, 'del_flg': '0'})
if not rows:
return {'status': False, 'msg': '结算单不存在'}
settlement = rows[0]
if settlement.get('status') not in ('draft', 'rejected', 'failed'):
return {'status': False, 'msg': '当前状态不可提交审批'}
phone = await _finance_phone(sor, settlement.get('accounting_orgid'))
if not phone:
return {'status': False, 'msg': '未找到当前机构财务审批人'}
business_rows = await sor.R('apv_business', {'business_name': business_name, 'del_flg': '0'})
if not business_rows:
return {'status': False, 'msg': '审批业务不存在: %s' % business_name}
form_component = {
'title': '财务结算审批',
'detail': {
'data': '%s %s-%s %s 金额:%s' % (
settlement.get('counterparty_name'),
settlement.get('period_start'),
settlement.get('period_end'),
settlement.get('counterparty_type'),
settlement.get('settlement_amount'),
)
},
}
apv_json = json.dumps({
'table': 'finance_settlement',
'settlement_id': settlement_id,
'settlement_no': settlement.get('settlement_no'),
}, ensure_ascii=False)
resp = await issue_approve(
phone,
settlement.get('accounting_orgid'),
userid,
business_rows[0]['id'],
form_component,
settlement.get('counterparty_orgid'),
settlement_id,
apv_json,
)
if not resp.get('status'):
return {'status': False, 'msg': '发起审批失败, %s' % resp.get('msg')}
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
await sor.U('finance_settlement', {
'id': settlement_id,
'status': 'approving',
'approval_status': 'start',
'approval_id': resp.get('instanceId'),
'created_by': userid,
'failure_reason': None,
'update_at': now_time,
})
return {
'status': True,
'msg': 'ok',
'data': {
'settlement_id': settlement_id,
'approval_id': resp.get('instanceId'),
'status': 'approving',
},
}
except Exception as e:
return {'status': False, 'msg': '提交审批失败, %s' % str(e)}
ret = await finance_settlement_submit(params_kw)
return ret