|  | @@ -30,6 +30,12 @@
 | 
	
		
			
				|  |  |                  @pressEnter="onSave(record.id)"
 | 
	
		
			
				|  |  |                />
 | 
	
		
			
				|  |  |                <check-outlined class="editable-cell-icon-check" @click="onSave(record.id)" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              <CloseOutlined
 | 
	
		
			
				|  |  | +                class="editable-cell-icon-check"
 | 
	
		
			
				|  |  | +                :style="{ right: '-24px' }"
 | 
	
		
			
				|  |  | +                @click="onCancel(record.id)"
 | 
	
		
			
				|  |  | +              />
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |              <div v-else class="editable-cell-text-wrapper">
 | 
	
		
			
				|  |  |                {{ text || ' ' }}
 | 
	
	
		
			
				|  | @@ -54,35 +60,51 @@
 | 
	
		
			
				|  |  |      >
 | 
	
		
			
				|  |  |        <div class="p-3">
 | 
	
		
			
				|  |  |          <a-form :model="formState" :rules="rules" layout="vertical" ref="formRef">
 | 
	
		
			
				|  |  | -          <a-form-item name="name" required label="节点名称">
 | 
	
		
			
				|  |  | -            <a-input v-model:value="formState.name" />
 | 
	
		
			
				|  |  | +          <a-form-item name="name" required label="名称">
 | 
	
		
			
				|  |  | +            <a-input v-model:value="formState.name" autocomplete="off" class="w-6" />
 | 
	
		
			
				|  |  |            </a-form-item>
 | 
	
		
			
				|  |  | -          <a-form-item name="id" required label="父级">
 | 
	
		
			
				|  |  | +          <a-form-item
 | 
	
		
			
				|  |  | +            name="id"
 | 
	
		
			
				|  |  | +            required
 | 
	
		
			
				|  |  | +            :label="treeSelectLabel"
 | 
	
		
			
				|  |  | +            :hidden="type === 'edit' ? true : false"
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  |              <a-tree-select
 | 
	
		
			
				|  |  |                v-model:value="formState.id"
 | 
	
		
			
				|  |  | -              :treeData="treeData"
 | 
	
		
			
				|  |  | +              :treeData="treeSelectData"
 | 
	
		
			
				|  |  |                :replace-fields="replaceFields"
 | 
	
		
			
				|  |  |                :tree-default-expand-all="true"
 | 
	
		
			
				|  |  |                :dropdown-style="{ height: '20rem' }"
 | 
	
		
			
				|  |  |              />
 | 
	
		
			
				|  |  |            </a-form-item>
 | 
	
		
			
				|  |  | +          <a-form-item name="code2" label="图标编码">
 | 
	
		
			
				|  |  | +            <a-input v-model:value="formState.code2" autocomplete="off" />
 | 
	
		
			
				|  |  | +          </a-form-item>
 | 
	
		
			
				|  |  |          </a-form>
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |      </AModal>
 | 
	
		
			
				|  |  |    </div>
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  <script lang="ts">
 | 
	
		
			
				|  |  | -  import { computed, defineComponent, reactive, ref, toRaw, toRefs, UnwrapRef } from 'vue'
 | 
	
		
			
				|  |  | +  import { computed, defineComponent, reactive, ref, toRaw, toRefs, unref, UnwrapRef } from 'vue'
 | 
	
		
			
				|  |  |    import { useDesign } from '/@/hooks/web/useDesign'
 | 
	
		
			
				|  |  |    import { Table, Modal, Form, Input, TreeSelect, Popconfirm, message } from 'ant-design-vue'
 | 
	
		
			
				|  |  | -  import { CheckOutlined, EditOutlined } from '@ant-design/icons-vue'
 | 
	
		
			
				|  |  | -  import { sectionAddApi, sectionAllApi, sectionUpdateApi, treeResfulApi } from '/@/api/sys/tree'
 | 
	
		
			
				|  |  | +  import { CheckOutlined, EditOutlined, CloseOutlined } from '@ant-design/icons-vue'
 | 
	
		
			
				|  |  | +  import {
 | 
	
		
			
				|  |  | +    delSectionApi,
 | 
	
		
			
				|  |  | +    sectionAddApi,
 | 
	
		
			
				|  |  | +    sectionAllApi,
 | 
	
		
			
				|  |  | +    sectionUpdateApi,
 | 
	
		
			
				|  |  | +    treeResfulApi
 | 
	
		
			
				|  |  | +  } from '/@/api/sys/tree'
 | 
	
		
			
				|  |  |    import { TreeResultModel } from '/@/api/model/tree'
 | 
	
		
			
				|  |  |    import { TreeRow } from '/#/tree'
 | 
	
		
			
				|  |  | +  import { useMessage } from '/@/hooks/web/useMessage'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    interface FormState {
 | 
	
		
			
				|  |  |      id: string
 | 
	
		
			
				|  |  |      name: string
 | 
	
		
			
				|  |  | +    code2: string
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    enum ModalType {
 | 
	
		
			
				|  |  |      ADD = 'add',
 | 
	
	
		
			
				|  | @@ -99,6 +121,7 @@
 | 
	
		
			
				|  |  |        AFormItem: Form.Item,
 | 
	
		
			
				|  |  |        CheckOutlined,
 | 
	
		
			
				|  |  |        EditOutlined,
 | 
	
		
			
				|  |  | +      CloseOutlined,
 | 
	
		
			
				|  |  |        APopconfirm: Popconfirm
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      setup() {
 | 
	
	
		
			
				|  | @@ -116,7 +139,8 @@
 | 
	
		
			
				|  |  |          serial: 0,
 | 
	
		
			
				|  |  |          attribution: '',
 | 
	
		
			
				|  |  |          contractId: '',
 | 
	
		
			
				|  |  | -        createTime: ''
 | 
	
		
			
				|  |  | +        createTime: '',
 | 
	
		
			
				|  |  | +        code2: ''
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |        const modal = reactive({
 | 
	
		
			
				|  |  |          visible: false,
 | 
	
	
		
			
				|  | @@ -124,13 +148,27 @@
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |        const formState: UnwrapRef<FormState> = reactive({
 | 
	
		
			
				|  |  |          id: '',
 | 
	
		
			
				|  |  | -        name: ''
 | 
	
		
			
				|  |  | +        name: '',
 | 
	
		
			
				|  |  | +        code2: ''
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // 目录操作相关
 | 
	
		
			
				|  |  |        const toggleModal = (type?: string) => {
 | 
	
		
			
				|  |  |          // 要打开form弹窗了, 设置当前的表单值
 | 
	
		
			
				|  |  |          if (!modal.visible) {
 | 
	
		
			
				|  |  | +          if (row.value.id && type) {
 | 
	
		
			
				|  |  | +            const unRow = unref(row)
 | 
	
		
			
				|  |  | +            if (type === ModalType.ADD) {
 | 
	
		
			
				|  |  | +              formState.id = unRow.depth === 3 ? unRow.parentId : unRow.id
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              formState.id = unRow.id
 | 
	
		
			
				|  |  | +              formState.name = unRow.name
 | 
	
		
			
				|  |  | +              formState.code2 = unRow.code2
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            const { createMessage } = useMessage()
 | 
	
		
			
				|  |  | +            return createMessage.warning('请先选择节点再进行操作')
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          modal.visible = !modal.visible
 | 
	
		
			
				|  |  |          type && (modal.type = type)
 | 
	
	
		
			
				|  | @@ -148,10 +186,10 @@
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      const onConfirm = () => {
 | 
	
		
			
				|  |  | +      const onConfirm = async () => {
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -          onSubmit()
 | 
	
		
			
				|  |  | -          initData()
 | 
	
		
			
				|  |  | +          await onSubmit()
 | 
	
		
			
				|  |  | +          await initData()
 | 
	
		
			
				|  |  |            toggleModal()
 | 
	
		
			
				|  |  |          } catch (error) {}
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -194,9 +232,9 @@
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |            title: '图表编码',
 | 
	
		
			
				|  |  | -          dataIndex: 'code',
 | 
	
		
			
				|  |  | -          key: 'code',
 | 
	
		
			
				|  |  | -          slots: { customRender: 'code' }
 | 
	
		
			
				|  |  | +          dataIndex: 'code2',
 | 
	
		
			
				|  |  | +          key: 'code2',
 | 
	
		
			
				|  |  | +          slots: { customRender: 'code2' }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |            title: '操作',
 | 
	
	
		
			
				|  | @@ -220,24 +258,47 @@
 | 
	
		
			
				|  |  |          editableData[key] = record
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      const onSave = (key: string) => {
 | 
	
		
			
				|  |  | -        delete editableData[key]
 | 
	
		
			
				|  |  | +      const onSave = async (key: string) => {
 | 
	
		
			
				|  |  | +        const { id, name, code2 } = toRaw(editableData[key])
 | 
	
		
			
				|  |  | +        await sectionUpdateApi({ id, name, code2 })
 | 
	
		
			
				|  |  |          // 执行保存请求 后初始化数据
 | 
	
		
			
				|  |  | -        // initData()
 | 
	
		
			
				|  |  | +        delete editableData[key]
 | 
	
		
			
				|  |  | +        initData()
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      const onDelete = (key: string) => {
 | 
	
		
			
				|  |  | -        // 执行删除请求 后初始化数据
 | 
	
		
			
				|  |  | -        // initData()
 | 
	
		
			
				|  |  | +      const onCancel = async (key: string) => {
 | 
	
		
			
				|  |  | +        delete editableData[key]
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const onDelete = async (key: string) => {
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +          await delSectionApi({ id: key })
 | 
	
		
			
				|  |  | +          await initData()
 | 
	
		
			
				|  |  | +        } catch (error) {}
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        const rules = {
 | 
	
		
			
				|  |  |          name: [{ required: true, message: '请输入名称' }],
 | 
	
		
			
				|  |  | -        id: [{ required: true, message: '请选择父节点' }]
 | 
	
		
			
				|  |  | +        id: [
 | 
	
		
			
				|  |  | +          { required: true, message: modal.type === ModalType.ADD ? '请选择父节点' : '请选择节点' }
 | 
	
		
			
				|  |  | +        ]
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        const replaceFields = { children: 'children', title: 'name', value: 'id' }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +      const treeSelectData = computed(() => {
 | 
	
		
			
				|  |  | +        if (modal.type === ModalType.ADD) {
 | 
	
		
			
				|  |  | +          return treeData.value.map(item => {
 | 
	
		
			
				|  |  | +            const newItem = { ...item }
 | 
	
		
			
				|  |  | +            if (item.children && item.children.length) {
 | 
	
		
			
				|  |  | +              newItem.children = item.children.map(item => ({ ...item, children: [] }))
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return newItem
 | 
	
		
			
				|  |  | +          })
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return treeData.value
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const treeSelectLabel = computed(() => (modal.type === ModalType.ADD ? '父级目录' : '节点'))
 | 
	
		
			
				|  |  |        return {
 | 
	
		
			
				|  |  |          ...toRefs(modal),
 | 
	
		
			
				|  |  |          prefixCls,
 | 
	
	
		
			
				|  | @@ -257,7 +318,10 @@
 | 
	
		
			
				|  |  |          onEdit,
 | 
	
		
			
				|  |  |          onSave,
 | 
	
		
			
				|  |  |          onDelete,
 | 
	
		
			
				|  |  | -        handleTreeOpreate
 | 
	
		
			
				|  |  | +        handleTreeOpreate,
 | 
	
		
			
				|  |  | +        treeSelectData,
 | 
	
		
			
				|  |  | +        treeSelectLabel,
 | 
	
		
			
				|  |  | +        onCancel
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    })
 | 
	
	
		
			
				|  | @@ -277,6 +341,7 @@
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      .editable-cell {
 | 
	
		
			
				|  |  |        position: relative;
 | 
	
		
			
				|  |  | +      width: 50%;
 | 
	
		
			
				|  |  |        .editable-cell-input-wrapper,
 | 
	
		
			
				|  |  |        .editable-cell-text-wrapper {
 | 
	
		
			
				|  |  |          padding-right: 24px;
 |