diff --git a/src/pages/SystemMgm/AreaManage/loadable.jsx b/src/pages/SystemMgm/AreaManage/loadable.jsx index 04ec20f..f5eb16f 100644 --- a/src/pages/SystemMgm/AreaManage/loadable.jsx +++ b/src/pages/SystemMgm/AreaManage/loadable.jsx @@ -1,6 +1,6 @@ import React, { useState, useRef, useEffect } from "react"; import { message, Pagination, Table, Input, Modal, Tree, Button } from "antd"; -import { MinusCircleOutlined, DeleteOutlined, EditOutlined, PlusCircleOutlined } from '@ant-design/icons'; +import { DeleteOutlined, EditOutlined, PlusCircleOutlined } from '@ant-design/icons'; import ajax from "@/services" import { BaseMap } from "@/components" import ModalAreaAdd from "./ModalAreaAdd"; diff --git a/src/pages/SystemMgm/OrgnizationMgm/index.scss b/src/pages/SystemMgm/OrgnizationMgm/index.scss index 1838f71..e9a79d7 100644 --- a/src/pages/SystemMgm/OrgnizationMgm/index.scss +++ b/src/pages/SystemMgm/OrgnizationMgm/index.scss @@ -3,3 +3,73 @@ $color-container-bg : var(--color-container-bg); $color-user-list-bg : var(--color-user-list-bg); $color-text : var(--color-text); $color-primary : var(--color-primary); + +.orgnization-container { + display: flex; + padding: 20px; + height: 100%; + .org-tree-container { + width: 250px; + margin-right: 20px; + .ant-tree { + .ant-tree-title { + .label-text { + margin-right: 20px; + } + .label-icon { + margin-right: 5px; + } + } + } + } + .org-content { + flex: 1; + height: 100%; + padding: 0 10px; + background: var(--color-user-list-bg); + .ant-tabs .ant-tabs-nav-wrap .ant-tabs-nav-list .ant-tabs-tab { + width: unset !important; + } + .base-form-container { + margin-top: 40px; + input { + width: 100%; + border-color: var(--color-border); + background-color: #393f4f; + border-radius: 4px; + color: var(--color-search-list-item-value); + &.ant-input-disabled { + background-color: hsla(0,0%,100%,.08); + } + } + .ant-select-disabled .ant-select-selector, .ant-select-disabled .ant-select-arrow .anticon { + background-color: hsla(0,0%,100%,.08) !important; + } + .ant-select:not(.ant-select-customize-input) .ant-select-selector{ + background-color: #393f4f; + border: 1px solid var(--color-border); + } + .ant-select-arrow .anticon{ + background-color: #393f4f !important; + } + .ant-input:placeholder-shown{ + background-color: #393f4f !important; + } + .area-tree { + .ant-tree { + margin-top: 5px; + } + } + } + .form-confirm { + display: flex; + justify-content: center; + margin-top: 10px; + padding-top: 20px; + border-top: 1px solid #9be0f147; + button { + margin: 0 10px; + } + } + } +} \ No newline at end of file diff --git a/src/pages/SystemMgm/OrgnizationMgm/loadable.jsx b/src/pages/SystemMgm/OrgnizationMgm/loadable.jsx index 91ab36e..1a6d981 100644 --- a/src/pages/SystemMgm/OrgnizationMgm/loadable.jsx +++ b/src/pages/SystemMgm/OrgnizationMgm/loadable.jsx @@ -1,15 +1,308 @@ -import React, { useState, useRef, useEffect } from "react"; -// import { message, Pagination, Table, Space, Modal, } from "antd"; -// import { dictionary, utils } from "@/config/common"; -// import moment from 'moment' -// import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks'; -// import ajax from "@/services" -// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components" -// import "./index.scss"; -// import errorImg from "@/assets/images/layout/error.png" -// import { useLocation } from "react-router-dom"; +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { message, Input, Upload, Modal, Space, Tree, Tabs, Form, Select, Button } from "antd"; +import { DeleteOutlined, EditOutlined, PlusCircleOutlined, LoadingOutlined, PlusOutlined } from '@ant-design/icons'; +import ajax from "@/services" +import "./index.scss"; + +const isDev = window.location.href.indexOf('localhost') > -1 function OrgnizationMgm() { - return
OrgnizationMgm
+ + const [editStatus, setEditStatus] = useState(false) + const [defaultTreeActiveKey, setDefaultTreeActiveKey] = useState([]) + const [defaultTreeAreaActiveKey, setDefaultTreeAreaActiveKey] = useState([]) + const [imgUploading, setImgUploading] = useState(false) + const [imgUrl, setImgUrl] = useState("") + const [orgTree, setOrgTree] = useState([]) + const [areaTree, setAreaTree] = useState([]) + const [activeOrg, setActiveOrg] = useState({}) + const [baseForm] = Form.useForm() + + const imgUploadUrl = () => { + return isDev ? `http://10.10.128.65:3001/mock/11/v1/controlalarm/upload_image` : `${baseApi}/v1/controlalarm/upload_image` + } + + const getAreaTree = () => { + ajax.getAreaTree().then((e) => { + if (e.status == 20000) { + setAreaTree(e.data) + setDefaultTreeActiveKey([e.data[0].id]) + } + }) + } + + const ajaxGetOrgDetail = (id) => { + handleCancel() + return new Promise((resolved, rejected) => { + ajax.getOrgDetail({id: id}).then((e) => { + if (e.status == 20000) { + resolved(e.data) + } else { + rejected(e.message) + } + }).catch((err) => { + rejected(err) + }) + }) + } + + const getOrgTree = () => { + ajax.getOrgTree().then((e) => { + if (e.status == 20000) { + setOrgTree(e.data) + handleTreeClick(undefined, {node: e.data[0]}) + } + }) + } + const handleOrgAdd = (e) => { + e.stopPropagation() + e.nativeEvent.stopImmediatePropagation() + + } + const handleOrgDel = () => { + e.stopPropagation() + e.nativeEvent.stopImmediatePropagation() + } + const handleOrgEdit = () => { + e.stopPropagation() + e.nativeEvent.stopImmediatePropagation() + } + + const ajaxOrgDetailSave = (data) => { + return new Promise((resolved, rejected) => { + ajax.orgDetailEdit(data).then((e) => { + if (e.status == 20000) { + resolved(e.message) + } else { + rejected(e.message) + } + }).catch((err) => { + rejected(err) + }) + }) + } + + const handleTreeClick = (e, {node}) => { + ajaxGetOrgDetail(node.id).then((data) => { + setActiveOrg({ + id: node.id, + key: node.key, + name: node.name, + level: node.level, + img_url: node.img_url, + control_area: node.control_area, + ...data + }) + baseForm.setFieldsValue({ + platform: data.platform, + control_type: data.control_type, + control_area: data.control_area, + img_url: data.img_url + }) + setImgUrl(data.img_url) + }).catch(err => { + message.error(err) + }) + } + + const uploadButton = ( +
+ {imgUploading ? : } +
+ 点击上传 +
+
+ ) + + const beforeUpload = () => { + setImgUploading(true) + return true + } + + const handleUploadChange = ({file}) => { + const res = file.response + if (res && res.status == 20000) { + baseForm.setFieldValue('img_url', res.data) + setImgUrl(res.data) + setImgUploading(false) + } + } + + const handleBaseFormValueChange = () => { + + } + + const handleAreaTreeChange = (checkedKeys) => { + baseForm.setFieldValue('control_area', checkedKeys.join(',')) + } + + const getAreaDefaultKeys = () => { + return baseForm.getFieldValue('control_area') + } + + const handleCancel = () => { + baseForm.setFieldsValue({ + ...activeOrg + }) + setImgUrl(activeOrg.img_url) + setEditStatus(false) + } + + const handleConfirm = () => { + ajaxOrgDetailSave(baseForm.getFieldsValue()).then((msg) => { + message.success(msg) + setEditStatus(false) + }).catch((err) => { + message.error(err) + }) + } + + const handleEdit = () => { + setEditStatus(true) + } + + const tabRender = useMemo(() => { + return [ + { + label: `基础配置`, + key: '1', + children: ( +
+
+ + + + {activeOrg.name} + + + + + + + {imgUrl ? ( + avatar + ) : ( + uploadButton + )} + + + { + activeOrg.level > 2 ? <> + + + + + + + : null + } +
+
+ ), + }, + activeOrg.level > 2 ? { + label: `功能配置`, + key: '2', + children: `Content of Tab Pane 2`, + } : undefined + ] + }, [JSON.stringify(activeOrg), editStatus, imgUrl]) + + useEffect(() => { + getOrgTree() + getAreaTree() + }, []) + + const treeTitleRender = ({name, children, level, pid, id, virtually_code, lng_lat, code}) => { + return <> + {name} + { + level > 2 ? <> + handleOrgAdd(e, {level, pid, isCity: false})} /> + handleOrgDel(e, {name, id})} /> + handleOrgEdit(e, {name, id, virtually_code, code, lng_lat})}/> + : ( + handleOrgAdd(e, {level, pid, isCity: true})} /> + ) + } + + } + + return ( +
+
+ + +
+
+ +
+ { + !editStatus ? ( + + ) : <> + + + + } +
+
+
+ ) } export default OrgnizationMgm; \ No newline at end of file diff --git a/src/services/system.js b/src/services/system.js index 780c7a3..ed17697 100644 --- a/src/services/system.js +++ b/src/services/system.js @@ -258,12 +258,37 @@ const areaTreeDel = (params) => { const areaTreeEdit = (params) => { return ajax({ - url: "/api/manage/area//edit_info", + url: "/api/manage/area/edit_info", type: "post", data: params, }) } +const orgDetailEdit = (params) => { + return ajax({ + url: "/api/manage/org/edit_info", + type: "post", + data: params, + }) +} + +// 系统管理 - 组织tree +const getOrgTree = (params) => { + return ajax({ + url: '/api/manage/org/tree', + type: 'post', + data: params + }) +} + +const getOrgDetail = (params) => { + return ajax({ + url: '/api/manage/org/detail', + type: 'post', + data: params + }) +} + export default { getLocationListData, deleteLocationData, @@ -294,5 +319,8 @@ export default { getConnectSave, areaTreeAdd, areaTreeDel, - areaTreeEdit + areaTreeEdit, + getOrgTree, + getOrgDetail, + orgDetailEdit }