edit.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '换热站'" v-model="dialogVisible" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
  5. <el-form-item label="所属换热站" prop="">
  6. <el-tree-select
  7. v-model="ruleForm.parentId"
  8. :data="treeData"
  9. :props="{
  10. label: 'name',
  11. children: 'children'
  12. }"
  13. node-key="id"
  14. :clearable="true"
  15. check-strictly
  16. style="width: 100%;"
  17. :render-after-expand="true"
  18. />
  19. </el-form-item>
  20. <el-form-item label="换热站名称" prop="name">
  21. <el-input v-model="ruleForm.name" placeholder="请输入换热站名称" />
  22. </el-form-item>
  23. <el-form-item label="换热站位置" prop="position">
  24. <el-input v-model="ruleForm.position" placeholder="请输入换热站位置" />
  25. </el-form-item>
  26. <el-form-item label="负责人" prop="principal">
  27. <!-- <el-input v-model="ruleForm.principal" placeholder="请输入负责人" /> -->
  28. <el-select v-model="ruleForm.principal" clearable style="width: 100%;" placeholder="请选择">
  29. <el-option
  30. v-for="item in userList"
  31. :key="item.id"
  32. :label="item.userNickname"
  33. :value="item.id">
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="状态" prop="status">
  38. <el-radio v-model="ruleForm.status" :label="1">在线</el-radio>
  39. <el-radio v-model="ruleForm.status" :label="0">不在线</el-radio>
  40. </el-form-item>
  41. <el-form-item label="数据模型" prop="dataTemplateIds">
  42. <el-select v-model="ruleForm.dataTemplateIds" multiple clearable style="width: 100%;" placeholder="请选择">
  43. <el-option
  44. v-for="item in dataHubList"
  45. :key="item.id"
  46. :label="item.name"
  47. :value="item.id">
  48. </el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="地图展示" prop="decade">
  52. <div>
  53. <span>经度:{{ ruleForm.lnt ? `${ruleForm.lnt},` : '' }}</span>
  54. <span style="margin-left: 10px">纬度:{{ ruleForm.lat }}</span>
  55. </div>
  56. <div class="mb10" style="width: 100%">
  57. <el-input v-model="keyword" @change="onLocalChange" placeholder="请输入关键字进行搜索" clearable style="width: 100%;"></el-input>
  58. </div>
  59. <div style="width: 100%; height: 300px" id="map-container"></div>
  60. </el-form-item>
  61. </el-form>
  62. <template #footer>
  63. <span class="dialog-footer">
  64. <el-button @click="onCancel" size="default">取 消</el-button>
  65. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
  66. </span>
  67. </template>
  68. </el-dialog>
  69. </div>
  70. </template>
  71. <script lang="ts">
  72. import { reactive, toRefs, defineComponent, ref, unref, nextTick, onMounted } from 'vue';
  73. import api from '/@/api/heatStation';
  74. import userApi from '/@/api/system';
  75. import datahubApi from '/@/api/datahub';
  76. import { ElMessage } from 'element-plus';
  77. import { useStore } from '/@/store/index';
  78. interface RuleFormState {
  79. id: number;
  80. parentId: number | string;
  81. name: string;
  82. position: string;
  83. lnt: number;
  84. lat: number;
  85. principal: string;
  86. types: number;
  87. status: number;
  88. }
  89. export default defineComponent({
  90. name: 'headStationLoop',
  91. setup(prop, { emit }) {
  92. const formRef = ref<HTMLElement | null>(null);
  93. const state = reactive({
  94. dialogVisible: false,
  95. map: null,
  96. ruleForm: {
  97. id: 0,
  98. parentId: '',
  99. name: '',
  100. position: '',
  101. lnt: '',
  102. lat: '',
  103. principal: '',
  104. types: 1,
  105. status: 1
  106. },
  107. keyword: '',
  108. rules: {
  109. name: [{ required: true, message: '换热站名称不能为空', trigger: 'blur' }],
  110. position: [{ required: true, message: '换热站位置不能为空', trigger: 'blur' }],
  111. principal: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
  112. status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
  113. },
  114. treeData: [],
  115. dataHubList: [],
  116. userList: [],
  117. mapLocal: null as any
  118. })
  119. const store = useStore();
  120. // 打开弹窗
  121. const openDialog = (row: any, tree: any) => {
  122. resetForm()
  123. queryDataHubList()
  124. queryUserList()
  125. state.treeData = tree
  126. if (row) {
  127. (state.ruleForm as any).id = row.id
  128. getDetail()
  129. }
  130. nextTick(() => {
  131. initMap()
  132. })
  133. state.dialogVisible = true
  134. }
  135. const queryDataHubList = () => {
  136. datahubApi.template.allList({})
  137. .then((res: any) => {
  138. state.dataHubList = res.list || [];
  139. });
  140. };
  141. const queryUserList = () => {
  142. userApi.user.getAllList({})
  143. .then((res: any) => {
  144. state.userList = res || [];
  145. });
  146. };
  147. const resetForm = () => {
  148. state.ruleForm = {
  149. id: 0,
  150. parentId: '',
  151. name: '',
  152. position: '',
  153. lnt: '',
  154. lat: '',
  155. principal: '',
  156. types: 1,
  157. status: 1
  158. }
  159. }
  160. // 关闭弹窗
  161. const closeDialog = () => {
  162. state.dialogVisible = false
  163. }
  164. // 取消
  165. const onCancel = () => {
  166. closeDialog()
  167. state.keyword = ''
  168. }
  169. const getDetail = () => {
  170. api.heatStation.detail(state.ruleForm.id)
  171. .then((res: any) => {
  172. state.ruleForm = {
  173. ...res,
  174. parentId: res.parentId === -1 ? '' : res.parentId
  175. }
  176. })
  177. }
  178. // 新增
  179. const onSubmit = () => {
  180. const formWrap = unref(formRef) as any
  181. if (!formWrap) return;
  182. formWrap.validate((valid: boolean) => {
  183. if (valid) {
  184. let params = { ...state.ruleForm };
  185. (params.parentId as any) = params.parentId || -1
  186. if (state.ruleForm.id) {
  187. //修改
  188. api.heatStation.edit(params).then(() => {
  189. ElMessage.success('换热站修改成功')
  190. emit('queryList')
  191. closeDialog() // 关闭弹窗
  192. })
  193. } else {
  194. //添加
  195. api.heatStation.add(params).then(() => {
  196. ElMessage.success('换热站添加成功')
  197. emit('queryList')
  198. closeDialog() // 关闭弹窗
  199. })
  200. }
  201. }
  202. })
  203. }
  204. const initMap = () => {
  205. let BMapGL = (window as any).BMapGL
  206. let map = new BMapGL.Map("map-container");
  207. // 获取布局配置信息
  208. let getThemeConfig = store.state.themeConfig.themeConfig;
  209. // 116.404, 39.915
  210. let point = new BMapGL.Point(state.ruleForm.lnt || 116.404, state.ruleForm.lat || 39.915);
  211. let zoomCtrl = new BMapGL.ZoomControl(); // 添加缩放控件
  212. let cityCtrl = new BMapGL.CityListControl()
  213. if(getThemeConfig.isIsDark) {
  214. map.setMapStyleV2({
  215. styleId: 'b8d841ee37fd5bd41e742049b6fcd0f5'
  216. });
  217. }
  218. map.centerAndZoom(point, 15);
  219. map.enableScrollWheelZoom(true); // 开启滚轮缩放
  220. map.addControl(zoomCtrl);
  221. map.addControl(cityCtrl);
  222. if (state.ruleForm.lnt && state.ruleForm.lat) {
  223. let marker = new BMapGL.Marker(new BMapGL.Point(state.ruleForm.lnt, state.ruleForm.lat));
  224. // 在地图上添加点标记
  225. map.addOverlay(marker);
  226. }
  227. state.mapLocal = new BMapGL.LocalSearch(map, {
  228. renderOptions:{map: map}
  229. })
  230. map.addEventListener('click', (e: any) => {
  231. console.log('map--click', e)
  232. let point = e.latlng
  233. state.ruleForm.lnt = point.lng
  234. state.ruleForm.lat = point.lat
  235. })
  236. }
  237. const onLocalChange = () => {
  238. state.mapLocal.search(state.keyword)
  239. }
  240. return {
  241. openDialog,
  242. closeDialog,
  243. onCancel,
  244. onSubmit,
  245. formRef,
  246. onLocalChange,
  247. // onMapClick,
  248. // onMarkersset,
  249. // mapReady,
  250. ...toRefs(state)
  251. }
  252. }
  253. })
  254. </script>
  255. <style scoped lang="scss">
  256. .mb10 {
  257. margin-bottom: 10px;
  258. }
  259. .mr10 {
  260. margin-right: 10px;
  261. }
  262. </style>