temp.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <template>
  2. <hc-drawer v-model="isShow" to-id="hc-main-box" is-close @close="drawerClose">
  3. <hc-body split>
  4. <template #left>
  5. <hc-card scrollbar>
  6. <hc-lazy-tree
  7. v-if="isTreeMode" :root-menu="treeMenuData" :menus="treeMenuData" :h-props="treeProps"
  8. tree-key="id" @load="treeLoadNode" @node-tap="treeNodeTap" @menu-tap="treeMenuClick"
  9. >
  10. <template #nodeName="{ data }">
  11. <span class="text-16px font-400">{{ data.nodeName }}</span>
  12. </template>
  13. </hc-lazy-tree>
  14. </hc-card>
  15. </template>
  16. <hc-card class="hc-desk-system-unit-temp">
  17. <template v-if="!isNullES(nodeInfo.id)">
  18. <hc-card-item title="节点信息">
  19. <el-descriptions :column="3" border>
  20. <el-descriptions-item label="节点编号:">{{ nodeInfo.nodeCode ?? '-' }}</el-descriptions-item>
  21. <el-descriptions-item label="节点名称:">{{ nodeInfo.nodeName ?? '-' }}</el-descriptions-item>
  22. <el-descriptions-item label="节点类型:">{{ nodeInfo.nodeTypeName ?? '-' }}</el-descriptions-item>
  23. <el-descriptions-item label="工程类型:">{{ nodeInfo.engineeringTypeName ?? '-' }}</el-descriptions-item>
  24. <el-descriptions-item label="备注:">{{ nodeInfo.remarks ?? '-' }}</el-descriptions-item>
  25. </el-descriptions>
  26. </hc-card-item>
  27. <hc-card-item title="下节节点列表">
  28. <hc-table :column="tableColumn" :datas="tableData" :loading="tableLoading" :is-index="false" :is-current-row="false" />
  29. </hc-card-item>
  30. </template>
  31. <hc-empty v-else title="请先点击左侧树节点" />
  32. </hc-card>
  33. </hc-body>
  34. <!-- 新增/修改 -->
  35. <hc-dialog v-model="isAddEditShow" widths="44rem" is-footer-center :title="formModel.id ? '修改' : '新增'" @close="addEditClose">
  36. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto">
  37. <el-form-item label="节点编号:">
  38. <el-input v-model="formModel.nodeCode" clearable placeholder="请输入节点编号" />
  39. </el-form-item>
  40. <el-form-item label="节点名称:" prop="nodeName">
  41. <el-input v-model="formModel.nodeName" clearable placeholder="请输入节点名称" />
  42. </el-form-item>
  43. <el-form-item label="节点类型:" prop="nodeType">
  44. <el-select v-model="formModel.nodeType" filterable clearable block placeholder="请选择节点类型">
  45. <el-option v-for="item in meterUnitType" :key="item.value" :label="item.label" :value="item.value" />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="工程类型:">
  49. <el-input v-model="formModel.engineeringTypeName" clearable placeholder="请输入工程类型" disabled />
  50. </el-form-item>
  51. <el-form-item label="备注:">
  52. <el-input v-model="formModel.remarks" clearable placeholder="请输入备注" />
  53. </el-form-item>
  54. </el-form>
  55. <template #footer>
  56. <el-button hc-btn @click="addEditClose">取消</el-button>
  57. <el-button hc-btn type="primary" :loading="addEditLoading" @click="addEditSubmit">提交</el-button>
  58. </template>
  59. </hc-dialog>
  60. </hc-drawer>
  61. </template>
  62. <script setup>
  63. import { nextTick, ref, watch } from 'vue'
  64. import { HcDelMsg } from 'hc-vue3-ui'
  65. import { getDictionaryData, getDictionaryName } from '~src/utils/tools'
  66. import { deepClone, formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
  67. import mainApi from '~api/desk/system-unit'
  68. const props = defineProps({
  69. data: {
  70. type: Object,
  71. default: () => ({}),
  72. },
  73. })
  74. const emit = defineEmits(['close'])
  75. //双向绑定
  76. const isShow = defineModel('modelValue', {
  77. default: false,
  78. })
  79. //监听数据
  80. const dataInfo = ref(props.data)
  81. watch(() => props.data, (data) => {
  82. dataInfo.value = data
  83. }, { immediate: true, deep: true })
  84. //监听显示
  85. watch(isShow, (val) => {
  86. if (val) getDataApi()
  87. })
  88. //处理相关数据
  89. const meterUnitType = ref([])
  90. const getDataApi = async () => {
  91. isTreeMode.value = true
  92. meterUnitType.value = await getDictionaryData('meter_unit_type', true)
  93. }
  94. //树配置
  95. const isTreeMode = ref(false)
  96. const treeProps = {
  97. label: 'nodeName',
  98. children: 'children',
  99. isLeaf: 'notExsitChild',
  100. }
  101. //懒加载树
  102. const treeLoadNode = async ({ item, level }, resolve) => {
  103. const parentId = level === 0 ? 0 : item.id
  104. const { id } = getObjValue(dataInfo.value)
  105. const { data } = await mainApi.getLazyTree({
  106. id: parentId,
  107. templateId: id,
  108. })
  109. resolve(getArrValue(data))
  110. }
  111. //树菜单根节点
  112. const treeMenuData = [
  113. { icon: 'add-circle', label: '新增节点', key: 'add' },
  114. { icon: 'draft', label: '编辑节点', key: 'edit' },
  115. { icon: 'arrow-up-down', label: '排序节点', key: 'rank' },
  116. { icon: 'delete-bin', label: '删除节点', key: 'del' },
  117. ]
  118. //菜单被点击
  119. const treeMenuClick = async ({ key, data, node }) => {
  120. console.log(key)
  121. if (key === 'add') {
  122. formModel.value = {}
  123. await nextTick()
  124. isAddEditShow.value = true
  125. } else if (key === 'edit') {
  126. formModel.value = deepClone(data)
  127. await nextTick()
  128. isAddEditShow.value = true
  129. }
  130. }
  131. //树节点被点击
  132. const nodeInfo = ref({})
  133. const treeNodeTap = ({ data }) => {
  134. const label = getDictionaryName(meterUnitType.value, data.nodeType)
  135. data.nodeTypeName = label ?? '-'
  136. nodeInfo.value = data
  137. getTableData(data)
  138. }
  139. //表格数据
  140. const tableColumn = ref([
  141. { key: 'nodeCode', name: '节点编号' },
  142. { key: 'nodeName', name: '节点名称' },
  143. { key: 'nodeTypeName', name: '节点类型' },
  144. { key: 'engineeringTypeName', name: '工程类型' },
  145. { key: 'remarks', name: '备注' },
  146. ])
  147. const tableData = ref([{}])
  148. //获取表格数据
  149. const tableLoading = ref(false)
  150. const getTableData = async () => {
  151. tableData.value = []
  152. const { id } = nodeInfo.value
  153. tableLoading.value = true
  154. const { data } = await mainApi.getChildList({ id })
  155. tableData.value = getArrValue(data)
  156. tableLoading.value = false
  157. }
  158. //新增、编辑节点
  159. const isAddEditShow = ref(false)
  160. const formRef = ref(null)
  161. const formModel = ref({})
  162. const formRules = {
  163. nodeName: { required: true, trigger: 'blur', message: '请输入节点名称' },
  164. nodeType: { required: true, trigger: 'blur', message: '请选择节点类型' },
  165. }
  166. //新增、编辑节点提交
  167. const addEditLoading = ref(false)
  168. const addEditSubmit = async () => {
  169. //验证表单
  170. const isForm = await formValidate(formRef.value)
  171. if (!isForm) return false
  172. addEditLoading.value = true
  173. //处理表单
  174. const form = formModel.value
  175. const { id, ancestor, templateId } = nodeInfo.value
  176. form.parentId = id
  177. form.ancestor = ancestor
  178. form.templateId = templateId
  179. form.nodeTypeName = getDictionaryName(meterUnitType.value, form.nodeType)
  180. //发起请求
  181. let res
  182. if (isNullES(form.id)) {
  183. res = await mainApi.add(form)
  184. } else {
  185. res = await mainApi.update(form)
  186. }
  187. //处理结果
  188. const { error, code } = getObjValue(res)
  189. addEditLoading.value = false
  190. if (!error && code === 200) {
  191. window?.$message?.success('操作成功')
  192. addEditClose()
  193. setTreeMode()
  194. }
  195. }
  196. //关闭 新增、编辑节点
  197. const addEditClose = () => {
  198. isAddEditShow.value = false
  199. formModel.value = {}
  200. }
  201. //树重加载
  202. const setTreeMode = () => {
  203. isTreeMode.value = false
  204. nodeInfo.value = {}
  205. tableData.value = []
  206. setTimeout(() => {
  207. isTreeMode.value = true
  208. }, 500)
  209. }
  210. //关闭抽屉
  211. const drawerClose = () => {
  212. isShow.value = false
  213. isTreeMode.value = false
  214. nodeInfo.value = {}
  215. emit('close')
  216. }
  217. </script>
  218. <style lang="scss">
  219. .hc-desk-system-unit-temp .el-card {
  220. .hc-card-item-box {
  221. height: auto;
  222. padding: 10px 14px;
  223. .hc-card-item-header {
  224. color: #4a4a4a;
  225. margin-bottom: 6px;
  226. }
  227. }
  228. .hc-card-item-box + .hc-card-item-box {
  229. margin-top: 20px;
  230. }
  231. }
  232. </style>