map_service_edit.py 5.1 KB
# coding=utf-8
#author:        4N
#createtime:    2021/9/17
#email:         nheweijun@sina.com


from app.util.component.ApiTemplate import ApiTemplate
import uuid
from ..models import Service,MapService,db,ServiceFunction
import requests
import configure
import json
import datetime
from app.util.component.UserCheck import UserCheck

class Api(ApiTemplate):

    api_name = "修改MapService服务"

    def process(self):

        # 返回结果
        res = {}

        try:
            guid = self.para.get("guid")
            functions = self.para.get("functions")
            service :Service = Service.query.filter_by(guid=guid).one_or_none()
            this_time = datetime.datetime.now()

            if not service:
                raise Exception("服务不存在!")

            #验证权限
            UserCheck.verify(service.creator)

            service_update = {"update_time":this_time}
            map_service_update = {}

            for key in self.para.keys():
                if key in ["name","title","description","overview","catalog_guid"]:
                    service_update[key] = self.para.get(key)
                if key in ["name","tile","project","capabilities"]:
                    map_service_update[key] = self.para.get(key)

            para = {"name":self.para.get("name"),
                    "title":self.para.get("title"),
                    "type":"mapserver",
                    "capabilities":2,
                    "project":self.para.get("project"),
                    "state":service.state
                    }

            map_service_register_url = "{}/dmap/api/manager/regservice".format(configure.dmap_engine)
            resp: requests.Response  = requests.post(map_service_register_url,data=json.dumps(para),
                                            headers={'Content-Type':'application/json'},timeout=3
                                            )
            if resp.status_code == 200:
                resp.encoding="utf-8"
                resp_json = resp.json()
                if not resp_json["status"]=="1":
                    raise Exception("调用矢量服务的修改服务接口失败!")
            else:
                raise Exception("调用矢量服务的修改服务接口失败!")

            service_update["overview"] = resp_json["url"]

            # 修改功能
            if functions:
                new_types = functions.split(",")
                old_functions = ServiceFunction.query.filter_by(service_guid=guid).all()
                for function in old_functions:
                    if function.type not in new_types:
                        db.session.delete(function)
                for new_type in new_types:
                    if new_type not in [fun.type for fun in old_functions]:
                        service_function = ServiceFunction(guid=uuid.uuid1().__str__(),type=new_type,
                                                           service_guid=guid)
                        db.session.add(service_function)

            map_service = MapService.query.filter_by(service_guid=guid)

            if service_update:
                Service.query.filter_by(guid=guid).update(service_update)
            if map_service_update:
                map_service.update(map_service_update)

            db.session.commit()

            res["result"] = True
        except Exception as e:
            raise e

        return res

    api_doc = {
        "tags": ["矢量地图接口"],
        "parameters": [

            {"name": "name",
             "in": "formData",
             "type": "string",
             "required": "true",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "title",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "description",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "catalog_guid",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},


            {"name": "layer_style",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图]图层样式"},

            {"name": "functions",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图]服务能力,用逗号相隔"},

            #矢量地图参数
            {"name": "capabilities",
             "in": "formData",
             "type": "int",
             "description": "[矢量地图]"},
            {"name": "project",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图]project"},

        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }