diff --git a/iti/applications/models/iot/iot_device.py b/iti/applications/models/iot/iot_device.py index f3475b6..ade536b 100644 --- a/iti/applications/models/iot/iot_device.py +++ b/iti/applications/models/iot/iot_device.py @@ -1,7 +1,7 @@ from iti.applications.extensions import db from iti.applications.common.crud import TimeModelMixin from iti.applications.common.utils import BaseSchema -from apiflask.fields import String, Integer, DateTime +from apiflask.fields import String, Integer, DateTime, Nested class IotDevice(db.Model, TimeModelMixin): """ @@ -22,6 +22,11 @@ class IotDevice(db.Model, TimeModelMixin): brand_name = db.Column(db.String(255), nullable=False, comment="品牌名称") specification_model = db.Column(db.String(255), nullable=False, comment="规格型号") status = db.Column(db.Integer, nullable=False, default=0, comment="状态 0:已停机 1:生产中 2:维修中") + #关系 + workshop = db.relationship( + "IotWorkshop", + primaryjoin="foreign(IotDevice.workshop_id) == IotWorkshop.id", + ) class IotDeviceSchema(BaseSchema): @@ -40,4 +45,19 @@ class IotDeviceSchema(BaseSchema): specification_model = String() status = Integer() created_at = DateTime(format="%Y-%m-%d %H:%M:%S") - updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") \ No newline at end of file + updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") + #关系 + workshop = Nested("IotWorkshopSimpleSchema") + +class IotDeviceSimpleSchema(BaseSchema): + """ + 设备信息表联合查询响应结构 + """ + class Meta: + name = "IotDevice" + + id = Integer() + device_name = String() + device_number = String() + #关系 + workshop = Nested("IotWorkshopSimpleSchema") \ No newline at end of file diff --git a/iti/applications/models/iot/iot_endpoint.py b/iti/applications/models/iot/iot_endpoint.py index b598f47..1976e19 100644 --- a/iti/applications/models/iot/iot_endpoint.py +++ b/iti/applications/models/iot/iot_endpoint.py @@ -1,7 +1,7 @@ from iti.applications.extensions import db from iti.applications.common.crud import TimeModelMixin from iti.applications.common.utils import BaseSchema -from apiflask.fields import String, Integer, DateTime +from apiflask.fields import String, Integer, DateTime, Nested class IotEndpoint(db.Model, TimeModelMixin): @@ -25,6 +25,11 @@ class IotEndpoint(db.Model, TimeModelMixin): brand_name = db.Column(db.String(255), nullable=False, comment="品牌名称") specification_model = db.Column(db.String(255), nullable=False, comment="规格型号") status = db.Column(db.Integer, nullable=False, default=0, comment="状态 0:停用 1:运行中 2:维修中") + #关系 + device = db.relationship( + "IotDevice", + primaryjoin="foreign(IotEndpoint.device_id) == IotDevice.id", + ) class IotEndpointSchema(BaseSchema): @@ -45,4 +50,20 @@ class IotEndpointSchema(BaseSchema): specification_model = String() status = Integer() created_at = DateTime(format="%Y-%m-%d %H:%M:%S") - updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") \ No newline at end of file + updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") + #关系 + device = Nested("IotDeviceSimpleSchema") + + +class IotEndpointSimpleSchema(BaseSchema): + """ + 采集端信息表联合查询响应结构 + """ + class Meta: + name = "IotEndpoint" + + id = Integer() + endpoint_name = String() + endpoint_number = String() + #关系 + device = Nested("IotDeviceSimpleSchema") \ No newline at end of file diff --git a/iti/applications/models/iot/iot_node.py b/iti/applications/models/iot/iot_node.py index fa14171..e90e174 100644 --- a/iti/applications/models/iot/iot_node.py +++ b/iti/applications/models/iot/iot_node.py @@ -1,7 +1,7 @@ from iti.applications.extensions import db from iti.applications.common.crud import TimeModelMixin from iti.applications.common.utils import BaseSchema -from apiflask.fields import String, Integer, DateTime +from apiflask.fields import String, Integer, DateTime, Nested class IotNode(db.Model, TimeModelMixin): @@ -28,6 +28,11 @@ class IotNode(db.Model, TimeModelMixin): calling_effective_config = db.Column(db.String(255), nullable=False, comment="报警触发表达式") method_content = db.Column(db.String(255), nullable=False, comment="方法节点") status = db.Column(db.Integer, nullable=False, default=0, comment="状态 0:禁用 1:启用") + #关系 + endpoint = db.relationship( + "IotEndpoint", + primaryjoin="foreign(IotNode.endpoint_id) == IotEndpoint.id", + ) class IotNodeSchema(BaseSchema): @@ -51,4 +56,6 @@ class IotNodeSchema(BaseSchema): method_content = String() status = Integer() created_at = DateTime(format="%Y-%m-%d %H:%M:%S") - updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") \ No newline at end of file + updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") + #关系 + endpoint = Nested("IotEndpointSimpleSchema") \ No newline at end of file diff --git a/iti/applications/models/iot/iot_workshop.py b/iti/applications/models/iot/iot_workshop.py index b489377..1f0dbd3 100644 --- a/iti/applications/models/iot/iot_workshop.py +++ b/iti/applications/models/iot/iot_workshop.py @@ -38,4 +38,15 @@ class IotWorkshopSchema(BaseSchema): status = Integer() remark = String() created_at = DateTime(format="%Y-%m-%d %H:%M:%S") - updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") \ No newline at end of file + updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") + +class IotWorkshopSimpleSchema(BaseSchema): + """ + 车间信息表联合查询响应结构 + """ + class Meta: + name = "IotWorkshop" + + id = Integer() + workshop_name = String() + workshop_number = String() \ No newline at end of file diff --git a/iti/applications/routes/iot/device_ctl.py b/iti/applications/routes/iot/device_ctl.py index 060f5f6..d50db70 100644 --- a/iti/applications/routes/iot/device_ctl.py +++ b/iti/applications/routes/iot/device_ctl.py @@ -31,7 +31,7 @@ def list_device(query_data: DeviceQuery): 获取设备列表 """ - return success(get_list_or_page(query_data)) + return success(get_list(query_data)) @bp.get("/page") @@ -45,7 +45,7 @@ def page_device(query_data: DeviceQuery): 分页获取设备列表 """ - return page(get_list_or_page(query_data)) + return page(get_page(query_data)) @bp.post("/add") @@ -105,9 +105,9 @@ def delete_device(id: int): return success() -def get_list_or_page(query_data: DeviceQuery): +def get_page(query_data: DeviceQuery): """ - 获取设备信息列表或分页 + 获取设备信息分页 """ query = select(IotDevice).order_by(IotDevice.created_at.desc()) if query_data.keyword: @@ -118,9 +118,26 @@ def get_list_or_page(query_data: DeviceQuery): ) if query_data.workshop_id: query = query.filter(IotDevice.workshop_id == query_data.workshop_id) - if query_data.status: + if query_data.status is not None: query = query.filter(IotDevice.status == query_data.status) - if query_data.page and query_data.size: - return db.paginate(query, page=query_data.page, per_page=query_data.size) - else: - return db.session.scalars(query).all() + + return db.paginate(query, page=query_data.page, per_page=query_data.size) + + +def get_list(query_data: DeviceQuery): + """ + 获取设备列表 + """ + query = select(IotDevice).options(noload(IotDevice.workshop)).order_by(IotDevice.created_at.desc()) + if query_data.keyword: + kw = ModelFilter.escape_like(query_data.keyword) + query = query.filter( + IotDevice.device_name.like(f"%{kw}%") + | IotDevice.device_number.like(f"%{kw}%") + ) + if query_data.workshop_id: + query = query.filter(IotDevice.workshop_id == query_data.workshop_id) + if query_data.status is not None: + query = query.filter(IotDevice.status == query_data.status) + + return db.session.scalars(query).all() \ No newline at end of file diff --git a/iti/applications/routes/iot/endpoint_ctl.py b/iti/applications/routes/iot/endpoint_ctl.py index b5cd427..91ee920 100644 --- a/iti/applications/routes/iot/endpoint_ctl.py +++ b/iti/applications/routes/iot/endpoint_ctl.py @@ -31,7 +31,7 @@ def list_endpoint(query_data: EndpointQuery): 获取采集端列表 """ - return success(get_list_or_page(query_data)) + return success(get_list(query_data)) @bp.get("/page") @@ -45,7 +45,7 @@ def page_endpoint(query_data: EndpointQuery): 分页获取采集端列表 """ - return page(get_list_or_page(query_data)) + return page(get_page(query_data)) @bp.post("/add") @@ -104,9 +104,9 @@ def delete_endpoint(id: int): db.session.commit() return success() -def get_list_or_page(query_data: EndpointQuery): +def get_page(query_data: EndpointQuery): """ - 获取采集端信息列表或分页 + 获取采集端信息分页 """ query = select(IotEndpoint).order_by(IotEndpoint.created_at.desc()) if query_data.keyword: @@ -117,9 +117,26 @@ def get_list_or_page(query_data: EndpointQuery): ) if query_data.device_id: query = query.filter(IotEndpoint.device_id == query_data.device_id) - if query_data.status: + if query_data.status is not None: query = query.filter(IotEndpoint.status == query_data.status) - if query_data.page and query_data.size: - return db.paginate(query, page=query_data.page, per_page=query_data.size) - else: - return db.session.scalars(query).all() + + return db.paginate(query, page=query_data.page, per_page=query_data.size) + + +def get_list(query_data: EndpointQuery): + """ + 获取采集端信息列表 + """ + query = select(IotEndpoint).options(noload(IotEndpoint.device)).order_by(IotEndpoint.created_at.desc()) + if query_data.keyword: + kw = ModelFilter.escape_like(query_data.keyword) + query = query.filter( + IotEndpoint.endpoint_name.like(f"%{kw}%") + | IotEndpoint.endpoint_number.like(f"%{kw}%") + ) + if query_data.device_id: + query = query.filter(IotEndpoint.device_id == query_data.device_id) + if query_data.status is not None: + query = query.filter(IotEndpoint.status == query_data.status) + + return db.session.scalars(query).all() \ No newline at end of file diff --git a/iti/applications/routes/iot/node_ctl.py b/iti/applications/routes/iot/node_ctl.py index 0f1734d..4904dc1 100644 --- a/iti/applications/routes/iot/node_ctl.py +++ b/iti/applications/routes/iot/node_ctl.py @@ -31,7 +31,7 @@ def list_node(query_data: NodeQuery): 获取采集节点列表 """ - return success(get_list_or_page(query_data)) + return success(get_list(query_data)) @bp.get("/page") @@ -45,7 +45,7 @@ def page_node(query_data: NodeQuery): 分页获取采集节点列表 """ - return page(get_list_or_page(query_data)) + return page(get_page(query_data)) @bp.post("/add") @@ -105,16 +105,26 @@ def delete_node(id: int): return success() -def get_list_or_page(query_data: NodeQuery): +def get_page(query_data: NodeQuery): """ - 获取采集节点列表或分页 + 获取采集节点分页 """ query = select(IotNode).order_by(IotNode.created_at.desc()) if query_data.endpoint_id: query = query.filter(IotNode.endpoint_id == query_data.endpoint_id) - if query_data.status: + if query_data.status is not None: query = query.filter(IotNode.status == query_data.status) - if query_data.page and query_data.size: - return db.paginate(query, page=query_data.page, per_page=query_data.size) - else: - return db.session.scalars(query).all() + + return db.paginate(query, page=query_data.page, per_page=query_data.size) + + +def get_list(query_data: NodeQuery): + """ + 获取采集节点列表 + """ + query = select(IotNode).options(noload(IotNode.endpoint)).order_by(IotNode.created_at.desc()) + if query_data.endpoint_id: + query = query.filter(IotNode.endpoint_id == query_data.endpoint_id) + if query_data.status is not None: + query = query.filter(IotNode.status == query_data.status) + return db.session.scalars(query).all() \ No newline at end of file diff --git a/iti/applications/routes/iot/workshop_ctl.py b/iti/applications/routes/iot/workshop_ctl.py index 4c2d468..e0638a8 100644 --- a/iti/applications/routes/iot/workshop_ctl.py +++ b/iti/applications/routes/iot/workshop_ctl.py @@ -116,7 +116,7 @@ def get_list_or_page(query_data: WorkshopQuery): | IotWorkshop.workshop_number.like(f"%{kw}%") | IotWorkshop.director_name.like(f"%{kw}%") ) - if query_data.status: + if query_data.status is not None: query = query.filter(IotWorkshop.status == query_data.status) if query_data.page and query_data.size: return db.paginate(query, page=query_data.page, per_page=query_data.size)