|
|
#!/usr/bin/env python
|
|
|
# encoding: utf-8
|
|
|
"""
|
|
|
@author: tx
|
|
|
@file: screen.py
|
|
|
@time: 2023/3/21 15:09
|
|
|
@desc: 大屏数据接口
|
|
|
"""
|
|
|
import datetime
|
|
|
|
|
|
from collections import defaultdict
|
|
|
|
|
|
from db_logic.medicament import BllMedicament
|
|
|
from db_logic.client import BllClient
|
|
|
from Common.Utils import PageParam, Utils
|
|
|
|
|
|
|
|
|
def get_chemicals_total_num_weight():
|
|
|
"""
|
|
|
获取化学品总数总重量
|
|
|
:return: 化学品总数,化学品总重量
|
|
|
"""
|
|
|
total_num = BllMedicament().get_chemicals_total_num()
|
|
|
total_weight = BllMedicament().get_chemicals_total_weight()
|
|
|
return total_num, total_weight
|
|
|
|
|
|
|
|
|
def get_other_drug_total_num():
|
|
|
standard_num, reagent_num, consumables_num = BllMedicament().get_chemicals_other_total_num()
|
|
|
return standard_num, reagent_num, consumables_num
|
|
|
|
|
|
|
|
|
def count_by(lst, fn):
|
|
|
"""
|
|
|
列表分组求和
|
|
|
:param lst: list
|
|
|
:param fn: func
|
|
|
:return: defaultdict(<class 'int'>, {'氯化钠': 2, '盐酸': 1, '氨水': 3})
|
|
|
"""
|
|
|
d = defaultdict(int)
|
|
|
for el in lst:
|
|
|
d[fn(el)] += 1
|
|
|
return d
|
|
|
|
|
|
|
|
|
def get_storage_summary():
|
|
|
"""
|
|
|
获取今日出入库信息
|
|
|
:return: chemicals: 物品名
|
|
|
day_out_num: 今日出库数
|
|
|
day_in_num: 今日入库数
|
|
|
opt_count: 操作次数
|
|
|
"""
|
|
|
start_time = datetime.datetime.now().strftime("%Y-%m-%d 00:00:00")
|
|
|
end_time = datetime.datetime.now().strftime("%Y-%m-%d 23:59:59")
|
|
|
|
|
|
kwargs = {
|
|
|
"put_in_user_name": "",
|
|
|
"func_type": '',
|
|
|
"statue_type": '',
|
|
|
"name": '',
|
|
|
"start_time": start_time,
|
|
|
"end_time": end_time,
|
|
|
"page_param": {},
|
|
|
"client_place": '',
|
|
|
"client_id": ''
|
|
|
}
|
|
|
|
|
|
def _get_in_out_storage_dict(record_type):
|
|
|
kwargs.update({"record_type": record_type})
|
|
|
data_list = BllMedicament().drug_show_type_info(**kwargs)
|
|
|
in_list = Utils.msyql_table_model(data_list)
|
|
|
_count_dict = count_by(in_list, lambda x: x["name"])
|
|
|
return _count_dict
|
|
|
|
|
|
# 入库计数
|
|
|
in_dict = _get_in_out_storage_dict(1)
|
|
|
# 领用计数
|
|
|
out_dict = _get_in_out_storage_dict(2)
|
|
|
chemical_names = set(in_dict.keys()) | set(out_dict.keys())
|
|
|
result = [{
|
|
|
"chemicals": item,
|
|
|
"day_out_num": out_dict[item],
|
|
|
"day_in_num": in_dict[item],
|
|
|
"opt_count": sum([out_dict[item], in_dict[item]])
|
|
|
} for item in chemical_names]
|
|
|
return result
|
|
|
|
|
|
|
|
|
def get_drug_operate():
|
|
|
"""
|
|
|
获取药剂操作情况列表
|
|
|
:return:
|
|
|
"""
|
|
|
page_param = PageParam(1, 20)
|
|
|
kwargs = {
|
|
|
"record_type": "",
|
|
|
"put_in_user_name": "",
|
|
|
"func_type": '',
|
|
|
"statue_type": '',
|
|
|
"name": '',
|
|
|
"start_time": "",
|
|
|
"end_time": "",
|
|
|
"page_param": page_param,
|
|
|
"client_place": '',
|
|
|
"client_id": ''
|
|
|
}
|
|
|
data_list = BllMedicament().drug_show_type_info(**kwargs)
|
|
|
record_list = Utils.msyql_table_model(data_list)
|
|
|
return record_list
|
|
|
|
|
|
|
|
|
def get_all_inventory():
|
|
|
"""
|
|
|
获取库存总览
|
|
|
:return:
|
|
|
"""
|
|
|
# 易燃易爆品
|
|
|
page_param = PageParam(1, 1000)
|
|
|
|
|
|
def _get_stock_all_info(functype):
|
|
|
data_list = BllMedicament().get_stock_all_info(
|
|
|
name="",
|
|
|
func_type=functype,
|
|
|
page_param=page_param,
|
|
|
client_place="",
|
|
|
client_id=""
|
|
|
)
|
|
|
data_list = Utils.msyql_table_model(data_list)
|
|
|
return data_list
|
|
|
|
|
|
data_list_1 = _get_stock_all_info(1)
|
|
|
data_list_2 = _get_stock_all_info(2)
|
|
|
data_list_3 = _get_stock_all_info(3)
|
|
|
all_list = data_list_1 + data_list_2 + data_list_3
|
|
|
result = defaultdict()
|
|
|
for item in all_list:
|
|
|
name = item["name"]
|
|
|
if name not in result:
|
|
|
result[name] = {"total_num": item["count_number"] if item["count_number"] else 0,
|
|
|
"total_weight": item["sum_remain"] if item["sum_remain"] else 0}
|
|
|
else:
|
|
|
result[name]["total_num"] += item["count_number"]
|
|
|
result[name]["total_weight"] += item["sum_remain"]
|
|
|
parse_result = [{
|
|
|
"name": k,
|
|
|
"total_num": v["total_num"],
|
|
|
"total_weight": v["total_weight"],
|
|
|
} for k, v in dict(result).items()]
|
|
|
return parse_result
|
|
|
|
|
|
|
|
|
def get_all_client_cell_ratio(func_type_dict):
|
|
|
"""
|
|
|
获取货位占比情况 每个分类func_type 所有药剂数量 / 所有位置占比
|
|
|
:return:
|
|
|
"""
|
|
|
|
|
|
def get_drug_list_total_count(func_type):
|
|
|
# 获取药剂总数量
|
|
|
page_param = PageParam(1, 10)
|
|
|
data_list = BllMedicament().get_drug_list(
|
|
|
seach_word="",
|
|
|
b_code="",
|
|
|
client_id="", func_type=func_type, page_param=page_param
|
|
|
)
|
|
|
return page_param.totalRecords
|
|
|
|
|
|
def _get_client_list_item(func_type):
|
|
|
# 货位总数
|
|
|
sql_all = f"""
|
|
|
select b.total_quantity as total_quantity, a.client_id, a.func_type
|
|
|
from (select * from rms_client where func_type = {func_type}) as a
|
|
|
left join
|
|
|
(select sum(storage_quantity) as total_quantity, client_id from rms_client_cell group by client_Id ) as b
|
|
|
on a.client_id = b.client_id
|
|
|
"""
|
|
|
total_quantity_list = BllClient().execute(sql_all).fetchall()
|
|
|
return sum([i.total_quantity for i in total_quantity_list if i.total_quantity])
|
|
|
|
|
|
func_type_list = func_type_dict.keys()
|
|
|
resp = dict()
|
|
|
for i in func_type_list:
|
|
|
total_records = get_drug_list_total_count(i)
|
|
|
total_quantity = _get_client_list_item(i)
|
|
|
ratio = total_records / total_quantity * 100 if total_quantity else 0
|
|
|
resp.update({i: f"{Utils.reserve_decimal(ratio, 2)}%"})
|
|
|
return resp
|