Browse Source

区域选线接口

duy 1 year ago
parent
commit
70f874f669
3 changed files with 217 additions and 62 deletions
  1. 1 1
      src/api/modules/base/region.js
  2. 17 2
      src/global/components/tree-data/index.vue
  3. 199 59
      src/views/base/region.vue

+ 1 - 1
src/api/modules/base/region.js

@@ -29,7 +29,7 @@ export default {
             return httpApi({
                 url: '/api/blade-land/landRole/remove',
                 method: 'post',
-                params: form,
+                data: form,
             }, msg)
         },
         //查询当前项目业主方合同段id

+ 17 - 2
src/global/components/tree-data/index.vue

@@ -2,6 +2,8 @@
     <HcLazyTree
         v-if="isShowTree"
         :h-props="treeProps" :auto-expand-keys="autoExpandKeys" :tree-key="treeKey" :show-checkbox="showCheckbox"
+        :default-checked-keys="defaultCheckedKeys"
+        @check="handleCheckChange"
         @load="treeLoadNode"
         @nodeTap="treeNodeClick"
     >
@@ -58,11 +60,17 @@ const props = defineProps({
         type: Boolean,
         default: false,
     },
+    defaultCheckedKeys: {
+        type: Array,
+        default: [],
+    },
 })
 //事件
-const emit = defineEmits(['menuTap', 'nodeTap'])
+const emit = defineEmits(['menuTap', 'nodeTap', 'change'])
 const useAppState = useAppStore()
 const projectId = ref(useAppState.getProjectId)
+const defaultCheckedKeys = ref(props.defaultCheckedKeys)
+
 
 //渲染完成
 onMounted(()=> {
@@ -116,8 +124,10 @@ const isShowTree = ref(true)
 //监听
 watch(() => [
     props.isMenu,
-], ([isMenu]) => {
+    props.defaultCheckedKeys,
+], ([isMenu, defaultCheckedKey]) => {
     isMenus.value = isMenu
+    defaultCheckedKeys.value = defaultCheckedKey
 })
 
 //数据格式
@@ -283,6 +293,11 @@ const getNodeExpandKeys = async ({ parent, data }, newKeys) => {
         await getNodeExpandKeys(parent, newKeys)
     }
 }
+//选择节点
+const handleCheckChange = (data, node)=>{
+    emit('change', { node, data })
+
+}
 </script>
 
 <style lang="scss">

+ 199 - 59
src/views/base/region.vue

@@ -2,85 +2,93 @@
     <HcCard>
         <template #header>
             <div class="w-64">
-                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入名称进行查询" size="large"/>
+                <el-input v-model="searchForm.name" clearable placeholder="请输入名称进行查询" size="large" />
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
             <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
                 <span>新增</span>
             </el-button>
-            <el-button size="large" type="danger" hc-btn>
-                <HcIcon name="delete-bin"/>
+            <el-button size="large" type="danger" hc-btn :disabled="tableCheckedKeys.length < 1" @click="batchClick">
+                <HcIcon name="delete-bin" />
                 <span>删除</span>
             </el-button>
         </template>
         <div class="base-region-box">
-            <div class="base-region-table" id="region-01">
-                <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelectionChange">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
-                        <el-button size="small" type="danger">删除</el-button>
+            <div id="region-01" class="base-region-table">
+                <HcTable ref="tableListRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" is-check @selection-change="tableSelectionChange" @row-click="rowView">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editRowClick(row)">
+                            编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delClickRow(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
-            <div class="base-region-info" id="region-02">
+            <div id="region-02" class="base-region-info">
                 <el-scrollbar>
                     <div class="base-region-card">
-                        <div class="title">已关联用户信息</div>
+                        <div class="title">
+                            已关联用户信息
+                        </div>
                         <div class="content">
-                            <el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag>
-                            <el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag>
-                            <el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag>
-                            <el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag>
-                            <el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag><el-tag>标签一</el-tag>
+                            <el-tag v-for="item in allUserNameArr" :key="item.id">
+                                {{ item }}
+                            </el-tag>
                         </div>
                     </div>
                     <div class="base-region-card">
-                        <div class="title">已分配区域权限</div>
+                        <div class="title">
+                            已分配区域权限
+                        </div>
                         <div class="content" style="padding-top: 12px">
-                            <HcTreeData :isMenu="false"/>
+                            <HcTreeData :is-menu="false" show-checkbox :default-checked-keys="defaultCheckedKeys" @change="treecheck" />
                         </div>
                     </div>
                 </el-scrollbar>
             </div>
         </div>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--新增/编辑-->
-        <HcDialog isToBody bgColor="white" :show="rowModal" isTable widths="62rem" :title="formModel.id?'编辑':'新增'" @save="rowModalSave" @close="rowModalClose">
+        <!-- 新增/编辑 -->
+        <HcDialog is-to-body bg-color="white" :show="rowModal" is-table widths="62rem" :title="formModel.id ? '编辑' : '新增'" :loading="submitLoading" @save="rowModalSave" @close="rowModalClose">
             <div class="base-region-dialog">
                 <div class="dialog-form">
                     <el-scrollbar>
                         <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" size="large">
-                            <el-form-item label="编号:" prop="key1">
-                                <el-input v-model="formModel.key1"/>
+                            <el-form-item label="编号:" prop="number">
+                                <el-input v-model="formModel.number" />
                             </el-form-item>
-                            <el-form-item label="名称:" prop="key2">
-                                <el-input v-model="formModel.key2"/>
+                            <el-form-item label="名称:" prop="name">
+                                <el-input v-model="formModel.name" />
                             </el-form-item>
-                            <el-form-item label="备注:" prop="key3">
-                                <el-input v-model="formModel.key3"/>
+                            <el-form-item label="备注:" prop="remark">
+                                <el-input v-model="formModel.remark" />
                             </el-form-item>
-                            <el-form-item label="关联用户" prop="key4">
-                                <HcTasksUser :contractId="0" :projectId="0" ui="w-full" @change="tasksUserChange"/>
+                            <el-form-item label="关联用户" prop="allUser">
+                                <HcTasksUser :contract-id="ownerId" :project-id="projectId" ui="w-full" :users="allUserName" @change="tasksUserChange" />
                             </el-form-item>
                         </el-form>
                     </el-scrollbar>
                 </div>
                 <div class="dialog-action">
-                    <div class="title">区域权限授权</div>
+                    <div class="title">
+                        区域权限授权
+                    </div>
                     <div class="data-tree-box">
                         <el-scrollbar>
-                            <HcTreeData :isMenu="false" showCheckbox/>
+                            <HcTreeData ref="retreeRef" :is-menu="false" show-checkbox :default-checked-keys="defaultCheckedKeys" @change="treecheck" />
                         </el-scrollbar>
                     </div>
                 </div>
@@ -90,25 +98,33 @@
 </template>
 
 <script setup>
-import {onMounted, onUnmounted, ref} from "vue";
-import split from "split.js";
+import { onMounted, onUnmounted, ref } from 'vue'
+import split from 'split.js'
+import regionApi from '~api/base/region.js'
+import { arrToId, arrToKey, formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { useAppStore } from '~src/store'
+import { delMessageV2 } from '~com/message/index.js'
 
+const useAppState = useAppStore()
+const projectId = ref(useAppState.getProjectId)
 //渲染完成
 onMounted(()=> {
     setSplitDom()
+    getTableData()
+    getOwnerIds()
 })
 
 // 初始化设置拖动分割线
-const splitvar = ref(null);
+const splitvar = ref(null)
 const setSplitDom = () => {
     try {
         //配置参考: https://split.js.org/#/?direction=vertical&snapOffset=0
         splitvar.value = split([
             '#region-01',
-            '#region-02'
+            '#region-02',
         ], {
             sizes: [50, 50],
-        });
+        })
     } catch (e) {
         setTimeout(() => {
             setSplitDom()
@@ -121,22 +137,23 @@ onUnmounted(() => {
     if (splitvar.value) {
         splitvar.value.destroy()
     }
+  
 })
 
 //搜索表单
 const searchForm = ref({
-    projectType: null, queryValue: null, startTime: null, endTime: null,
-    current: 1, size: 20, total: 0
+    name: null, queryValue: null,
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -145,52 +162,128 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'key1', name: '编号'},
-    {key: 'key2', name: '角色名称'},
-    {key: 'key3', name: '备注'},
-    {key: 'action', name: '操作', width: '130', align: 'center'},
+    { key: 'number', name: '编号' },
+    { key: 'allUser', name: '角色名称' },
+    { key: 'remark', name: '备注' },
+    { key: 'action', name: '操作', width: '130', align: 'center' },
 ]
 const tableData = ref([
-    {id: 1, key1: 'xxxx', key2: 'xxxx', key3: '65632'},
-    {id: 2, key1: 'xxxx', key2: 'xxxx', key3: '65632'},
-    {id: 3, key1: 'xxxx', key2: 'xxxx', key3: '65632'},
-    {id: 4, key1: 'xxxx', key2: 'xxxx', key3: '65632'},
+ 
 ])
-const getTableData = () => {
+const getTableData = async () => {
+    tableLoading.value = true
+    const { error, code, data } = await regionApi.getPage({
+        ...searchForm.value,
+        projectId: projectId.value,
+    })
+    tableLoading.value = false
+    if (!error && code === 200) {
+        tableData.value = getArrValue(data['records'])
+        searchForm.value.total = data['total'] || 0
+        if (tableData.value.length > 0) {
+            getDetail(tableData.value[0].id)
+        } else {
+            allUserNameArr.value = []
+            defaultCheckedKeys.value = []
 
+        }
+        
+    } else {
+        tableData.value = []
+        searchForm.value.total = 0
+    }
+}
+//getOwnerId查询当前项目业主方合同段id
+const ownerId = ref('')
+const getOwnerIds = async ()=>{
+    const { error, code, data } = await regionApi.getOwnerId({
+        projectId: projectId.value,
+    })
+    tableLoading.value = false
+    if (!error && code === 200) {
+        ownerId.value = data
+    } else {
+        ownerId.value = ''
+    }
 }
 
 //多选事件
+//多选
+const tableListRef = ref(null)
+const tableCheckedKeys = ref([])
 const tableSelectionChange = (rows) => {
-    console.log(rows)
+    tableCheckedKeys.value = rows.filter((item) => {
+        return (item ?? '') !== ''
+    })
+}
+const rowView = ({ row })=>{
+   getDetail(row.id)
 }
-
 //弹窗
 const rowModal = ref(false)
 const formRef = ref(null)
 const formModel = ref({})
 const formRules = {
-    key1: [{required: true, message: '请输入名称', trigger: 'blur'}],
+    name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
 }
-
+const allUserName = ref('')
 const tasksUserChange = (user) => {
-    console.log(user)
+    formModel.value.allUser = arrToKey(user, 'userId', '-')
+
 }
 
 //新增
 const addRowClick = () => {
     formModel.value = {}
     rowModal.value = true
+    defaultCheckedKeys.value = []
+    allUserName.value = ''
 }
 
 //编辑
 const editRowClick = (row) => {
-    formModel.value = row
+    // formModel.value = row
     rowModal.value = true
-}
+    getDetail(row.id)
 
+}
+const allUserNameArr = ref([])
+//获取详情
+const getDetail = async (id)=>{
+    const { error, code, data } = await regionApi.getDetail({
+        id,
+    })
+    if (!error && code === 200) {
+        formModel.value = getObjValue(data)
+        defaultCheckedKeys.value = data['allAreaId'].split(',') || []
+        allUserName.value = arrToKey(data['allUserList'], 'name', '-') || ''
+        allUserNameArr.value = allUserName.value .split(',') || []
+     
+    } else {
+        formModel.value = { }
+      
+    }
+ }
 //保存
-const rowModalSave = () => {
+const submitLoading = ref(false)
+const rowModalSave = async () => {
+    console.log(formModel.value, 'value')
+    const res = await formValidate(formRef.value)
+    if (res) {
+        submitLoading.value = true
+        //发起请求
+        const form = formModel.value
+        form.projectId = projectId.value
+        const { error, code, msg } = await regionApi.addOrUpdate(form)
+        //判断状态
+        submitLoading.value = false
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            rowModal.value = false
+            getTableData()
+            
+        } 
+    }
 
 }
 
@@ -199,6 +292,53 @@ const rowModalClose = () => {
     rowModal.value = false
     formModel.value = {}
 }
+
+//授权树
+const defaultCheckedKeys = ref([])
+const retreeRef = ref(null)
+const treecheck = (data)=>{
+    const checkedKeys = data.node.checkedKeys
+    formModel.value.allAreaId = checkedKeys.join(',')
+
+}
+//删除
+const delClickRow = (row)=>{
+    delMessageV2(async (action, instance, done) => {
+        if (action === 'confirm') {
+            instance.confirmButtonLoading = true
+             removeRow([row.id])
+            instance.confirmButtonLoading = false
+            done()
+        } else {
+            done()
+        }
+ })
+}
+const removeRow = async (id)=>{
+    const { error, code } = await regionApi.remove( id, false)
+    //判断状态
+    if (!error && code === 200) {
+        window.$message?.success('删除成功')
+        getTableData()
+    } else {
+        window.$message?.error('删除失败')
+    }
+}
+
+const batchClick = ()=>{
+    const rows = tableCheckedKeys.value
+    const ids = arrToId(rows).split(',')
+    delMessageV2(async (action, instance, done) => {
+        if (action === 'confirm') {
+            instance.confirmButtonLoading = true
+             removeRow(ids)
+            instance.confirmButtonLoading = false
+            done()
+        } else {
+            done()
+        }
+ })
+}
 </script>
 
 <style lang="scss" scoped>