55 lines
1.7 KiB
Plaintext
55 lines
1.7 KiB
Plaintext
debug(f'{params_kw=}')
|
|
userid = await get_user()
|
|
userorgid = await get_userorgid()
|
|
|
|
start_date = params_kw.get('start_date', '')
|
|
end_date = params_kw.get('end_date', '')
|
|
|
|
if not start_date or not end_date:
|
|
return json.dumps({'total': 0, 'rows': [], 'stats': {'total_count': 0, 'debit_sum': 0, 'credit_sum': 0}}, ensure_ascii=False, default=str)
|
|
|
|
ns = {
|
|
'orgid': userorgid,
|
|
'start_date': start_date,
|
|
'end_date': end_date,
|
|
'page': int(params_kw.get('page', 1)),
|
|
'rows': int(params_kw.get('rows', 60)),
|
|
'sort': 'acc_date desc'
|
|
}
|
|
|
|
async with get_sor_context(request._run_ns, 'accounting') as sor:
|
|
sql = """select d.acc_date, d.acc_timestamp, d.acc_dir,
|
|
concat(coalesce(s.name, '交易'), ' #', substring_index(d.summary, ':', 1)) as summary,
|
|
d.amount, d.balance, s.name as subject_name,
|
|
count(*) over() as _total,
|
|
coalesce(sum(case when d.acc_dir = '1' then d.amount else 0 end) over(), 0) as _debit,
|
|
coalesce(sum(case when d.acc_dir = '0' then d.amount else 0 end) over(), 0) as _credit
|
|
from acc_detail d
|
|
join account a on d.accountid = a.id COLLATE utf8mb4_unicode_ci
|
|
left join subject s on a.subjectid = s.id COLLATE utf8mb4_unicode_ci
|
|
where a.orgid = ${orgid}$
|
|
and d.acc_date >= ${start_date}$
|
|
and d.acc_date <= ${end_date}$"""
|
|
rows = await sor.sqlExe(sql, ns)
|
|
|
|
if not isinstance(rows, list):
|
|
data_rows = rows.rows
|
|
total = rows.total
|
|
first = data_rows[0] if data_rows else None
|
|
else:
|
|
data_rows = rows
|
|
total = len(rows)
|
|
first = data_rows[0] if data_rows else None
|
|
|
|
stats = {
|
|
'total_count': total,
|
|
'debit_sum': round(float(first._debit), 4) if first else 0,
|
|
'credit_sum': round(float(first._credit), 4) if first else 0
|
|
}
|
|
result = {
|
|
'total': total,
|
|
'rows': data_rows,
|
|
'stats': stats
|
|
}
|
|
return json.dumps(result, ensure_ascii=False, default=str)
|