#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Date:2022/07/14 08:36:50 ''' import threading import time from Business.Warning import BllWarning from Business.MedicamentVariety import BllMedicamentVariety, Utils, datetime from DataEntity.WarningModels import EntityWarning class SupervisionWarning: def __init__(self): # 删除视频事件 self.deleteVideoDatetime = None def supervision_start(self): p = threading.Thread(target=self.supervision_start_thread) p.start() def insert_warning_default(self, customer_id, object_type, object_id, object_name, warning_content): try: warning_obj = EntityWarning( warning_id=str(Utils.UUID()), customer_id=customer_id, object_type=object_type, object_id=object_id, object_name=object_name, warning_content=warning_content, warning_date=datetime.datetime.now(), warning_user_name='系统', is_solve=0, is_add=1 ) bool_ = BllWarning().insert(warning_obj) if bool_: print('插入成功!') except Exception as error: print(error) return def warning_content_type(self, tp): # 根据object_type俩进行消息区分 content_dict = { "2": "药剂过期预警:过期药剂[%s](%s), 当前时间: %s; 超出设定过期时间%s; 位置:%s; 号柜%s", "3": "药剂种类余量预警:药剂种类%s, 当前种类药剂余量%s瓶,小于设定余量%s瓶;", "1": "药剂保质期预警:药剂 %s(%s) 超过保质期预警线, 当前时间:%s; 设定警戒线:%s天; 位置:%s号柜 %s", "5": "%s 药柜滤芯保质期预警:药柜滤芯提前预警时间%s天,生产日期%s,当前时间:%s,保质期:%s天; 已达到提前预警时间;", "6": "出库超期预警:用户[%s]已领用: %s(%s) %s天,超过预警线:%s天" } return content_dict.get(tp, "") def supervision_start_thread(self): while True: try: BllWarning().executeNoParam("delete from rms_warning where object_type not in('7') ") # 查询预警数量和某一类型当前在库数量 SQL = """ SELECT b.variety_id as variety_id, b.customer_id, b.Name, sum(case when a.status = 1 then 1 else 0 end) as normal_count, b.inventory_warning_value from rms_medicament_variety as b LEFT JOIN rms_medicament as a on b.variety_id = a.variety_id GROUP by b.variety_id """ data_obj_list = BllMedicamentVariety().execute(SQL).fetchall() for data_obj in data_obj_list: if data_obj.inventory_warning_value: if data_obj.inventory_warning_value > data_obj.normal_count: # 封装conent,统一化管理 # 封装创建warning方法,统一化管理 # 药剂种类余量预警 object_type = 3 content_info = self.warning_content_type( object_type) self.insert_warning_default( customer_id=data_obj.customer_id, object_type=object_type, object_id=data_obj.variety_id, object_name=data_obj.name, warning_content=content_info % ( data_obj.name, str(data_obj.normal_count), str(data_obj.inventory_warning_value) ) ) time.sleep(1) # SQL查询过期预警数量 SQL = """ select * from rms_medicament a where a.expiration_date < now(); """ expire_obj_list = BllWarning().execute(SQL).fetchall() if expire_obj_list: for expire_obj in expire_obj_list: if expire_obj.status != 3: # 封装conent,统一化管理 # 封装创建warning方法,统一化管理 # 药剂过期预警 object_type = 2 conent = self.warning_content_type(object_type) self.insert_warning_default( customer_id=expire_obj.customer_id, object_type=object_type, object_id=expire_obj.medicament_id, object_name=expire_obj.name, warning_content=conent % ( expire_obj.name, expire_obj.bar_code, str(datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S')), str(expire_obj.expiration_date or ''), str(expire_obj.client_code or ''), str(expire_obj.place or '') ), ) time.sleep(1) # SQL查询保质期预警数量 SQL = """ select * from rms_medicament a where a.expiration_date < DATE_ADD(now(), INTERVAL a.shelf_life_warning_value DAY); """ expireIdList = [x.medicament_id for x in expire_obj_list] shelflife_obj_list = BllWarning().execute(SQL).fetchall() if shelflife_obj_list: for expire_obj in shelflife_obj_list: if (expire_obj.status != 3 and expire_obj.medicament_id not in expireIdList): # 封装conent,统一化管理 # 封装创建warning方法,统一化管理 # 药剂保质期预警 object_type = 1 conent = self.warning_content_type(object_type) self.insert_warning_default( customer_id=expire_obj.customer_id, object_type=object_type, object_id=expire_obj.medicament_id, object_name=expire_obj.name, warning_content=conent % ( expire_obj.name, expire_obj.bar_code, str(datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S')), str(expire_obj.shelf_life_warning_value), expire_obj.client_code, (expire_obj.place if expire_obj.place else '') ) ) time.sleep(1) # SQL查询领用超期预警数量 todayDate = datetime.datetime.now().strftime("%Y-%m-%d") SQL = """ SELECT DATEDIFF('"""+todayDate+"""',STR_TO_DATE(by_user_date,'%Y-%m-%d')) as user_days, b.use_days_warning_value,a.by_user_name,a.`name`,a.bar_code,a.medicament_id,a.customer_id FROM rms_medicament a LEFT JOIN rms_medicamentvariety b ON a.variety_id=b.variety_id WHERE DATEDIFF('"""+todayDate+"""',STR_TO_DATE(by_user_date,'%Y-%m-%d'))>b.use_days_warning_value AND a.`status`=2; """ shelflife_obj_list = BllWarning().execute(SQL).fetchall() if shelflife_obj_list: for expire_obj in shelflife_obj_list: # 封装conent,统一化管理 # 封装创建warning方法,统一化管理 # 出库超期预警 object_type = 6 conent = self.warning_content_type(object_type) self.insert_warning_default( customer_id=expire_obj.customer_id, object_type=object_type, object_id=expire_obj.medicament_id, object_name=expire_obj.name, warning_content=conent % ( expire_obj.by_user_name, expire_obj.name, expire_obj.bar_code, str(expire_obj.user_days), str(expire_obj.use_days_warning_value) ) ) time.sleep(1) # SQL查询药柜滤芯保质期预警 SQL = """ SELECT * FROM `rms_client`; """ filter_obj_list = BllWarning().execute(SQL).fetchall() if filter_obj_list is not None: for filter_obj in filter_obj_list: if filter_obj.filter_production_date: # 滤芯过期提前预警时间 生产日期 + 保质期 - 提前预警天数 filter_expire_date = filter_obj.filter_production_date + datetime.timedelta(days=( filter_obj.filter_shelf_life - filter_obj.filter_shelf_life_warning_value)) if filter_expire_date <= datetime.datetime.now(): BllWarning_obj = BllWarning().findList( EntityWarning.object_id == filter_obj.client_id).all() if not BllWarning_obj: # 封装conent,统一化管理 # 封装创建warning方法,统一化管理 # 药柜滤芯保质期预警 object_type = 5 conent = self.warning_content_type( object_type) self.insert_warning_default( customer_id=filter_obj.customer_id, object_type=object_type, object_id=filter_obj.client_id, object_name=filter_obj.client_name, warning_content=conent % ( filter_obj.client_name, str(filter_obj.filter_shelf_life_warning_value), filter_obj.filter_production_date.strftime( '%Y-%m-%d %H:%M:%S'), str(datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S')), str(filter_obj.filter_shelf_life),) ) time.sleep(1) except Exception as e: print(str(e)) # logUtil().debug('预警监测:'+traceback.format_exc()) time.sleep(3600)