service_list.py 6.2 KB
# coding=utf-8
#author:        4N
#createtime:    2021/9/14
#email:         nheweijun@sina.com


from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.ModelVisitor import ModelVisitor
from .models import Service,ServiceFunction,ServiceEngine
from sqlalchemy import or_
import requests
import re
from .util.ServiceType import ServiceType
from app.util.component.UserAlias import UserAlias

class Api(ApiTemplate):
    api_name = "服务列表"

    def process(self):

        # 返回结果
        res = {}

        try:
            page_index = int(self.para.get("page_index", "0"))
            page_size = int(self.para.get("page_size", "10"))

            title = self.para.get("title")
            name = self.para.get("name")
            type = self.para.get("type")
            function_type = self.para.get("function_type")
            state = self.para.get("state")

            catalog_guid = self.para.get("catalog_guid")

            services = Service.query.order_by(Service.update_time.desc())

            if state:
                services = services.filter_by(state=int(state))
            if type:
                services = services.filter_by(type=type)

            if catalog_guid:
                services = services.filter_by(catalog_guid=catalog_guid)
            # 并集
            if title and name:
                services = services.filter(
                    or_(Service.title.like("%" + title + "%"), Service.name.like("%" + name + "%")))
            else:
                if title:
                    services = services.filter(Service.title.like("%" + title + "%"))
                if name:
                    services = services.filter(Service.name.like("%" + name + "%"))


            # 本地服务
            services = services.all()
            services_json = ModelVisitor.objects_to_jsonarray(services)
            for service_json in services_json:
                service_json["functions"] =  sorted(ModelVisitor.objects_to_jsonarray(ServiceFunction.query.filter_by(service_guid=service_json["guid"]).all()),
                                                    key=lambda x:x["type"])

            # 影像地图
            image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()

            for ie in image_engines:
                url = "{}/API/Service/List".format(ie.url)
                try:
                    response:requests.Response = requests.post(url,{"page_size":"9999","page_index":"0"})
                    if not response.json().get("result"):
                        raise Exception("获取影像地图失败!")
                    else:
                        raw_json = response.json()["data"]["list"]
                        if state:
                            raw_json = [ service for service in raw_json if service["state"] == int(state)]
                        if type:
                            raw_json = [service for service in raw_json if service["type"] == type]
                        if catalog_guid:
                            raw_json = [service for service in raw_json if service["catalog_guid"] == catalog_guid]
                        # 并集
                        if title and name:
                            raw_json = [service for service in raw_json if  re.search(name, service["name"]) or re.search(title, service["title"])]
                        else:
                            if title:
                                raw_json = [service for service in raw_json if re.search(title, service["title"])]
                            if name:
                                raw_json = [service for service in raw_json if re.search(name, service["name"])]
                        services_json.extend(raw_json)
                except:
                    pass

            # 筛选服务能力
            if function_type:
                services_json = [s for s in services_json if list(f["type"] for f in s["functions"]).__contains__(function_type)]

            res["data"] = {}
            res["data"]["count"] = len(services_json)

            # update时间倒数
            services_json = sorted(services_json,key=lambda x:x["update_time"],reverse=True)

            res["data"]["list"] = services_json[page_index*page_size:(page_index+1)*page_size]

            # 显示别名
            user_alias = UserAlias()
            for service_json in res["data"]["list"]:

                service_json["display_name"] = user_alias.get_alias(service_json["creator"])

            res["result"] = True

        except Exception as e:
            raise e

        return res

    def judge(self,name):
        return name.__contains__("演示")

    api_doc = {
        "tags": ["服务接口"],
        "parameters": [
            {"name": "page_index",
             "in": "formData",
             "type": "int",
             "description": "页"},
            {"name": "page_size",
             "in": "formData",
             "type": "int",
             "description": "页大小"},
            {"name": "title",
             "in": "formData",
             "type": "string",
             "description": "服务标题"},
            {"name": "name",
             "in": "formData",
             "type": "string",
             "description": "服务名"},

            {"name": "function_type",
             "in": "formData",
             "type": "string",
             "description": "服务类型",
             "enum":["WMS","WMTS","WFS"]},

            {"name": "state",
             "in": "formData",
             "type": "string",
             "description": "状态",
             "enum":[0,1]},
            {"name": "type",
             "in": "formData",
             "type": "string",
             "description": "服务类型",
             "enum":[st.value for st in ServiceType]},
            {"name": "catalog_guid",
             "in": "formData",
             "type": "string",
             "description": "服务目录"},
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }