|
@@ -0,0 +1,580 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <el-dialog v-model="visible" :title="titleMap[mode]" width="860" :close-on-click-modal="false" @closed="$emit('closed')">
|
|
|
|
|
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="120">
|
|
|
|
|
+ <el-card header="基础信息" shadow="never">
|
|
|
|
|
+ <el-row>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目名称" prop="projectName">
|
|
|
|
|
+ <el-input v-model="form.projectName" placeholder="请输入项目名称"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目别名">
|
|
|
|
|
+ <el-input v-model="form.projectAliasName" placeholder="请输入项目别名"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="所属企业" prop="deptId">
|
|
|
|
|
+ <el-tree-select v-model="form.deptId" v-bind="props.treeSelectProps" :props="{ label: 'name', value: 'deptId' }" ></el-tree-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目类型" prop="projectType">
|
|
|
|
|
+ <el-select v-model="form.projectType" placeholder="请选择项目类型">
|
|
|
|
|
+ <el-option v-for="item in typeDic" :key="item" :value="item"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目状态" prop="projectStatus">
|
|
|
|
|
+ <el-select v-model="form.projectStatus" placeholder="请选择项目状态">
|
|
|
|
|
+ <el-option v-for="item in statusDic" :key="item" :value="item"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="建设规模" prop="projectScale">
|
|
|
|
|
+ <el-radio-group v-model="form.projectScale">
|
|
|
|
|
+ <el-radio value="3">小型</el-radio>
|
|
|
|
|
+ <el-radio value="6">中型</el-radio>
|
|
|
|
|
+ <el-radio value="9">大型</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="投资总额">
|
|
|
|
|
+ <el-input-number v-model="form.projectMoney" :min="0" :precision="2" :controls="false" placeholder="请输入投资总额">
|
|
|
|
|
+ <template #suffix>万元</template>
|
|
|
|
|
+ </el-input-number>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="安监备案号">
|
|
|
|
|
+ <el-input v-model="form.projectBackupsNumber" clearable placeholder="请输入安监备案号"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="建筑面积">
|
|
|
|
|
+ <el-input-number v-model="form.projectBuildingArea" :min="0" :precision="2" :controls="false" placeholder="请输入建筑面积">
|
|
|
|
|
+ <template #suffix>㎡</template>
|
|
|
|
|
+ </el-input-number>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="结构形式">
|
|
|
|
|
+ <el-input v-model="form.projectStructure" clearable placeholder="请输入结构形式"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="合同工期">
|
|
|
|
|
+ <el-date-picker v-model="form.contractDate" type="daterange" value-format="YYYY-MM-DD" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="设计使用年限">
|
|
|
|
|
+ <el-input-number v-model="form.designLife" :min="0" :controls="false" placeholder="请输入设计使用年限"></el-input-number>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="发证机关">
|
|
|
|
|
+ <el-input v-model="form.licenceAuthority" clearable placeholder="请输入发证机关"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="发证日期">
|
|
|
|
|
+ <el-date-picker v-model="form.licenceDate" value-format="YYYY-MM-DD" placeholder="请选择发证日期"></el-date-picker>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="监督机构">
|
|
|
|
|
+ <el-input v-model="form.superviseAuthority" clearable placeholder="请输入工程质量监督机构"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="施工许可证编号">
|
|
|
|
|
+ <el-input v-model="form.licenceSgNo" clearable placeholder="请输入施工许可证编号"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24">
|
|
|
|
|
+ <el-form-item class="m-b-0" label="施工许可证">
|
|
|
|
|
+ <sc-upload-file v-model="form.folders['project/licence_sg'].entities" :limit="1">
|
|
|
|
|
+ <el-button type="primary" size="small">
|
|
|
|
|
+ <template #icon><sc-iconify icon="ant-design:plus-outlined"></sc-iconify></template>
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </sc-upload-file>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+
|
|
|
|
|
+ <el-card header="接口信息" shadow="never">
|
|
|
|
|
+ <el-card header="青岛市市平台接口信息" shadow="never">
|
|
|
|
|
+ <el-row>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目名称">
|
|
|
|
|
+ <el-input v-model="form.qdProjectName" clearable placeholder="请输入项目名称"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目ID" prop="qdProjectId">
|
|
|
|
|
+ <el-input v-model="form.qdProjectId" clearable placeholder="请输入项目ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目TOKEN">
|
|
|
|
|
+ <el-input v-model="form.qdProjectToken" clearable placeholder="请输入项目TOKEN"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目PROVIDER">
|
|
|
|
|
+ <el-input v-model="form.qdProjectProvider" clearable placeholder="请输入项目PROVIDER"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="劳务ID">
|
|
|
|
|
+ <el-input v-model="form.qdProjectNo" clearable placeholder="请输入劳务ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+
|
|
|
|
|
+ <el-card header="崂山区平台接口信息" shadow="never">
|
|
|
|
|
+ <el-row>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目名称">
|
|
|
|
|
+ <el-input v-model="form.lsProjectName" clearable placeholder="请输入项目名称"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目ID" prop="qdProjectId">
|
|
|
|
|
+ <el-input v-model="form.lsProjectId" clearable placeholder="请输入项目ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目TOKEN">
|
|
|
|
|
+ <el-input v-model="form.lsProjectToken" clearable placeholder="请输入项目TOKEN"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目PROVIDER">
|
|
|
|
|
+ <el-input v-model="form.lsProjectProvider" clearable placeholder="请输入项目PROVIDER"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="劳务ID">
|
|
|
|
|
+ <el-input v-model="form.lsProjectNo" clearable placeholder="请输入劳务ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+
|
|
|
|
|
+ <el-card header="青岛市市政平台接口信息" shadow="never">
|
|
|
|
|
+ <el-row>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目名称">
|
|
|
|
|
+ <el-input v-model="form.szProjectName" clearable placeholder="请输入项目名称"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目ID" prop="qdProjectId">
|
|
|
|
|
+ <el-input v-model="form.szProjectId" clearable placeholder="请输入项目ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目TOKEN">
|
|
|
|
|
+ <el-input v-model="form.szProjectToken" clearable placeholder="请输入项目TOKEN"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目PROVIDER">
|
|
|
|
|
+ <el-input v-model="form.szProjectProvider" clearable placeholder="请输入项目PROVIDER"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="劳务ID">
|
|
|
|
|
+ <el-input v-model="form.szProjectNo" clearable placeholder="请输入劳务ID"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+
|
|
|
|
|
+ <el-card header="位置信息" shadow="never">
|
|
|
|
|
+ <el-row>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="省/直辖市">
|
|
|
|
|
+ <el-select v-model="form.province" clearable :disabled="!districtComplete" placeholder="选择省/直辖市" @change="changeDistrict($event, 'province')">
|
|
|
|
|
+ <el-option v-for="(item, index) in districtList.province" :key="index" :label="item.name" :value="item.name"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="地级市">
|
|
|
|
|
+ <el-select v-model="form.city" clearable :disabled="!districtComplete" placeholder="选择地级市" @change="changeDistrict($event, 'city')">
|
|
|
|
|
+ <el-option v-for="(item, index) in districtList.city" :key="index" :label="item.name" :value="item.name"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="区县">
|
|
|
|
|
+ <el-select v-model="form.region" clearable :disabled="!districtComplete" placeholder="选择区县" @change="changeDistrict($event, 'region')">
|
|
|
|
|
+ <el-option v-for="(item, index) in districtList.region" :key="index" :label="item.name" :value="item.name"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="街道">
|
|
|
|
|
+ <el-select v-model="form.street" clearable :disabled="!districtComplete" placeholder="选择街道" @change="changeDistrict($event, 'street')">
|
|
|
|
|
+ <el-option v-for="(item, index) in districtList.street" :key="index" :label="item.name" :value="item.name"></el-option>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目地址">
|
|
|
|
|
+ <el-input v-model="form.address" clearable :disabled="!districtComplete" placeholder="请输入项目地址" @change="addressChange"></el-input>
|
|
|
|
|
+ <div class="el-form-item-msg">输入地址进行查询,并点击坐标点以确认坐标。若无坐标点请输入更详情地址</div>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :md="12" :xs="24">
|
|
|
|
|
+ <el-form-item label="项目坐标">
|
|
|
|
|
+ <el-input v-model="form.projectCoordinates" readonly placeholder="选择行政区级别或输入地址查询"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24">
|
|
|
|
|
+ <div id="container"></div>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+
|
|
|
|
|
+ <template #footer>
|
|
|
|
|
+ <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
|
|
|
|
|
+ <el-button auto-insert-space @click="visible = false">取消</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup>
|
|
|
|
|
+import API from "@/api";
|
|
|
|
|
+import TOOL from "@/utils/tool";
|
|
|
|
|
+import XEUtils from "xe-utils";
|
|
|
|
|
+import AMapLoader from '@amap/amap-jsapi-loader';
|
|
|
|
|
+import { typeDic, statusDic, interfaceDic, polygonOptions } from "./main";
|
|
|
|
|
+import scUploadFile from "@/components/scUpload/file";
|
|
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
|
|
+
|
|
|
|
|
+const $emit = defineEmits(["success", "closed"]);
|
|
|
|
|
+const props = defineProps({
|
|
|
|
|
+ treeSelectProps: { type: Object, default: () => {} }
|
|
|
|
|
+});
|
|
|
|
|
+const visible = ref(false);
|
|
|
|
|
+const isSaving = ref(false);
|
|
|
|
|
+
|
|
|
|
|
+const mode = ref("add");
|
|
|
|
|
+const titleMap = reactive({
|
|
|
|
|
+ add: "新增",
|
|
|
|
|
+ edit: "修改"
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const form = ref({
|
|
|
|
|
+ fpiId: null,
|
|
|
|
|
+ projectName: null,
|
|
|
|
|
+ projectAliasName: null,
|
|
|
|
|
+ deptId: null,
|
|
|
|
|
+ projectFirmName: null,
|
|
|
|
|
+ projectType: null,
|
|
|
|
|
+ projectStatus: null,
|
|
|
|
|
+ projectScale: null,
|
|
|
|
|
+ projectMoney: null,
|
|
|
|
|
+ projectBackupsNumber: null,
|
|
|
|
|
+ projectBuildingArea: null,
|
|
|
|
|
+ projectStructure: null,
|
|
|
|
|
+ contractDate: [],
|
|
|
|
|
+ contractBeginDate: null,
|
|
|
|
|
+ contractEndDate: null,
|
|
|
|
|
+ designLife: null,
|
|
|
|
|
+ licenceAuthority: null,
|
|
|
|
|
+ licenceDate: null,
|
|
|
|
|
+ superviseAuthority: null,
|
|
|
|
|
+ licenceSgNo: null,
|
|
|
|
|
+ folders: {
|
|
|
|
|
+ "project/licence_sg": {
|
|
|
|
|
+ entities: []
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ qdProjectName: null,
|
|
|
|
|
+ qdProjectId: null,
|
|
|
|
|
+ qdProjectToken: null,
|
|
|
|
|
+ qdProjectProvider: null,
|
|
|
|
|
+ qdProjectNo: null,
|
|
|
|
|
+
|
|
|
|
|
+ lsProjectName: null,
|
|
|
|
|
+ lsProjectId: null,
|
|
|
|
|
+ lsProjectToken: null,
|
|
|
|
|
+ lsProjectProvider: null,
|
|
|
|
|
+ lsProjectNo: null,
|
|
|
|
|
+
|
|
|
|
|
+ szProjectName: null,
|
|
|
|
|
+ szProjectId: null,
|
|
|
|
|
+ szProjectToken: null,
|
|
|
|
|
+ szProjectProvider: null,
|
|
|
|
|
+ szProjectNo: null,
|
|
|
|
|
+
|
|
|
|
|
+ province: null,
|
|
|
|
|
+ city: null,
|
|
|
|
|
+ region: null,
|
|
|
|
|
+ street: null,
|
|
|
|
|
+ address: null,
|
|
|
|
|
+ longitude: null,
|
|
|
|
|
+ latitude: null,
|
|
|
|
|
+ projectCoordinates: ""
|
|
|
|
|
+});
|
|
|
|
|
+const rules = reactive({
|
|
|
|
|
+ projectName: [{ required: true, message: "请输入项目名称" }],
|
|
|
|
|
+ deptId: [{ required: true, message: "请选择所属企业" }],
|
|
|
|
|
+ projectType: [{ required: true, message: "请选择项目类型" }],
|
|
|
|
|
+ projectStatus: [{ required: true, message: "请选择项目状态" }],
|
|
|
|
|
+ projectScale: [{ required: true, message: "请选择建设规模" }],
|
|
|
|
|
+
|
|
|
|
|
+ qdProjectId: [{ len: 16, message: "请输入16位项目ID" }],
|
|
|
|
|
+ lsProjectId: [{ len: 16, message: "请输入16位项目ID" }],
|
|
|
|
|
+ szProjectId: [{ len: 16, message: "请输入16位项目ID" }]
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+let AMap = null, map = null, marker = null, polygons = null, districtSearch = null, geocoder = null
|
|
|
|
|
+const districtComplete = ref(false);
|
|
|
|
|
+const districtList = reactive({
|
|
|
|
|
+ province: [],
|
|
|
|
|
+ city: computed(() => XEUtils.map(XEUtils.get(XEUtils.find(districtList.province, item => item.name == form.value.province), "districtList"), item => ({ ...item, preLevel: form.value.province }))),
|
|
|
|
|
+ region: computed(() => XEUtils.map(XEUtils.get(XEUtils.find(districtList.city, item => item.name == form.value.city), "districtList"), item => ({ ...item, preLevel: form.value.city }))),
|
|
|
|
|
+ street: computed(() => XEUtils.map(XEUtils.get(XEUtils.find(districtList.region, item => item.name == form.value.region), "districtList"), item => ({ ...item, preLevel: form.value.region })))
|
|
|
|
|
+});
|
|
|
|
|
+const boundAreas = reactive({});
|
|
|
|
|
+
|
|
|
|
|
+const open = () => {
|
|
|
|
|
+ visible.value = true;
|
|
|
|
|
+ initMap();
|
|
|
|
|
+}
|
|
|
|
|
+const setData = async fpiId => {
|
|
|
|
|
+ open();
|
|
|
|
|
+ mode.value = "edit";
|
|
|
|
|
+ API.system.project.detail({ fpiId }).then(res => {
|
|
|
|
|
+ XEUtils.objectEach(form.value, (_, key) => {
|
|
|
|
|
+ if (key == "projectFirmName") XEUtils.set(form.value, "deptId", XEUtils.get(XEUtils.findTree(props.treeSelectProps.data, item => item.name == XEUtils.get(res.project, key)), "item.deptId", null))
|
|
|
|
|
+ else if (key == "folders") {
|
|
|
|
|
+ XEUtils.objectEach(form.value.folders, (_, folder_key) => {
|
|
|
|
|
+ XEUtils.set(form.value, `${key}.${folder_key}.entities`, XEUtils.map(XEUtils.get(res.project, `${key}.${folder_key}.entities`), ({ id, mineType, name, path }) => ({ id, mineType, name, path })))
|
|
|
|
|
+ });
|
|
|
|
|
+ } else XEUtils.set(form.value, key, XEUtils.get(res.project, key) || XEUtils.get(res.position, key, null))
|
|
|
|
|
+ });
|
|
|
|
|
+ XEUtils.arrayEach(res.apiList, item => {
|
|
|
|
|
+ const prefix = XEUtils.get(interfaceDic, item.platformType);
|
|
|
|
|
+ XEUtils.objectEach(XEUtils.pick(item, ["projectName", "projectId", "projectToken", "projectProvider", "projectNo"]), (val, key) => {
|
|
|
|
|
+ XEUtils.set(form.value, prefix + TOOL.capitalizeWords(key), val);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ drawMap();
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const initMap = async () => {
|
|
|
|
|
+ AMap = await AMapLoader.load({ key: "2beebf5f21929258fd62a8ea4223e837", version: "2.0", plugins: ["AMap.DistrictSearch", "AMap.Geocoder"] });
|
|
|
|
|
+ map = new AMap.Map("container", { zoom: 18 });
|
|
|
|
|
+ marker = new AMap.Marker();
|
|
|
|
|
+ districtSearch = new AMap.DistrictSearch({ level: "country", subdistrict: 4, extensions: "all" });
|
|
|
|
|
+ districtSearch.search("中国", (status, result) => {
|
|
|
|
|
+ districtList.province = status == "complete" ? XEUtils.get(result, "districtList[0].districtList", []) : [];
|
|
|
|
|
+ districtComplete.value = status == "complete";
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ geocoder = new AMap.Geocoder({ batch: false });
|
|
|
|
|
+ map.on("click", ({ lnglat }) => {
|
|
|
|
|
+ if (districtComplete.value) {
|
|
|
|
|
+ map.clearMap();
|
|
|
|
|
+ const position = [lnglat.lng, lnglat.lat];
|
|
|
|
|
+ marker.setPosition(position);
|
|
|
|
|
+ marker.add(map);
|
|
|
|
|
+ map.setFitView();
|
|
|
|
|
+
|
|
|
|
|
+ geocoder.getAddress(position, (status, result) => {
|
|
|
|
|
+ if (status === "complete" && result.regeocode) setPosition(position, result.regeocode);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const drawMap = () => {
|
|
|
|
|
+ geocoder.getAddress(XEUtils.get(form.value, "projectCoordinates", "").split(","), (status, result) => {
|
|
|
|
|
+ if (status === "complete" && result.regeocode) {
|
|
|
|
|
+ form.value.longitude = XEUtils.first(form.value.projectCoordinates.split(","));
|
|
|
|
|
+ form.value.latitude = XEUtils.last(form.value.projectCoordinates.split(","));
|
|
|
|
|
+ map.clearMap();
|
|
|
|
|
+ marker.setPosition(form.value.projectCoordinates.split(","));
|
|
|
|
|
+ map.add(marker);
|
|
|
|
|
+ map.setFitView();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ form.value.longitude = null;
|
|
|
|
|
+ form.value.latitude = null;
|
|
|
|
|
+ form.value.projectCoordinates = "";
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getBound = (keyword, key) => {
|
|
|
|
|
+ const { preLevel, citycode } = XEUtils.find(districtList[key], item => item.name == keyword);
|
|
|
|
|
+ districtSearch.setLevel(key == "region" ? "district" : key);
|
|
|
|
|
+ districtSearch.setSubdistrict(1);
|
|
|
|
|
+ districtSearch.search(keyword, (status, result) => {
|
|
|
|
|
+ if (status == "complete" && result.districtList.length) {
|
|
|
|
|
+ const { boundaries } = key == "province" ? XEUtils.first(result.districtList) : XEUtils.find(result.districtList, item => item.citycode == citycode);
|
|
|
|
|
+ if (boundaries) {
|
|
|
|
|
+ const boundAreas_key = key == "province" ? keyword : preLevel + keyword;
|
|
|
|
|
+ XEUtils.set(boundAreas, boundAreas_key, boundaries);
|
|
|
|
|
+ drawPolygons(keyword, key);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const drawPolygons = (keyword, key) => {
|
|
|
|
|
+ const distData = XEUtils.find(districtList[key], item => item.name == keyword);
|
|
|
|
|
+ const boundAreas_key = key == "province" ? keyword : distData.preLevel + keyword;
|
|
|
|
|
+ if (XEUtils.has(boundAreas, boundAreas_key)) {
|
|
|
|
|
+ form.value.longitude = XEUtils.get(distData, "center.lng", null);
|
|
|
|
|
+ form.value.latitude = XEUtils.get(distData, "center.lat", null);
|
|
|
|
|
+ form.value.projectCoordinates = XEUtils.get(distData, "center.lng", "") + "," + XEUtils.get(distData, "center.lat", "") || "";
|
|
|
|
|
+ polygons = XEUtils.map(boundAreas[boundAreas_key], path => new AMap.Polygon({ path, ...polygonOptions }));
|
|
|
|
|
+ map.add(polygons);
|
|
|
|
|
+ map.setFitView(polygons);
|
|
|
|
|
+ } else getBound(keyword, key);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const changeDistrict = (keyword, key) => {
|
|
|
|
|
+ if (key == "province") {
|
|
|
|
|
+ form.value.city = null;
|
|
|
|
|
+ form.value.region = null;
|
|
|
|
|
+ form.value.street = null;
|
|
|
|
|
+ form.value.longitude = null;
|
|
|
|
|
+ form.value.latitude = null;
|
|
|
|
|
+ form.value.projectCoordinates = "";
|
|
|
|
|
+ }
|
|
|
|
|
+ if (key == "city") {
|
|
|
|
|
+ form.value.region = null;
|
|
|
|
|
+ form.value.street = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (key == "region") form.value.street = null;
|
|
|
|
|
+ form.value.address = null;
|
|
|
|
|
+ map.clearMap();
|
|
|
|
|
+ if (keyword) drawPolygons(keyword, key);
|
|
|
|
|
+ else {
|
|
|
|
|
+ if (key == "city") drawPolygons(form.value.province, "province");
|
|
|
|
|
+ if (key == "region") drawPolygons(form.value.city, "city");
|
|
|
|
|
+ if (key == "street") drawPolygons(form.value.region, "region");
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const addressChange = keyword => {
|
|
|
|
|
+ polygons && map.remove(polygons);
|
|
|
|
|
+ form.value.city && geocoder.setCity(form.value.city);
|
|
|
|
|
+ if (keyword) {
|
|
|
|
|
+ geocoder.getLocation(keyword, (status, result) => {
|
|
|
|
|
+ if (status === "complete" && result.geocodes.length) {
|
|
|
|
|
+ map.clearMap();
|
|
|
|
|
+ const poiMarkers = result.geocodes.slice(0, 5).map((item, index) => {
|
|
|
|
|
+ const poiMarker = new AMap.Marker({ icon: `//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-${index + 1}.png`, position: [item.location.lng, item.location.lat], offset: new AMap.Pixel(-13, -30), extData: item });
|
|
|
|
|
+ poiMarker.on("click", ({ target }) => {
|
|
|
|
|
+ const { lng, lat } = target.getPosition();
|
|
|
|
|
+ setPosition([lng, lat], target.getExtData());
|
|
|
|
|
+ map.setFitView(target);
|
|
|
|
|
+ });
|
|
|
|
|
+ return poiMarker;
|
|
|
|
|
+ });
|
|
|
|
|
+ map.add(poiMarkers);
|
|
|
|
|
+ map.setFitView();
|
|
|
|
|
+ } else ElMessage.error("根据地址查询位置失败");
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const setPosition = (position, { addressComponent, formattedAddress }) => {
|
|
|
|
|
+ const { province, city, district, township } = addressComponent;
|
|
|
|
|
+ XEUtils.merge(form.value, {
|
|
|
|
|
+ province, city, region: district, street: township,
|
|
|
|
|
+ address: formattedAddress.split(province + city + district + township)[1],
|
|
|
|
|
+ longitude: position[0], latitude: position[1], projectCoordinates: position.join()
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const formRef = ref();
|
|
|
|
|
+const submit = () => {
|
|
|
|
|
+ formRef.value.validate(valid => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ const query = XEUtils.omit(form.value, ["contractDate", "folders"]);
|
|
|
|
|
+
|
|
|
|
|
+ XEUtils.merge(query, {
|
|
|
|
|
+ projectFirmName: XEUtils.get(XEUtils.findTree(props.treeSelectProps.data, item => item.deptId == form.value.deptId), "item.name"),
|
|
|
|
|
+ contractBeginDate: XEUtils.first(XEUtils.get(form.value, "contractDate")) || null,
|
|
|
|
|
+ contractEndDate: XEUtils.last(XEUtils.get(form.value, "contractDate")) || null,
|
|
|
|
|
+ longitude: XEUtils.multiply(form.value.longitude, 1000000),
|
|
|
|
|
+ latitude: XEUtils.multiply(form.value.latitude, 1000000)
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ const newFiles = form.value.folders["project/licence_sg"].entities.filter(item => !item.id).map(item => item.path);
|
|
|
|
|
+ if (newFiles.length) {
|
|
|
|
|
+ XEUtils.set(query, "folders", {
|
|
|
|
|
+ "project/licence_sg": {
|
|
|
|
|
+ entities: newFiles.map(ticket => ({ features: { ticket } }))
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ isSaving.value = true;
|
|
|
|
|
+ API.system.project[mode.value](query).then(res => {
|
|
|
|
|
+ isSaving.value = false;
|
|
|
|
|
+ ElMessage.success("操作成功");
|
|
|
|
|
+ visible.value = false;
|
|
|
|
|
+ $emit("success", mode.value);
|
|
|
|
|
+ }).catch(() => isSaving.value = false);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onUnmounted(() => {
|
|
|
|
|
+ map && map.destroy();
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+defineExpose({
|
|
|
|
|
+ open,
|
|
|
|
|
+ setData
|
|
|
|
|
+})
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
|
+.m-b-0 {margin-bottom: 0;}
|
|
|
|
|
+.el-card :deep(.el-card__header) {background: #f9fdff;}
|
|
|
|
|
+.el-card :deep(.el-card__body) {padding-right: calc(var(--el-dialog-padding-primary) + var(--el-card-padding));}
|
|
|
|
|
+.el-card + .el-card {margin-top: 15px;}
|
|
|
|
|
+
|
|
|
|
|
+.el-form {
|
|
|
|
|
+ padding: 0 var(--el-dialog-padding-primary);
|
|
|
|
|
+
|
|
|
|
|
+ .el-input-number, :deep(.el-date-editor.el-input) {width: 100%;}
|
|
|
|
|
+ .el-input-number :deep(.el-input__inner) {text-align: unset;}
|
|
|
|
|
+ .el-input-number :deep(.el-input__suffix) {font-size: 12px;}
|
|
|
|
|
+
|
|
|
|
|
+ .el-form-item-msg {line-height: 1.5em;margin-top: .6em;}
|
|
|
|
|
+
|
|
|
|
|
+ #container {
|
|
|
|
|
+ height: 300px;
|
|
|
|
|
+
|
|
|
|
|
+ .amap-icon img {
|
|
|
|
|
+ width: 25px;
|
|
|
|
|
+ height: 34px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|