Explorar o código

Merge remote-tracking branch 'origin/test-dev' into test-dev

chenr hai 2 meses
pai
achega
60513ed8b5

+ 1 - 1
public/version.json

@@ -1,3 +1,3 @@
 {
-  "value": "20250121170517"
+  "value": "20250529111005"
 }

+ 47 - 0
src/api/manager/ledger.js

@@ -0,0 +1,47 @@
+import request from '@/router/axios';
+//分页获取台账
+
+//词典接口
+export const page = (params) => {
+    return request({
+        url: '/api/blade-manager/synchronousRecord/page',
+        method: 'get',
+        params
+    })
+}
+//获取当前项目的模板项目
+
+export const getTempProject = (params) => {
+    return request({
+        url: '/api/blade-manager/synchronousRecord/getTempProject',
+        method: 'get',
+        params
+    })
+}
+//新增数据
+
+export const addSync = (projectInfo) => {
+    return request({
+        url: '/api/blade-manager/synchronousRecord/add',
+        method: 'post',
+        data: projectInfo
+    })
+}
+
+//是否同步
+
+export const getNodeStatus = (projectInfo) => {
+    return request({
+        url: '/api/blade-manager/synchronousRecord/getNodeStatus',
+        method: 'post',
+        params: projectInfo
+    })
+}
+
+export const getById = (params) => {
+    return request({
+        url: '/api/blade-manager//synchronousRecord/getById',
+        method: 'get',
+        params
+    })
+}

+ 99 - 0
src/api/sigital/signer.js

@@ -0,0 +1,99 @@
+import request from '@/router/axios';
+//获取岗位列表信息
+export const getRoleList = (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/roleList',
+        method: 'get',
+        params
+    })
+}
+
+//分页
+export const getListPage = (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/list',
+        method: 'get',
+        params
+    })
+}
+
+
+//获取元素列表
+export const getElementList = (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/elementList',
+        method: 'get',
+        params
+    })
+}
+
+
+//获取元素表分类列表
+export const getTableTypeList = (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/tableType',
+        method: 'get',
+        params
+    })
+}
+//获取元素表列表
+export const getTableList = (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/tableList',
+        method: 'get',
+        params
+    })
+}
+
+//获取所有施工方、监理方、业主方的角色列表
+export const queryAllRoleList= (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/queryAllRoleList',
+        method: 'get',
+        params
+    })
+}
+
+
+// 新增或修改
+export const submitEle = (data) => {
+    return request({
+        url: '/api/blade-manager/signConfig/submit',
+        method: 'post',
+        data
+    });
+}
+//获取元素详情 /blade-manager/signConfig/elementDetail
+export const elementDetail= (params) => {
+    return request({
+        url: '/api/blade-manager/signConfig/elementDetail',
+        method: 'get',
+        params
+    })  
+}
+
+export const roleDetail= (params) => {
+    return request({
+        url: '/api//blade-manager/signConfig/roleDetail',
+        method: 'get',
+        params
+    })  
+}
+//删除
+export const removeEle = (data) => {
+    return request({
+        url: '/api/blade-manager/signConfig/remove',
+        method: 'post',
+        params:data
+    });
+}
+
+
+//启用
+export const updateStatusEle = (data) => {
+    return request({
+        url: '/api//blade-manager/signConfig/updateStatus',
+        method: 'post',
+        params:data
+    });
+}

BIN=BIN
src/assets/loader.png


+ 1 - 0
src/assets/loader.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C12.5523 2 13 2.44772 13 3V6C13 6.55228 12.5523 7 12 7C11.4477 7 11 6.55228 11 6V3C11 2.44772 11.4477 2 12 2ZM12 17C12.5523 17 13 17.4477 13 18V21C13 21.5523 12.5523 22 12 22C11.4477 22 11 21.5523 11 21V18C11 17.4477 11.4477 17 12 17ZM22 12C22 12.5523 21.5523 13 21 13H18C17.4477 13 17 12.5523 17 12C17 11.4477 17.4477 11 18 11H21C21.5523 11 22 11.4477 22 12ZM7 12C7 12.5523 6.55228 13 6 13H3C2.44772 13 2 12.5523 2 12C2 11.4477 2.44772 11 3 11H6C6.55228 11 7 11.4477 7 12ZM19.0711 19.0711C18.6805 19.4616 18.0474 19.4616 17.6569 19.0711L15.5355 16.9497C15.145 16.5592 15.145 15.9261 15.5355 15.5355C15.9261 15.145 16.5592 15.145 16.9497 15.5355L19.0711 17.6569C19.4616 18.0474 19.4616 18.6805 19.0711 19.0711ZM8.46447 8.46447C8.07394 8.85499 7.44078 8.85499 7.05025 8.46447L4.92893 6.34315C4.53841 5.95262 4.53841 5.31946 4.92893 4.92893C5.31946 4.53841 5.95262 4.53841 6.34315 4.92893L8.46447 7.05025C8.85499 7.44078 8.85499 8.07394 8.46447 8.46447ZM4.92893 19.0711C4.53841 18.6805 4.53841 18.0474 4.92893 17.6569L7.05025 15.5355C7.44078 15.145 8.07394 15.145 8.46447 15.5355C8.85499 15.9261 8.85499 16.5592 8.46447 16.9497L6.34315 19.0711C5.95262 19.4616 5.31946 19.4616 4.92893 19.0711ZM15.5355 8.46447C15.145 8.07394 15.145 7.44078 15.5355 7.05025L17.6569 4.92893C18.0474 4.53841 18.6805 4.53841 19.0711 4.92893C19.4616 5.31946 19.4616 5.95262 19.0711 6.34315L16.9497 8.46447C16.5592 8.85499 15.9261 8.85499 15.5355 8.46447Z"></path></svg>

+ 2 - 2
src/config/index.json

@@ -1,9 +1,9 @@
 {
   "target22": "http://39.108.216.210:8090",
-  "target": "http://192.168.0.109:8090",
+  "target7": "http://192.168.0.109:8090",
   "target2": "http://192.168.0.101:8090",
   "target3": "http://183.247.216.148:28090",
-  "target1": "http://192.168.0.110:8090",
+  "target": "http://192.168.0.109:8090",
   "dev": {
     "port": 1888
   }

+ 29 - 1
src/router/views/index.js

@@ -77,6 +77,7 @@ export default [{
             component: () =>
               import ( /* webpackChunkName: "views" */ '@/views/manager/projectinfo/detail.vue')
           },
+          
           //归档树配置规则
           {
             path: '/manager/projectinfo/archivetreeRule',
@@ -88,6 +89,18 @@ export default [{
             component: () =>
               import ( /* webpackChunkName: "views" */ '@/views/manager/projectinfo/archivetreeRule.vue')
           },
+
+            //电签角色库
+            {
+            path: '/digital/signer',
+            name: '电签角色库',
+            meta: {
+                i18n: 'signer',
+                menu: false,
+            },
+            component: () =>
+                import ( /* webpackChunkName: "views" */'@/views/digital/signer.vue')
+            },
           
         ]
     }, {
@@ -225,7 +238,22 @@ export default [{
             component: () =>
                 import ( /* webpackChunkName: "views" */ '@/views/manager/contractinfo/detail')
         }]
-    }, {
+    },
+    {
+        path: '/contract',
+        component: Layout,
+        redirect: '/contract/detail1',
+        children: [{
+            path: 'detail1',
+            name: '编辑合同段',
+            meta: {
+                i18n: 'edit'
+            },
+            component: () =>
+                import ( /* webpackChunkName: "views" */ '@/views/manager/contractinfo/detail')
+        }]
+    },
+     {
         path: '/excel',
         component: Layout,
         redirect: '/excel/excelmodel',

+ 1293 - 0
src/views/digital/signer.vue

@@ -0,0 +1,1293 @@
+<template>
+    <basic-container>
+        <el-row :gutter="20" class="h100p">
+                <el-col :span="5" class="h100p">
+                    <div class="grid-content1">
+                        <el-radio-group v-model="tabPosition" @input="getRoleData"  size="small">
+                            <el-radio-button label="1">施工</el-radio-button>
+                            <el-radio-button label="2">监理</el-radio-button>
+                            <el-radio-button label="3">业主</el-radio-button>
+                          
+                        </el-radio-group>
+
+                        <div class="flex" style="margin-top: 10px">
+                            <el-input
+                           size="small"
+                            placeholder="请输入岗位名称"
+                            clearable
+                            @clear="clearInput"
+                            v-model="postText"
+                            >
+                            </el-input>
+                            <el-button  class="mg-l-10" @click="searchPost" type="primary" size="small"
+                            >搜索</el-button
+                            >
+                            
+                        </div>
+                        <div class="post-list">
+                                <el-scrollbar style="margin-top: 20px; height: 100%" v-loading="roleListLoading">
+                                    <ul
+                                            class="contextmenu"
+                                            >
+                                                <li v-for="item in roleData" :key="item"  
+                                                 :class="{'selected': selectedItem === item}"
+                                                @click="positionClick($event,item)">
+                                                 
+                                                    <span>{{item.roleName}}</span>
+                                                </li>
+                                    </ul>
+                                </el-scrollbar>
+                         </div>
+                    </div>
+                   
+                </el-col>
+                <el-col :span="19" class="h100p">
+                    <div class="grid-content2 ">
+                        <div class="header-btn">
+                           
+                            <el-button type="primary" size="small" @click="addEleClick">新增</el-button>
+                            <el-button type="info" size="small" @click="editEleClick" :disabled="checkedList.length<1">编辑</el-button>
+                            <el-button type="success" size="small"  @click="openClick(row,1)" :loading="openLoading">启用</el-button>
+                            <el-button type="warning" size="small"  @click="openClick(row,0)" :loading="closeLoading">停用</el-button>
+                            <el-button type="danger" size="small" @click="rowDel(row)" :loading="removeLoad">删除</el-button>
+                        </div>
+                        <div class="table-box">
+                            <el-table
+                                v-loading="tableLoading"
+                                ref="multipleTable"
+                                :data="tableData"
+                                tooltip-effect="dark"
+                                style="width: 100%"
+                                @selection-change="handleSelectionChange">
+                              
+                                <el-table-column
+                                    type="selection"
+                                    width="55">
+                                </el-table-column>
+                                <el-table-column
+                                 label="序号"
+                                type="index"
+                                width="50">
+                                </el-table-column>
+                                <el-table-column
+                                label="电签元素名称"
+                                prop="eName"
+                              >
+                                </el-table-column>
+                                <el-table-column
+                                prop="elementTypeName"
+                                label="字符类型"
+                               >
+                        
+                                </el-table-column>
+                                <el-table-column
+                              
+                                label="元素来源"
+                               >
+                               <template slot-scope="scope">
+                                <el-link type="warning" @click="eleCheck(scope.row,scope.$index,1)">查看</el-link>
+                               </template>
+                                </el-table-column>
+                                <el-table-column
+                              
+                                label="绑定岗位"
+                               >
+                               <template slot-scope="scope">
+                                <el-link type="warning" @click="selectPost(scope.row,scope.$index,1)">查看</el-link>
+                               </template>
+                                </el-table-column>
+                                <el-table-column
+                                    prop="status"
+                                    label="状态"
+                                    width="100"
+                                    >
+                                    <template slot-scope="scope">
+                                        <i class="el-icon-success" style="font-size: 20px;color:#67C23A" v-if="scope.row.status==1"></i>
+                                        <i class="el-icon-error" style="font-size: 20px;color:red" v-else></i>
+                                    </template>
+                                    </el-table-column>
+                            </el-table>
+                        </div>
+                        <div class="pagination-page">
+                            <el-pagination
+                            @size-change="handleSizeChange"
+                            @current-change="handleCurrentChange"
+                            :current-page="currentPage"
+                            :page-sizes="[10, 20, 30, 40,50]"
+                            :page-size="pageSize"
+                            layout="total, sizes, prev, pager, next, jumper"
+                            :total="total">
+                         </el-pagination>
+                        </div>
+                    </div>
+                </el-col>
+              
+        </el-row>
+
+        <el-dialog
+        class="dialog-footer-center"
+            append-to-body
+            title="新增电签配置信息"
+            :visible.sync="addDialogVisible"
+            width="80%"
+            :before-close="handleAddClose">
+           <div>
+            <el-table 
+                                :data="tableData1"
+                                style="width: 100%"
+                                max-height="600"
+                              >
+                              
+                                <el-table-column
+                                label="电签元素名称"
+                              >
+                                <template slot-scope="scope">
+                                 
+                                    <el-select v-model="scope.row.eName" placeholder="请选择元素或搜索"   filterable   size="small" @change="changeEleType($event,scope.row)">
+                                        <el-option
+                                        v-for="item in eleOptions"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value">
+                                        </el-option>
+                                    </el-select>
+                                </template>
+                                </el-table-column>
+                                <el-table-column
+                                prop="name"
+                                label="字符类型"
+                               >
+                               <template slot-scope="scope">
+                                    <el-select
+                                    v-model="scope.row.elementType"
+                                    disabled
+                                    size="small"
+                                    placeholder="请选择"
+                                    >
+                                    <el-option
+                                        v-for="item in dataTypeList"
+                                        :key="item.id"
+                                        :label="item.dictValue"
+                                        :value="item.dictKey"
+                                    ></el-option>
+                                    </el-select>
+                                </template>
+                                </el-table-column>
+                                <el-table-column
+                                prop="address"
+                                label="元素来源"
+                               >
+                               <template slot-scope="scope">
+                                <el-link type="warning" @click="eleCheck(scope.row,scope.$index)">请选择</el-link>
+                               </template>
+                                </el-table-column>
+                                <el-table-column
+                                prop="address"
+                                label="绑定岗位"
+                               >   <template slot-scope="scope">
+                                <el-link type="warning" :underline="true" @click="selectPost(scope.row,scope.$index)">请选择</el-link>
+                               </template>
+                                </el-table-column>
+                                <el-table-column
+                                    prop="tag"
+                                    label="操作"
+                                    width="100"
+                                    >
+                                    <template slot-scope="scope">
+                                    <el-button type="text" @click="handleAdd(scope.row,scope.$index)">
+                                        <i class="el-icon-circle-plus-outline" style="font-size: 20px;color:#67C23A"></i>
+                                    </el-button>
+                                    <el-button type="text" @click="handleDelete(scope.row,row,scope.$index)">
+                                        <i class="el-icon-remove-outline" style="font-size: 20px;color:red"></i>
+                                    </el-button>
+                                </template>
+                                    </el-table-column>
+                            </el-table>
+           </div>
+            <span slot="footer" class="dialog-footer">
+              
+                <el-button type="primary" @click="saveBatch" :loading="saveBatchLoading">保存并生效</el-button>
+            </span>
+            </el-dialog>
+            <!-- 选择元素来源 -->
+            <el-dialog
+             class="dialog-footer-center"
+            append-to-body
+                title="元素来源"
+                :visible.sync="sourceDialogVisible"
+                width="50%"
+                :close="handleSourceClose">
+                <div>
+                    <p class="tip-text" v-if="!isEleView" >
+                        提示:配置之后会把所有元素表该元素字段都自动配置电签岗位对应关系。
+                    </p>
+                   <div class="source-radio-group">
+                    <el-radio-group v-model="selectedSourceOption" :disabled="isEleView">
+                        <el-radio :label="0">适配所有元素表</el-radio>
+                        <el-radio :label="1">部分元素表</el-radio>
+                    </el-radio-group>
+                   </div>
+                 <!-- 并行显示的下拉框 -->
+                        <div v-if="selectedSourceOption === 1&&!isEleView" class="dropdown-container">
+                            <el-select 
+                                v-model="elementCategorySelect" 
+                                placeholder="请选择表分类" 
+                                style="flex: 1; margin-right: 10px;"
+                                 clearable @change="changeSelect" 
+                                 
+                                  >
+                                <el-option
+                                    v-for="item in elementCategoryOptions"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value">
+                                </el-option>
+                            </el-select>
+                            <el-select 
+                                v-loading="loadingList"
+                                v-model="elementTableNameSelect" 
+                                placeholder="请输入元素表名称进行模糊检索" 
+                                style="flex: 1;" 
+                                filterable clearable multiple
+                                class="custom-multi-select"
+                             
+                              
+                                 >
+                                <el-option
+                                    v-for="item in elementTableOptions"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                        <div v-if="selectedSourceOption === 1&&!isEleView" class="element-list-container">
+                            <el-scrollbar>
+                                <ul class="element-checkbox-list">
+                                    <li v-for="(item, index) in elementList" :key="item.value" class="element-item">
+                                        <el-checkbox v-model="item.checked" @change="changeEleClick($event,item)">{{ item.label }}</el-checkbox>
+                                    </li>
+                                </ul>
+                            </el-scrollbar>
+                        </div>
+                        <el-table
+                    max-height="600px"
+                        v-loading="elementLoading"
+                            v-if="selectedSourceOption === 1&&isEleView"
+                            :data="elementList1"
+                            border
+                            style="width: 100%;margin-top: 20px;"
+                             :header-cell-style="{ background: '#A0B7E2', color: 'black' }"
+                            >
+                            <el-table-column
+                            prop="name"
+                            label="元素表名称"
+                            align="center"
+                           >
+                            </el-table-column>
+                         
+                          
+                        </el-table>
+                </div>
+                <span slot="footer" class="dialog-footer" v-if="!isEleView">
+                  
+                    <el-button type="primary" @click="confirmSourceSelection">确 定</el-button>
+                </span>
+            </el-dialog>
+            <!-- 绑定岗位弹窗 -->
+            <el-dialog
+             class="dialog-footer-center"
+                append-to-body
+                title="绑定岗位"
+                :visible.sync="bindPostDialogVisible"
+                width="50%"
+                :before-close="handleBindPostClose">
+                <div class="bind-post-content">
+                    <!-- 参建方分类 + 岗位名称下拉框 -->
+                    <div class="dropdown-pair" v-if="!isPosView">
+                        <el-select v-model="partyCategorySelect" placeholder="请选择参建方分类" style="flex: 1; margin-right: 10px;"  @change="changePositionName">
+                            <el-option
+                                v-for="item in partyCategoryOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                        <el-select v-model="positionNameSelect" filterable multiple  placeholder="请输入岗位名称进行模糊检索" class="custom-multi-select" style="flex: 1;"   v-loading="positionNameLoading">
+
+                            <el-option
+                                v-for="item in positionNameOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+
+                    <!-- 岗位列表 -->
+                    <div class="position-list-container" v-if="!isPosView">
+                        <el-scrollbar > <!-- 18行 * 30px = 540px -->
+                            <ul class="position-checkbox-list">
+                                <li v-for="(item, index) in positionList" :key="index" class="position-item">
+                                    <el-checkbox v-model="item.checked"  @change="changePosClick($event,item)">{{ item.label }}</el-checkbox>
+                                </li>
+                            </ul>
+                        </el-scrollbar>
+                    </div>
+                    <el-table
+                        v-loading="bindPosLoading"
+                        v-if="isPosView"
+                        :data="positionList1"
+                        border
+                        max-height="600px"
+                          :header-cell-style="{ background: '#A0B7E2', color: 'black' }"
+                        style="width: 100%;margin-top: 20px;">
+                     
+                        <el-table-column
+                        prop="type"
+                        label="所属方"
+                         align="center"
+                       >
+                        </el-table-column>
+                        <el-table-column
+                        prop="name"
+                        label="岗位名称"
+                         align="center"
+                       >
+                        </el-table-column>
+                      
+                    </el-table>
+                </div>
+                <span slot="footer" class="dialog-footer"  v-if="!isPosView">
+                  
+                    <el-button type="primary" @click="confirmBindPostSelection">确 定</el-button>
+                </span>
+            </el-dialog>
+    </basic-container>
+</template>
+
+<script>
+  import {getRoleList,getListPage,getElementList,getTableTypeList,getTableList,queryAllRoleList,submitEle,elementDetail,roleDetail,removeEle,updateStatusEle} from "@/api/sigital/signer.js";
+  import { getDictionary } from "@/api/system/dict";
+
+    export default {
+        data() {
+            return {
+                tabPosition: '1',
+                postText: '',
+                roleData:[],
+                roleListLoading:false,
+                multipleTable:null,
+                tableData: [],
+                tableLoading: false,
+
+                selectedItem: {
+                    id: '',
+                },
+                removeLoad:false,
+                openLoading:false,
+                closeLoading:false,
+
+                currentPage: 1,
+                pageSize: 10,
+                total: 0,
+
+                addDialogVisible: false,
+                saveBatchLoading: false,
+                checkedList: [],
+                tableData1: [{}],
+                eleOptions: [
+                  
+                ],
+                dataTypeList: [],
+                sourceDialogVisible: false, // 控制弹窗显示
+                isEleView: true, // 是否查看
+                eleCheckRow: {},
+                eleIndex: 0,
+                selectedSourceOption: 1, // 默认选中 "适配所有元素表"
+                elementCategorySelect: '', // 元素分类表分类选中值
+                loadingList: false,
+                elementTableNameSelect: [], // 元素表名称筛选选中值
+                elementCategoryOptions: [
+                   
+                ],
+                elementTableOptions: [
+               
+                ],
+                allElementTableOptions: [],
+
+                elementList:[],
+                elementList1:[],
+                elementLoading: false,
+
+                bindPostDialogVisible: false,
+                bindPosLoading: false,
+                partyCategorySelect: '', // 参建方分类选中值
+                positionNameSelect: [], // 岗位名称选中值
+                partyCategoryOptions: [
+                    { value: '1', label: '施工方' },
+                    { value: '2', label: '监理方' },
+                    { value: '3', label: '业主方' }
+                ],
+                positionNameOptions: [],
+                allPositionNameOptions  : [],
+                positionNameLoading: false,
+
+                positionList: [],
+                positionList1:[],
+                isPosView: true, //
+                //  是否查看
+                selectedPostRow: {},
+                selectedPostIndex: 0,
+
+            }
+        },
+        watch: {
+            elementTableNameSelect(newVal) {
+                if (newVal) {
+                    let arr=[]; 
+                    this.allElementTableOptions.forEach(item => {
+                        newVal.forEach(tableName => {
+                            if (item.value === tableName) {
+                              arr.push(item)
+                            }
+                        });
+                    });
+                
+                    // 更新 elementList 并自动选中对应的项
+                    this.elementList = arr.map(element => ({
+                        ...element,
+                        checked: true // 自动选中
+                    }))
+                 
+                }
+            },
+            positionNameSelect(newVal) {
+             
+                
+                if (newVal) {
+                    let arr=[]; 
+             
+                    this.allPositionNameOptions.forEach(item => {
+                        newVal.forEach(roleName => {
+                            if (item.value === roleName) {
+                              arr.push(item)
+                            }
+                        });
+                    });
+                
+                    // 更新 elementList 并自动选中对应的项
+                    this.positionList = arr.map(element => ({
+                        ...element,
+                        checked: true // 自动选中
+                    }))
+                 
+                }
+            },
+        
+        
+    
+
+        },
+        methods: {
+            clearInput() {
+                this.postText = ''
+                this.getRoleData();
+            },
+            searchPost() {
+              this.getRoleData();
+            },
+            handleSelectionChange(val) {
+                this.checkedList=val
+            },
+            //获取岗位列表
+            getRoleData() {
+                this.roleListLoading = true;
+                getRoleList({
+                    type: this.tabPosition,
+                    roleName: this.postText
+                }).then(res => {
+                    console.log(res,'res');
+                    
+                    this.roleListLoading = false;
+                    if (res.data.code == 200) {
+                        this.roleListLoading = false;
+                        this.roleData = res.data.data;
+                    }else{
+                        this.roleData = [];
+                    }
+                })
+            },
+            positionClick(event, item){
+                this.selectedItem = item; 
+                this.getTableData();
+                
+            },
+            getTableData() {
+       
+                
+                this.$refs.multipleTable.clearSelection();
+                this.tableLoading = true;
+                getListPage({
+                    size: this.pageSize,
+                    current: this.currentPage,
+                    keyword: this.postText,
+                    roleId: this.selectedItem.roleId||''
+                }).then(res => {
+                    this.tableLoading = false;
+                    if (res.data.code == 200) {
+                       
+                        this.tableData = res.data.data['records'];
+                        this.total = res.data.data['total'];
+                    }else{
+                        this.tableData = [];
+                    }
+                })
+            },
+            handleSizeChange(val) {
+                this.pageSize = val;
+                this.getTableData();
+            },
+            handleCurrentChange(val) {
+                this.currentPage = val;
+                this.getTableData();
+            },
+            addEleClick() {
+                this.addDialogVisible = true;
+                this.tableData1=[{}]
+            },
+            editEleClick(row) {
+                
+                this.addDialogVisible = true;
+                this.tableData1 = [...this.checkedList]
+                console.log( this.tableData1,' this.tableData1');
+                this.isPosView=false
+                this.isEleView=false
+                
+            },
+            //启用
+            openClick(row,type){
+                if (this.checkedList.length == 0) {
+                    this.$message({
+                        type: "warning",
+                        message: "请选择需要操作的数据",
+                    });
+                    return;
+                }
+                if(type==1){
+                    this.openLoading=true;
+                }else{
+                    this.closeLoading=true;
+                }
+                let ids = '';
+                if (this.checkedList.length > 0) {
+                    ids = this.checkedList.map(item => item.id).join(',');
+                }
+                updateStatusEle({
+                    ids: ids,
+                    status: type
+                })                
+                .then(res => {
+                    if(res.data.code==200){
+                        this.$message({
+                            type: 'success',
+                            message: '操作成功!'
+                        });
+                        this.getTableData();
+                    }else{
+                        this.$message({
+                            type: 'error',
+                            message: res.data.msg
+                        });
+                    }
+                }).finally(() => {
+                    if(type==1){
+                        this.openLoading=false;
+                    }else{
+                        this.closeLoading=false;
+                    }
+                });
+            },
+            
+
+            handleAddClose(){
+                this.addDialogVisible = false;
+            },
+            getEleOptions(){
+                getElementList().then(res => {
+                    if (res.data.code == 200) {
+                        this.eleOptions = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.ename,
+                            etype: item.etype,
+                        }));
+                    }else{
+                        this.eleOptions = [];
+
+                    }
+                });
+            },
+           
+            getDataTypelist() {
+                if (this.dataTypeList.length > 1) {
+                    return;
+                }
+                getDictionary({
+                    code: "data_type",
+                }).then((res) => {
+                    res.data.data.forEach((element) => {
+                    element.dictKey = Number(element.dictKey);
+                    });
+                    this.dataTypeList = res.data.data;
+                });
+            },
+            handleAdd(row,index) {
+                this.tableData1.splice(index + 1, 0, {});
+             
+
+                // 新增操作的逻辑
+            },
+            handleDelete(row,index) {
+                console.log('删除', row);
+                if(this.tableData1.length==1){
+                    this.$message({
+                        type: "warning",
+                        message: "请至少保留一条数据",
+                    });
+                    return;
+                }
+                this.tableData1.splice(index, 1);
+                // 删除操作的逻辑
+            },
+            rowDel() {
+                let ids=''
+                if (this.checkedList.length == 0) {
+                    this.$message({
+                        type: "warning",
+                        message: "请选择需要删除的数据",
+                    });
+                    return;
+                }
+                if (this.checkedList.length > 0) {
+                    ids = this.checkedList.map(item => item.id).join(',');
+                }
+                let _that = this;
+                this.$confirm("删除后,项目级表单电签信息将同步删除,请确认是否删除", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                })
+                    .then(() => {
+                    _that.remove({ ids });
+                    })
+                    .catch(() => {
+                    this.$message({
+                        type: "info",
+                        message: "已取消删除",
+                    });
+                    })
+            },
+            async remove(ids) {
+                this.removeLoad = true;
+                removeEle(ids).then(res => {
+                    console.log(res,'res');
+                    
+                    this.removeLoad = false;
+                    if (res.data.code == 200) {
+                        this.$message({
+                            type: "success",
+                            message: "删除成功!",
+                        });
+                        this.getTableData();
+                        this.getRoleData();
+                    }
+                }).finally(() => {
+                    this.removeLoad = false;
+                });
+            },
+            changeEleType(value,row) {
+                const selectedItem = this.eleOptions.find(item => item.value === value);
+                    if (selectedItem && selectedItem.etype != null) {
+                        row.elementType = selectedItem.etype; // 假设接口返回的 eleOptions 中有 etype 字段
+                        row.eName=selectedItem.label;
+                        row.elementId=selectedItem.value;
+                    }        
+
+              
+            },
+            //选择元素来源
+            eleCheck(row,index,type) {
+               
+                this.getAllElements()
+                this.eleCheckRow=row;
+                this.eleIndex=index;
+                if(type===1){
+                    this.isEleView = true;
+                    this.getEleDetail(row.id)
+                    this.selectedSourceOption=row.tableType
+                }else{
+                    this.isEleView = false;
+                 
+                    this.selectedSourceOption=row.tableType
+                    
+                   if(row.id){
+                    this.getEleDetail(row.id,1)
+                        getTableList({
+                            tableType:''
+                        }).then(res => {
+                    
+                            if (res.data.code == 200) {
+                                this.elementTableOptions = res.data.data.map(item => ({
+                                    value: item.id,
+                                    label: item.tabChName
+                                }));
+                                // this.elementTableNameSelect=row.tableIds
+                                let arr=[];
+                                this.elementList.forEach(item => {
+                                    arr.push(item.value)
+                                    // item.checked = false;
+                                });
+                                this.elementTableNameSelect=arr
+
+                            }else{  
+                                this.elementTableOptions = [];
+                                this.elementTableNameSelect=[]
+                            }
+                        });
+
+                   }else{
+               
+                 
+                    this.elementCategorySelect=row.eleType
+                    this.changeSelect(row.eleType)
+                    this.elementTableNameSelect=row.tableIds
+
+
+                    
+                   }
+                   
+                    this.getElementCategoryOptions();
+                   
+                }
+                this.sourceDialogVisible = true;
+           
+           
+          
+            },
+            //查看详情
+            getEleDetail(id,type){
+                this.elementLoading = true;
+                elementDetail({
+                   id
+                }).then(res => {
+                   
+                    this.elementLoading = false;
+                    if (res.data.code == 200) {
+                        if(type==1){
+                            // this.elementList = res.data.data;
+                            this.elementList = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.name,
+                            checked: true
+                          
+                        }));
+                            console.log( this.elementList,' this.elementList');
+                            
+                                
+                        }else{
+                            this.elementList1 = res.data.data;
+                        }
+                      
+                    }else{
+                        this.elementList1 = [];
+                        this.elementList = [];
+                    }
+                })
+            },
+            getPosDetail(id){
+            this.bindPosLoading = true;
+                roleDetail({
+                   id
+                }).then(res => {
+                    this.bindPosLoading = false;
+                   
+                    
+                    if (res.data.code == 200) {
+                        this.positionList1 = res.data.data;
+                        this.positionList = res.data.data;
+                        this.positionNameSelect=res.data.data.map(item => item.id)
+                        
+                        this.positionList.map(item => {
+                            item.label = item.name;
+                            item.value = item.id;
+                            item.checked = true
+                          });
+                       
+                    }else{
+                        this.positionList1 = [];
+                        this.positionList = [];
+                    }
+                })
+            },
+                //获取元素表分类
+            
+           getElementCategoryOptions(){
+         
+                getTableTypeList().then(res => {
+                    if (res.data.code == 200) {
+                        this.elementCategoryOptions = res.data.data.map(item => ({
+                            value: item.dictKey,
+                            label: item.dictValue,
+                            id:item.id
+                        }));
+                    }else{  this.elementCategoryOptions = [];}
+                });
+            },
+            changeSelect(){
+              this.getElementTableOptions();
+            },
+            getAllElements(){ 
+                getTableList({
+                    tableType:''
+                }).then(res => {
+            
+                    if (res.data.code == 200) {
+                        this.allElementTableOptions = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.tabChName
+                        }));
+                    }else{  this.allElementTableOptions = [];}
+                });
+            },
+            //获取元素表List
+            getElementTableOptions(){
+                this.loadingList = true;
+                getTableList({
+                    tableType:this.elementCategorySelect
+                }).then(res => {
+                    this.loadingList = false;
+                    if (res.data.code == 200) {
+                        this.elementTableOptions = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.tabChName
+                        }));
+                        this.slec
+                    }else{  this.elementTableOptions = [];}
+                });
+            },
+                    // 弹窗关闭时的回调
+            handleSourceClose(done) {
+                this.sourceDialogVisible = false;
+              
+              
+                done();
+            },
+            changeEleClick(value,item) {
+                if(!value){
+                    this.elementTableNameSelect.forEach((ele,index)=>{
+                       if(ele == item.value){
+                        this.elementTableNameSelect.splice(index,1);
+                       }
+                    })
+                    
+                }
+            },
+            changePosClick(value,item) {
+                if(!value){
+                    this.positionNameSelect.forEach((ele,index)=>{
+                       if(ele == item.value){
+                        this.positionNameSelect.splice(index,1);
+                       }
+                    })
+                    
+                }
+            },
+            quitClose() {
+                this.sourceDialogVisible = false;
+                this.selectedSourceOption = 1;
+                this.elementTableNameSelect = [];
+                this.elementList  = [];
+                this.elementCategorySelect = '';
+            },
+            positionClose() {
+                this.bindPostDialogVisible = false;
+                this.partyCategorySelect=''
+                this.positionNameSelect = [];
+                this.positionList  = [];
+                this.partyCategorySelect = '';
+            },
+            // 确认按钮点击事件
+            confirmSourceSelection() {
+         
+                if(this.selectedSourceOption!==0&&this.selectedSourceOption!==1){
+                    this.$message({
+                        type: 'warning',
+                        message: '请选择元素来源!'
+                    });
+                    return
+                }
+                
+                if (this.selectedSourceOption === 0) {
+                    // 处理适配所有元素表的逻辑
+                    console.log("适配所有元素表");
+                    // this.eleCheckRow.tableType = 1;
+                    this.tableData1.forEach((item, index) => {
+                        if (item.id === this.eleCheckRow.id) {
+                            this.tableData1[index].tableType = 0;
+                        }
+                    })
+              
+               
+                    
+                } else {
+                    // 处理适配部分元素表的逻辑
+                    
+                    
+                    this.tableData1.forEach((item, index) => {
+                        if (index==this.eleIndex) {
+                            this.tableData1[index].tableType = 1;
+                        }
+                    })
+                    if (this.elementTableNameSelect&&this.elementTableNameSelect.length > 0) {
+                        this.tableData1.forEach((item, index) => {
+                            if (index==this.eleIndex) {
+                                this.tableData1[index].tableIds = this.elementTableNameSelect
+                                this.tableData1[index].eleType = this.elementCategorySelect;
+                            }
+                        });
+                    }else{
+                        this.tableData1.forEach((item, index) => {
+                            if (index==this.eleIndex) {
+                                this.tableData1[index].tableIds ='';
+                                this.tableData1[index].eleType=''
+                                this.elementList1 = [];
+                                this.elementList = [];
+                            }
+                        });
+                    }
+                   
+                 
+                    
+                   
+                }
+                
+                // 关闭弹窗
+                this.sourceDialogVisible = false;
+            },
+            // 打开绑定岗位弹窗
+            selectPost(row,index,type) {
+                this.selectedPostIndex=index;
+                this.getAllPositionNameOptions();
+                this.positionNameOptions=this.allPositionNameOptions;
+                if(type===1){
+                    this.isPosView=true
+                  
+                    if(row.id){
+                        this.getPosDetail(row.id)
+                    }
+                }else{
+                    if(row.id){
+                        this.getPosDetail(row.id)
+                        
+                        
+                    }
+                    this.isPosView=false
+                    this.partyCategorySelect='1'
+                    this.getPositionList();
+                    this.selectedPostRow = row;
+               
+                    
+                    // this.positionNameSelect=arr
+                    if(!row.id&&row.roleIds&&row.roleIds.length>0){
+                            this.positionNameSelect = row.roleIds;
+                            this.partyCategorySelect=row.partyCategory
+                        }else{
+                            this.positionNameSelect = [];
+                            this.partyCategorySelect = '';
+                            this.positionList  = [];
+                        }
+                       
+                 }
+                this.bindPostDialogVisible = true;
+              
+            },
+            changePositionName() {
+                this.getPositionList();
+            },
+            getAllPositionNameOptions() {
+                queryAllRoleList({
+                    type:''
+                }).then(res => {
+                    if (res.data.code == 200) {
+                        this.allPositionNameOptions = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.roleName
+                        }));
+                    }else{  this.allPositionNameOptions = [];}
+                });
+            },
+            // 获取岗位列表
+            getPositionList() {
+                this.positionNameLoading = true;
+                queryAllRoleList({
+                    type:this.partyCategorySelect
+                }).then(res => {
+                    this.positionNameLoading = false;
+                    if (res.data.code == 200) {
+                        this.positionNameOptions = res.data.data.map(item => ({
+                            value: item.id,
+                            label: item.roleName
+                        }));
+                    }else{  this.positionNameOptions = [];}
+                });
+            },
+
+
+            // 弹窗关闭回调
+            handleBindPostClose(done) {
+                this.bindPostDialogVisible = false;
+                done();
+            },
+
+            // 确认选择岗位
+            confirmBindPostSelection() {
+                if(this.positionNameSelect.length==0){
+                    this.$message.error('请选择岗位')
+                    return
+                }
+                if (this.positionNameSelect.length > 0) {
+                        // this.selectedPostRow.roleIds = this.positionNameSelect.join(',');
+                        this.tableData1.forEach((item, index) => {
+                            if (this.selectedPostIndex == index) {
+                                this.tableData1[index].roleIds =this.positionNameSelect
+                                this.tableData1[index].partyCategory =this.partyCategorySelect
+                            }
+                        });
+                    }else{
+                        // this.selectedPostRow.roleIds = '';
+                        this.tableData1.forEach((item, index) => {
+                            if (this.selectedPostIndex == index) {
+                                this.tableData1[index].roleIds =[]
+                                this.tableData1[index].partyCategory = ''
+                            }
+                        });
+                    }
+                    console.log(this.tableData1,'this.tableData1');
+                this.bindPostDialogVisible = false;
+            },
+            saveBatch(){
+                console.log(this.tableData1,'this.tableData1');
+                if(this.tableData1.length==0){
+                    this.$message.error('请选择数据')
+                    return
+                }
+                this.saveBatchLoading = true;
+                submitEle(
+                    this.tableData1
+                    ).then((res) => {
+                    if(res.data.code==200){
+                        this.$message.success(res.data.msg)
+                        this.getTableData();
+                        this.getRoleData();
+                        this.addDialogVisible=false
+                    }else{
+                        this.$message.error(res.data.msg)
+                    }
+                    }).finally(() => {
+                        this.saveBatchLoading = false;
+                    });
+            }
+    
+        },
+        mounted() {
+            this.getRoleData();
+            this.getTableData();
+            this.getEleOptions();
+            this.getDataTypelist();
+        },
+        components: {}
+    }
+</script>
+<style lang="scss" scoped>
+.h100p{
+    height: 100%;
+}
+  .grid-content1{
+        height: 100%;
+        border-right: 1px solid #D6D6D6;
+        padding-right: 10px;
+        .post-list{
+            margin-top: -18px;
+            height: calc(100% - 110px);
+            // border: 1px solid red;
+        }
+
+        
+        .contextmenu {
+        padding: 4px 0;  /* 添加适当的内边距 */
+        // min-width: 120px;
+        }
+
+        .contextmenu ul {
+        list-style: none;  /* 移除小圆点 */
+        padding: 0;
+        margin: 0;
+        // min-width: 80px;
+        background: #fff;
+        border: 1px solid #e4e7ed;
+        border-radius: 4px;
+        box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
+        }
+
+
+        .contextmenu li {
+        padding: 8px 16px;
+        line-height: 22px;
+        display: flex;
+        align-items: center;
+        cursor: pointer;
+        transition: all 0.3s;
+                &.selected {
+                background-color: #409eff;
+                color: white;
+                span {
+                    color: white;
+                }
+            }
+        }
+
+
+        .contextmenu li i {
+        margin-right: 8px;
+        font-size: 16px;
+        }
+
+
+        .contextmenu li span {
+        font-size: 14px;
+        color: #606266;
+        }
+
+
+        .contextmenu li:hover,
+        .contextmenu li.active {
+        background-color: #f5f7fa;
+        color: #409eff;
+        }
+
+
+        .contextmenu li.divider {
+        height: 1px;
+        background-color: #e4e7ed;
+        margin: 4px 0;
+        padding: 0;
+        }
+       
+    }
+.grid-content2{
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    .header-btn{
+        margin-top: 10px;
+        text-align: right;
+   }
+   .table-box {
+        flex: 1;
+        overflow: hidden;
+        
+        .el-table {
+            height: 100% !important;
+        }
+    }
+}
+.tip-text {
+margin-top: -30px;
+    color: red;
+  
+}
+.source-radio-group{
+    margin-top: 20px;
+    text-align: center;
+}
+.dropdown-container {
+    display: flex;
+    margin-top: 20px;
+}
+.element-list-container {
+    margin-top: 20px;
+    height: 300px;
+    overflow-y: auto
+}
+
+.element-checkbox-list {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+.element-item {
+    line-height: 30px;
+    padding-left: 10px;
+}
+
+.bind-post-content {
+    padding-bottom: 20px;
+}
+
+.dropdown-pair {
+    display: flex;
+    margin-bottom: 20px;
+}
+
+.position-list-container {
+    // border: 1px solid #e4e7ed;
+    border-radius: 4px;
+    padding: 10px;
+    height: 300px;
+    overflow-y: auto;
+}
+
+.position-checkbox-list {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+.position-item {
+    line-height: 30px;
+    padding-left: 10px;
+}
+.limit-height-select .el-select-dropdown__wrap {
+    max-height: 30px !important;
+    overflow-y: auto !important;
+}
+</style>
+<style lang="scss" >
+/* 限制已选标签容器高度并启用滚动 */
+.custom-multi-select .el-select__tags {
+  max-height: 60px; /* 控制高度 */
+  overflow-y: auto;  /* 启用滚动 */
+  white-space: normal; /* 允许换行(可选) */
+}
+
+/* 调整折叠标签的显示样式 */
+.custom-multi-select .el-tag {
+  margin: 2px 4px 2px 0;
+}
+
+/* 可选:隐藏原生滚动条(更美观) */
+.custom-multi-select .el-select__tags::-webkit-scrollbar {
+  width: 0;
+}
+.dialog-footer-center {
+    .el-dialog__footer {
+      text-align: center;
+    }
+}
+.pagination-page{
+    text-align: center;
+    margin-top: 10px;
+}
+</style>
+

+ 91 - 139
src/views/manager/archivetree.vue

@@ -4,7 +4,7 @@
     style="height:100%;"
   >
     <el-row class="h-100p">
-      <el-col :span="12"  class=" h-100p">
+      <el-col :span="24"  class=" h-100p">
         <div class="h-100p flex flex-d-c ov-hidden">
           <el-tabs v-model="activeName" @tab-click="handleClick" >
             <el-tab-pane label="竣工档案目录" name="first"  >
@@ -42,13 +42,10 @@
 
                   >
                     <!-- <span style="text-overflow: ellipsis;width:101%;">{{ data.title }}</span> -->
-                    <span v-if="data.title&&data.title.length<=30">{{data.title | ellipsis}}</span>
-
-                    <el-tooltip v-if="data.title&&data.title.length>30" :content="data.title" raw-content placement="top-start"  effect="light">
-                      <span v-if="data.title &&data.title.length <=30">{{ data.title }}</span>
-                      <span v-if="data.title && data.title.length > 30"> {{data.title | ellipsis}}</span>
-                    </el-tooltip>
+                 
 
+                   
+                    {{ data.title }}
                     <span
                       class="marleft10"
                       v-show="data.moreShow"
@@ -105,12 +102,7 @@
 
                         >
                             <!-- <span style="text-overflow: ellipsis;width:101%;">{{ data.title }}</span> -->
-                            <span v-if="data.title&&data.title.length<=30">{{data.title | ellipsis}}</span>
-
-                              <el-tooltip v-if="data.title&&data.title.length>30" :content="data.title" raw-content placement="top-start"  effect="light">
-                                <span v-if="data.title &&data.title.length <=30">{{ data.title }}</span>
-                                <span v-if="data.title && data.title.length > 30"> {{data.title | ellipsis}}</span>
-                              </el-tooltip>
+                            {{ data.title }}
 
                             <span
                               class="marleft10"
@@ -152,112 +144,7 @@
 
         </div>
       </el-col>
-      <el-col :span="12" class="h-100p">
-        <basic-container  class=" h-100p ">
-          <div class="peizhi h-100p ov-hidden"  v-loading="rightTreeLoading">
-            <el-tabs v-model="activetabName" @tab-click="handletabClick">
-              <el-tab-pane label="立卷规则" name="second">
-                <el-row style="margin-bottom:15px">
-                  <el-button type="primary" plain @click="setHigh">设置为最高并卷层级</el-button>
-                  <el-button type="primary" plain @click="setType">设置为分类卷并卷</el-button>
-                  <el-button type="primary" plain @click="setAlone">设置为独立组卷</el-button>
-                </el-row>
-                <div style="display: flex;justify-content: space-between;">
-                  <el-select v-model="publictreevalue" clearable placeholder="请选择公有质检化分树" @change="treeIdChange" style="  margin-bottom:15px;  width:45%;">
-                    <el-option
-                      v-for="item in publictreeoptions"
-                      :key="item.id"
-                      :label="item.wbsName"
-                      :value="item.id">
-                    </el-option>
-                  </el-select>
-                  <el-select v-model="testtreevalue" clearable placeholder="请选择公有试验化分树" @change="treeIdChange"  style="    width: 45%;">
-                    <el-option
-                      v-for="item in testtreeoptions"
-                      :key="item.id"
-                      :label="item.wbsName"
-                      :value="item.id">
-                    </el-option>
-                  </el-select>
-                </div>
-              </el-tab-pane>
-              <el-tab-pane label="工程文件入口配置" name="first"></el-tab-pane>
-            </el-tabs>
-
-            <div class="scrollClass "  v-if="activetabName==='second'" style="height:100%">
-              <el-scrollbar style="height:80%">
-                <el-tree
-                  :props="Rightprops"
-                  :data="rightData"
-                  node-key="id"
-                  ref="settree"
-                  class="filter-tree"
-                  show-checkbox :check-strictly="true"
-                  @check="handleCheckChange"
-                  :default-expanded-keys="defaultExpandedKeys1"
-                  :current-node-key="curreenttid1"
-                >
-                  <div class="custom-tree-node" slot-scope="{ node, data }"   @mouseover="mouseOver(data)"    style="flex: 1;width: 100%;justify-content: flex-start;"
-                       @mouseleave="mouseLeave(data)">
-                    <!-- <span>{{ node.label }}</span> -->
-                    <span v-if="node.label&&node.label.length<=25">{{node.label | ellipsis1}}</span>
-
-                    <el-tooltip v-if="node.label&&node.label.length>25" :content="node.label" raw-content placement="top-start"  effect="light">
-                      <span v-if="node.label &&node.label.length <=25">{{node.label}}</span>
-                      <span v-if="node.label && node.label.length > 25"> {{node.label | ellipsis1}}</span>
-                    </el-tooltip>
-                    <span  class="marleft10"
-                           v-show="data.moreShow">
-                              <div class="config_type" v-if="data.archiveAutoType == 1&&data.archiveAutoGroupSelect == 1">最</div>
-                              <div class="config_type" v-if="data.archiveAutoType == 2&&data.archiveAutoGroupSelect == 1">分</div>
-                              <div  class="config_type" v-if="data.archiveAutoType == 3&&data.archiveAutoGroupSelect == 1">独</div>
-                          <el-button
-                            type="text"
-                            size="mini"
-                            @click.stop="() => viewConfig(data,node)">
-                            查看配置
-                          </el-button>
-                          <el-link @click.stop="removeArchive(data)" type="danger" :underline="false" class="marleft10"><i class="el-icon-delete"></i></el-link>
-                        </span>
-                  </div>
-                </el-tree>
-              </el-scrollbar>
-            </div>
-            <div class="flexEnd"  v-if="isentryTree&&activetabName==='first'">
-              <i
-                @click="rightPushTree"
-                class="el-icon-plus"
-                style="backgroundColor:#2A97DF;color:#fff;fontSize:20px;cursor: pointer;"
-              ></i>
-            </div>
-            <div class="scrollClass "  v-if="isentryTree&&activetabName==='first'" style="height:100%">
-              <el-scrollbar style="height:80%">
-                <el-tree
-                  :props="Rightprops"
-                  :data="rightData"
-                  node-key="id"
-                  ref="tree"
-                  class="filter-tree"
-
-                >
-                  <div class="custom-tree-node" slot-scope="{ node, data }"   @mouseover="mouseOver(data)"
-                       @mouseleave="mouseLeave(data)">
-                    <!-- <span>{{ node.label }}</span> -->
-                    <span v-if="node.label&&node.label.length<=25">{{node.label | ellipsis1}}</span>
-
-                    <el-tooltip v-if="node.label&&node.label.length>25" :content="node.label" raw-content placement="top-start"  effect="light">
-                      <span v-if="node.label &&node.label.length <=25">{{node.label}}</span>
-                      <span v-if="node.label && node.label.length > 25"> {{node.label | ellipsis1}}</span>
-                    </el-tooltip>
-
-                  </div>
-                </el-tree>
-              </el-scrollbar>
-            </div>
-          </div>
-        </basic-container>
-
-      </el-col>
+ 
     </el-row>
 
 
@@ -339,7 +226,23 @@
               ></el-option>
             </el-select>
           </el-form-item>
+          <el-form-item
+              label="并卷规则"
+              prop="archiveAutoType"
+            >
+              <el-select
 
+                v-model="form.archiveAutoType"
+                style="width:400px;"
+              >
+                <el-option
+                  v-for="item in ruleTypeList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
           <el-form-item
             label="储存类型"
             prop="storageType"
@@ -377,7 +280,25 @@
                 ></el-option>
               </el-select>
             </el-form-item>
+           
             <template v-if="form.isStorageNode==1">
+              <el-form-item
+              label="保管期限"
+              prop="storageTime"
+            >
+              <el-select
+
+                v-model="form.storageTime"
+                style="width:400px;"
+              >
+                <el-option
+                  v-for="item in timeList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
               <el-form-item
                 label="储存类型"
                 prop="storageType"
@@ -516,7 +437,7 @@
         slot="footer"
         class="dialog-footer"
       >
-        <el-button @click="treeTap=false">取 消</el-button>
+        <el-button @click="treeClose">取 消</el-button>
         <el-button
           type="primary"
           @click="saveTree"
@@ -731,6 +652,8 @@ export default {
         projectType:'',//工程类型
         storageType:'',//储存类型
         expDataType:[],//文件类型
+        archiveAutoType:1,//并卷规则
+        storageTime:'',//保管期限
       },
       rules: {
         nodeName: [{ required: true, message: '请输入节点名称', trigger: 'blur' }],
@@ -806,6 +729,24 @@ export default {
         label: '否',
         value: 2
       },],//存储节点枚举
+      ruleTypeList: [
+      {
+        label: '单独组卷',
+        value: 1
+      }, {
+        label: '分类并卷',
+        value: 2
+      },
+      {
+        label: '最高组卷',
+        value: 3
+      },
+      ],
+      timeList: [
+      { label: '永久', value: '3' },
+    { label: '30年', value: '2' },
+    { label: '10年', value: '1' },
+      ],
       builtDrawingList: [{
         label: '是',
         value: 1
@@ -1252,6 +1193,9 @@ export default {
       if (this.filterText) {
         this.defaultExpanded = [data.id]
       }
+      this.form.archiveAutoType=1
+      this.form.storageTime='3'
+     
       this.treeTap = true
     },
     async edittree (data,node) {//编辑树
@@ -1284,7 +1228,9 @@ export default {
           console.log(1111111);
           this.remove(node.id).then(()=>{
             _that.$refs.trees1.remove(node) //删除界面上的节点
+          if(this.filterText){
             this.archiveTreetree4()//全加载左侧树
+          }
           }).catch(()=>{
 
           })
@@ -1323,6 +1269,8 @@ export default {
 
         this.form.projectType = res.data.projectType   //工程类型
         this.form.storageType = res.data.storageType   //储存类型
+        this.form.archiveAutoType = res.data.archiveAutoType   //最高1  分类2  独立3
+        this.form.storageTime = res.data.storageTime 
 
         if(res.data.expDataType){
           this.form.expDataType = res.data.expDataType.split(',')   //文件类型
@@ -1385,6 +1333,8 @@ export default {
         projectType:'',//工程类型
         storageType:'',//储存类型
         expDataType:[],//文件类型
+        archiveAutoType:'',//最高1  分类2  独立3
+        storageTime:'',//储存时间
       }
       this.$refs.form.resetFields();
       this.form.id = ''
@@ -1399,9 +1349,9 @@ export default {
     },
     async major_data_type () {//内业资料类型
       const { data: res } = await dictionary({ code: 'major_data_type' })
-      console.log(res);
+ ;
       if (res.code == 200) {
-        this.majorDataTypeList = res.data
+        this.majorDataTypeList =  res.data.filter(item => item.dictKey !== '0');
       }
     },
     async display_hierarchy () {//显示层级
@@ -1411,12 +1361,14 @@ export default {
         this.displayHierarchyList = res.data
       }
     },
-    saveTree () {//保存按钮
-      console.log(this.form.postType,'post');
-      console.log(this.treeParent,'treeParent');
+   async saveTree () {//保存按钮
       if(this.treeParent.postType&&this.treeParent.postType!= this.form.postType){
         this.$message.warning('岗位类型必须和父级节点岗位类型一直')
       }else{
+        const isValid = await this.$refs.form.validate()
+        if(!isValid){
+          return false
+        }
         this.$refs.form.validate(val => {
           if (val) {
             if (this.form.nodeType == 2) {
@@ -1435,6 +1387,8 @@ export default {
 
                     projectType:this.form.projectType, //工程类型
                     storageType:this.form.storageType, //储存类型
+                    archiveAutoType:this.form.archiveAutoType,//并卷规则
+                    storageTime:this.form.storageTime,//存储时间
                   })
                 } else {
                   this.baocun({
@@ -1449,6 +1403,8 @@ export default {
 
                     projectType:this.form.projectType, //工程类型
                     storageType:this.form.storageType, //储存类型
+                    archiveAutoType:this.form.archiveAutoType,//并卷规则
+                    storageTime:this.form.storageTime,//存储时间
                   })
                 }
               } else {
@@ -1461,6 +1417,8 @@ export default {
                   isStorageNode: this.form.isStorageNode,  //是否为存储节点
 
                   projectType:this.form.projectType, //工程类型
+                  archiveAutoType:this.form.archiveAutoType,//并卷规则
+                  storageTime:this.form.storageTime,//存储时间
                 })
               }
             } else if (this.form.nodeType == 1) {
@@ -1477,6 +1435,8 @@ export default {
 
                   projectType:this.form.projectType, //工程类型
                   storageType:this.form.storageType, //储存类型
+                  archiveAutoType:this.form.archiveAutoType,//并卷规则
+                  storageTime:this.form.storageTime,//存储时间
                 })
               }else if(this.form.associationType == 2){
                 //试验资料
@@ -1491,6 +1451,8 @@ export default {
                   expDataType:this.form.expDataType.join(','),//文件类型
                   projectType:this.form.projectType, //工程类型
                   storageType:this.form.storageType, //储存类型
+                  archiveAutoType:this.form.archiveAutoType,//并卷规则
+                  storageTime:this.form.storageTime,//存储时间
                 })
               }else {
                 this.baocun({
@@ -1503,6 +1465,8 @@ export default {
 
                   projectType:this.form.projectType, //工程类型
                   storageType:this.form.storageType, //储存类型
+                  archiveAutoType:this.form.archiveAutoType,//并卷规则
+                  storageTime:this.form.storageTime,//存储时间
                 })
               }
             }
@@ -1852,20 +1816,8 @@ export default {
     this.heights = this.$refs.container.$el.offsetHeight
   },
   filters:{
-    ellipsis(value) {
-      if (!value) return "";
-      if (value.length > 35) {
-        return value.slice(0, 35) + "...";
-      }
-      return value;
-    },
-    ellipsis1(value) {
-      if (!value) return "";
-      if (value.length > 25) {
-        return value.slice(0, 25) + "...";
-      }
-      return value;
-    },
+
+ 
 
   },
 }

+ 25 - 23
src/views/manager/contractinfo/detail.vue

@@ -355,7 +355,7 @@
                       </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                      <el-form-item
+                      <!-- <el-form-item
                         label="保管期限"
                         prop="storagePeriod"
                       >
@@ -371,6 +371,14 @@
                             :value="item.dictKey"
                           ></el-option>
                         </el-select>
+                      </el-form-item> -->
+                      <el-form-item
+                        label="卷盒规格"
+                        prop="specification"
+                      >
+                      <el-select v-model="contractForm.specification" clearable placeholder="请选择" style="width:100%">
+                                <el-option v-for="item in coilsize" :key="item.value" :label="item.label" :value="item.value" />
+                            </el-select>
                       </el-form-item>
                     </el-col>
                   </el-row>
@@ -413,7 +421,7 @@
                       </el-form-item>
                     </el-col>
                     <el-col :span="12">
-
+                     
                     </el-col>
                   </el-row>
                 </el-col>
@@ -1021,7 +1029,14 @@ export default {
         middlePayRatio:null,
         sevenRatio: null,
         twentyEightRatio: null,
-      }//计量合同段管理相关信息
+
+      },//计量合同段管理相关信息
+      coilsize:[
+          { label: '30mm', value: '30' },
+          { label: '40mm', value: '40' },
+          { label: '50mm', value: '50' },
+          { label: '60mm', value: '60' },
+      ]
     }
   },
   computed: {
@@ -1142,7 +1157,7 @@ export default {
         this.activeType = this.$route.query.type;
       }
 
-      this.getStoragePeriodList();//获取业务字典
+     
       this.getSecurityLevelList();//获取安全等级
       this.setHeaders();
     },
@@ -1237,9 +1252,9 @@ export default {
           if (Number(this.contractForm.securityLevel) < 0) {
             this.contractForm.securityLevel = 0;
           }
-          if (Number(this.contractForm.storagePeriod) < 0) {
-            this.contractForm.storagePeriod = 0;
-          }
+          // if (Number(this.contractForm.storagePeriod) < 0) {
+          //   this.contractForm.storagePeriod = 0;
+          // }
 
             this.meterContractInfo = this.contractForm.meterContractInfo
             ||{
@@ -1302,9 +1317,9 @@ export default {
           if (Number(this.contractForm.securityLevel) < 0) {
             this.contractForm.securityLevel = 0;
           }
-          if (Number(this.contractForm.storagePeriod) < 0) {
-            this.contractForm.storagePeriod = 0;
-          }
+          // if (Number(this.contractForm.storagePeriod) < 0) {
+          //   this.contractForm.storagePeriod = 0;
+          // }
 
           this.meterContractInfo=res.data.data.meterContractInfo
             ||{
@@ -1703,19 +1718,6 @@ export default {
       this.$refs['contractForm'].validateField('projectPlace');
     },
 
-    getStoragePeriodList() {
-      if (this.storagePeriodList.length > 1) {
-        return;
-      }
-      getDictbiz({
-        code: 'storage_period'
-      }).then((res) => {
-        res.data.data.forEach(element => {
-          element.dictKey = Number(element.dictKey)
-        });
-        this.storagePeriodList = res.data.data;
-      })
-    },
     getSecurityLevelList() {
       if (this.securityLevelList.length > 1) {
         return;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 169 - 556
src/views/manager/projectinfo/archivetreeRule.vue


+ 44 - 6
src/views/manager/projectinfo/detail.vue

@@ -87,18 +87,44 @@
                     </el-input>
                   </el-form-item>
                   <el-form-item
-                    label="电签类别"
-                    prop="remarkType"
+                    label="施工文件后缀"
+                    prop="sgSuffix"
                   >
-                    <el-radio-group v-model="projectForm.remarkType">
-                      <el-radio :label="1">安心签</el-radio>
-                      <el-radio :label="2">东方中讯</el-radio>
-                    </el-radio-group>
+                    <el-input v-model="projectForm.sgSuffix">
+                    
+                    </el-input>
+                  </el-form-item>
+                  <el-form-item
+                    label="监理文件后缀"
+                    prop="jlSuffix"
+                  >
+                    <el-input v-model="projectForm.jlSuffix">
+                    </el-input>
                   </el-form-item>
+                 
+                      <el-form-item
+                      label="电签类别"
+                      prop="remarkType"
+                    >
+                    <el-tooltip slot="label" effect="light" content="选择本项目所要应用的电签公司" placement="top">
+                      <span>电签类别</span>
+                    </el-tooltip>
+
+                      <el-radio-group v-model="projectForm.remarkType">
+                        <el-radio :label="1">安心签</el-radio>
+                        <el-radio :label="2">(首讯)东方中讯</el-radio>
+                        <el-radio :label="3">东方中讯</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                 
+               
                   <el-form-item
                     label="电签方式"
                     prop="approvalType"
                   >
+                  <el-tooltip slot="label" effect="light" content="平行审批只作用于质检系统,计量系统默认流程审批" placement="top">
+                      <span>电签方式</span>
+                    </el-tooltip>
                     <el-radio-group v-model="projectForm.approvalType">
                       <el-radio :label="1">流程审批</el-radio>
                       <el-radio :label="2">平行审批</el-radio>
@@ -191,6 +217,9 @@
                     label="开启随机数"
                     prop="isOpenRandomNumber"
                   >
+                  <el-tooltip slot="label" effect="light" content="开启表单右键功能随机数生成" placement="top">
+                      <span>开启随机数</span>
+                    </el-tooltip>
                     <el-radio-group v-model="projectForm.isOpenRandomNumber">
                       <el-radio :label="0">不开启</el-radio>
                       <el-radio :label="1">开启</el-radio>
@@ -209,6 +238,9 @@
                     label="模板引用"
                     prop="templateType"
                   >
+                  <el-tooltip slot="label" effect="light" content="选择该项目引用后台项目WBS模版节点,或是让客户自行导入WBS引用底层节点" placement="top">
+                      <span>模板引用</span>
+                    </el-tooltip>
                     <el-radio-group v-model="projectForm.templateType">
                       <el-radio :label="1">模板节点</el-radio>
                       <el-radio :label="2">底层节点</el-radio>
@@ -612,6 +644,12 @@ export default {
         remarkType: [
             { required: true, message: '请选择电签类别', trigger: 'blur' },
         ],
+        sgSuffix: [
+          { required: true, message: '请输入施工后缀', trigger: 'blur' },
+        ],
+        jlSuffix: [
+          { required: true, message: '请输入监理后缀', trigger: 'blur' },
+        ],
         templateType:[
             { required: true, message: '请选择是否模板引用', trigger: 'blur' },
         ],

+ 2 - 1
src/views/manager/projectinfo/editElement/editElement.vue

@@ -545,7 +545,8 @@ export default {
           message: '已取消删除'
         });
       });
-      _that.AddNewElementField = '替换元素'
+            _that.$refs.cascader.clearCheckedNodes()
+            _that.AddNewElementField = ''
     },
     getInformation2 (a, b, c) {
       if (this.AddNewElementField) {

+ 209 - 0
src/views/manager/projectinfo/ledger.vue

@@ -0,0 +1,209 @@
+<template>
+    <basic-container class="list">
+      <div class="flex">
+     
+          <el-select
+            v-model="searchForm.projectId"
+            filterable
+            style="width: 300px"
+            placeholder="请选择项目"
+            clearable
+            @change="listpage"
+          >
+            <el-option
+              v-for="item in options"
+              :key="item.id"
+              :label="item.projectName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+          <el-select 
+            v-model="searchForm.range"
+            filterable
+            style="width: 200px;margin-left: 10px;margin-right: 10px"
+            placeholder="同步范围"
+            clearable
+            @change="listpage"
+          >
+          <el-option
+              v-for="item in rangeOptions"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+          <el-select 
+                 v-model="searchForm.type"
+                filterable
+                style="width: 200px;margin-right: 10px"
+                placeholder="同步类型"
+                clearable
+                @change="listpage"
+            >
+            <el-option
+                v-for="item in typeOptions"
+                :key="item.id"
+                 :label="item.dictValue"
+                :value="item.dictKey"
+                >
+                </el-option>
+            </el-select>
+           
+          
+            <el-button type="info" class="el-icon-close" @click="reSearchClick"
+              >重置</el-button
+            >
+
+
+      </div>
+  
+      <el-table
+        class="martop20 tableList"
+        :data="tableData"
+        header-color="red"
+        style="width: 100%"
+        max-height="650"
+      >
+        <el-table-column type="index" label="序号" > </el-table-column>
+        <el-table-column prop="projectName" label="项目">
+        </el-table-column>
+        <el-table-column prop="rangeName" label="同步范围">
+        </el-table-column>
+        <el-table-column prop="templateName" label="同步源">
+        </el-table-column>
+        <el-table-column prop="typeName" label="同步类型">
+        </el-table-column>
+        <el-table-column prop="nodeName" label="同步节点">
+        </el-table-column>
+        <el-table-column prop="createUser" label="同步人">
+        </el-table-column>
+        <el-table-column prop="createTime" label="同步时间">
+        </el-table-column>
+      </el-table>
+      <el-pagination
+      style="float:right"
+      background
+      class="martop10 marbottom10"
+      layout="sizes, total, prev, pager, next"
+      :total="total"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :current-page.sync="pageindex"
+      :page-size="pagesize"
+        :page-sizes="[10, 20, 30, 40]"
+    >
+    </el-pagination>
+    </basic-container>
+  </template>
+  
+  <script>
+ import { getDictionary } from "@/api/system/dict";
+ import { getProjectList } from "@/api/manager/projectinfo";
+ import { page } from "@/api/manager/ledger";
+  export default {
+    data() {
+      return {
+       searchForm: {
+          projectId: "",
+          range: "",
+          type: "",
+        },
+        options: [],
+
+        rangeOptions: [],
+        typeOptions: [],
+        tableData: [],
+        total: 0,
+        pageindex: 1,
+        pagesize: 20,
+      
+      };
+    },
+    methods: {
+     getRangeOptions(){
+      getDictionary({
+        code: "wbs_snyc_range",
+      }).then((res) => {
+        this.rangeOptions = res.data.data;
+      });
+     },
+     getTypeOptions(){
+      getDictionary({
+        code: "wbs_sync_type",
+      }).then((res) => {
+        this.typeOptions = res.data.data;
+      });
+     },
+      handleSizeChange(val) {
+        this.pagesize = val;
+        this.listpage();
+      },
+      handleCurrentChange(val) {
+        this.pageindex = val;
+        this.listpage();
+      },
+      typeChange() {
+        this.listpage();
+      },
+  
+      projectChange() {
+        
+        this.listpage();
+      },
+ 
+
+      async queryProjectList() {
+        //获取所有项目
+        const { data: res } = await getProjectList();
+        if (res.code == 200) {
+          this.options = res.data.records;
+         
+
+        }
+      },
+      async listpage() {
+        //分页获取证书列表数据
+        const { data: res } = await page({
+          current: this.pageindex,
+          size: this.pagesize,
+          ...this.searchForm,
+        });
+  
+        if (res.code == 200) {
+          this.tableData = res.data.records;
+          this.total = res.data.total;
+        }
+      },
+
+      reSearchClick() {
+        this.searchForm = {
+          projectId: "",
+          range: "",
+          type: "",
+        };
+
+        this.listpage();
+      },
+      //#endregion
+    },
+    created() {
+      this.queryProjectList();
+      this.getRangeOptions();
+      this.getTypeOptions()
+      this.listpage();
+    },
+  };
+  </script>
+  
+  <style lang="scss" scoped>
+  .tableList {
+    ::v-deep th.el-table__cell {
+      font-size: 16px !important;
+    }
+  }
+  .header-box-center {
+    margin-left: 40px;
+  }
+  </style>
+  

+ 16 - 2
src/views/manager/projectinfo/list.vue

@@ -1,7 +1,8 @@
 <template>
   <basic-container>
     <div>
-      <div class="pd-b-20 border-grey-b">
+      <div class="pd-b-20 border-grey-b header-box">
+       <div>
         <span class="mg-r-10">选择项目名称</span>
         <el-select
           v-model="projectId"
@@ -15,7 +16,11 @@
             :value="item.id"
           ></el-option>
         </el-select>
+       </div>
+
+        <el-button type="primary" @click="syncLedger">同步台账</el-button>
       </div>
+   
       <div class="pd-t-20">
         <el-row
           :gutter="20"
@@ -238,7 +243,7 @@ export default {
     },
     editContract (item) {
       this.$router.push({
-        path: '/contract/detail',
+        path: '/contract/detail1',
         query: {
           pid: item.pid,
           cid: item.id,
@@ -399,6 +404,10 @@ export default {
     wbsManage () {//wbs树管理按钮
       this.$router.push('/manager/privateWBS/' + 111)
     },
+    //同步
+    syncLedger () {
+      this.$router.push('/manager/projectinfo/ledger' )
+    }
   }
 };
 </script>
@@ -427,4 +436,9 @@ export default {
 .abg3 {
   background-color: rgb(42, 53, 155);
 }
+.header-box{
+  display: flex;
+  justify-content: space-between;
+  width: 100%;
+}
 </style>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 805 - 175
src/views/manager/projectinfo/tree.vue


+ 6 - 6
src/views/manager/projectinfo/treeTemplate/template/electronicSignature.vue

@@ -114,12 +114,12 @@
           <table @click class="table martop20 copyTable" width='100%' border='1px ' bordercolor="#E5E5E5" cellpadding='2px'>
             <thead cellpadding='2px' height='40px'>
             <tr>
-              <th width='30%'>元素位置</th>
-              <th width='30%'>签字岗位</th>
-              <th width='30%'>签字时间元素位置</th>
-              <th width='10%'>偏移x</th>
-              <th width='10%'>偏移y</th>
-              <th width='20%'>操作</th>
+              <th >元素位置</th>
+              <th>签字岗位</th>
+              <th>签字时间元素位置</th>
+              <th >偏移x</th>
+              <th>偏移y</th>
+              <th >操作</th>
             </tr>
             </thead>
             <tbody height='36px'>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio