[add 委员会] 新增委员会信息、委员信息的列表页和详情页

This commit is contained in:
danshihao
2024-06-07 13:45:15 +08:00
parent eb5c3e77e0
commit 06c3505cc3
12 changed files with 781 additions and 4 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

+7 -3
View File
@@ -1,8 +1,8 @@
@font-face {
font-family: "anticon-jeecg"; /* Project id 2798517 */
src: url('iconfont.woff2?t=1705570227820') format('woff2'),
url('iconfont.woff?t=1705570227820') format('woff'),
url('iconfont.ttf?t=1705570227820') format('truetype');
src: url('iconfont.woff2?t=1717644876199') format('woff2'),
url('iconfont.woff?t=1717644876199') format('woff'),
url('iconfont.ttf?t=1717644876199') format('truetype');
}
.anticon-jeecg {
@@ -13,6 +13,10 @@
-moz-osx-font-smoothing: grayscale;
}
.anticonyinzhang:before {
content: "\e785";
}
.anticondraftgroup:before {
content: "\e65e";
}
File diff suppressed because one or more lines are too long
+7
View File
@@ -5,6 +5,13 @@
"css_prefix_text": "anticon",
"description": "",
"glyphs": [
{
"icon_id": "39837879",
"name": "cus_tc",
"font_class": "yinzhang",
"unicode": "e785",
"unicode_decimal": 59269
},
{
"icon_id": "3009589",
"name": "cus_draftgroup",
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,142 @@
<template>
<a-spin :spinning="loading">
<page-header-title :img-for-icon="IconImg" :is-level-one="false" :level-two-title="title"></page-header-title>
<a-card :bordered="false" class="description-box">
<a-descriptions bordered size="middle" class="description-item" :class="{'description-item-close': !section.isOpen}" v-for="section in sectionList" :key="section.id" :column="section.column">
<div slot="title" class="description-head">
<div class="description-head-title">{{ section.title }}</div>
<div class="description-head-btn" @click="section.isOpen = !section.isOpen">
<a-icon :type="section.isOpen ? 'up' : 'down'" style="margin-right: 4px;" /> {{ section.isOpen ? '收起' : '展开' }}
</div>
</div>
<a-descriptions-item v-for="label in section.labelList" :key="label.label"
:span="label.span ? label.span : 1"
:label="label.label">{{ model[label.valueField] }}</a-descriptions-item>
</a-descriptions>
</a-card>
</a-spin>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@assets/imgs/icon/icon_committee_detail.png'
import {getAction} from '@api/manage'
export default {
name: 'CommitteeInfoDetail',
components: {PageHeaderTitle},
data () {
return {
IconImg,
title: this.$route.meta.title,
loading: true,
model: {},
// 内容块列表(column列数 一行显示几个字段,配合labelList[].span占用几列使用)
sectionList: [
{
id: '1',
title: '委员会基础信息',
isOpen: true,
column: 2,
labelList: [
{ label: '委员会名称', valueField: 'committeeName', span: 2 },
{ label: '英文名称', valueField: 'englishName', span: 2 },
{ label: 'TC|SC号', valueField: 'committeeName', span: 2 },
{ label: '负责专业范围', valueField: 'responsibleForProfessionalScope', span: 2 },
{ label: '届号', valueField: 'whatIsTheCurrentSession' },
{ label: '第一届成立年代', valueField: 'establishmentYear' },
{ label: '第一届成立时间', valueField: 'firstEstablishmentDate' },
{ label: '第一届成立文号', valueField: 'establishmentNumber' },
{ label: '本届批准文号编号', valueField: 'approvalNumberForThisSession' },
{ label: '本届批准时间', valueField: 'approvalTimeForThisSession' },
{ label: '筹建单位', valueField: 'preparationUnit', span: 2 },
{ label: '业务指导单位', valueField: 'businessGuidanceUnit', span: 2 },
]
},
{
id: '2',
title: '秘书处信息信息',
isOpen: true,
column: 2,
labelList: [
{ label: '秘书处所在单位', valueField: 'theUnitToWhichOneBelongs' },
{ label: '秘书长', valueField: 'secretaryGeneral' },
{ label: '所在单位性质', valueField: 'unitNature', span: 2 },
{ label: '所在单位的社会统一信用代码(或组织机构代码)', valueField: 'orgCode', span: 2 },
{ label: '所在单位的省份', valueField: 'province' },
{ label: '所在单位的城市', valueField: 'city' },
{ label: '通讯地址', valueField: 'secretariatMailingAddress', span: 2 },
{ label: '办公电话', valueField: 'telephone' },
{ label: '传真', valueField: 'facsimile' },
{ label: '电子邮箱', valueField: 'email' },
{ label: '邮编', valueField: 'zipCode' },
{ label: '联系人', valueField: 'contacts', span: 2 },
{ label: '联系人办公电话', valueField: 'contactPhoneNumber' },
{ label: '联系人传真', valueField: 'contactFax' },
{ label: '联系人电子邮箱', valueField: 'contactEmail' },
{ label: '联系人手机', valueField: 'cellPhone' },
]
},
]
}
},
created () {
this.model.id = this.$route.query.id
this.loadData()
},
methods: {
loadData () {
this.loading = true
getAction('/PayCommitteeInfo/queryById', {id: this.model.id}).then(res => {
if (res.success) {
this.model = res.result
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
}
}
}
</script>
<style lang="less" scoped>
.description-box {
/deep/ .ant-descriptions-view {
border-radius: 0;
}
// 字段列的宽度
/deep/ .ant-descriptions-item-label {
width: 20%;
}
// 一块的头部样式
/deep/ .ant-descriptions-title {
margin-bottom: 0;
background-color: #E6F5F5;
padding: 12px 24px;
color: @primary-color;
}
.description-head {
display: flex;
justify-content: space-between;
align-items: center;
.description-head-btn {
font-weight: 500;
font-size: 14px;
cursor: pointer;
}
}
.description-item {
margin-bottom: 20px;
&.description-item-close /deep/ .ant-descriptions-view {
display: none;
}
}
}
</style>
@@ -0,0 +1,215 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入委员会名称" v-model="queryParam.committeeName" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="TC/SC号" v-model="queryParam.committeeNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery" v-has="'company:search'">查询</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1300}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 跳转详情 -->
<template slot="detail" slot-scope="text, record">
<j-ellipsis :value="text" :length="20" @click="handleDetail(record)" class="can-click"></j-ellipsis>
</template>
<!-- 跳转委员信息 -->
<template slot="memberNumber" slot-scope="text, record">
<j-ellipsis :value="text" :length="20" @click="handleMember(record)" class="can-click"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : '' }}</template>
<div class="table-text">{{ text || text === 0 ? text : '' }}</div>
</a-tooltip>
</template>
</a-table>
</div>
<!-- /table表格区域-->
</a-card>
</div>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_organizational_manage.png'
import {JeroListMixin} from '@/mixins/JeroListMixin'
export default {
name: 'CommitteeInfoList',
components: {PageHeaderTitle},
mixins: [JeroListMixin],
data () {
return {
isorter: null,
IconImg,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: 'TC号',
align: 'center',
width: 140,
dataIndex: 'committeeNumber',
scopedSlots: { customRender: 'text' }
},
{
title: '委员会名称',
align: 'center',
width: 140,
dataIndex: 'committeeName',
scopedSlots: { customRender: 'detail' }
},
{
title: '秘书处承担单位',
align: 'center',
width: 200,
dataIndex: 'theUnitToWhichOneBelongs',
scopedSlots: { customRender: 'text' }
},
{
title: '业务指导单位',
align: 'center',
width: 200,
dataIndex: 'businessGuidanceUnit',
scopedSlots: { customRender: 'text' }
},
{
title: '专业范围',
align: 'center',
width: 280,
dataIndex: 'responsibleForProfessionalScope',
scopedSlots: { customRender: 'text' }
},
{
title: '秘书长',
align: 'center',
width: 100,
dataIndex: 'secretaryGeneral',
scopedSlots: { customRender: 'text' }
},
{
title: '办公电话',
align: 'center',
width: 140,
dataIndex: 'telephone',
scopedSlots: { customRender: 'text' }
},
{
title: '电子邮箱',
align: 'center',
width: 200,
dataIndex: 'email',
scopedSlots: { customRender: 'text' }
},
{
title: '本届批准文号',
align: 'center',
width: 140,
dataIndex: 'approvalNumberForThisSession',
scopedSlots: { customRender: 'text' }
},
{
title: '委员数量',
align: 'center',
width: 100,
dataIndex: 'memberNumber',
scopedSlots: { customRender: 'memberNumber' }
},
],
url: {
list: '/PayCommitteeInfo/page'
}
}
},
methods: {
// 跳转详情
handleDetail (record) {
this.$router.push({
path: '/organizationalManage/committeeDetail',
query: {
id: record.id
}
})
},
// 跳转委员信息页面
handleMember (record) {
this.$router.push({
path: '/organizationalManage/committeeMemberInfo',
query: {
committeeNumber: record.committeeNumber
}
})
},
handleTableChange(pagination) {
//分页、排序、筛选变化时触发
this.ipagination = pagination
this.loadData()
}
}
}
</script>
<style lang="less" scoped>
.can-click {
cursor: pointer;
color: @primary-color;
}
.table-text {
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
@@ -0,0 +1,187 @@
<template>
<a-spin :spinning="loading">
<page-header-title :img-for-icon="IconImg" :is-level-one="false" :level-two-title="title"></page-header-title>
<a-card :bordered="false" class="description-box" ref="descriptionBox">
<a-descriptions bordered size="middle" class="description-item" :class="{'description-item-close': !section.isOpen}" v-for="section in sectionList" :key="section.id" :column="section.column">
<div slot="title" class="description-head">
<div class="description-head-title">{{ section.title }}</div>
<div class="description-head-btn" @click="section.isOpen = !section.isOpen">
<a-icon :type="section.isOpen ? 'up' : 'down'" style="margin-right: 4px;" /> {{ section.isOpen ? '收起' : '展开' }}
</div>
</div>
<a-descriptions-item v-for="(label, index) in section.labelList" :key="label.label || index"
:span="label.span ? label.span : 1"
:abc.prop="2"
:class="{'descriptions-item-none': label.type === 'none'}"
:label="label.label">
<template v-if="!label.type">{{ model[label.valueField] }}</template>
<template v-else-if="label.type === 'img'">
<img :src="getImgUrl(model[label.valueField])" alt="" class="descriptions-item-content-img">
</template>
</a-descriptions-item>
</a-descriptions>
</a-card>
</a-spin>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@assets/imgs/icon/icon_committee_detail.png'
import {getAction, getFileAccessHttpUrl} from '@api/manage'
export default {
name: 'CommitteeMemberInfoDetail',
components: {PageHeaderTitle},
data () {
return {
IconImg,
title: this.$route.meta.title,
loading: true,
model: {},
// 内容块列表(column列数 一行显示几个字段,配合labelList[].span占用几列使用)
sectionList: [
{
id: '1',
title: '基本信息',
isOpen: true,
column: 2,
labelList: [
{ label: '个人照片', valueField: 'photo', type: 'img' },
{ label: '姓名', valueField: 'name' },
{ label: '', valueField: '', type: 'none' }, // 为了个人照片跨三列空出来,配合样式display:none隐藏
{ label: '性别', valueField: 'gender' },
{ label: '', valueField: '', type: 'none' }, // 为了个人照片跨三列空出来,配合样式display:none隐藏
{ label: '出生年月', valueField: 'birthDate' },
{ label: '民族', valueField: 'nation' },
{ label: '政治面貌', valueField: 'politicalLandscape' },
{ label: '身份证', valueField: 'identificationNumber' },
{ label: '委员会职务', valueField: 'positionOfStandardsCommittee' },
{ label: '委员会编号', valueField: 'committeeNumber' },
{ label: '委员会聘书编号', valueField: 'appointmentLetterNumber' },
{ label: '聘书有效期', valueField: 'validityPeriodOfEmploymentLetter' },
{ label: '加入标委会时间', valueField: 'committeeParticipationTime' },
{ label: '行政职务', valueField: 'administrativePosition' },
{ label: '从事专业', valueField: 'engagedInProfession' },
{ label: '技术职称', valueField: 'technicalTitle' },
{ label: '职称级别', valueField: 'titleLevel' },
]
},
{
id: '2',
title: '工作单位信息',
isOpen: true,
column: 2,
labelList: [
{ label: '工作单位', valueField: 'workUnit' },
{ label: '单位统一社会信用代码(或组织机构代码)', valueField: 'orgCode' },
{ label: '单位性质', valueField: 'unitNature' },
{ label: '央企级别', valueField: 'centralEnterpriseLevel' },
{ label: '所属相关方', valueField: 'affiliatedParties' },
{ label: '所在省、直辖市、自治区、特区', valueField: 'provinceOfWorkUnit' },
{ label: '通信地址', valueField: 'communicationAddress' },
{ label: '邮政编码', valueField: 'zipCode' },
{ label: '联系电话', valueField: 'contactPhoneNumber' },
{ label: '手机', valueField: 'mobilePhone' },
{ label: '传真', valueField: 'facsimile' },
{ label: '电子邮箱', valueField: 'email' },
]
},
{
id: '3',
title: '毕业院校信息',
isOpen: true,
column: 2,
labelList: [
{label: '毕业院校', valueField: 'graduationInstitution'},
{label: '所学专业', valueField: 'majorStudied'},
{label: '学历', valueField: 'educationalBackground'},
{label: '学位', valueField: 'degree'},
{label: '专业技术特长', valueField: 'professionalTechnicalExpertise'},
{label: '会何种外语及熟练程度', valueField: 'foreignLanguage'},
{label: '其他语言及熟练程度', valueField: 'foreignLanguageProficiencyLevel'},
{label: '两院院士', valueField: 'isAcademician'},
]
}
]
}
},
created () {
this.model.id = this.$route.query.id
this.loadData()
},
mounted() {
// 处理图片要跨行,组件没有提供跨行的属性
const imgEl = this.$refs.descriptionBox.$el.querySelector('.descriptions-item-content-img')
imgEl.parentNode.setAttribute('rowspan', 3)
imgEl.parentNode.previousElementSibling.setAttribute('rowspan', 3)
},
methods: {
loadData () {
this.loading = true
getAction('/PayCommitteeMemberInfo/queryById', {id: this.model.id}).then(res => {
if (res.success) {
this.model = res.result
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
// 获取图片url
getImgUrl (id) {
return getFileAccessHttpUrl(id)
}
}
}
</script>
<style lang="less" scoped>
.description-box {
/deep/ .ant-descriptions-view {
border-radius: 0;
}
// 字段列的宽度
/deep/ .ant-descriptions-item-label {
width: 20%;
}
// 一块的头部样式
/deep/ .ant-descriptions-title {
margin-bottom: 0;
background-color: #E6F5F5;
padding: 12px 24px;
color: @primary-color;
}
.description-head {
display: flex;
justify-content: space-between;
align-items: center;
.description-head-btn {
font-weight: 500;
font-size: 14px;
cursor: pointer;
}
}
.description-item {
margin-bottom: 20px;
&.description-item-close /deep/ .ant-descriptions-view {
display: none;
}
}
// 没有内容的label就不显示
/deep/ .ant-descriptions-item-no-label {
display: none;
// label对应的内容单元格也不显示
& + .ant-descriptions-item-content {
display: none;
}
}
.descriptions-item-content-img {
max-height: 100px;
}
}
</style>
@@ -0,0 +1,222 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="TC/SC号" v-model="queryParam.committeeNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-select v-model="queryParam.positionOfStandardsCommittee"
show-search
allowClear
placeholder="请选择委员会职务"
:filter-option="filterOption">
<a-select-option v-for="item in committeePositionList" :key="item" :value="item">{{ item }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入聘书编号" v-model="queryParam.appointmentLetterNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入工作单位" v-model="queryParam.workUnit" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入委员名称" v-model="queryParam.name" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery" v-has="'company:search'">查询</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1300}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 跳转详情 -->
<template slot="detail" slot-scope="text, record">
<j-ellipsis :value="text" :length="20" @click="handleDetail(record)" class="can-click"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : '' }}</template>
<div class="table-text">{{ text || text === 0 ? text : '' }}</div>
</a-tooltip>
</template>
</a-table>
</div>
<!-- /table表格区域-->
</a-card>
</div>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_organizational_manage.png'
import {JeroListMixin} from '@/mixins/JeroListMixin'
export default {
name: 'CommitteeMemberInfoList',
components: {PageHeaderTitle},
mixins: [JeroListMixin],
data () {
return {
disableMixinCreated: true,
isorter: null,
IconImg,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
// 委员会职务下拉
committeePositionList: [
'主任委员',
'副主任委员',
'副主任委员兼秘书长',
'秘书长',
'副秘书长',
'委员',
'顾问',
],
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: 'TC号',
align: 'center',
width: 140,
dataIndex: 'committeeNumber',
scopedSlots: { customRender: 'detail' }
},
{
title: '委员姓名',
align: 'center',
width: 140,
dataIndex: 'name',
scopedSlots: { customRender: 'text' }
},
{
title: '性别',
align: 'center',
width: 140,
dataIndex: 'gender',
scopedSlots: { customRender: 'text' }
},
{
title: '委员会职务',
align: 'center',
width: 140,
dataIndex: 'positionOfStandardsCommittee',
scopedSlots: { customRender: 'text' }
},
{
title: '工作单位',
align: 'center',
width: 140,
dataIndex: 'workUnit',
scopedSlots: { customRender: 'text' }
},
{
title: '单位职务',
align: 'center',
width: 140,
dataIndex: 'administrativePosition',
scopedSlots: { customRender: 'text' }
},
{
title: '聘书编号',
align: 'center',
width: 140,
dataIndex: 'appointmentLetterNumber',
scopedSlots: { customRender: 'text' }
},
],
url: {
list: '/PayCommitteeMemberInfo/page'
}
}
},
created() {
this.$set(this.queryParam, 'committeeNumber', this.$route.query.committeeNumber)
this.searchQuery()
},
methods: {
// 跳转详情
handleDetail (record) {
this.$router.push({
path: '/organizationalManage/committeeMemberDetail',
query: {
id: record.id
}
})
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
},
handleTableChange(pagination) {
//分页、排序、筛选变化时触发
this.ipagination = pagination
this.loadData()
}
}
}
</script>
<style lang="less" scoped>
.can-click {
cursor: pointer;
color: @primary-color;
}
.table-text {
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
</style>