Browse Source

预归档库

master
xuhuajiao 1 year ago
parent
commit
4bc7801ac9
  1. 21
      src/api/system/category/process.js
  2. 75
      src/assets/styles/prearchive-library.scss
  3. 64
      src/views/prearchiveLibrary/index.vue
  4. 275
      src/views/prearchiveLibrary/module/batchFile.vue
  5. 1
      src/views/prearchiveLibrary/module/form.vue
  6. 65
      src/views/prearchiveLibrary/module/moveFile.vue
  7. 213
      src/views/prearchiveLibrary/module/scope.vue
  8. 41
      src/views/system/archivesCategory/processManage/index.vue
  9. 99
      src/views/system/archivesCategory/processManage/module/form.vue
  10. 2
      src/views/system/groupManage/index.vue
  11. 26
      src/views/system/log/operateLog/index.vue
  12. 6
      src/views/system/log/search.vue
  13. 2
      src/views/system/role/index.vue
  14. 80
      src/views/system/user/center.vue

21
src/api/system/category/process.js

@ -0,0 +1,21 @@
import request from '@/utils/request'
// 门类流程管理基础
export function FetchInitCategoryFlowBase(params) {
return request({
url: 'api/category/initCategoryFlowBase',
method: 'get',
params
})
}
// 根据门类获取流程设置
export function FetchInitFlowByCategoryId(params) {
return request({
url: 'api/category/initFlowByCategoryId',
method: 'get',
params
})
}
export default { FetchInitCategoryFlowBase, FetchInitFlowByCategoryId }

75
src/assets/styles/prearchive-library.scss

@ -0,0 +1,75 @@
@import 'variables';
@import 'mixin';
.move-form{
::v-deep .el-dialog{
width: 828px;
}
.move-main{
display: flex;
justify-content: space-between;
height: 477px;
border: 1px solid #E6E8ED;
}
.move-left{
width: 253px;
padding: 12px 20px 0 12px;
border-right: 1px solid #E6E8ED;
}
.move-right{
flex: 1;
h4{
position: relative;
padding-left: 52px;
height: 40px;
line-height: 40px;
font-size: 16px;
color: #0C0E1E;
border-bottom: 1px solid #E6E8ED;
background: #F5F9FC;
&::before{
content: "";
position: absolute;
left: 0;
top: 0;
display: inline-block;
width: 39px;
height: 40px;
border-right: 1px solid #E6E8ED;
}
}
.raido-main{
display: flex;
flex-direction: column;
flex-wrap: wrap;
justify-content: flex-start;
height: 360px;
overflow: hidden;
overflow-y: scroll;
.el-radio{
width: 100%;
margin-right: 0;
height: 40px;
line-height: 40px;
border-bottom: 1px solid #E6E8ED;
::v-deep .el-radio__input{
margin-left: 12px;
}
::v-deep .el-radio__label{
display: inline-block;
padding-left: 12px;
margin-left: 12px;
border-left: 1px solid #E6E8ED;
}
}
}
.select-content{
padding: 0 18px;
height: 40px;
line-height: 40px;
border-top: 1px solid #E6E8ED;
}
}
}

64
src/views/prearchiveLibrary/index.vue

@ -8,13 +8,16 @@
<span class="left-bottom-line" /> <span class="left-bottom-line" />
<!--门类树状结构--> <!--门类树状结构-->
<div class="tree-scroll"> <div class="tree-scroll">
<el-tree ref="tree" v-loading="crud.loading" :data="treeList" :props="defaultProps" node-key="id" :expand-on-click-node="false" highlight-current :default-expanded-keys="[1]" :default-checked-keys="[1]" @node-click="handleNodeClick">
<el-tree ref="tree" v-loading="crud.loading" :data="crud.data" :props="defaultProps" node-key="id" :expand-on-click-node="false" highlight-current @node-click="handleNodeClick">
<span slot-scope="{ node, data }" class="custom-tree-node"> <span slot-scope="{ node, data }" class="custom-tree-node">
<span v-if="data.isType===1 " class="iconFolder">
{{ data.label }}
<span v-if="data.isType === 1 " class="iconFolder">
{{ data.cnName }}
</span> </span>
<span v-if="data.isType===2 " class="iconFile">
{{ data.label }}
<span v-if="data.isType === 2" class="iconArch">
{{ data.cnName }}
</span>
<span v-if="data.isType === 3" class="iconFile">
{{ data.cnName }}
</span> </span>
</span> </span>
</el-tree> </el-tree>
@ -118,7 +121,7 @@
</template> </template>
<script> <script>
import crudCategory from '@/api/category/category'
import CRUD, { presenter, header } from '@crud/crud' import CRUD, { presenter, header } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@ -128,9 +131,10 @@ import '@riophae/vue-treeselect/dist/vue-treeselect.css'
// import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' // import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import dataJson from './data.json' import dataJson from './data.json'
import tableJson from './table.json' import tableJson from './table.json'
import eForm from './module/form.vue'
import batchFile from './module/batchFile.vue'
import moveFile from './module/moveFile.vue'
import eForm from './module/form'
import batchFile from './module/batchFile'
import moveFile from './module/moveFile'
import Vue from 'vue'
export default { export default {
name: 'PrearchiveLibrary', name: 'PrearchiveLibrary',
@ -138,8 +142,8 @@ export default {
cruds() { cruds() {
return [ return [
CRUD({ CRUD({
title: '预归档库', url: 'api/archives-type/menu',
crudMethod: { ...crudCategory },
title: '预归档库', url: 'api/document/menu',
crudMethod: { },
optShow: { optShow: {
add: false, add: false,
edit: false, edit: false,
@ -162,7 +166,7 @@ export default {
}, },
defaultProps: { defaultProps: {
children: 'children', children: 'children',
label: 'label'
label: 'cnName'
}, },
treeList: [], treeList: [],
table: [], table: [],
@ -185,6 +189,17 @@ export default {
this.table = tableJson this.table = tableJson
}, },
methods: { methods: {
//
findNode(tree, func) {
for (const node of tree) {
if (func(node)) return node
if (node.children) {
const res = this.findNode(node.children, func)
if (res) return res
}
}
return null
},
// //
expandParents(node) { expandParents(node) {
node.expanded = true node.expanded = true
@ -196,10 +211,16 @@ export default {
}, },
[CRUD.HOOK.afterRefresh]() { [CRUD.HOOK.afterRefresh]() {
let currentKey let currentKey
if (localStorage.getItem('currentMetaDataKey')) {
currentKey = JSON.parse(localStorage.getItem('currentMetaDataKey'))
if (localStorage.getItem('documentCategoryKey')) {
currentKey = JSON.parse(localStorage.getItem('documentCategoryKey'))
} else { } else {
currentKey = this.treeList[0]
if (this.crud.data[0].isType === 1) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
} else {
currentKey = this.crud.data[0]
}
} }
// //
this.$refs.tree.setCurrentKey(currentKey.id) this.$refs.tree.setCurrentKey(currentKey.id)
@ -215,6 +236,19 @@ export default {
}, },
// //
handleNodeClick(val) { handleNodeClick(val) {
if (val) {
this.crud.selectionChangeHandler([val])
this.$refs.eform.pid = val.id
this.selectedCategory = val
if (val.pid !== '0') {
Vue.set(this.selectedCategory, 'parentName', this.$refs.tree.getNode(val.pid).data.cnName)
}
//
localStorage.setItem('documentCategoryKey', JSON.stringify(val))
// if (this.$refs.tree.getNode(val.pid) && this.$refs.tree.getNode(val.pid).childNodes) {
// this.brotherNodeNum = this.$refs.tree.getNode(val.pid).childNodes.length
// }
}
}, },
// -form/-api // -form/-api
handleForm(type) { handleForm(type) {

275
src/views/prearchiveLibrary/module/batchFile.vue

@ -1,129 +1,132 @@
<template> <template>
<!-- 批量成件 -->
<el-dialog class="batch-form" append-to-body :modal-append-to-body="false" :close-on-click-modal="false" :before-close="handleClose" :visible="batchVisible" title="批量成件">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="130px">
<el-form-item label="对应规则" prop="rules">
<el-select v-model="form.rules" placeholder="请选择" style="width: 225px;" @change="selectRules(val)">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
<div>
<!-- 批量成件 -->
<el-dialog class="batch-form" append-to-body :modal-append-to-body="false" :close-on-click-modal="false" :before-close="handleClose" :visible="batchVisible" title="批量成件">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="130px">
<el-form-item label="对应规则" prop="rules">
<el-select v-model="form.ruleName" placeholder="请选择" style="width: 225px;" @change="selectRules">
<el-option
v-for="item in rulesOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="归档范围" prop="scope">
<el-input v-model="form.scope" type="text">
<i slot="suffix" class="el-input__icon iconfont icon-sousuo" @click="selectScope" />
</el-input>
</el-form-item>
<el-form-item label="源分类" prop="documentName">
<el-input v-model="form.documentName" type="text" disabled />
</el-form-item>
<el-form-item label="目标门类" prop="categoryId">
<treeselect
v-model="form.categoryId"
:options="categoryTree"
flat
:multiple="false"
:normalizer="normalizer"
placeholder="请选择目标门类(整理库/管理库门类)"
@select="handleSelectCategory"
/> />
</el-select>
</el-form-item>
<el-form-item label="归档范围" prop="scope">
<el-input v-model="form.scope" type="text">
<i slot="suffix" class="el-input__icon iconfont icon-sousuo" />
</el-input>
</el-form-item>
<el-form-item label="源分类" prop="classify">
<el-input v-model="form.classify" type="text" />
</el-form-item>
<el-form-item label="目标门类" prop="target">
<treeselect
v-model="form.target"
:options="targetOptions"
placeholder="请选择"
/>
</el-form-item>
</el-form>
<div class="corres-field-main">
<div class="corres-field-list corres-field-left">
<div class="corres-field-title">
<p>字段取值</p>
</div>
<div class="field-list">
<div v-for="(item, index) in selectStatus" :key="index" class="field-item">
<el-select :key="index" v-model="item.fiedType">
<el-option
v-for="v in fiedOption"
:key="v.value"
:label="v.label"
:value="v.value"
/>
</el-select>
</el-form-item>
</el-form>
<div class="corres-field-main">
<div class="corres-field-list corres-field-left">
<div class="corres-field-title">
<p>字段取值</p>
</div> </div>
</div>
</div>
<div class="corres-field-list corres-field-middle">
<div class="corres-field-title">
<p>源分类文件库-文件表</p>
<span>文件库分类A</span>
</div>
<div class="field-list">
<div v-for="(item, index) in selectStatus" :key="index" class="field-item">
<el-select :key="index" v-model="item.value">
<el-option
v-for="v in selectOptions"
:key="v.value"
:label="v.label"
:value="v.value"
/>
</el-select>
<div v-if="!item.mode" class="field-state"><span :class=" item.isType === 1 ? 'is-select' : 'is-hide'">{{ item.isType === 1 ? '显示': '隐藏' }}</span></div>
<div class="field-list">
<div v-for="(item, index) in selectStatus" :key="index" class="field-item">
<el-select :key="index" v-model="item.fiedType">
<el-option
v-for="v in fiedOption"
:key="v.value"
:label="v.label"
:value="v.value"
/>
</el-select>
</div>
</div> </div>
</div> </div>
</div>
<div class="corres-field-list corres-field-right">
<div class="corres-field-title">
<p>目标门类整理库/管理库-文件表</p>
<span>文书档案文件</span>
<div class="corres-field-list corres-field-middle">
<div class="corres-field-title">
<p>源分类文件库-文件表</p>
<span>文件库分类A</span>
</div>
<div class="field-list">
<div v-for="(item, index) in selectStatus" :key="index" class="field-item">
<el-select :key="index" v-model="item.value">
<el-option
v-for="v in selectOptions"
:key="v.value"
:label="v.label"
:value="v.value"
/>
</el-select>
<div v-if="!item.mode" class="field-state"><span :class=" item.isType === 1 ? 'is-select' : 'is-hide'">{{ item.isType === 1 ? '显示': '隐藏' }}</span></div>
</div>
</div>
</div> </div>
<div class="field-list">
<div v-for="(item,index) in targetData" :key="index" class="field-item">
<p>{{ item.label }}</p>
<div class="field-state"><span :class=" item.isType === 1 ? 'is-select' : 'is-hide'">{{ item.isType === 1 ? '显示': '隐藏' }}</span></div>
<div class="corres-field-list corres-field-right">
<div class="corres-field-title">
<p>目标门类整理库/管理库-文件表</p>
<span>文书档案文件</span>
</div>
<div class="field-list">
<div v-for="(item,index) in targetData" :key="index" class="field-item">
<p>{{ item.label }}</p>
<div class="field-state"><span :class=" item.isType === 1 ? 'is-select' : 'is-hide'">{{ item.isType === 1 ? '显示': '隐藏' }}</span></div>
</div>
</div> </div>
</div> </div>
<div v-if="selectStatus.length === 0" class="empty-data" />
</div>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="batchVisible = false">取消</el-button>
<el-button type="primary" @click="batchVisible = false">确定</el-button>
</div> </div>
<div v-if="selectStatus.length === 0" class="empty-data" />
</div>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="formVisible = false">确定</el-button>
</div> </div>
</div>
</el-dialog>
</el-dialog>
<ScopeModule ref="scopeModule" @getScope="hanleScopeSelect" />
</div>
</template> </template>
<script> <script>
import { FetchInitFieldMateList, FetchInitFieldMate } from '@/api/system/fieldMate'
import { FetchDocumentMenu } from '@/api/system/fileLibrary/fileLibrary'
import { FetchCategoryMenu } from '@/api/system/category/category'
import Treeselect from '@riophae/vue-treeselect' import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
// import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' // import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import fieldData from './data.json' import fieldData from './data.json'
import ScopeModule from './scope'
export default { export default {
name: 'BatchFile', name: 'BatchFile',
components: { Treeselect },
components: { Treeselect, ScopeModule },
data() { data() {
return { return {
batchVisible: false, batchVisible: false,
options: [
{
value: '选项1',
label: '规则A'
}, {
value: '选项2',
label: '规则B'
}, {
value: '选项3',
label: '规则C'
}
],
targetOptions: [],
rulesOptions: [],
categoryTree: [],
form: { form: {
rules: null,
ruleName: null,
scope: null, scope: null,
classify: '',
target: null
documentId: null,
documentName: '',
categoryId: null
}, },
selectedCategoryName: null,
scopeVisible: false,
loadSource: [], loadSource: [],
rules: { rules: {
target: [
{ required: true, message: '请选择档案门类', trigger: 'input' }
categoryId: [
{ required: true, message: '请选择档案门类', trigger: 'change' }
] ]
}, },
fiedOption: [ fiedOption: [
@ -142,25 +145,95 @@ export default {
} }
}, },
created() { created() {
this.getInitFieldMateList()
this.getCategoryDataTree()
this.getDocumentDataTree()
},
mounted() {
}, },
methods: { methods: {
//
getInitFieldMateList() {
FetchInitFieldMateList().then(res => {
this.rulesOptions = res.content.map(item => {
const json = {}
json.label = item.rule_name
json.value = item.id
return json
})
})
},
getInitDetail(id) {
FetchInitFieldMate({ 'id': id }).then((res) => {
console.log(res)
this.form.documentName = res.documentName
this.form.categoryId = res.fieldMateDetails[0].pid.categoryId.pid
}).catch(err => {
console.log(err)
})
},
selectRules(val) { selectRules(val) {
this.getInitDetail(val)
this.selectStatus = [] this.selectStatus = []
this.targetData = fieldData this.targetData = fieldData
this.targetData.forEach((item, index) => {
this.selectStatus.push({ mode: true, value: '' })
// this.targetData.forEach((item, index) => {
// this.selectStatus.push({ mode: true, value: '' })
// })
},
filterData(data) {
return data.filter(node => {
if (node.children && node.children.length > 0) {
node.children = this.filterData(node.children) //
}
return node.isType !== 3 // isType3
})
},
//
getCategoryDataTree() {
FetchCategoryMenu().then(res => {
this.categoryTree = this.filterData(res)
})
},
getDocumentDataTree() {
FetchDocumentMenu().then(res => {
this.documentTree = this.filterData(res)
}) })
}, },
handleSelectCategory(val) {
this.selectedCategoryName = val.cnName
},
//
selectScope() {
this.$refs.scopeModule.scopeVisible = true
},
hanleScopeSelect(val) {
if (val.length !== 0) {
this.form.scope = val[0].scopeName
console.log('val', val)
}
},
handleClose(done) { handleClose(done) {
this.batchVisible = false this.batchVisible = false
done() done()
},
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.cnName,
children: node.children,
isDisabled: node.isType !== 2
}
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/prearchive-library.scss";
.batch-form{ .batch-form{
::v-deep .el-dialog{ ::v-deep .el-dialog{
width: 828px !important; width: 828px !important;

1
src/views/prearchiveLibrary/module/form.vue

@ -17,6 +17,7 @@
</template> </template>
<script> <script>
import PreviewForm from '@/views/components/category/PreviewForm' import PreviewForm from '@/views/components/category/PreviewForm'
import addJson from '../add.json' import addJson from '../add.json'
export default { export default {

65
src/views/prearchiveLibrary/module/moveFile.vue

@ -76,71 +76,8 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.move-form{
::v-deep .el-dialog{
width: 828px;
}
.move-main{
display: flex;
justify-content: space-between;
height: 477px;
border: 1px solid #E6E8ED;
}
.move-left{
width: 253px;
padding: 12px 20px 0 12px;
border-right: 1px solid #E6E8ED;
}
@import "~@/assets/styles/prearchive-library.scss";
.move-right{
flex: 1;
h4{
position: relative;
padding-left: 52px;
height: 40px;
line-height: 40px;
font-size: 16px;
color: #0C0E1E;
border-bottom: 1px solid #E6E8ED;
background: #F5F9FC;
&::before{
content: "";
position: absolute;
left: 0;
top: 0;
display: inline-block;
width: 39px;
height: 40px;
border-right: 1px solid #E6E8ED;
}
}
.raido-main{
display: flex;
flex-direction: column;
flex-wrap: wrap;
justify-content: flex-start;
height: 360px;
overflow: hidden;
overflow-y: scroll;
.el-radio{
width: 100%;
margin-right: 0;
height: 40px;
line-height: 40px;
border-bottom: 1px solid #E6E8ED;
::v-deep .el-radio__input{
margin-left: 12px;
}
::v-deep .el-radio__label{
display: inline-block;
padding-left: 12px;
margin-left: 12px;
border-left: 1px solid #E6E8ED;
}
}
}
}
}
.el-pagination{ .el-pagination{
padding-right: 5px; padding-right: 5px;
margin: 25px 0 !important; margin: 25px 0 !important;

213
src/views/prearchiveLibrary/module/scope.vue

@ -0,0 +1,213 @@
<template>
<!-- 归档范围 -->
<el-dialog class="move-form" append-to-body :modal-append-to-body="false" :close-on-click-modal="false" :before-close="handleClose" :visible="scopeVisible" title="归档范围">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div class="move-main">
<div class="move-left">
<!--门类树状结构-->
<div class="tree-scroll">
<el-tree
ref="tree2"
v-loading="crud.loading"
:data="crud.data"
node-key="id"
:props="defaultProps"
:expand-on-click-node="false"
@node-click="handleNodeClick2"
/>
</div>
</div>
<div class="move-right">
<h4>归档范围</h4>
<div class="raido-main" style="height: 395px;">
<el-table
ref="table"
v-loading="crud.loading"
lazy
:show-header="false"
:data="tableData"
:row-key="getRowKey"
:load="getSonClass"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
highlight-current-row
@select="handleSelect"
@selection-change="selectionChangeHandler"
@row-click="clickRowHandler"
>
<el-table-column type="selection" align="center" width="55" />
<el-table-column :show-overflow-tooltip="true" prop="scopeName" label="名称" />
</el-table>
</div>
<div class="select-content">
当前选中{{ selections.length!==0 ? selections[0].scopeName : '' }}
</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelScope">取消</el-button>
<el-button type="primary" @click="confirmedScope">确定</el-button>
</div>
</div>
</el-dialog>
</template>
<script>
import { FetchInitArchivesScope, FetchSonArchivesScope } from '@/api/system/archivesScope'
import CRUD, { presenter, header, crud } from '@crud/crud'
import Vue from 'vue'
export default {
name: 'ScopeModule',
components: { },
cruds() {
return [
CRUD({
title: '归档范围', url: 'api/category/menu',
crudMethod: {}, sort: []
})
]
},
mixins: [presenter(), header(), crud()],
data() {
return {
scopeVisible: false,
selectedCategory: null,
tableData: [],
selections: [],
defaultProps: { children: 'children', label: 'cnName' }
}
},
created() {
},
mounted() {
},
methods: {
getRowKey(row) {
return row.id
},
filterData(data) {
return data.filter(node => {
if (node.children && node.children.length > 0) {
node.children = this.filterData(node.children) //
}
return node.isType !== 3 // isType3
})
},
//
findNode(tree, func) {
for (const node of tree) {
if (func(node)) return node
if (node.children) {
const res = this.findNode(node.children, func)
if (res) return res
}
}
return null
},
//
expandParents(node) {
node.expanded = true
if (node.parent) {
this.expandParents(node.parent)
}
},
[CRUD.HOOK.afterRefresh]() {
this.crud.data = this.filterData(this.crud.data)
this.$nextTick(() => {
if (this.$refs.tree2) {
let currentKey
if (this.crud.data[0].isType === 1) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
} else {
currentKey = this.crud.data[0]
}
//
this.$refs.tree2.setCurrentKey(currentKey.id)
this.$nextTick(() => {
//
const selectedKey = this.$refs.tree2.getCurrentNode()
if (this.$refs.tree2.getNode(selectedKey) && this.$refs.tree2.getNode(selectedKey).parent) {
this.expandParents(this.$refs.tree2.getNode(selectedKey).parent)
}
//
this.handleNodeClick(selectedKey)
})
}
})
},
//
handleNodeClick2(val) {
if (val) {
this.selectedCategory = val
if (val.pid !== '0') {
Vue.set(this.selectedCategory, 'parentName', this.$refs.tree2.getNode(val.pid).data.cnName)
}
this.getInitArchivesScope()
}
},
getInitArchivesScope() {
FetchInitArchivesScope({ 'categoryId': this.selectedCategory.id }).then(res => {
this.tableData = res.content.map(function(item, index) {
if (item.sonNum !== 0) {
item.hasChildren = true
item.children = null
} else {
item.hasChildren = false
}
return item
})
})
},
getSonClass(tree, treeNode, resolve) {
setTimeout(() => {
FetchSonArchivesScope({ pid: tree.id }).then(res => {
const data = res.map(function(obj) {
if (obj.sonNum !== 0 && obj.sonNum) {
obj.hasChildren = true
obj.children = null
} else {
obj.hasChildren = false
}
return obj
})
resolve(data)
})
}, 100)
},
handleSelect(selection) {
this.$refs.table.clearSelection() //
if (selection.length > 0) {
//
this.$refs.table.toggleRowSelection(selection[0])
}
},
// table - row
clickRowHandler(row) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row)
},
selectionChangeHandler(val) {
this.selections = val
},
cancelScope() {
this.scopeVisible = false
},
confirmedScope() {
this.scopeVisible = false
this.$emit('getScope', this.selections)
},
handleClose(done) {
this.scopeVisible = false
done()
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/prearchive-library.scss";
</style>

41
src/views/system/archivesCategory/processManage/index.vue

@ -1,11 +1,11 @@
<template> <template>
<div class="process-container"> <div class="process-container">
<div class="process-item">
<span>入管理库流程</span>
<div v-for="item in flowBaseList" :key="item.id" class="process-item">
<span>{{ item.name }}</span>
<p>01-归档审批流程<i class="iconfont icon-shezhi" @click="toProcessSelected()" /></p> <p>01-归档审批流程<i class="iconfont icon-shezhi" @click="toProcessSelected()" /></p>
<el-switch v-model="manageEnable" class="isEnable-chapter" /> <el-switch v-model="manageEnable" class="isEnable-chapter" />
</div> </div>
<div class="process-item">
<!-- <div class="process-item">
<span>退接收库流程</span> <span>退接收库流程</span>
<p>02-退回审批流程<i class="iconfont icon-shezhi" /></p> <p>02-退回审批流程<i class="iconfont icon-shezhi" /></p>
<el-switch v-model="returnEnable" class="isEnable-chapter" /> <el-switch v-model="returnEnable" class="isEnable-chapter" />
@ -34,16 +34,25 @@
<span>开发审批流程</span> <span>开发审批流程</span>
<p>07-开发审批流程<i class="iconfont icon-shezhi" /></p> <p>07-开发审批流程<i class="iconfont icon-shezhi" /></p>
<el-switch v-model="developEnable" class="isEnable-chapter" /> <el-switch v-model="developEnable" class="isEnable-chapter" />
</div>
</div> -->
<eForm ref="cuform" /> <eForm ref="cuform" />
</div> </div>
</template> </template>
<script> <script>
import { FetchInitCategoryFlowBase, FetchInitFlowByCategoryId } from '@/api/system/category/process'
import eForm from './module/form' import eForm from './module/form'
export default { export default {
name: 'ProcessManage', name: 'ProcessManage',
components: { eForm }, components: { eForm },
props: {
selectedCategory: {
type: Object,
default: function() {
return {}
}
}
},
data() { data() {
return { return {
manageEnable: true, manageEnable: true,
@ -52,14 +61,34 @@ export default {
externalEnable: true, externalEnable: true,
borrowEnable: false, borrowEnable: false,
destroyEnable: false, destroyEnable: false,
developEnable: false
developEnable: false,
flowBaseList: [],
flowSetting: []
} }
}, },
watch: { watch: {
}, },
created() {
mounted() {
this.getInitCategoryFlowBase()
this.getInitFlowByCategoryId()
}, },
methods: { methods: {
getInitCategoryFlowBase() {
FetchInitCategoryFlowBase().then((res) => {
console.log('1', res)
this.flowBaseList = res
}).catch(err => {
console.log(err)
})
},
getInitFlowByCategoryId() {
FetchInitFlowByCategoryId({ 'categoryId': this.selectedCategory.id }).then((res) => {
console.log('2', res)
this.flowSetting = res
}).catch(err => {
console.log(err)
})
},
toProcessSelected() { toProcessSelected() {
this.$refs.cuform.cuDialogVisible = true this.$refs.cuform.cuDialogVisible = true
} }

99
src/views/system/archivesCategory/processManage/module/form.vue

@ -3,13 +3,24 @@
<div class="setting-dialog"> <div class="setting-dialog">
<el-form ref="form" class="process-form" inline :model="form" :rules="rules" size="small" label-width="80px"> <el-form ref="form" class="process-form" inline :model="form" :rules="rules" size="small" label-width="80px">
<div class="process-template"> <div class="process-template">
<el-form-item label="流程模板" prop="template">
<el-select v-model="form.template" style="width: 580px;">
<el-option v-for="item in selectOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-form-item label="流程模板" prop="modelId">
<el-select
v-model="form.modelId"
placeholder="请选择"
style="width: 580px;"
:value-key="'label'"
@change="selectModel"
>
<el-option
v-for="item in modelOptions"
:key="item.value"
:label="item.label"
:value="item"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<div class="template-img"> <div class="template-img">
<img src="" alt="">
<img :src="srcImg" alt="" :onerror="defaultImg">
</div> </div>
</div> </div>
<div class="process-task"> <div class="process-task">
@ -43,47 +54,24 @@
</template> </template>
<script> <script>
import { FetchInitFlowAll, FetchFindFolwImgByModelId } from '@/api/system/flowable'
import { getAllJob } from '@/api/system/job'
export default { export default {
data() { data() {
return { return {
cuDialogVisible: false, cuDialogVisible: false,
loading: false, loading: false,
form: { form: {
template: null,
modelId: null,
task01: null, task01: null,
task02: null task02: null
}, },
selectOptions: [
{
id: 1,
value: '默认模板',
label: '默认模板'
},
{
id: 2,
value: '模板A',
label: '模板A'
},
{
id: 3,
value: '模板B',
label: '模板B'
}
],
jobOptions: [
{
id: 1,
value: '岗位A',
label: '岗位A'
},
{
id: 2,
value: '岗位B',
label: '岗位B'
}
],
modelOptions: [],
srcImg: null,
defaultImg: 'this.src="' + require('@/assets/images/system/default-img.jpg') + '"',
jobOptions: [],
rules: { rules: {
template: [
modelId: [
{ required: true, message: '流程模板不可为空', trigger: 'change' } { required: true, message: '流程模板不可为空', trigger: 'change' }
], ],
task01: [ task01: [
@ -95,7 +83,43 @@ export default {
} }
} }
}, },
mounted() {
this.getAllFlowable()
this.getAllJob()
},
methods: { methods: {
getAllFlowable() {
FetchInitFlowAll().then((res) => {
this.modelOptions = res.map(item => {
const json = {}
json.procdefId = item.procdefId
json.value = item.modelKey
json.label = item.deployName
return json
})
}).catch(err => {
console.log(err)
})
},
selectModel(val) {
FetchFindFolwImgByModelId({ 'processDefinitionId': val.procdefId }).then((res) => {
this.srcImg = 'data:image/jpeg;base64,' + res
}).catch(err => {
console.log(err)
})
},
getAllJob() {
getAllJob().then((res) => {
this.jobOptions = res.content.map(item => {
const json = {}
json.value = item.id
json.label = item.postName
return json
})
}).catch(err => {
console.log(err)
})
},
save() { save() {
// this.loading = true // this.loading = true
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
@ -128,6 +152,11 @@ export default {
width: 690px; width: 690px;
height: 460px; height: 460px;
border: 1px solid #eee; border: 1px solid #eee;
overflow: hidden;
img{
display: block;
width: 100%;
}
} }
.task-tip{ .task-tip{
margin-bottom: 20px; margin-bottom: 20px;

2
src/views/system/groupManage/index.vue

@ -103,8 +103,8 @@
<el-tooltip class="item" effect="dark" content="选择门类关联" placement="top"> <el-tooltip class="item" effect="dark" content="选择门类关联" placement="top">
<span class="role-span role-tab-active">门类关联</span> <span class="role-span role-tab-active">门类关联</span>
</el-tooltip> </el-tooltip>
<!-- v-permission="['admin','fonds:edit']" -->
<el-button <el-button
v-permission="['admin','fonds:edit']"
:disabled="!showButton" :disabled="!showButton"
:loading="categoryLoading" :loading="categoryLoading"
size="mini" size="mini"

26
src/views/system/log/operateLog/index.vue

@ -1,11 +1,12 @@
<template> <template>
<div style="height: calc(100vh - 236px);">
<Search :is-log-type="isLogType" @handleClearOperateData="handleDelt" />
<div class="operateLog-main">
<Search :is-log-type="isLogType" :is-center="isCenter" @handleClearOperateData="handleDelt" />
<!-- calc(100vh - 396px) -->
<el-table <el-table
ref="table" ref="table"
:data="crud.data" :data="crud.data"
style="width: 100%;" style="width: 100%;"
height="calc(100vh - 396px)"
:height="heightStyle"
@row-click="clickRowHandler" @row-click="clickRowHandler"
@selection-change="crud.selectionChangeHandler" @selection-change="crud.selectionChangeHandler"
> >
@ -71,10 +72,24 @@ export default {
} }
}) })
}, },
props: {
isCenter: {
type: Boolean,
default: false
}
},
data() { data() {
return { return {
isLogType: 'operate', isLogType: 'operate',
selections: []
selections: [],
heightStyle: ''
}
},
mounted() {
if (this.isCenter) {
this.heightStyle = 'calc(100vh - 470px)'
} else {
this.heightStyle = 'calc(100vh - 396px)'
} }
}, },
methods: { methods: {
@ -105,6 +120,9 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.operateLog-main{
height: calc(100vh - 236px);
}
::v-deep .el-pagination{ ::v-deep .el-pagination{
margin: 24px 0 10px 0 !important margin: 24px 0 10px 0 !important
} }

6
src/views/system/log/search.vue

@ -26,7 +26,7 @@
</div> </div>
<crudOperation> <crudOperation>
<template v-slot:left> <template v-slot:left>
<el-button :loading="crud.downloadLoading" size="mini" @click="handleComfiredDelt"><i class="iconfont icon-shanchu" />清空</el-button>
<el-button v-if="!isCenter" :loading="crud.downloadLoading" size="mini" @click="handleComfiredDelt"><i class="iconfont icon-shanchu" />清空</el-button>
</template> </template>
<template v-slot:right> <template v-slot:right>
<el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)"> <el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)">
@ -66,6 +66,10 @@ export default {
isLogType: { isLogType: {
type: String, type: String,
default: '' default: ''
},
isCenter: {
type: Boolean,
default: false
} }
}, },
data() { data() {

2
src/views/system/role/index.vue

@ -84,8 +84,8 @@
<el-tooltip class="item" effect="dark" content="选择指定角色分配全宗范围" placement="top"> <el-tooltip class="item" effect="dark" content="选择指定角色分配全宗范围" placement="top">
<span :class="['role-span', {'role-tab-active': roleTabIndex == 1}]" @click="changeActiveTab(1)">全宗范围</span> <span :class="['role-span', {'role-tab-active': roleTabIndex == 1}]" @click="changeActiveTab(1)">全宗范围</span>
</el-tooltip> </el-tooltip>
<!-- v-permission="['admin','roles:edit']" -->
<el-button <el-button
v-permission="['admin','roles:edit']"
:disabled="!showButton" :disabled="!showButton"
:loading="treeLoading" :loading="treeLoading"
size="mini" size="mini"

80
src/views/system/user/center.vue

@ -21,12 +21,12 @@
<ul class="user-info"> <ul class="user-info">
<li><div style="height: 100%"><i class="iconfont icon-zhanghao" />账号<div class="user-right">{{ user.username }}</div></div></li> <li><div style="height: 100%"><i class="iconfont icon-zhanghao" />账号<div class="user-right">{{ user.username }}</div></div></li>
<li><i class="iconfont icon-yonghuming" style="font-size: 13px;" />用户名<div class="user-right">{{ user.nickName }}</div></li> <li><i class="iconfont icon-yonghuming" style="font-size: 13px;" />用户名<div class="user-right">{{ user.nickName }}</div></li>
<li><i class="iconfont icon-xingbie" />性别<div class="user-right"></div></li>
<li><i class="iconfont icon-yonghujiaose" style="font-size: 12px;" />用户角色<div class="user-right"> {{ user.dept.name }}</div></li>
<li><i class="iconfont icon-suoshuquanzong" />所属全宗<div class="user-right">全宗A</div></li>
<li><i class="iconfont icon-suoshubumen" />所属部门<div class="user-right">部门A</div></li>
<li><i class="iconfont icon-shoujihaoma" />手机号码<div class="user-right">{{ user.phone }}</div></li>
<li><i class="iconfont icon-yonghuyouxiang" style="font-size: 12px;" />用户邮箱<div class="user-right">{{ user.email }}</div></li>
<li><i class="iconfont icon-xingbie" />性别<div class="user-right">{{ user.gender ? user.gender : '/' }}</div></li>
<li><i class="iconfont icon-yonghujiaose" style="font-size: 12px;" />用户角色<div class="user-right"><span v-for="item in user.roles" :key="item.id">{{ item.name + ' ' }}</span></div></li>
<li><i class="iconfont icon-suoshuquanzong" />所属全宗<div class="user-right">{{ user.fondsId ? user.fondsId : '/' }}</div></li>
<li><i class="iconfont icon-suoshubumen" />所属部门<div class="user-right">{{ user.dept ? user.dept.deptsName : '/' }}</div></li>
<li><i class="iconfont icon-shoujihaoma" />手机号码<div class="user-right">{{ user.email ? user.phone : '/' }}</div></li>
<li><i class="iconfont icon-yonghuyouxiang" style="font-size: 12px;" />用户邮箱<div class="user-right">{{ user.email ? user.email : '/' }}</div></li>
<li><i class="iconfont icon-yanzhengma" />安全设置<div class="user-right"><a @click="$refs.pass.dialog = true">修改密码</a></div></li> <li><i class="iconfont icon-yanzhengma" />安全设置<div class="user-right"><a @click="$refs.pass.dialog = true">修改密码</a></div></li>
</ul> </ul>
</div> </div>
@ -45,7 +45,7 @@
<span class="tab-right-img" /> <span class="tab-right-img" />
</ul> </ul>
<div v-if="activeIndex == 0" class="tab-item"> <div v-if="activeIndex == 0" class="tab-item">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="100px">
<el-form ref="form" class="tab-form" :model="form" :rules="rules" size="small" label-width="100px">
<el-form-item label="用户名" prop="nickName"> <el-form-item label="用户名" prop="nickName">
<el-input v-model="form.nickName" style="width: 324px" /> <el-input v-model="form.nickName" style="width: 324px" />
<span class="form-tip">用户昵称不作为登录使用</span> <span class="form-tip">用户昵称不作为登录使用</span>
@ -76,52 +76,8 @@
<processCenter v-if="activeIndex == 2" /> <processCenter v-if="activeIndex == 2" />
<!-- 操作日志 --> <!-- 操作日志 -->
<div v-if="activeIndex == 3" class="tab-item" style="padding-left: 20px;"> <div v-if="activeIndex == 3" class="tab-item" style="padding-left: 20px;">
<div class="head-container">
<div class="user-header-search">
<el-input v-model="query.keyword" clearable size="small" placeholder="输入关键字搜索" prefix-icon="el-icon-search" class="filter-item" style="width: 225px;" />
<date-range-picker v-model="query.createTime" class="date-item" />
<!-- @click="crud.toQuery" -->
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search">搜索</el-button>
<!-- @click="crud.resetQuery()" -->
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left">重置</el-button>
</div>
<el-button size="mini">
<i class="iconfont icon-daochu" />
导出
</el-button>
</div>
<el-table v-loading="loading" :data="data" style="width: 100%;" height="444px">
<el-table-column prop="description" label="行为描述" />
<el-table-column prop="requestIp" label="IP" />
<el-table-column :show-overflow-tooltip="true" prop="address" label="IP来源" />
<el-table-column prop="browser" label="浏览器" />
<el-table-column prop="time" label="请求耗时" align="center">
<template slot-scope="scope">
<el-tag v-if="scope.row.time <= 300">{{ scope.row.time }}ms</el-tag>
<el-tag v-else-if="scope.row.time <= 1000" type="warning">{{ scope.row.time }}ms</el-tag>
<el-tag v-else type="danger">{{ scope.row.time }}ms</el-tag>
</template>
</el-table-column>
<el-table-column align="right">
<template slot="header">
<div style="display:inline-block;float: right;cursor: pointer" @click="init">创建日期<i class="el-icon-refresh" style="margin-left: 40px" /></div>
</template>
<template slot-scope="scope">
<span>{{ scope.row.createTime | parseTime }}</span>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination
:total="total"
:current-page="page + 1"
style="margin-top: 8px;"
layout="total, prev, pager, next, sizes"
@size-change="sizeChange"
@current-change="pageChange"
/>
<OperateLog :is-center="isCenter" />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -131,7 +87,6 @@
</template> </template>
<script> <script>
import DateRangePicker from '@/components/DateRangePicker'
import myUpload from 'vue-image-crop-upload' import myUpload from 'vue-image-crop-upload'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import updatePass from './center/updatePass' import updatePass from './center/updatePass'
@ -144,9 +99,10 @@ import { editUser } from '@/api/system/user'
import Avatar from '@/assets/images/avatar.png' import Avatar from '@/assets/images/avatar.png'
import messageCenter from './messageCenter/index.vue' import messageCenter from './messageCenter/index.vue'
import processCenter from './processCenter/index.vue' import processCenter from './processCenter/index.vue'
import OperateLog from '@/views/system/log/operateLog/index'
export default { export default {
name: 'Center', name: 'Center',
components: { updatePass, updateEmail, myUpload, messageCenter, DateRangePicker, processCenter },
components: { updatePass, updateEmail, myUpload, messageCenter, processCenter, OperateLog },
mixins: [crud], mixins: [crud],
data() { data() {
// //
@ -184,7 +140,8 @@ export default {
gender: [ gender: [
{ required: true, message: '请选择性别', trigger: 'change' } { required: true, message: '请选择性别', trigger: 'change' }
] ]
}
},
isCenter: true
} }
}, },
computed: { computed: {
@ -202,7 +159,7 @@ export default {
} }
}, },
created() { created() {
this.form = { id: this.user.id, nickName: this.user.nickName, gender: this.user.gender, phone: this.user.phone }
this.form = { id: this.user.id, nickName: this.user.nickName, gender: this.user.gender, phone: this.user.phone, email: this.user.email }
store.dispatch('GetInfo').then(() => {}) store.dispatch('GetInfo').then(() => {})
if (this.$route.query) { if (this.$route.query) {
this.activeIndex = this.$route.query.activeIndex this.activeIndex = this.$route.query.activeIndex
@ -267,6 +224,9 @@ export default {
margin-top: 90px; margin-top: 90px;
z-index: 9; z-index: 9;
} }
.operateLog-main{
height: calc(100vh - 300px);
}
.elect-cont-left{ .elect-cont-left{
width: 368px !important; width: 368px !important;
padding: 0 !important; padding: 0 !important;
@ -368,7 +328,7 @@ export default {
// } // }
[data-theme=light] .tab-item { [data-theme=light] .tab-item {
// height: calc(100vh - 193px); // height: calc(100vh - 193px);
::v-deep .el-form{
::v-deep .el-form.tab-form{
margin-top: 40px; margin-top: 40px;
} }
.user-submit{ .user-submit{
@ -419,7 +379,7 @@ select:-webkit-autofill {
input { input {
background-color: transparent; background-color: transparent;
} }
.el-pagination{
margin: 20px 0 10px 0 !important
}
// .el-pagination{
// margin: 20px 0 10px 0 !important
// }
</style> </style>
Loading…
Cancel
Save