Merge remote-tracking branch 'origin/thirdStage' into thirdStage

This commit is contained in:
赵霄
2023-12-27 15:22:00 +08:00
45 changed files with 543 additions and 23 deletions
+15 -1
View File
@@ -28,6 +28,16 @@ const getOverseasStandardList = (params) => postAction('/laws/standard/overseas/
// 企标的高级搜索,查询列表数据
const getEnterStandardList = (params) => postAction('/laws/standard/enterprise/getCommonPageNoPermissions', params)
// 快捷入口-显示模块列表
const getQuickEntryModuleList = (params) => getAction('/home/lawsHomeQuickAccess/queryMenuList', params)
// 快捷入口可选列表
const getQuickEntryList = (params) => getAction('/home/lawsHomeQuickAccess/queryPermissionMenuList', params)
// 快捷入口-保存显示模块列表
const saveQuickEntryModuleList = (params) => postAction('/home/lawsHomeQuickAccess/saveMenu', params)
// 待办任务-列表
const getTodoList = (params) => getAction('/home/lawsHomeBacklogTask/queryBacklogTaskList', params)
export {
getSearchHistoryData,
deleteSearchHistoryById,
@@ -41,5 +51,9 @@ export {
getEnterStandardQuery,
getDomesticStandardList,
getOverseasStandardList,
getEnterStandardList
getEnterStandardList,
getQuickEntryModuleList,
getQuickEntryList,
saveQuickEntryModuleList,
getTodoList
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+18
View File
@@ -26,5 +26,23 @@ module.exports = {
releaseDate: '发布日期',
materialDate: '实施日期',
standardStatus: '标准状态'
},
// 快捷入口
quickEnter: {
quickEnter: '快捷入口',
menuManage: '菜单管理',
custom: '自定义',
optionModules: '可选模块',
personalDisplayModule: '个人展示模块',
itemUnit: '项',
itemsUnit: '项',
listEmpty: '列表为空',
pleaseEnterSearchContent: '请输入搜索内容',
maxSelectedNine: '最多选择9个模块'
},
// 待办任务
todoTask: {
todoTask: '待办任务',
more: '更多'
}
}
+18
View File
@@ -26,5 +26,23 @@ module.exports = {
releaseDate: '发布日期',
materialDate: '实施日期',
standardStatus: '标准状态'
},
// 快捷入口
quickEnter: {
quickEnter: '快捷入口',
menuManage: '菜单管理',
custom: '自定义',
optionModules: '可选模块',
personalDisplayModule: '个人展示模块',
itemUnit: '项',
itemsUnit: '项',
listEmpty: '列表为空',
pleaseEnterSearchContent: '请输入搜索内容',
maxSelectedNine: '最多选择9个模块'
},
// 待办任务
todoTask: {
todoTask: '待办任务',
more: '更多'
}
}
@@ -75,11 +75,17 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
font-weight: 400;
color: @primary-color;
text-align: center;
background-image: url('../../../assets/image/dashboardLinkBack.png');
cursor: pointer;
}
@media screen and (max-width: 1366px) {
.content-div {
height: 40px;
line-height: 40px;
}
}
</style>
@@ -0,0 +1,145 @@
<template>
<j-modal
:title="$t('dashboard.quickEnter.custom')"
:visible="visible"
:width="1000"
switchFullscreen
@ok="handleOk"
:confirmLoading="loading"
@cancel="close"
:cancelText="$t('close')">
<a-spin :spinning="loading">
<a-transfer
class="transfer"
:data-source="dataSource"
:titles="titles"
:show-search="true"
:filter-option="filterOption"
:target-keys="targetKeys"
:row-key="item => item.id"
:render="item => item.name"
:listStyle="listStyle"
:locale="locale"
@change="handleChange"
/>
</a-spin>
</j-modal>
</template>
<script>
import { getQuickEntryList, saveQuickEntryModuleList } from '@api/dashboard'
export default {
name: 'MenuManageModal',
data () {
return {
loading: false,
// 穿梭框两侧样式
listStyle: {
textAlign: 'left',
width: '40%',
height: '100%'
},
visible: false,
// 可选数据和个人展示模块
titles: [this.$t('dashboard.quickEnter.optionModules'), this.$t('dashboard.quickEnter.personalDisplayModule')],
// 可选数据
dataSource: [],
// 已选数据id
targetKeys: [],
// 多语言
locale: {
itemUnit: this.$t('dashboard.quickEnter.itemUnit'),
itemsUnit: this.$t('dashboard.quickEnter.itemsUnit'),
notFoundContent: this.$t('dashboard.quickEnter.listEmpty'),
searchPlaceholder: this.$t('dashboard.quickEnter.pleaseEnterSearchContent')
}
}
},
methods: {
/**
* 打开弹框
* @param ids - 已经选择的ids
*/
show (ids) {
this.visible = true
// 清空之前的数据,然后重新请求
this.dataSource = []
this.targetKeys = ids || []
this.getMenuList()
},
// 获取菜单列表
getMenuList () {
this.loading = true
getQuickEntryList().then(res => {
if (res.success) {
// 穿梭框需要这个格式否则会报错
this.dataSource = res.result || []
} else {
this.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.loading = false
}, 1000)
})
},
// 确定
handleOk () {
// 最多选择9个模块
if (this.targetKeys.length > 9) {
this.$message.warning(this.$t('dashboard.quickEnter.maxSelectedNine'))
return
}
this.loading = true
saveQuickEntryModuleList({
permissionIds: this.targetKeys.join(',')
}).then(res => {
if (res.success) {
this.$message.success(res.message)
this.$emit('ok')
this.close()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
// 关闭
close () {
this.visible = false
},
// 穿梭框改变
handleChange (targetKeys, direction, moveKeys) {
console.log(targetKeys, direction, moveKeys)
this.targetKeys = targetKeys
},
// 搜索过滤
filterOption (inputValue, option) {
return option.description.indexOf(inputValue) > -1
}
}
}
</script>
<style lang="less" scoped>
.transfer {
height: 50vh;
text-align: center;
/deep/ .ant-transfer-operation button {
margin: 20px 0;
border-radius: 50%;
}
/deep/ .ant-transfer-list-header-selected {
display: inline-flex;
flex-direction: row-reverse;
justify-content: space-between;
width: 94%;
.ant-transfer-list-header-title {
position: static;
}
}
}
</style>
+130 -18
View File
@@ -2,38 +2,124 @@
<a-card :bordered="false">
<a-spin :spinning="loading">
<div class="top-wrapper">
<p class="left-p"><i class="iconfont icon-rukou left-icon"></i>快捷入口</p>
<p class="right-p" @click="menuManage"><i class="iconfont icon-settings"></i>菜单管理</p>
<p class="left-p"><i class="iconfont icon-rukou left-icon"></i>{{ this.$t('dashboard.quickEnter.quickEnter') }}</p>
<p class="right-p" @click="menuManage"><i class="iconfont icon-settings"></i>{{ this.$t('dashboard.quickEnter.menuManage') }}</p>
</div>
<div class="content-wrapper">
<div class="content-div" v-for="item in dataSource" :key="item.id">
<i class="iconfont" :class="'icon-' + item.iconName"></i>
<p>{{ item.name }}</p>
<div class="content-div" v-for="item in dataSource" :key="item.id" @click="handleTo(item.url)">
<img class="icon-img" :src="item.src" :alt="item.name" v-if="item.src">
<!--<i class="iconfont" :class="'icon-' + 'shengchanliuchengguanli'"></i>-->
<a-tooltip placement="top">
<template slot="title">{{item.name}}</template>
<p>{{ item.name }}</p>
</a-tooltip>
</div>
<div class="plus-div">
<a-icon type="plus" />
<div class="plus-div" @click="menuManage" v-if="dataSource.length < 9">
<a-icon type="plus" class="text-primary-color" />
</div>
</div>
</a-spin>
<!-- 菜单管理 -->
<menu-manage-modal ref="menuManageModal" @ok="loadData"/>
</a-card>
</template>
<script>
import MenuManageModal from '@views/dashboard/modules/MenuManageModal'
import { getQuickEntryModuleList } from '@api/dashboard'
// 菜单名 --> 图标名
const map = [
{ name: '专项项目库', srcName: 'project-library' },
{ name: '企业标准', srcName: 'enterprise-standard' },
{ name: '企标复审计划', srcName: 'standard-review-plan' },
{ name: '企标宣贯', srcName: 'standard-promotion' },
{ name: '企标稽查', srcName: 'standard-audit' },
{ name: '企标级别映射', srcName: 'standard-level-mapping' },
{ name: '企标计划', srcName: 'standard-plan' },
{ name: '企标评审会记录', srcName: 'standard-review-minutes' },
{ name: '内部工作组', srcName: 'internal-working-group' },
{ name: '动态消息', srcName: 'dynamic-message' },
{ name: '友情链接管理', srcName: 'friend-link-management' },
{ name: '国内标准', srcName: 'domestic-standards' },
{ name: '已发分享', srcName: 'shared-items' },
{ name: '已收分享', srcName: 'received-shares' },
{ name: '征求意见', srcName: 'soliciting-opinions' },
{ name: '我的收藏', srcName: 'my-favorites' },
{ name: '我的消息', srcName: 'my-messages' },
{ name: '数据字典', srcName: 'data-dictionary' },
{ name: '文档拆分', srcName: 'document-splitting' },
{ name: '新建流程', srcName: 'new-process' },
{ name: '新旧拆分单对比', srcName: 'new-old-split-comparison' },
{ name: '未符合项', srcName: 'non-compliance-items' },
{ name: '标准化活动', srcName: 'standardization-activities' },
{ name: '标准预警', srcName: 'standard-warning' },
{ name: '标签管理', srcName: 'tag-management' },
{ name: '流程中心', srcName: 'process-center' },
{ name: '流程配置', srcName: 'process-configuration' },
{ name: '浏览记录', srcName: 'browsing-history' },
{ name: '海外标准', srcName: 'overseas-standards' },
{ name: '用户中心', srcName: 'user-center' },
{ name: '联络人管理', srcName: 'contact-management' },
{ name: '自定义对比', srcName: 'custom-comparison' },
{ name: '角色中心', srcName: 'role-center' },
{ name: '资料中心', srcName: 'resource-center' },
{ name: '车型项目库', srcName: 'vehicle-project-library' },
{ name: '部门管理', srcName: 'department-management' },
{ name: '问答库', srcName: 'questions-answers-library' }
]
export default {
name: 'QuickEnterCard',
components: { MenuManageModal },
data () {
return {
loading: false,
dataSource: [
{ iconName: 'shengchanliuchengguanli', name: '新建流程' },
{ iconName: 'a-moxingkuaisuchaifen1', name: '标准拆分' },
{ iconName: 'shoucang', name: '我的收藏' },
{ iconName: 'a-fagui1', name: '国内法规' },
{ iconName: 'a-moxingkuaisuchaifen1', name: '征求意见' },
{ iconName: 'jiaoseguanli', name: '角色管理' },
{ iconName: 'wenda1', name: '我的问答' }
// { iconName: 'shengchanliuchengguanli', name: '新建流程' },
// { iconName: 'a-moxingkuaisuchaifen1', name: '标准拆分' },
// { iconName: 'shoucang', name: '我的收藏' },
// { iconName: 'a-fagui1', name: '国内法规' },
// { iconName: 'a-moxingkuaisuchaifen1', name: '征求意见' },
// { iconName: 'jiaoseguanli', name: '角色管理' },
// { iconName: 'wenda1', name: '我的问答' }
]
}
},
created () {
this.loadData()
},
methods: {
// 获取快捷入口
loadData () {
this.loading = true
getQuickEntryModuleList().then(res => {
if (res.success) {
const data = res.result || []
this.dataSource = data.map(item => {
// 如果能找到菜单名,就用对应图标
const findMap = map.find(m => m.name === item.name)
if (findMap) {
item.src = require(`@/assets/image/dashboard/${findMap.srcName}.png`)
}
return item
})
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
// 点击快捷入口,跳转对应页面
handleTo (path) {
this.$router.push({ path })
},
// 菜单管理
menuManage () {
const ids = this.dataSource.map(item => item.id)
this.$refs.menuManageModal.show(ids)
}
}
}
</script>
@@ -45,13 +131,14 @@ export default {
//flex-wrap: wrap;
//justify-content: space-between;
display: grid;
grid-template-columns: repeat(auto-fill, 100px);
grid-template-columns: repeat(auto-fill, calc((100% - 20px) / 3));
grid-gap: 10px;
grid-auto-flow: row;
margin-top: 10px;
& > div {
width: 100px;
height: 100px;
//width: 100px;
//height: 100px;
min-height: 50px;
border-radius: 8px 8px 8px 8px;
display: flex;
flex-direction: column;
@@ -59,21 +146,33 @@ export default {
align-items: center;
}
.content-div {
// (总高度 - 内边距 - 标题 - 上下边距) / 3
height: calc((306px - 48px - 31px - 20px) / 3);
cursor: pointer;
background: rgba(213,44,38,0.08);
.icon-img {
width: 27px;
}
.iconfont {
font-size: 27px;
color: @primary-color;
}
p {
width: 90%;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 0;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-family: PingFang SC, PingFang SC, sans-serif;
font-weight: 400;
color: #000000;
line-height: 28px;
}
}
.plus-div {
cursor: pointer;
border: 1px dashed @primary-color;
box-sizing: border-box;
.anticon {
@@ -81,4 +180,17 @@ export default {
}
}
}
.text-primary-color {
color: @primary-color
}
@media screen and (max-width: 1366px) {
.content-wrapper {
.content-div {
p {
font-size: 14px;
}
}
}
}
</style>
@@ -20,10 +20,13 @@
<div class="tab-div" :class="warningTab === 'newCarType' ? 'curr-tab' : ''" @click="warningTabChange('newCarType')">新车型实施预警</div>
<div class="tab-div" :class="warningTab === 'carInProduction' ? 'curr-tab' : ''" @click="warningTabChange('carInProduction')">在产车实施预警</div>
</div>
<!--这里的scroll.y必须有后面用媒体查询进行样式覆盖-->
<a-table
ref="table"
size="middle"
rowKey="id"
class="table"
:scroll="{ x: '100%', y: '40vh' }"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
@@ -234,4 +237,14 @@ export default {
//transition-duration: 0.1s;
//transition-timing-function: ease-in;
}
// 通过媒体查询覆盖表格高度
.table /deep/ .ant-table-scroll .ant-table-body {
max-height: calc(70vh - 250px) !important;
}
@media screen and (max-width: 1366px) {
.table /deep/ .ant-table-scroll .ant-table-body {
max-height: calc(70vh - 280px) !important;
}
}
</style>
+197 -3
View File
@@ -1,15 +1,209 @@
<template>
<a-card :bordered="false">
待办任务
<a-spin :spinning="loading">
<div class="top-wrapper">
<p class="left-p"><i class="iconfont icon-rukou left-icon"></i>{{ $t('dashboard.todoTask.todoTask') }}</p>
<p class="right-p" @click="handleMore">{{ $t('dashboard.todoTask.more') }}<i class="iconfont icon-right"></i></p>
</div>
<div class="content-wrapper">
<div class="content-item" v-for="item in dataSource" :key="item.id" @click="handleToDetail(item)">
<a-tooltip placement="top">
<template slot="title">{{item.prcName}}</template>
<p>{{ item.prcName }}</p>
</a-tooltip>
</div>
</div>
</a-spin>
</a-card>
</template>
<script>
import { getTodoList } from '@api/dashboard'
export default {
name: 'ToDoTaskCard'
name: 'ToDoTaskCard',
data () {
return {
loading: false,
// 数据
dataSource: []
}
},
created () {
this.getTodoTask()
},
methods: {
// 获取待办任务
getTodoTask () {
this.loading = true
getTodoList().then(res => {
if (res.success) {
this.dataSource = res.result.records || []
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
// 跳转待办详情
handleToDetail (record) {
let path = ''
// 跳转到对应流程页面
switch (record.prcType + '') {
// 标准法规入库/变更流程
case '1':
path = '/workCenter/StandardEntryOrChangeProcess'
break
// 标准征求意见流程
case '2':
path = '/workCenter/StandardConsultationProcess'
break
// 项目合规评估流程
case '3':
path = '/workCenter/ProjectComplianceEvaluationProcess'
break
// 未符合项跟踪流程
case '4':
path = '/workCenter/NoMatchTrackingProcess'
break
// 法规采购流程
case '6':
path = '/workCenter/StandardProcurementProcess'
break
// 企标立项、变更计划
case '7':
path = '/workCenter/enterpriseStandardInitChange/planApprovalChangeFlow'
break
// 年度制修订计划(各部门主动上报)
case '8':
path = '/workCenter/annualRevisionPlanActivelyReport/revisionPlanActivelyReportFlow'
break
// 年度制修订计划(标准化发起)
case '9':
path = '/workCenter/annualRevisionPlanStandardizationInit/revisionPlanStandardizationInitFlow'
break
// 企标制修订流程
case '10':
path = '/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow'
break
// 企标更改流程
case '11':
path = '/workCenter/enterpriseStandardChange/enterpriseStandardChangeFlow'
break
// 企标复审流程
case '12':
path = '/workCenter/enterpriseStandardRecheck/enterpriseStandardRecheckFlow'
break
// 企标废止流程
case '13':
path = '/workCenter/enterpriseStandardAnnul/enterpriseStandardAnnulFlow'
break
// 企标封存流程
case '14':
path = '/workCenter/enterpriseStandardSealSave/enterpriseStandardSealSaveFlow'
break
// 已封存企标启用流程
case '15':
path = '/workCenter/enterpriseStandardStartUse/enterpriseStandardStartUseFlow'
break
// 企标稽查计划
case '16':
path = '/workCenter/EnterpriseStandardInspectionPlan'
break
// 企标稽查流程
case '17':
path = '/workCenter/EnterpriseStandardInspectionProcess'
break
// 稽查延期申请流程
case '18':
path = '/workCenter/InspectionExtensionRequestProcess'
break
// 企标稽查整改
case '19':
path = '/workCenter/EnterpriseStandardInspectionRectification'
break
// 权限申请流程
case '20':
path = '/workCenter/PermissionApplicationProcess'
break
// 标准宣贯流程
case '21':
path = '/workCenter/StandardPromotionProcess'
break
// 会后管理流程
case '22':
path = '/workCenter/PostMeetingManageProcess'
break
// 如果都没找到不用跳转
default:
return
}
this.$router.push({
path: path,
query: {
projectId: record.projectId,
taskName: record.taskName,
taskId: record.taskId, // 任务id
processInstanceId: record.processInstanceId, // 流程实例id,必须传人员信息右侧表格查询需要用
nodeId: record.nodeId // 节点的id
}
})
},
// 更多:跳转待办
handleMore () {
this.$router.push({
path: '/workCenter/processCenter/processCenter'
})
}
}
}
</script>
<style scoped>
<style lang="less" scoped>
.content-wrapper {
margin-top: 10px;
height: calc(100vh - 346px - 200px);
overflow-y: auto;
.content-item {
cursor: pointer;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: PingFang SC, PingFang SC, sans-serif;
font-weight: 400;
color: #1D2129;
position: relative;
font-size: 16px;
line-height: 48px;
height: 48px;
border-bottom: 1px solid #E5E6EB;
text-indent: 18px;
}
.content-item::before {
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
display: block;
content: '';
background-color: #86909C;
width: 6px;
height: 6px;
border-radius: 50%;
}
}
@media screen and (max-width: 1366px) {
.content-wrapper {
height: calc(100vh - 306px - 200px);
.content-item {
line-height: 40px;
height: 40px;
font-size: 14px;
}
}
}
</style>