Merge branch 'master' into 标准拆分译文变更

# Conflicts:
#	src/common/lang/en-us.js
#	src/common/lang/zh-cn.js
#	src/views/documentTool/documentSplit/modules/SplitAddForm.vue
#	src/views/workCenter/standardInterpretationProcess/modules/InterpretationClauseTable.vue
This commit is contained in:
danshihao
2024-08-14 17:15:31 +08:00
152 changed files with 3192 additions and 1176 deletions
+53 -27
View File
@@ -3,26 +3,16 @@
<!-- <first-stage-card></first-stage-card>-->
<!-- </div>-->
<div class="all-wrapper">
<a-row :gutter="20">
<a-col :span="24" class="mb-20">
<!-- 检索 -->
<retrieval-card></retrieval-card>
</a-col>
<a-col :span="24" class="mb-20">
<!-- 快捷入口 -->
<quick-enter-card></quick-enter-card>
</a-col>
<a-col :span="10" class="mb-20">
<!-- 待办任务 -->
<to-do-task-card class="mb-20"></to-do-task-card>
<!-- 友情链接 -->
<friend-link-card></friend-link-card>
</a-col>
<a-col :span="14" class="mb-20">
<!-- 预警 -->
<search-and-warning-card></search-and-warning-card>
</a-col>
</a-row>
<!-- 检索 -->
<retrieval-card class="home-search"></retrieval-card>
<!-- 快捷入口 -->
<quick-enter-card class="home-quick-entrance"></quick-enter-card>
<!-- 待办任务 -->
<to-do-task-card class="home-todo"></to-do-task-card>
<!-- 友情链接 -->
<friend-link-card class="home-link"></friend-link-card>
<!-- 列表 -->
<search-and-warning-card class="home-table"></search-and-warning-card>
</div>
</template>
@@ -46,14 +36,45 @@ export default {
@import '~@assets/less/common.less';
.all-wrapper {
padding: 20px 8px 0;
}
.flex-item {
margin: 10px;
}
.mb-20 {
margin-bottom: 20px;
padding: 8px 8px 0;
display: grid;
width: 100%;
height: calc(100vh - 60px - 8px - 20px);
grid-gap: 20px;
grid-template-columns: 0.4fr 0.6fr;
grid-template-rows: 56px 180px minmax(200px, auto) 180px;
grid-template-areas: 'Search Search'
'QuickEntrance QuickEntrance'
'Todo Table'
'Link Table';
.home-search,
.home-quick-entrance,
.home-todo,
.home-link,
.home-table{
height: 100%;
overflow: hidden;
border-radius: 8px;
}
.home-search {
grid-area: Search;
overflow: visible;
}
.home-quick-entrance {
grid-area: QuickEntrance;
}
.home-todo {
grid-area: Todo;
}
.home-link {
grid-area: Link;
}
.home-table {
grid-area: Table;
}
}
/deep/ .top-wrapper {
display: flex;
align-items: center;
@@ -89,6 +110,11 @@ export default {
}
// 1366屏幕
@media screen and (max-width: 1366px) {
.all-wrapper {
height: calc(100vh - 60px - 8px - 20px + 200px);
// 友情链接部分减少了12像素
grid-template-rows: 56px 180px minmax(200px, auto) 168px;
}
/deep/ .top-wrapper {
.left-p {
font-size: 16px;
+32 -8
View File
@@ -1,5 +1,5 @@
<template>
<a-card :bordered="false">
<div class="friend-link-wrapper">
<a-spin :spinning="loading">
<div class="top-wrapper">
<span class="left-p"><i class="iconfont icon-link left-icon"></i>{{$t('dashboard.friendLink.friendLink')}}</span>
@@ -7,15 +7,15 @@
</div>
<div class="content-wrapper">
<div class="content-div" v-for="item in dataSource" :key="item.id" @click="clickLink(item)">
<img class="icon-img" :src="getImg(item.logoUrl)" :alt="item.name">
<a-tooltip placement="top">
<img class="icon-img" :src="getImg(item.logoUrl)" :alt="item.name">
<template slot="title">{{ item.name }}</template>
<p>{{ item.name }}</p>
</a-tooltip>
</div>
</div>
</a-spin>
</a-card>
</div>
</template>
<script>
@@ -69,13 +69,19 @@ export default {
</script>
<style scoped lang="less">
.friend-link-wrapper {
padding: 24px;
background-color: white;
}
@itemSize: 64px;
.content-wrapper {
display: grid;
grid-template-columns: repeat(6, 1fr);
// 总宽度 - 子内容的宽度 = 剩余宽度 / 5 = 就是每个的右间距,最后一个元素不需要右间距
grid-gap: calc((100% - (6 * @itemSize)) / 5);
margin-top: 12px;
}
.content-div {
.content-div > span {
cursor: pointer;
text-align: center;
display: flex;
@@ -86,12 +92,12 @@ export default {
.icon-img {
border-radius: 8px;
width: 64px;
height: 64px;
width: @itemSize;
height: @itemSize;
margin-bottom: 2px;
}
p {
width: 64px;
width: @itemSize;
height: 28px;
line-height: 28px;
margin: 0;
@@ -102,4 +108,22 @@ export default {
white-space: nowrap;
}
}
// 1366屏幕
@media screen and (max-width: 1366px) {
@itemSize: 52px;
.content-wrapper {
grid-gap: calc((100% - (6 * @itemSize)) / 5);
}
.content-div > span {
.icon-img {
width: @itemSize;
height: @itemSize;
}
p {
width: @itemSize;
}
}
}
</style>
+12 -4
View File
@@ -1,5 +1,5 @@
<template>
<a-card :bordered="false">
<div class="quick-enter-wrapper">
<a-spin :spinning="loading">
<div class="top-wrapper">
<p class="left-p"><i class="iconfont icon-rukou left-icon"></i>{{ this.$t('dashboard.quickEnter.quickEnter') }}</p>
@@ -24,7 +24,7 @@
</a-spin>
<!-- 菜单管理 -->
<menu-manage-modal ref="menuManageModal" @ok="loadData"/>
</a-card>
</div>
</template>
<script>
@@ -89,14 +89,22 @@ export default {
</script>
<style scoped lang="less">
.quick-enter-wrapper {
background-color: white;
padding: 24px;
box-sizing: border-box;
}
.content-wrapper {
overflow: auto;
@itemGap: 20px;
display: grid;
margin-top: 12px;
grid-template-columns: repeat(auto-fill, calc(100% / 14));
grid-template-columns: repeat(14, minmax(72px, 1fr));
// 总宽度 - 子内容的宽度 = 剩余宽度 / 5 = 就是每个的右间距,最后一个元素不需要右间距
grid-column-gap: calc((100% - (14 * 72px)) / 13);
& > .content-div > span,
& > .plus-div > span {
padding: 9px 16px 0;
display: flex;
flex-direction: column;
justify-content: center;
+17 -20
View File
@@ -1,19 +1,19 @@
<template>
<!-- 搜索区域 -->
<div class="search-wrapper">
<a-select class="resource-type-select" v-model="resourceType">
<a-select class="resource-type-select" v-model="resourceType" size="large">
<a-select-option value="all">{{ $t('dashboard.generalSearch.all')}}</a-select-option>
<a-select-option v-for="item in resourceTypeOptions" :key="item.value" :value="item.value" :title="item.title">
{{ item.title }}
<a-select-option v-for="item in resourceTypeOptions" :key="item.value" :value="item.value" :title="isChinese() ? item.title : item.enText">
{{ isChinese() ? item.title : item.enText }}
</a-select-option>
</a-select>
<a-input class="search-input" v-model="searchValue" :placeholder="$t('pleaseEnter')" @pressEnter="searchInputEnter">
<a-input class="search-input" size="large" v-model="searchValue" :placeholder="$t('pleaseEnter')" @pressEnter="searchInputEnter">
<a-icon slot="prefix" type="search" style="color: #0064FA;" />
</a-input>
<div class="btn-box">
<a-button type="primary" icon="search" @click="toSearchWindow('title')">{{ $t('dashboard.retrieval.titleSearch') }}</a-button>
<a-button type="primary" icon="search" @click="toSearchWindow('fullText')">{{ $t('dashboard.retrieval.fullSearch') }}</a-button>
<a-button type="primary" class="btn-ghost" ghost @click="toAdvancedSearch"><img :src="require('@/assets/image/icon/super-search.png')" alt='' class="btn-icon">{{ $t('dashboard.retrieval.advancedSearch') }}</a-button>
<a-button type="primary" size="large" icon="search" @click="toSearchWindow('title')">{{ $t('dashboard.retrieval.titleSearch') }}</a-button>
<a-button type="primary" size="large" icon="search" @click="toSearchWindow('fullText')">{{ $t('dashboard.retrieval.fullSearch') }}</a-button>
<a-button type="primary" size="large" class="btn-ghost" ghost @click="toAdvancedSearch"><img :src="require('@/assets/image/icon/super-search.png')" alt='' class="btn-icon">{{ $t('dashboard.retrieval.advancedSearch') }}</a-button>
</div>
</div>
</template>
@@ -80,21 +80,21 @@ export default {
<style lang="less" scoped>
@height: 56px;
.search-wrapper {
width: 80%;
margin: 0 auto;
width: 80%;
display: grid;
grid-template-columns: 102px 1fr auto;
grid-template-columns: 120px 1fr auto;
grid-gap: 10px;
& > .resource-type-select {
flex: 0 0 102px;
height: 100%;
color: @primary-color;
/deep/.ant-select-arrow svg {
fill: @primary-color;
}
/deep/.ant-select-selection--single {
height: @height;
height: 100%;
border-color: @primary-color;
}
/deep/.ant-select-arrow {
@@ -108,7 +108,8 @@ export default {
}
& > .search-input {
flex: auto;
height: 100%;
font-size: 16px;
//margin-left: 10px;
/deep/.ant-input-prefix {
left: 24px;
@@ -116,14 +117,14 @@ export default {
/deep/.ant-input {
padding-left: 40px;
height: @height;
height: 100%;
border-color: @primary-color;
}
}
.btn-box .ant-btn {
flex: 138px;
height: @height;
min-width: 138px;
height: 100%;
&:not(:first-child) {
margin-left: 10px;
@@ -133,10 +134,6 @@ export default {
.btn-icon {
margin-right: 8px;
vertical-align: top;
}
@media screen and (max-width: 1366px) {
@height: 42px;
vertical-align: sub;
}
</style>
@@ -12,10 +12,11 @@
size="middle"
:rowKey="(_, index) => index"
class="table"
:scroll="{ x: '100%', y: '40vh' }"
:scroll="{ x: '100%', y: 'calc(100vh - 550px)' }"
:columns="showColumns"
:dataSource="dataSource"
:pagination="ipagination"
:components="components"
@change="handleTableChange"
:loading="loading">
<template slot="text" slot-scope="text">
@@ -32,6 +33,14 @@
<div v-else class="table-text">{{ global.emptyLine }}</div>
</a-tooltip>
</template>
<!-- 标准状态 -->
<template v-slot:standardState="text, record">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : global.emptyLine }}</template>
<div v-if="text" class="status-style" :style="getStandardStateStyle(record)">{{ text }}</div>
<div v-else class="table-text">{{ global.emptyLine }}</div>
</a-tooltip>
</template>
<!-- 企标号企标名称 -->
<template v-slot:enStandard="text, record">
<a-tooltip overlay-class-name="tooltip-style">
@@ -61,7 +70,7 @@
</template>
<script>
import { StandardSource } from '@/enums/commonEnums'
import { EnterpriseStandardStatus, StandardSource, StandardStatus } from '@/enums/commonEnums'
import { getMarketRegulationsList } from '../../../api/api'
import {
getHomeNewStandard,
@@ -210,7 +219,7 @@ export default {
align: 'left',
dataIndex: 'standardState_dictText',
width: 100,
scopedSlots: { customRender: 'text' },
scopedSlots: { customRender: 'standardState' },
show: () => {
return [
this.tabList[0].key,
@@ -222,7 +231,7 @@ export default {
{ // 代替标准编号
title: this.$t('dashboard.tableList.substituteStandardNumber'),
align: 'left',
dataIndex: 'substituteStandardNumber',
dataIndex: 'replacedByStandardNumber',
width: 100,
scopedSlots: { customRender: 'text' },
show: () => {
@@ -308,6 +317,11 @@ export default {
showSizeChanger: true,
total: 0
},
components: {
header: {
cell: this.initHeader(this.columns)
}
},
url: {
list: '/laws/localTool/standardEarlyWarning/newModelImplementation'
}
@@ -319,6 +333,71 @@ export default {
// this.loadData(1)
},
methods: {
// 自定义渲染表头(表头换行影响高度)
initHeader () {
return (h, props, children, abc) => {
// 获取列的key值和特性
const { key, ...restProps } = props
const col = this.columns.find(col => col.dataIndex === key)
if (col) {
return (
<th {...restProps}>
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{col.title}</template>
<div class="table-text">{col.title}</div>
</a-tooltip>
</th>
)
}
return (
<th {...restProps}>{children}</th>
)
}
},
// 获取标准状态
getStandardStateStyle (row) {
let color = ''
switch (row.standardState + '') {
// 草案
case StandardStatus.DRAFT.value:
color = '243, 129, 65'
break
// 征求意见
case StandardStatus.SEEK_FOR_OPTIONS.value:
color = '129, 206, 94'
break
// 审查
case StandardStatus.EXAMINE.value:
color = '255, 98, 98'
break
// 报批
case StandardStatus.APPROVAL.value:
color = '48, 175, 255'
break
// 发布
case StandardStatus.RELEASE.value:
color = '6, 176, 140'
break
// 现行有效(外部标准\企标)
case StandardStatus.CURRENTLY_EFFECTIVE.value:
case EnterpriseStandardStatus.CURRENTLY_EFFECTIVE.value:
color = '137, 138, 233'
break
// 废止(外部标准\企标)
case StandardStatus.ABOLISH.value:
case EnterpriseStandardStatus.ABOLISH.value:
color = '156, 177, 208'
break
}
if (color) {
return {
backgroundColor: `rgba(${color}, 0.1)`,
border: `1px solid rgba(${color}, 0.5)`,
color: `rgba(${color}, 1)`
}
}
return {}
},
/**
* 查看标准分解单
*/
@@ -361,7 +440,7 @@ export default {
this.dataSource = []
this.warningTab = value
this.showColumns = this.columns.filter(col => col.show ? col.show() : true).map(item => {
return Object.assign({}, item, { show: undefined })
return Object.assign({}, item, { show: undefined, ellipsis: true })
})
this.loadData(1)
},
@@ -471,7 +550,7 @@ export default {
<style scoped lang="less">
// 预警容器
.warning-wrapper {
height: calc(100vh - 406px);
height: 100%;
}
// tab样式
@@ -479,6 +558,7 @@ export default {
/deep/.ant-tabs-bar {
margin-bottom: 0;
border: none;
}
/deep/&.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab {
@@ -513,6 +593,7 @@ export default {
}
// 表格样式
.table-warpper {
border-radius: 8px;
// 内容高度 = 该部分整体高度 - tab高度
height: calc(100% - 44px);
background-color: #fff;
@@ -524,6 +605,11 @@ export default {
/deep/ .ant-table-thead > tr > th {
background-color: #fff;
font-weight: 400;
font-family: PingFang SC, PingFang SC, sans-serif;
color: #666666;
font-weight: 400;
font-size: 14px;
}
/deep/ .ant-table-row .ant-table-row-cell-break-word {
@@ -539,7 +625,21 @@ export default {
}
@media screen and (max-width: 1366px) {
.warning-wrapper {
height: calc(100vh - 226px);
/deep/ .ant-table-body {
max-height: calc(100vh - 345px) !important;
}
//height: calc(110vh - 550px) !important;
}
}
// 标准状态样式
.status-style {
border-radius: 14px;
height: 28px;
line-height: 28px;
padding: 0 12px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
+7 -5
View File
@@ -1,5 +1,5 @@
<template>
<a-card :bordered="false" class="todo-card">
<div class="todo-wrapper">
<a-spin :spinning="loading">
<div class="top-wrapper">
<p class="left-p"><i class="iconfont icon-calendar left-icon"></i>{{ $t('dashboard.todoTask.todoTask') }}</p>
@@ -18,7 +18,7 @@
</div>
<a-list :data-source="[]" v-else></a-list>
</a-spin>
</a-card>
</div>
</template>
<script>
@@ -98,8 +98,10 @@ export default {
<style lang="less" scoped>
@size: 48px;
.todo-card {
height: calc(100vh - 611px);
.todo-wrapper {
padding: 24px;
background-color: white;
/deep/ .ant-spin-container,
/deep/ .ant-spin-nested-loading,
/deep/ .ant-card-body {
@@ -108,7 +110,7 @@ export default {
}
.content-wrapper {
height: calc(100% - 30px - 12px);
margin-top: 10px;
margin-top: 12px;
overflow-y: auto;
.content-item {
+42 -20
View File
@@ -12,7 +12,7 @@
<a-divider>{{ $t('dashboard.advancedSearch.retrieveCategories') }}</a-divider>
<div class="filter-area-div" ref="filterArea">
<a-row :gutter="24" class="filter-row">
<a-col :md="2" class="label-col"><span class="search_label">{{ $t('dashboard.advancedSearch.searchType') }}</span></a-col>
<a-col :md="2" class="label-col" :title="$t('dashboard.advancedSearch.searchType')"><span class="search_label">{{ $t('dashboard.advancedSearch.searchType') }}</span></a-col>
<a-col :md="18" class="option-col">
<div v-for="item in standardTypeOptions" :key="item.value" class="option-div" :class="currStandardType === item.value ? 'option-curr' : ''" @click="standardTypeChange(item.value)">
{{ item.label }}
@@ -31,6 +31,7 @@
<a-form-item :label="item.dbFieldTxt" :labelCol="labelCol" :wrapperCol="wrapperCol" :colon="false">
<template v-if="item.fieldShowType === FieldType.TREE.value">
<a-tree-select
:replaceFields="getReplaceFields(item.dbFieldName)"
tree-node-filter-prop="title"
v-model="queryParam[item.dbFieldName]"
:maxTagCount="1"
@@ -44,6 +45,7 @@
<!-- 树形选择器单选 -->
<template v-if="item.fieldShowType === FieldType.TREE_SINGLE.value">
<a-tree-select
:replaceFields="getReplaceFields(item.dbFieldName)"
tree-node-filter-prop="title"
v-model="queryParam[item.dbFieldName]"
:maxTagCount="1"
@@ -60,14 +62,11 @@
<a-input :placeholder="$t('pleaseEnter')+item.dbFieldTxt"
v-model="queryParam[item.dbFieldName]"></a-input>
</template>
<!-- 日期区间 -->
<!-- 日期区间(条款选择的日期只要单侧) -->
<template v-else-if="[FieldType.DATE_SINGLE.value, FieldType.DATE_MORE.value].includes(item.fieldShowType)">
<j-range-picker v-model="queryParam[item.dbFieldName]"
<j-date-picker v-model="queryParam[item.dbFieldName]"
format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@change="onChange(item.dbFieldName)"></j-range-picker>
<!--<a-range-picker v-model="queryParam[item.dbFieldName]"-->
<!-- format="YYYY-MM-DD" value-format="YYYY-MM-DD"-->
<!-- @change="onChange(item.dbFieldName)"></a-range-picker>-->
@change="onChange(item.dbFieldName)"></j-date-picker>
</template>
<!-- 字典单选框 -->
<template v-else-if="item.fieldShowType === FieldType.OPTION_SINGLE.value">
@@ -133,6 +132,7 @@
:tree-data="optionsData[item.dbFieldName]"
:replaceFields="{key: 'id', value: 'id', title: 'name', children: 'childPartNameList'}"
tree-checkable
tree-check-strictly
show-search
allowClear
:filterTreeNode="filterTreeOption"
@@ -244,14 +244,20 @@ import Vue from 'vue'
import { ACCESS_TOKEN } from '../../../store/mutation-types'
import { previewPdf } from '../../../utils/previewPdf'
import { kkFilePreview } from '../../../utils/kkFilePreview'
import JRangePicker from '@comp/JDatePicker'
import JDatePicker from '@comp/JDatePicker'
export default {
name: 'AdvancedSearch',
components: { JRangePicker, JTable },
components: { JDatePicker, JTable },
data () {
return {
FieldType,
// 需要英文状态下翻译下拉的字段
dictTextFieldList: [
'professional_field', // 全部-专业领域
'applicable_market', // 适用市场
'domain_area' // 条款-专业领域
],
loading: false,
toggleSearchStatus: true, // 检索条件的展开和收起,false收缩状态
currStandardType: '1', // 1外部 3企标 4条款 5全部
@@ -385,13 +391,13 @@ export default {
dataIndex: 'item_content',
scopedSlots: { customRender: 'item_content' }
},
{ // 适用零部件
title: this.$t('dashboard.advancedSearch.applicableComponents'),
align: 'center',
width: 180,
dataIndex: 'applicable_components',
scopedSlots: { customRender: 'text' }
},
// { // 适用零部件
// title: this.$t('dashboard.advancedSearch.applicableComponents'),
// align: 'center',
// width: 180,
// dataIndex: 'applicable_components',
// scopedSlots: { customRender: 'text' }
// },
{ // 新生产车实施日期
title: this.$t('dashboard.advancedSearch.newProduceVehiclesImplementationDate'),
align: 'center',
@@ -417,7 +423,7 @@ export default {
title: this.$t('dashboard.advancedSearch.keywords'),
align: 'center',
width: 180,
dataIndex: 'keywords',
dataIndex: 'part_name_dictText',
scopedSlots: { customRender: 'text' }
},
{ // 责任部门
@@ -550,6 +556,18 @@ export default {
this.queryParam.standard_state = this.defaultStandardStatus
},
methods: {
/**
* 处理英文下树结构下拉的字段替换
* @param field - 字段名
*/
getReplaceFields (field) {
const obj = {}
// 数据字典或标签内容管理英文是enTitle
if (this.dictTextFieldList.includes(field)) {
obj.title = this.isChinese() ? 'title' : 'enTitle'
}
return obj
},
// 导出
handleExportXls (fileName, fileSuffix = '.xls') {
if (!fileName || typeof fileName !== 'string') {
@@ -615,16 +633,17 @@ export default {
path = '/enterpriseStandardLibrary/enterpriseStandardDetail'
} else if (this.currStandardType === '5') {
// 全部的话,就判断是企标还是外部
if (record.resource_type === StandardSource.FOREIGN.value) {
if (record.resource_type + '' === StandardSource.FOREIGN.value) {
path = '/standardRegulationLibrary/foreignStandardDetailPage'
} else if (record.resource_type === StandardSource.ENTERPRISE.value) {
} else if (record.resource_type + '' === StandardSource.ENTERPRISE.value) {
path = '/enterpriseStandardLibrary/enterpriseStandardDetail'
}
}
this.$openPageNewSheet({
path: path,
query: {
id: record.id
id: record.id,
standardNumber: record.standard_number
}
})
},
@@ -963,6 +982,9 @@ export default {
.label-col {
text-align: left;
color: #86909c;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.option-col {
width: calc(100% - 200px);
+7 -3
View File
@@ -66,7 +66,7 @@
<div class="label-col"><span class="search_label">{{ selectOptions[value].label }}</span></div>
<div class="option-col">
<div v-for="item in selectOptions[value].options" :key="item.itemValue" class="option-div" :class="selectOptions[value].current === item.itemValue ? 'option-curr' : ''" @click="selectOptionsChange(value, item.itemValue)">
<span>{{ item.itemText }}<span v-if="item.statisticsCount || item.statisticsCount === 0">(<span class="option-span-num">{{ item.statisticsCount }}</span>)</span></span>
<span>{{ isChinese() ? item.itemText : item.itemTextEnglish }}<span v-if="item.statisticsCount || item.statisticsCount === 0">(<span class="option-span-num">{{ item.statisticsCount }}</span>)</span></span>
</div>
</div>
</div>
@@ -330,7 +330,11 @@ export default {
if (res.result[item]) {
// 通过key获取对应label
const label = this.getLabelByKey(item)
res.result[item].unshift({ itemText: this.$t('dashboard.generalSearch.all'), itemValue: 'all' })
res.result[item].unshift({
itemText: this.$t('dashboard.generalSearch.all'),
itemTextEnglish: this.$t('dashboard.generalSearch.all'),
itemValue: 'all'
})
this.selectOptions[item] = {
options: res.result[item],
label: label,
@@ -908,7 +912,7 @@ export default {
line-height: 28px;
margin-right: 20px;
max-height: calc(100% - 340px);
max-width: 50%;
max-width: 30%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -136,7 +136,8 @@ export default {
{
title: this.$t('docTool.comparison.oldTextState'),
width: 150,
dataIndex: 'fileTypeLeft_dictText'
dataIndex: 'fileTypeLeft_dictText',
scopedSlots: { customRender: 'dictText' }
},
// 新文档文本号
{
@@ -156,13 +157,15 @@ export default {
{
title: this.$t('docTool.comparison.newTextState'),
width: 150,
dataIndex: 'fileTypeRight_dictText'
dataIndex: 'fileTypeRight_dictText',
scopedSlots: { customRender: 'dictText' }
},
// 发布情况
{
title: this.$t('docTool.comparison.releaseSituation'),
width: 150,
dataIndex: 'releaseState_dictText'
dataIndex: 'releaseState_dictText',
scopedSlots: { customRender: 'dictText' }
},
// 创建人
{
@@ -256,6 +259,11 @@ export default {
onOk: () => {
const idList = []
const selectionRows = JSON.parse(JSON.stringify(this.selectionRows))
// 发布状态不能删除
if (selectionRows.some(item => item.releaseState !== 'draft')) {
this.$message.warning(this.$t('publishedAndCannotDeleted'))
return
}
for (let i = 0; i < selectionRows.length; i++) {
if (selectionRows[i].createBy === this.userInfo.username &&
selectionRows[i].releaseState === 'draft') {
@@ -166,7 +166,7 @@ export default {
queryParamLeft: {},
ipaginationLeft: {
current: 1,
pageSize: 50,
pageSize: 10,
pageSizeOptions: ['10', '50', '100', '150', '200'],
showTotal: (total, range) => {
return range[0] + '-' + range[1] + ' ' + this.$t('total') + ' ' + total + ' ' + this.$t('strip')
@@ -182,7 +182,7 @@ export default {
queryParamRight: {},
ipaginationRight: {
current: 1,
pageSize: 50,
pageSize: 10,
pageSizeOptions: ['10', '50', '100', '150', '200'],
showTotal: (total, range) => {
return range[0] + '-' + range[1] + ' ' + this.$t('total') + ' ' + total + ' ' + this.$t('strip')
@@ -230,7 +230,8 @@ export default {
title: this.$t('docTool.comparison.textStatus'),
ellipsis: true,
dataIndex: 'fileType_dictText',
width: 100
width: 100,
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('fileName'),
@@ -263,7 +264,8 @@ export default {
title: this.$t('docTool.comparison.textStatus'),
ellipsis: true,
dataIndex: 'fileType_dictText',
width: 100
width: 100,
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('fileName'),
@@ -96,7 +96,7 @@ import '../../../assets/less/common.less'
import JTable from '../../../components/jero/JTable.vue'
import SplitText from './modules/SplitText.vue'
import { JeroListMixin } from '@/mixins/JeroListMixin'
import { releaseSplitStandard, changePermission, withdraw } from '@api/documentToolApi'
import { releaseSplitStandard, changePermission, withdraw, checkChangePermission } from '@api/documentToolApi'
import ImportSplitResultModal from './modules/ImportSplitResultModal.vue'
import UserSelectModal from '../../../components/selection/UserSelectModal.vue'
import { SplitStatus, StandardSource } from '@/enums/commonEnums'
@@ -183,7 +183,8 @@ export default {
{
dataIndex: 'fileType_dictText',
title: this.$t('docTool.split.fileStatus'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 文件名称
{
@@ -195,7 +196,8 @@ export default {
{
dataIndex: 'splitStatus_dictText',
title: this.$t('docTool.split.splitState'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 编辑人
{
@@ -292,6 +294,7 @@ export default {
query: {
infoId: record.id,
infoNumber: record.serialNumber,
standardClass: record.standardClass,
createBy: record.createBy,
standardName: record.title
}
@@ -327,7 +330,14 @@ export default {
this.$message.warning(this.$t('selectAtLeastOne'))
return
}
this.$refs.userSelectModal.open()
// 校验是否有权限更改
checkChangePermission({ ids: this.selectedRowKeys.join(',') }).then(res => {
if (res.success) {
this.$refs.userSelectModal.open()
} else {
this.$message.warn(res.message)
}
})
},
continueChangePermission (id) {
this.loading = true
@@ -48,19 +48,19 @@
<i class="iconfont icon-shanchu_" />
</a-button>
<!--节点上移是否可以上移在树形数据中应该有字段标识-->
<a-button icon="up"
v-if="record.pid"
class="tree-operate-node-btn"
@click.stop="orgMoveUp(record)"
v-has="'split:sarFileSplitMenu:moveUp'">
</a-button>
<!--<a-button icon="up"-->
<!-- v-if="record.pid"-->
<!-- class="tree-operate-node-btn"-->
<!-- @click.stop="orgMoveUp(record)"-->
<!-- v-has="'split:sarFileSplitMenu:moveUp'">-->
<!--</a-button>-->
<!--节点下移是否可以下移在树形数据中应该有字段标识-->
<a-button icon="down"
v-if="record.pid"
class="tree-operate-node-btn"
@click.stop="orgmoveDown(record)"
v-has="'split:sarFileSplitMenu:moveDown'">
</a-button>
<!--<a-button icon="down"-->
<!-- v-if="record.pid"-->
<!-- class="tree-operate-node-btn"-->
<!-- @click.stop="orgmoveDown(record)"-->
<!-- v-has="'split:sarFileSplitMenu:moveDown'">-->
<!--</a-button>-->
</div>
</div>
</template>
@@ -243,6 +243,8 @@ export default {
mixins: [ConfigurableTableMixin],
data () {
return {
// 导入的最大大小
importMaxSize: 20,
StandardSource,
data: [],
loading: false, // 提交的加载
@@ -373,7 +375,8 @@ export default {
this.menuId = this.selectedKeys[0]
this.uploadData = {
menuId: this.menuId,
infoId: this.infoId
infoId: this.infoId,
standardClass: this.$route.query.standardClass
}
this.filters.info_id = this.infoId
this.filters.menu_id = this.menuId
@@ -17,9 +17,12 @@
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('standardSelect.standardNumber')">
<standard-selection :placeholder="$t('pleaseSelect') + $t('standardSelect.standardNumber')"
type="radio"
splitSearch
disabledSourceSearch
@nameChange="handleStandardNumberChange"
@listChange="handleStandardListChange"
:select-only="true"
:can-selected-source="[StandardSource.FOREIGN.value, StandardSource.ENTERPRISE.value]"
:can-selected-source="[StandardSource.FOREIGN.value]"
class="readonly-input"
v-decorator="['serialNumber', validatorRules.serialNumber]" />
</a-form-item>
@@ -111,6 +114,7 @@ export default {
validateTrigger: 'change'
}
},
standardInfo: {}, // 选择的标准
downTemplateUrl: '/laws/DocumentTool/documentSplit/downloadImportTemplate' // 模板下载
}
},
@@ -122,8 +126,10 @@ export default {
this.form.validateFields(async (errors, values) => {
if (!errors) {
this.confirmLoading = true
const formData = values
const formData = Object.assign({}, values)
const fileInfo = await getFileInfo({ id: formData.splitFileId })
formData.standardId = this.standardInfo.id
formData.standardClass = this.standardInfo.standardClass
if (fileInfo.success) {
formData.fileName = fileInfo.result.fileName
}
@@ -196,6 +202,9 @@ export default {
handleStandardNumberChange (name) {
this.form.setFieldsValue({ title: name })
},
handleStandardListChange (list) {
this.standardInfo = list[0] || {}
},
// 下载导入模板
downTemplate (fileName, fileSuffix = '.xls') {
if (!fileName || typeof fileName !== 'string') {
@@ -126,6 +126,7 @@
<!-- 12, 树选择 -->
<s-tree-select
v-else-if="item.fieldShowType === FieldType.TREE.value"
:replaceFields="getReplaceFields(item.dbFieldName)"
v-model="formInline[item.dbFieldName]"
:disabled="disabled || disabledFieldList.includes(item.dbFieldName)"
:tree-data="optionsData[item.dbFieldName]"
@@ -145,24 +146,33 @@
<!-- 15, 树选择单选 -->
<s-tree-select v-else-if="item.fieldShowType === FieldType.TREE_SINGLE.value"
v-model="formInline[item.dbFieldName]"
:replaceFields="getReplaceFields(item.dbFieldName)"
:disabled="disabled || disabledFieldList.includes(item.dbFieldName)"
:tree-data="optionsData[item.dbFieldName]"
:label-in-value="false"
@change="updateDom"
:placeholder="$t('pleaseSelect')+item.dbFieldTxt + getPlaceholderSuffix(item)" />
<!--16树形弹框选择-->
<tree-selection v-else-if="item.fieldShowType === FieldType.TREE_MODAL_SELECT.value"
:placeholder="$t('pleaseSelect')+item.dbFieldTxt + getPlaceholderSuffix(item)"
v-model="formInline[item.dbFieldName]"
:filedName="item.dbFieldName"
type="checkbox"
:options-href="item.fieldHref"
:nameStr="formInline[item.dbFieldName + '_dictText']"
:dict-id="item.dictId"
:disabled="disabled || disabledFieldList.includes(item.dbFieldName)"
:children-column-name="getTreeSelectionChildrenColumnName(item)"
:is-tag-library-restriction="item.dbFieldName === 'property_tag'"
:search-field-name="item.dbFieldName === 'property_tag' ? 'firstNodeName' : null" />
<!--<tree-selection v-else-if="item.fieldShowType === FieldType.TREE_MODAL_SELECT.value || item.fieldShowType === FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value"-->
<!-- :placeholder="$t('pleaseSelect')+item.dbFieldTxt + getPlaceholderSuffix(item)"-->
<!-- v-model="formInline[item.dbFieldName]"-->
<!-- :filedName="item.dbFieldName"-->
<!-- type="checkbox"-->
<!-- :options-href="item.fieldHref"-->
<!-- :nameStr="formInline[item.dbFieldName + '_dictText']"-->
<!-- :dict-id="item.dictId"-->
<!-- :disabled="disabled || disabledFieldList.includes(item.dbFieldName)"-->
<!-- :children-column-name="getTreeSelectionChildrenColumnName(item)"-->
<!-- :is-tag-library-restriction="item.dbFieldName === 'property_tag'"-->
<!-- :search-field-name="item.dbFieldName === 'property_tag' ? 'firstNodeName' : null" />-->
<tree-data-selection v-else-if="item.fieldShowType === FieldType.TREE_MODAL_SELECT.value || item.fieldShowType === FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value"
:placeholder="$t('pleaseSelect')+item.dbFieldTxt"
v-model="formInline[item.dbFieldName]"
:fieldName="item.dbFieldName"
:nameStr="formInline[item.dbFieldName + '_dictText']"
@nameChange="treeDataSelectNameChange"
:optionsHref="item.treeFirstHref"
:dict-id="item.dictId"/>
</a-form-model-item>
</div>
</template>
@@ -177,7 +187,7 @@
<a-button type="primary" icon="plus" ghost @click="handleAddClauseContent(-1)">{{ $t('newlyAdded') }}</a-button>
</div>
<template v-if="contentList && contentList.length > 0">
<div class="clause-item" v-for="(clause, index) in contentList" :key="index + 'clause'">
<div class="clause-item" v-for="(clause, index) in contentList" :key="clause.uuid || (index + 'clause')">
<div class="clause-item-operate">
<a-button @click="handleAddClauseContent(index)">{{ $t('newlyAdded') }}</a-button>
<a-button v-if="clause.type === TypeOfClauseItem.TABLE.value" @click="splitEdit(index,clause)">
@@ -273,12 +283,15 @@ import { getAction } from '../../../../api/manage'
import { getFormDictTreeList } from '../../../../api/api'
import STreeSelect from '../../../../components/STreeSelect'
import TreeSelection from '../../../../components/selection/TreeSelection'
import { randomUUID } from '@/utils/util'
import TreeDataSelection from '@comp/selection/TreeDataSelection'
import SplitAddClauseUploadImage from '@comp/splitUpload/SplitAddClauseUploadImage'
export default {
name: 'SplitAddForm',
components: {
SplitAddClauseUploadImage,
TreeDataSelection,
TreeSelection,
JMultipleDatePicker,
SplitDetailAddTable,
@@ -294,6 +307,12 @@ export default {
hiddenFieldList: ['item_content', 'translation'], // 隐藏的字段
radioDictSelect: [], // 使用radio样式的数据字典单选
disabledFieldList: [], // 禁用的字段
// 需要英文状态下翻译下拉的字段
dictTextFieldList: [
'professional_field', // 全部-专业领域
'applicable_market', // 适用市场
'domain_area' // 条款-专业领域
],
specialPlaceholder: {}, // 特殊的placeholder
optionsData: {}, // 通过接口获取的下拉数据
title: this.$t('newlyAdded'),
@@ -343,6 +362,18 @@ export default {
}
},
methods: {
/**
* 处理英文下树结构下拉的字段替换
* @param field - 字段名
*/
getReplaceFields (field) {
const obj = {}
// 数据字典或标签内容管理英文是enTitle
if (this.dictTextFieldList.includes(field)) {
obj.title = this.isChinese() ? 'title' : 'enTitle'
}
return obj
},
/**
* 新增
*/
@@ -533,35 +564,45 @@ export default {
},
// 增加条款内容成功
handleAddOk (type, content) {
const headerArr = this.contentList.splice(0, this.addIndex + 1)
const footerArr = this.contentList.splice(-this.addIndex)
const insertArr = []
switch (type) {
case TypeOfClauseItem.TEXT.value:
for (let i = 0; i < content; i++) {
insertArr.push({
id: '',
uuid: randomUUID(),
type: TypeOfClauseItem.TEXT.value,
[this.currentFieldObj.field]: ''
})
}
break
case TypeOfClauseItem.IMG.value:
insertArr[0] = {
id: '',
type: TypeOfClauseItem.IMG.value,
[this.currentFieldObj.field]: content.file.response.result.url,
[this.currentFieldObj.tempUrlField]: window._CONFIG.domianURL + '/sys/split/file/getImage?fileName=' + content.file.response.result.fileName
// 处理上传接口报错的情况
if (content.imgs) {
content.imgs.forEach(file => {
insertArr.push({
id: '',
uuid: randomUUID(),
type: TypeOfClauseItem.IMG.value,
[this.currentFieldObj.field]: file.response.result.url,
[this.currentFieldObj.tempUrlField]: window._CONFIG.domianURL + '/sys/split/file/getImage?fileName=' + file.response.result.fileName
})
})
}
break
case TypeOfClauseItem.TABLE.value:
insertArr[0] = {
id: '',
uuid: randomUUID(),
type: 'TABLE',
[this.currentFieldObj.field]: content[0]
}
}
this.contentList = [...headerArr, ...insertArr, ...footerArr]
if (this.addIndex !== -1) {
this.contentList.splice(this.addIndex + 1, 0, ...insertArr)
} else {
this.contentList.push(...insertArr)
}
},
/**
* 译文编辑
@@ -770,6 +811,9 @@ export default {
}
return null
},
treeDataSelectNameChange (value, fieldName) {
this.formInline[fieldName + '_dictText'] = value
},
/**
* 如果字段中的usableRange只有一个值,那么就需要在placeholder中标识
* @param field
@@ -128,7 +128,7 @@ export default {
disabled: false,
titleImg: this.$t('uploadPictures'),
listType: 'picture',
accept: '.png,.jpeg,.jpg,.gif',
accept: '.png,.jpeg,.jpg',
// 表格行列相关数据
rowColForm: {},
validatorRowColRules: {
@@ -159,8 +159,11 @@ export default {
},
// 上传文件
uploadSuccess (file, data, imgs) {
this.$emit('ok', TypeOfClauseItem.IMG.value, { file, data, imgs })
this.visible = false
// 所有文件都上传完成再去关闭弹框
if (Array.isArray(imgs) && imgs.every(item => item.status === 'done')) {
this.$emit('ok', TypeOfClauseItem.IMG.value, { file, data, imgs })
this.visible = false
}
// this.$emit('addImageOk', file, data, imgs)
},
// 确定增加的类型
@@ -146,7 +146,7 @@
:label-in-value="false"
:placeholder="$t('pleaseSelect')+item.dbFieldTxt + getPlaceholderSuffix(item)" />
<!--16树形弹框选择-->
<tree-selection v-else-if="item.fieldShowType === FieldType.TREE_MODAL_SELECT.value"
<tree-selection v-else-if="item.fieldShowType === FieldType.TREE_MODAL_SELECT.value || item.fieldShowType === FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value"
:placeholder="$t('pleaseSelect')+item.dbFieldTxt + getPlaceholderSuffix(item)"
v-model="formInline[item.dbFieldName]"
:filedName="item.dbFieldName"
@@ -108,7 +108,8 @@ export default {
{
dataIndex: 'origin_dictText',
title: this.$t('docTool.split.dataType'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 标准号
{
@@ -126,7 +127,8 @@ export default {
{
dataIndex: 'standardFileType_dictText',
title: this.$t('docTool.comparison.textStatus'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 附件
{
@@ -151,6 +153,20 @@ export default {
this.loadStandardStructureTree()
},
methods: {
// 获取树结构没有被禁用的value值
getValuesWhereNotDisabled (tree = []) {
const values = []
function traverse (node) {
if (!node.disabled) { // 只处理 disabled 不为 true 的节点
values.push(node.value)
}
if (node.children && node.children.length > 0) {
node.children.forEach(child => traverse(child))
}
}
tree.forEach(node => traverse(node))
return values
},
getQueryParams () {
// 获取查询条件
const sqp = {}
@@ -162,17 +178,18 @@ export default {
param.field = this.getQueryField()
param.pageNo = this.ipagination.current
param.pageSize = this.ipagination.pageSize
if (Array.isArray(param.standardSystem)) {
if (Array.isArray(param.standardSystem) && param.standardSystem.length) {
param.standardSystem = param.standardSystem.map(item => item.value).join(',')
} else {
param.standardSystem = this.getValuesWhereNotDisabled(this.standardStructureTree).join(',')
}
return filterObj(param)
},
// 加载标准结构树
loadStandardStructureTree () {
// option 不传显示我的收藏,1不显示我的收藏
getForeignStandardTree({ option: 1 }).then(res => {
// option 不传显示我的收藏,1不显示我的收藏, 2只能选二级中国及中国下三级,和欧盟EU
getForeignStandardTree({ option: 2 }).then(res => {
if (res.success) {
console.log(res.result)
this.standardStructureTree = res.result || []
}
})
@@ -132,14 +132,14 @@ export default {
title: this.$t('docTool.ocrTextRecognition.textStatus'),
align: 'center',
width: 180,
dataIndex: 'fileTypeDictText',
scopedSlots: { customRender: 'text' }
dataIndex: 'fileType_dictText',
scopedSlots: { customRender: 'dictText' }
},
{ // 转换结果
title: this.$t('docTool.ocrTextRecognition.conversionResults'),
align: 'center',
width: 180,
dataIndex: 'resultContentDictText',
dataIndex: this.isChinese() ? 'resultContent_dictText' : 'resultContent_dictTextEn',
scopedSlots: { customRender: 'tag' }
},
{ // 消耗时间
@@ -88,7 +88,8 @@ export default {
{
dataIndex: 'origin_dictText',
title: this.$t('docTool.split.dataType'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 标准号
{
@@ -106,7 +107,8 @@ export default {
{
dataIndex: 'standardFileType_dictText',
title: this.$t('docTool.comparison.textStatus'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 附件
{
@@ -526,12 +526,6 @@ export default {
this.$message.warning(this.$t('selectARecord'))
return
}
console.log(this.selectionRows)
if (this.selectionRows.find(item => !item.editFlag)) {
// 有没有查看权限的数据
this.$message.warning(this.$t('enterpriseStandardLibrary.standard.disabledBatchDel'))
return
}
const ids = this.selectedRowKeys.join(',')
this.$confirm({
title: this.$t('confirmBatchDeletion'),
@@ -47,6 +47,18 @@
type="primary" ghost @click="viewAll(formItem.dbFieldName)">
{{ $t('enterpriseStandardLibrary.standard.viewAll')}}
</a-button>
<!-- 是需要翻译的也需要双语翻译的,并且不在不需要双语翻译的字段里 -->
<span v-else-if="needDictFieldList.includes(formItem.fieldShowType) && needEnNameFieldType.includes(formItem.fieldShowType) && !needEnNameTypeNotUseField.includes(formItem.dbFieldName)">
{{
detailData[(isChinese() ? formItem.dbFieldName + '_dictText' : formItem.dbFieldName + '_dictTextEn')] || global.emptyLine
}}
</span>
<!-- 是需要翻译的但不需要双语翻译的,或者在需要双语翻译的类型里,但是不需要双语翻译的字段 -->
<span v-else-if="needDictFieldList.includes(formItem.fieldShowType) && (!needEnNameFieldType.includes(formItem.fieldShowType) || needEnNameFieldType.includes(formItem.fieldShowType) && needEnNameTypeNotUseField.includes(formItem.dbFieldName))">
{{
detailData[formItem.dbFieldName + '_dictText'] || global.emptyLine
}}
</span>
<span v-else-if="detailData[formItem.dbFieldName + '_dictText']">{{ detailData[formItem.dbFieldName + '_dictText'] }}</span>
<!-- 标准适用范围,有标签需要编译 -->
<span v-else-if="detailData[formItem.dbFieldName] && formItem.dbFieldName === 'standard_scope'" v-html="detailData[formItem.dbFieldName]"></span>
@@ -89,7 +101,7 @@
<!-- 稽查内容 -->
<div class="detail-page-part">
<div class="detail-page-part-title">
<span>稽查内容</span>
<span>{{ $t('enterpriseStandardLibrary.standard.auditContent') }}</span>
</div>
<div class="detail-page-part-table">
<a-table
@@ -190,7 +202,7 @@ export default {
dataSource: [], // 稽查内容数据
image: false,
imageUrl: '',
showViewAllField: ['auth_dept'], // 需要显示展示查看全部按钮的字段
showViewAllField: ['part_name'], // 需要显示展示查看全部按钮的字段
// 标准字段,需要跳转标准详情
standardFields: ['substitute_standard_number', 'replaced_by_standard_number', 'reference_standard', 'referenced_standard'],
// 参与只允许查看最新稿件排序的字段顺序(发布稿>征求意见稿)
@@ -199,7 +211,13 @@ export default {
manuScriptNewestFileField: '',
filePerm: { // 上传文件根据权限控制只能查看,没有权限的除了系统管理员外不可见不可下载
associated_file: 'enterpriseStandard:associatedFile:look' // 关联文件
}
},
// 需要数据字段翻译的属性类型
needDictFieldList: [FieldType.USER_SINGLE.value, FieldType.ORGAN_SINGLE.value, FieldType.ORGAN_MORE.value, FieldType.OPTION_SINGLE.value, FieldType.OPTION_MORE.value, FieldType.TREE.value, FieldType.TREE_SINGLE.value],
// 需要双语切换翻译的属性类型
needEnNameFieldType: [FieldType.OPTION_SINGLE.value, FieldType.OPTION_MORE.value, FieldType.TREE.value, FieldType.TREE_SINGLE.value],
// 是双语切换翻译的属性,但是不翻译的字段
needEnNameTypeNotUseField: ['standard_system']
}
},
computed: {
@@ -218,12 +236,8 @@ export default {
methods: {
fileIsDownload (fieldName) { // 文件是否可下载
if (Object.keys(this.filePerm).includes(fieldName)) {
// 系统管理员可下载
if (this.isSystemAdmin) {
return true
} else {
return false
}
// 需要特殊判断的字段不可下载
return false
} else {
// 不是需要特殊判断的字段正常可下载
return true
@@ -51,6 +51,14 @@
</a-tooltip>
</template>
<!--增加数据字典双语翻译的插槽-->
<template slot="dictText" slot-scope="text, record, index, column">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</template>
<div class="table-text">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</div>
</a-tooltip>
</template>
</a-table>
</div>
@@ -125,10 +133,10 @@ export default {
},
{
title: this.$t('standardSelect.textState'),
dataIndex: 'standardState_dictText',
dataIndex: 'esStandardState_dictText',
align: 'center',
width: 120,
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
}
],
dataList: [],
@@ -15,7 +15,7 @@
<!-- 引用标准可以选国标和外标 -->
<add-form ref="addForm"
:flag="StandardSource.ENTERPRISE.value"
:defaultValue="{year_number: new Date().getFullYear() + '', try_flag: '0'}"
:defaultValue="{year_number: new Date().getFullYear() + ''}"
:disabledFieldList="disabledFieldList"
:selectStandardCanUpdateTypeField="['reference_standard']"
:hiddenFieldList="hiddenFieldList"
@@ -23,6 +23,7 @@
:get-form-func="getFormFunc"
:get-document-info-func="getDocumentInfoFunc"
:exclude-standard-fields="['substitute_standard_number', 'reference_standard']"
:selectStandardValueNeedNameField="['substitute_standard_number', 'reference_standard']"
@submitFormData="submitFormData" />
<div class="header-text-btn">
<!-- 稽查内容 -->
@@ -99,7 +100,7 @@ export default {
StandardSource,
visible: false,
title: '',
width: 800,
width: '50%',
// 存储表单的数据
form: {},
confirmLoading: false,
@@ -251,4 +252,8 @@ export default {
.check-content-table {
padding-bottom: 40px;
}
/deep/ .ant-drawer-content-wrapper {
min-width: 800px;
}
</style>
@@ -94,20 +94,6 @@ export default {
dataIndex: 'releaseDate',
scopedSlots: { customRender: 'text' }
},
{
title: this.$t('personalCenter.collection.newCarTypeDate'),
align: 'center',
width: 180,
dataIndex: 'newModelImplementationDate',
scopedSlots: { customRender: 'text' }
},
{
title: this.$t('personalCenter.collection.productCarDate'),
align: 'center',
width: 180,
dataIndex: 'onTheProductionDate',
scopedSlots: { customRender: 'text' }
},
{
title: this.$t('personalCenter.collection.standardState'),
align: 'center',
@@ -117,6 +117,17 @@
</a-tooltip>
</template>
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
</template>
<!-- 附件 -->
<template v-slot:file="{text, record}">
<a v-if="text" class="link-a" @click="handleLookFile(record)">{{ $t('view') }}</a>
@@ -133,6 +144,8 @@
<nonmatch-item-look-modal ref="nonmatchItemLookModal"/>
<!-- 文件查看弹框 -->
<upload-file ref="uploadFile" disabled></upload-file>
<!-- 条款内容 -->
<split-clause-detail ref="splitClauseDetail" />
</a-card>
</template>
@@ -144,10 +157,11 @@ import NonmatchItemCloseModal from './modules/NonmatchItemCloseModal'
import NonmatchItemLookModal from './modules/NonmatchItemLookModal'
import { queryDepartTreeList } from '../../../api/api'
import UploadFile from '@/components/UploadFile'
import SplitClauseDetail from '../../documentTool/documentSplit/modules/SplitClauseDetail'
export default {
name: 'NonmatchItemList',
components: { JTable, NonmatchItemCloseModal, NonmatchItemLookModal, UploadFile },
components: { JTable, NonmatchItemCloseModal, NonmatchItemLookModal, UploadFile, SplitClauseDetail },
mixins: [JeroListMixin],
data () {
return {
@@ -165,7 +179,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 标准编号
title: this.$t('standardNumber'),
@@ -194,7 +208,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'termContent',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'item_content' }
},
{ // 责任部门
title: this.$t('regulatoryComplianceAssessmentDatabase.nonmatchItem.responsibleDepartment'),
@@ -215,14 +229,14 @@ export default {
align: 'center',
width: 180,
dataIndex: 'problemType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 整改状态
title: this.$t('regulatoryComplianceAssessmentDatabase.nonmatchItem.rectificationState'),
align: 'center',
width: 180,
dataIndex: 'rectifyStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // PCR编号
title: this.$t('regulatoryComplianceAssessmentDatabase.nonmatchItem.pcrNumber'),
@@ -320,6 +334,10 @@ export default {
}
})
},
// 显示条款内容弹框
showContent (val) {
this.$refs.splitClauseDetail.open(val)
},
// 批量关闭
batchClose () {
if (this.selectedRowKeys.length <= 0) {
@@ -25,10 +25,22 @@
<!-- 适用市场 -->
<a-col :md="6" :sm="8">
<a-form-item :label="$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.applicableMarket')">
<j-multi-select-tag
:placeholder="$t('pleaseSelect') + $t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.applicableMarket')"
<!-- <j-multi-select-tag-->
<!-- :placeholder="$t('pleaseSelect') + $t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.applicableMarket')"-->
<!-- v-model="queryParam.applicableMarket"-->
<!-- dict-code="market_state"></j-multi-select-tag>-->
<a-tree-select
tree-node-filter-prop="title"
v-model="queryParam.applicableMarket"
dict-code="market_state"></j-multi-select-tag>
:maxTagCount="1"
:getPopupContainer="triggerNode=> triggerNode.parentNode"
:tree-data="countryOptions"
:placeholder="$t('pleaseSelect')+$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.applicableMarket')"
show-search
allowClear
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:filterTreeNode="filterTreeOption"
/>
</a-form-item>
</a-col>
@@ -103,6 +115,7 @@
import JTable from '@/components/jero/JTable'
import { JeroListMixin } from '@/mixins/JeroListMixin'
import AssessmentLookModal from './modules/AssessmentLookModal'
import { getFormDictTreeList } from '../../../api/api'
export default {
name: 'RegulatoryComplianceAssessmentList',
@@ -110,6 +123,7 @@ export default {
mixins: [JeroListMixin],
data () {
return {
countryOptions: [], // 国家下拉选择
columns: [
{ // 标准编号
title: this.$t('standardNumber'),
@@ -130,7 +144,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'applicableMarket_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 评估日期
title: this.$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.dateOfEvaluation'),
@@ -164,6 +178,7 @@ export default {
}
},
created () {
this.getCountryOption()
// 标准主计划跳转进来携带标准+适用市场
this.$set(this.queryParam, 'applicableMarket', this.$route.query.applicableMarket)
this.$set(this.queryParam, 'standardName', this.$route.query.standardName)
@@ -171,6 +186,13 @@ export default {
this.loadData()
},
methods: {
getCountryOption () {
getFormDictTreeList({ dictId: '1801130851452059649' }).then(res => {
if (res.success) {
this.countryOptions = res.result
}
})
},
toDetail (record) {
const path = '/standardRegulationLibrary/foreignStandardDetailPage'
this.$openPageNewSheet({
@@ -6,7 +6,9 @@
:closable="true"
switchFullscreen
:footer="false"
:class="isFullScreen ? 'full-screen-modal' : ''"
@cancel="handleCancel"
@update:fullscreen="updataFullScreen"
:visible="visible">
<div class="table-page-search-wrapper">
@@ -80,9 +82,28 @@
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:scroll="{x: '100%', y: 'calc(100vh - 500px)'}"
:scroll="{x: '100%', y: isFullScreen ? 'calc(100vh - 330px)' : 'calc(100vh - 500px)'}"
@change="handleTableChange">
<!--增加数据字典双语翻译的插槽-->
<template slot="dictText" slot-scope="text, record, index, column">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</template>
<div class="table-text">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</div>
</a-tooltip>
</template>
<!-- 条款内容 -->
<template slot="item_content" slot-scope="text, record">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : global.emptyLine }}</template>
@@ -99,6 +120,8 @@
<!-- 文件列表查看 -->
<upload-file ref="uploadFile" disabled></upload-file>
<!-- 条款内容 -->
<split-clause-detail ref="splitClauseDetail" />
</j-modal>
</template>
@@ -107,10 +130,11 @@
import { JeroListMixin } from '@/mixins/JeroListMixin'
import { queryDepartTreeList } from '../../../../api/api'
import UploadFile from '@/components/UploadFile'
import SplitClauseDetail from '../../../documentTool/documentSplit/modules/SplitClauseDetail'
export default {
name: 'AssessmentLookModal',
components: { UploadFile },
components: { UploadFile, SplitClauseDetail },
mixins: [JeroListMixin],
data () {
return {
@@ -140,7 +164,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'termContent',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'item_content' }
},
{ // 车型
title: this.$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.vehicleType'),
@@ -154,7 +178,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 责任部门
title: this.$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.responsibleDepartment'),
@@ -175,7 +199,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'result_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 不满足要求的现状
title: this.$t('regulatoryComplianceAssessmentDatabase.assessmentLibrary.theStatusNotMeetRequirements'),
@@ -239,7 +263,8 @@ export default {
},
disableMixinCreated: true,
image: false,
imageUrl: ''
imageUrl: '',
isFullScreen: false
}
},
mounted () {
@@ -261,6 +286,14 @@ export default {
}
})
},
// 全屏切换
updataFullScreen (value) {
this.isFullScreen = value
},
// 显示条款内容弹框
showContent (val) {
this.$refs.splitClauseDetail.open(val)
},
filterTreeOption (input, option) {
const text = option.componentOptions.propsData.title || option.componentOptions.propsData.label
return text.toLowerCase().indexOf(input.toLowerCase()) >= 0
@@ -294,4 +327,10 @@ export default {
/deep/ .ant-form-item-label {
min-width: 70px !important;
}
.full-screen-modal {
/deep/ .ant-modal-body {
height: calc(100% - 55px) !important;
}
}
</style>
@@ -106,19 +106,19 @@ export default {
form: this.$form.createForm(this),
labelCol: {
xs: { span: 24 },
sm: { span: 4 }
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 }
sm: { span: 16 }
},
lineLabelCol: {
xs: { span: 24 },
sm: { span: 2 }
sm: { span: 3 }
},
lineWrapperCol: {
xs: { span: 24 },
sm: { span: 21 }
sm: { span: 20 }
},
ueContent: '',
// UE编辑器配置
@@ -369,5 +369,13 @@ export default {
box-sizing: border-box;
overflow: auto;
padding: 32px 0;
/deep/ .ant-form-item-label {
margin-right: 10px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
word-break: break-all;
}
}
</style>
@@ -121,7 +121,8 @@ export default {
{
dataIndex: 'dynamicClassification_dictText',
title: this.$t('standardRegulationLibrary.dynamicMessage.dynamicCataloging'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 来源
{
@@ -139,7 +140,8 @@ export default {
{
dataIndex: 'releaseStatus_dictText',
title: this.$t('standardRegulationLibrary.dynamicMessage.releaseStatus'),
width: 150
width: 150,
scopedSlots: { customRender: 'dictText' }
},
// 发布时间
{
@@ -536,6 +536,8 @@ export default {
this.ipagination.current -= 1
}
this.loadData()
// 清空列表选中
this.onClearSelected()
} else {
this.$message.warn(res.message)
}
@@ -563,6 +565,7 @@ export default {
this.searchParams = Object.assign({}, params)
this.selectedRowKeys = []
this.selectedTreeKeys = []
this.selectedTreeNodeCodes = []
delete this.filters.nodeCode
this.getTableHeader()
this.loadData()
@@ -9,7 +9,7 @@
<!-- 过程稿件显示展开收起 -->
<div v-if="part === DisplayAreaManagement.PROCESS_DOCUMENTATION.text || part === DisplayAreaManagement.PROCESS_DOCUMENTATION.textEn" class="retractable-btn" @click="handleChangeRetractable(index)">
<i class="iconfont " :class="retractableFlag[index] ? 'icon-nav-top' : 'icon-nav-bottom'" />
{{ retractableFlag[index] ? '收起' : '展开' }}
{{ retractableFlag[index] ? $t('putAway') : $t('open') }}
</div>
</div>
<div class="detail-page-part-form" v-if="part !== DisplayAreaManagement.PROCESS_DOCUMENTATION.text && part !== DisplayAreaManagement.PROCESS_DOCUMENTATION.textEn">
@@ -54,21 +54,33 @@
<span v-else>{{ global.emptyLine }}</span>
</div>
<!-- 需要显示查看全部按钮 -->
<a v-else-if="showViewAllField.includes(formItem.dbFieldName) &&
<a-button v-else-if="showViewAllField.includes(formItem.dbFieldName) &&
(detailData[formItem.dbFieldName + '_dictText'] || detailData[formItem.dbFieldName])"
@click="viewAll(formItem.dbFieldName)">
type="primary" ghost @click="viewAll(formItem.dbFieldName)">
{{ $t('enterpriseStandardLibrary.standard.viewAll')}}
</a>
</a-button>
<!-- 是需要翻译的也需要双语翻译的,并且不在不需要双语翻译的字段里 -->
<span v-else-if="needDictFieldList.includes(formItem.fieldShowType) && needEnNameFieldType.includes(formItem.fieldShowType) && !needEnNameTypeNotUseField.includes(formItem.dbFieldName)">
{{
detailData[(isChinese() ? formItem.dbFieldName + '_dictText' : formItem.dbFieldName + '_dictTextEn')] || global.emptyLine
}}
</span>
<!-- 是需要翻译的但不需要双语翻译的,或者在需要双语翻译的类型里,但是不需要双语翻译的字段 -->
<span v-else-if="needDictFieldList.includes(formItem.fieldShowType) && (!needEnNameFieldType.includes(formItem.fieldShowType) || needEnNameFieldType.includes(formItem.fieldShowType) && needEnNameTypeNotUseField.includes(formItem.dbFieldName))">
{{
detailData[formItem.dbFieldName + '_dictText'] || global.emptyLine
}}
</span>
<span v-else>
{{
detailData[needDictFieldList.includes(formItem.fieldShowType) ? formItem.dbFieldName + '_dictText' : formItem.dbFieldName] || global.emptyLine
detailData[formItem.dbFieldName] || global.emptyLine
}}
</span>
</div>
</div>
<!-- 过程稿件特殊处理-->
<div class="detail-page-process-manuscript" v-if="part === DisplayAreaManagement.PROCESS_DOCUMENTATION.text || part === DisplayAreaManagement.PROCESS_DOCUMENTATION.textEn" v-show="retractableFlag[index]">
<div class="detail-page-process-manuscript-item" v-for="formItem in form[part]" :key="formItem.id">
<div class="detail-page-process-manuscript" v-if="part === DisplayAreaManagement.PROCESS_DOCUMENTATION.text || part === DisplayAreaManagement.PROCESS_DOCUMENTATION.textEn">
<div class="detail-page-process-manuscript-item" v-for="formItem in (retractableFlag[index] ? form[part] : [form[part][0]])" :key="formItem.id">
<div class="detail-page-process-manuscript-title">
<span>{{ formItem.dbFieldTxt }}</span>
<!-- 标准解读-->
@@ -180,6 +192,10 @@ export default {
retractableFlag: {}, // 面板展开收起的标识
// 业务基本信息有几个部分
formPartList: [],
// 需要双语切换翻译的属性类型
needEnNameFieldType: [FieldType.OPTION_SINGLE.value, FieldType.OPTION_MORE.value, FieldType.TREE.value, FieldType.TREE_SINGLE.value],
// 是双语切换翻译的属性,但是不翻译的字段
needEnNameTypeNotUseField: ['standard_system']
}
},
computed: {
@@ -310,7 +326,7 @@ export default {
},
// 查看全部
viewAll (fieldName) {
const data = this.detailData[fieldName + '_dictText'] || this.detailData[fieldName]
const data = this.isChinese() ? this.detailData[fieldName + '_dictText'] : this.detailData[fieldName + '_dictTextEn'] || this.detailData[fieldName]
this.$refs.textContentModal.open(data)
},
handlePreview (file, formItem) {
@@ -22,6 +22,7 @@
:open-selected-all-field-list="openSelectedAllFieldList"
:exclude-standard-fields="excludeStandardFields"
:flag-by-field="{associated_enterprise_standard: StandardSource.ENTERPRISE.value, associated_standard: StandardSource.FOREIGN.value}"
:selectStandardValueNeedNameField="['substitute_standard_number', 'reference_standard']"
@submitFormData="submitFormData" />
</a-spin>
</div>
@@ -118,7 +119,7 @@ export default {
}
submitFunc(formInline).then((res) => {
if (res.success) {
this.$message.success(res.message)
this.$message.success(this.$t('operationSuccessful'))
this.$emit('ok')
this.close()
} else {
@@ -48,6 +48,14 @@
</a-tooltip>
</template>
<!--增加数据字典双语翻译的插槽-->
<template slot="dictText" slot-scope="text, record, index, column">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</template>
<div class="table-text">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</div>
</a-tooltip>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : global.emptyLine }}</template>
@@ -143,7 +151,7 @@ export default {
dataIndex: 'standardState_dictText',
align: 'center',
width: 120,
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
}
],
dataList: [],
@@ -219,7 +227,7 @@ export default {
*/
toDetailPage ({ id }) {
this.$openPageNewSheet({
path: '/standardRegulationLibrary/ForeignStandardDetail',
path: '/standardRegulationLibrary/foreignStandardDetailPage',
query: {
id
}
@@ -10,7 +10,7 @@
<!-- 国家/地区 -->
<a-col :span="12">
<label>{{ $t('standardRegulationLibrary.marketRegulationsList.countryRegion') }}</label>
<span>{{ model.country_dictText || global.emptyLine }}</span>
<span>{{ (isChinese() ? model.country_dictText : model.country_dictTextEn) || global.emptyLine }}</span>
</a-col>
<!-- 清单编号 -->
<a-col :span="12">
@@ -25,12 +25,12 @@
<!-- 驾驶位置 -->
<a-col :span="12">
<label>{{ $t('standardRegulationLibrary.marketRegulationsList.drivingPosition') }}</label>
<span>{{ model.drivePosition_dictText || global.emptyLine }}</span>
<span>{{ (isChinese() ? model.drivePosition_dictText : model.drivePosition_dictTextEn) || global.emptyLine }}</span>
</a-col>
<!-- 密级 -->
<a-col :span="12">
<label>{{ $t('standardRegulationLibrary.marketRegulationsList.securityClass') }}</label>
<span>{{ model.securityLevel_dictText || global.emptyLine }}</span>
<span>{{ (isChinese() ? model.securityLevel_dictText : model.securityLevel_dictTextEn) || global.emptyLine }}</span>
</a-col>
<!-- 清单说明 -->
<a-col :span="12">
@@ -247,21 +247,21 @@ export default {
align: 'center',
width: 180,
dataIndex: 'country_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 适用车型
title: this.$t('standardRegulationLibrary.marketListField.applicableVehicleType'),
align: 'center',
width: 180,
dataIndex: 'applicableVehicle_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 认证对象
title: this.$t('standardRegulationLibrary.marketListField.authenticationObject'),
align: 'center',
width: 180,
dataIndex: 'authenticationObject_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 认证交付物
title: this.$t('standardRegulationLibrary.marketListField.certifiedDeliverables'),
@@ -275,14 +275,14 @@ export default {
align: 'center',
width: 180,
dataIndex: 'type_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 动力类型
title: this.$t('standardRegulationLibrary.marketListField.dynamicType'),
align: 'center',
width: 180,
dataIndex: 'dynamicType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 主控部门
title: this.$t('standardRegulationLibrary.marketListField.mainControlDepartment'),
@@ -296,7 +296,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'mainDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 关联部门
title: this.$t('standardRegulationLibrary.marketListField.relatedDepartment'),
@@ -310,31 +310,31 @@ export default {
align: 'center',
width: 180,
dataIndex: 'associateDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 批量限制
title: this.$t('standardRegulationLibrary.marketListField.batchRestriction'),
align: 'center',
width: 180,
dataIndex: 'batchLimit_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 自动驾驶等级
title: this.$t('standardRegulationLibrary.marketListField.automaticDrivingLevel'),
align: 'center',
width: 180,
dataIndex: 'autopilotLevel_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 要求类型
title: this.$t('standardRegulationLibrary.marketListField.requirementType'),
align: 'center',
width: 180,
dataIndex: 'requireType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 备注
title: this.$t('remarks'),
title: this.$t('standardRegulationLibrary.marketListField.remarks'),
align: 'center',
width: 180,
dataIndex: 'remark',
@@ -19,6 +19,7 @@
:tree-data="countryOptions"
tree-checkable
treeCheckStrictly
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
@change="countryChange"
:placeholder="$t('pleaseSelect')+$t('standardRegulationLibrary.marketRegulationsList.countryRegion')" />
</a-form-item>
@@ -365,21 +366,21 @@ export default {
align: 'center',
width: 180,
dataIndex: 'country_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 适用车型
title: this.$t('standardRegulationLibrary.marketListField.applicableVehicleType'),
align: 'center',
width: 180,
dataIndex: 'applicableVehicle_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 认证对象
title: this.$t('standardRegulationLibrary.marketListField.authenticationObject'),
align: 'center',
width: 180,
dataIndex: 'authenticationObject_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 认证交付物
title: this.$t('standardRegulationLibrary.marketListField.certifiedDeliverables'),
@@ -393,14 +394,14 @@ export default {
align: 'center',
width: 180,
dataIndex: 'type_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 动力类型
title: this.$t('standardRegulationLibrary.marketListField.dynamicType'),
align: 'center',
width: 180,
dataIndex: 'dynamicType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 主控部门
title: this.$t('standardRegulationLibrary.marketListField.mainControlDepartment'),
@@ -414,7 +415,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'mainDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 关联部门
title: this.$t('standardRegulationLibrary.marketListField.relatedDepartment'),
@@ -428,31 +429,31 @@ export default {
align: 'center',
width: 180,
dataIndex: 'associateDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 批量限制
title: this.$t('standardRegulationLibrary.marketListField.batchRestriction'),
align: 'center',
width: 180,
dataIndex: 'batchLimit_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 自动驾驶等级
title: this.$t('standardRegulationLibrary.marketListField.automaticDrivingLevel'),
align: 'center',
width: 180,
dataIndex: 'autopilotLevel_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 要求类型
title: this.$t('standardRegulationLibrary.marketListField.requirementType'),
align: 'center',
width: 180,
dataIndex: 'requireType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 备注
title: this.$t('remarks'),
title: this.$t('standardRegulationLibrary.marketListField.remarks'),
align: 'center',
width: 180,
dataIndex: 'remark',
@@ -35,6 +35,7 @@
:placeholder="$t('pleaseSelect')+$t('standardRegulationLibrary.marketRegulationsList.countryRegion')"
show-search
allowClear
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:filterTreeNode="filterTreeOption"
/>
</a-form-item>
@@ -152,7 +153,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'country_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 清单编号
title: this.$t('standardRegulationLibrary.marketRegulationsList.listNumber'),
@@ -173,7 +174,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'drivePosition_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 清单版本
title: this.$t('standardRegulationLibrary.marketRegulationsList.listVersion'),
@@ -201,7 +202,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'manifestStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -66,6 +66,7 @@
:tree-data="countryOptions"
tree-checkable
treeCheckStrictly
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:placeholder="$t('pleaseSelect')+$t('standardRegulationLibrary.marketListField.applicableCountryRegion')" />
</a-form-item>
<!-- 认证对象 -->
@@ -136,8 +137,8 @@
v-decorator.trim="[ 'requireType', validatorRules.requireType ]" />
</a-form-item>
<!-- 备注 -->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('remarks')">
<a-input :placeholder="$t('pleaseEnter') + $t('remarks')"
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('standardRegulationLibrary.marketListField.remarks')">
<a-input :placeholder="$t('pleaseEnter') + $t('standardRegulationLibrary.marketListField.remarks')"
:maxLength="50"
v-decorator.trim="[ 'remark', validatorRules.remark ]" />
</a-form-item>
@@ -303,7 +304,7 @@ export default {
this.form.setFieldsValue(pick(this.model, 'standardNumber', 'standardName', 'standardEnglishName',
'type', 'newProductImplDate', 'newAuthImplDate', 'registrationDate', 'country',
'authenticationObject', 'certifyTheDeliverables', 'mainDept', 'mainDeptProfMode', 'associateDept',
'associateDeptProfMode', 'applicableVehicle', 'dynamicType', 'batchLimit', 'autopilotLevel', 'requireType'))
'associateDeptProfMode', 'applicableVehicle', 'dynamicType', 'batchLimit', 'autopilotLevel', 'requireType', 'remark'))
})
},
getCountryOption () {
@@ -417,6 +417,10 @@ export default {
background-color: #e6f4ff !important;
}
// 日期选择框 右侧重叠的问题
/deep/ .ant-calendar-picker-input.ant-input {
padding-right: 0;
}
/deep/ .table-page-search-wrapper .ant-form-inline .ant-form-item > .ant-form-item-label {
min-width: 60px;
}
@@ -63,7 +63,7 @@ export default {
data () {
return {
title: this.$t('newlyAdded'),
width: 600,
width: 800,
visible: false,
confirmLoading: false,
modal: {},
@@ -71,11 +71,11 @@ export default {
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 4 }
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 20 }
sm: { span: 18 }
},
validatorRules: {
// 节点名称
@@ -24,6 +24,7 @@
:tree-data="applicableMarketList"
tree-checkable
treeCheckStrictly
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:placeholder="$t('pleaseSelect') + $t('standardRegulationLibrary.standardMasterPlan.applicableMarket')"/>
</a-form-item>
</a-col>
@@ -114,14 +115,14 @@ export default {
align: 'center',
dataIndex: 'standardState_dictText',
width: 100,
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // 适用市场
title: this.$t('standardRegulationLibrary.standardMasterPlan.applicableMarket'),
align: 'center',
dataIndex: 'applicableMarket_dictText',
width: 100,
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -142,10 +143,17 @@ export default {
text: this.$t('view'),
clickEvent: 'handleShow',
has: 'standardMasterPlan:detail'
},
// 删除
{
text: this.$t('delete'),
clickEvent: 'handleDelete',
has: 'standardMasterPlan:delete'
}
],
url: {
list: '/laws/StandardMasterPlan/queryByPage',
delete: '/laws/StandardMasterPlan/delete',
exportXlsUrl: '/laws/StandardMasterPlan/exportExcel'
},
// 适用市场下拉
@@ -34,6 +34,7 @@
<s-tree-select v-decorator="['base.applicableMarket', validatorRules.applicableMarket]"
:getPopupContainer="triggerNode=> triggerNode.parentNode"
style="width: 100%"
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
@change="changeApplicableMarket"
:tree-data="applicableMarketList"
treeCheckStrictly
@@ -402,7 +403,7 @@
<a-form-item :wrapper-col="{span:22}">
<div style="text-align: right">
<a-button type="primary" @click="handleViewMarketList"
:disabled="!model.marketStandardId">
:disabled="!data[5].associationId">
{{ $t('standardRegulationLibrary.standardMasterPlan.viewMarketList') }}
</a-button>
</div>
@@ -468,7 +469,7 @@
<a-form-item :wrapper-col="{span:22}">
<div style="text-align: right">
<a-button type="primary" @click="handleViewTroubleshootingResults"
:disabled="!model.standardId">
:disabled="!data[6].actualCompletionDate">
{{ $t('standardRegulationLibrary.standardMasterPlan.viewTroubleshootingResults') }}
</a-button>
</div>
@@ -600,8 +601,9 @@ import StandardResolutionSheetModal
from '@views/standardRegulationLibrary/foreignStandard/detail/modules/StandardResolutionSheetModal'
import { getFormDictTreeList } from '@api/api'
import STreeSelect from '@comp/STreeSelect'
import { filterObj } from '@/utils/util'
// 初始化data数组,默认9个对象中有type1-9
const initDataArr = () => new Array(9).fill(0).map((_, i) => ({ type: i + 1 }))
export default {
name: 'StandardMasterPlanModal',
components: { STreeSelect, StandardResolutionSheetModal, UserSelection, StandardSelection },
@@ -615,7 +617,7 @@ export default {
disableSubmit: false,
model: {},
// 默认9个对象,type 1:信息输入 2:文本入库 3:导入通知 4:法规解读 5:法规宣贯 6:市场法规清单更新 7:法规符合性排查 8:通用文件整改计划 9:车型整改
data: new Array(9).fill(0).map((_, i) => ({ type: i + 1 })),
data: initDataArr(),
modelType: '',
validatorRules: {
// 标准编号
@@ -698,29 +700,62 @@ export default {
}
},
methods: {
// 回显页面信息
// 新增回显页面信息
updatePageInfo () {
if (this.confirmLoading) {
return
}
const formData = this.form.getFieldsValue()
console.log('2适用市场', formData.base.applicableMarket)
if (formData.base.applicableMarket && this.model.standardId) {
this.confirmLoading = true
getStandardMasterPlanAddEcho({
applicableMarket: formData.base.applicableMarket,
standardId: this.model.standardId
}).then(res => {
if (res.success) {
const data = res.result || []
// 保留可输入字段
data.forEach(item => {
const canInputField = this.getCanInputField(Number(item.type))
const index = Number(item.type) - 1
// 删除可填写字段,防止覆盖
canInputField.forEach(field => delete item[field])
// 回显表单
this.form.setFieldsValue({
[`data[${index}]`]: Object.assign(formData.data[index], filterObj(item))
[`data[${index}]`]: Object.assign(formData.data[index], item)
})
// 存到页面
this.data[index] = Object.assign(this.data[index], filterObj(item))
this.data[index] = Object.assign(this.data[index], item)
})
}
}).finally(() => {
this.confirmLoading = false
})
}
},
/**
* 根据type获取可输入的字段
* @param type - 类型
*/
getCanInputField (type) {
switch (type) {
// 导入通知:是否涉及、责任人、计划完成日期
case 3:
return ['isInvolved', 'responsiblePerson', 'responsiblePerson_dictText', 'plannedCompletionDate']
// 导入通知:是否涉及、计划完成日期
case 4:
return ['isInvolved', 'plannedCompletionDate']
// 市场法规清单更新:是否涉及、计划完成日期
case 6:
return ['isInvolved', 'plannedCompletionDate']
// 法规符合性排查:是否涉及、责任人、计划完成日期
case 7:
return ['isInvolved', 'responsiblePerson', 'responsiblePerson_dictText', 'plannedCompletionDate']
default:
return []
}
},
// 获取国家地区、也是适用市场下拉
getCountryOption () {
getFormDictTreeList({ dictId: '1801130851452059649' }).then(res => {
@@ -787,7 +822,7 @@ export default {
close () {
this.form.resetFields()
this.model = {}
this.data = new Array(9).fill(0).map((_, i) => ({ type: i + 1 }))
this.data = initDataArr()
this.modelType = ''
this.disableSubmit = false
this.visible = false
@@ -848,7 +883,10 @@ export default {
* 适用市场改变
*/
changeApplicableMarket (value) {
this.updatePageInfo()
console.log('1适用市场', value)
this.$nextTick(() => {
this.updatePageInfo()
})
},
/**
* 选择用户得到用户名
@@ -907,7 +945,7 @@ export default {
path: '/standardRegulationLibrary/marketRegulationsList/marketRegulationsDetailPage',
query: {
title: this.$t('view'),
ids: this.model.marketStandardId
ids: this.data[5].associationId
}
})
},
@@ -941,6 +979,8 @@ export default {
}
</script>
<style scoped>
<style lang="less" scoped>
/deep/ .ant-select-tree-dropdown {
width: 100%;
}
</style>
+4 -3
View File
@@ -132,11 +132,11 @@ export default {
title: this.$t('operation'),
// dataIndex: 'action',
align: 'center',
width: 100,
width: 150,
scopedSlots: { customRender: 'action' }
}
],
canOpeFlag: process.env.VUE_APP_TAG_FLAG === '0', // 是否可以操作编辑和删除,开发环境可以
canOpeFlag: false, // process.env.VUE_APP_TAG_FLAG === '0', // 是否可以操作编辑和删除,开发环境可以
dict: '',
labelCol: {
xs: { span: 8 },
@@ -158,7 +158,8 @@ export default {
// 字典配置
{
text: this.$t('system.tag.dictionaryConfiguration'),
clickEvent: 'editDictItem'
clickEvent: 'editDictItem',
has: 'sys:dict:set'
},
// 编辑
{
+5 -3
View File
@@ -247,7 +247,8 @@ export default {
title: this.$t('status'),
align: 'center',
width: 80,
dataIndex: 'status_dictText'
dataIndex: 'status_dictText',
scopedSlots: { customRender: 'dictText' }
},
{
@@ -277,13 +278,13 @@ export default {
{
text: this.$t('roleManage.userBtn'),
clickEvent: 'handleOpen',
has: ''
has: 'sys:role:user'
},
// 授权
{
text: this.$t('roleManage.toGrantAuthorization'),
clickEvent: 'handlePerssion',
has: ''
has: 'sys:role:permission'
},
// 编辑
{
@@ -532,6 +533,7 @@ export default {
},
searchReset2 () {
this.queryParam2 = {}
this.onClearSelected2()
this.loadData2(1)
},
handleTableChange2 (pagination, filters, sorter) {
+3 -3
View File
@@ -63,9 +63,9 @@
<!--已读、未读状态-->
<template v-slot:readFlag="{text, record}">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text}}</template>
<template slot="title">{{ isChinese() ? text : record.readFlag_dictTextEn }}</template>
<div class="table-text" :class="{'agree-color': record.readFlag + '' === '1', 'reject-color': record.readFlag + '' === '0'}">
{{ text }}
{{ isChinese() ? text : record.readFlag_dictTextEn }}
</div>
</a-tooltip>
</template>
@@ -142,7 +142,7 @@ export default {
align: 'center',
dataIndex: 'msgCategory_dictText',
width: 150,
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('message.my.publisher'),
+33 -19
View File
@@ -172,6 +172,7 @@ import JTable from '@/components/jero/JTable'
import JSearchSelectTag from '@/components/dict/JSearchSelectTag'
import UploadHandStampModal from './modules/UploadHandStampModal'
import { isHasPermission } from '../../utils/hasPermission'
import { UserSource } from '../../enums/commonEnums'
export default {
name: 'UserList',
@@ -238,7 +239,8 @@ export default {
align: 'center',
width: 90,
dataIndex: 'sex_dictText',
sorter: true
sorter: true,
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('phoneNumber'),
@@ -274,7 +276,8 @@ export default {
title: this.$t('status'),
align: 'center',
width: 80,
dataIndex: 'status_dictText'
dataIndex: 'status_dictText',
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -302,28 +305,37 @@ export default {
{
text: this.$t('edit'),
clickEvent: 'handleEdit',
has: 'user:edit'
has: 'user:edit',
show: (record) => {
// IAM同步过来的不能编辑
return record.source !== UserSource.IAM.value
}
},
// 详情
{
text: this.$t('details'),
clickEvent: 'handleDetail',
has: ''
has: 'user:detail'
},
// 密码
{
text: this.$t('user.password'),
clickEvent: 'handleChangePassword',
has: '',
has: 'user:password',
show: (record) => {
return this.isDev
// IAM同步过来的不能编辑
return record.source !== UserSource.IAM.value
}
},
// 删除
{
text: this.$t('delete'),
clickEvent: 'handleDelete',
has: 'sys:user:sel'
has: 'sys:user:sel',
show: (record) => {
// IAM同步过来的不能删除
return record.source !== UserSource.IAM.value
}
},
// 冻结
{
@@ -331,7 +343,8 @@ export default {
clickEvent: 'handleFrozen',
has: 'user:edit',
show: (record) => {
return this.isDev && (record.status + '') === '1'
// IAM同步过来的不能编辑
return (record.status + '') === '1' && record.source !== UserSource.IAM.value
}
},
// 解冻
@@ -340,15 +353,16 @@ export default {
clickEvent: 'handleFrozen',
has: 'user:edit',
show: (record) => {
return this.isDev && (record.status + '') === '2'
// IAM同步过来的不能编辑
return (record.status + '') === '2' && record.source !== UserSource.IAM.value
}
},
// 上传手写章
{
text: this.$t('user.uploadHandStamp'),
clickEvent: 'handleUploadHandStamp',
has: 'user:uploadHandStamp'
}
// 上传手写章
// {
// text: this.$t('user.uploadHandStamp'),
// clickEvent: 'handleUploadHandStamp',
// has: 'user:uploadHandStamp'
// }
]
}
},
@@ -442,10 +456,10 @@ export default {
})
},
handleChangePassword (username) {
if (process.env.VUE_APP_CURRENT_SYSTEM === 'IAM') {
this.$message.warn('请前往IAM修改密码')
return
}
// if (process.env.VUE_APP_CURRENT_SYSTEM === 'IAM') {
// this.$message.warn('请前往IAM修改密码')
// return
// }
this.$refs.passwordmodal.show(username)
},
passwordModalOk () {
@@ -52,6 +52,14 @@
</div>
</template>
<template slot="link" slot-scope="{text}">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || global.emptyLine }}</template>
<div class="table-text can-click-table-text" v-if="text" @click="toLink(text)">{{ text }}</div>
<div v-else class="table-text">{{ global.emptyLine }}</div>
</a-tooltip>
</template>
<template v-slot:action="{text, record}">
<a @click="handleEdit(record)" v-has="'sys:friendshipLink:edit'">{{ $t('edit') }}</a>
<a-divider type="vertical" v-if="isHasPermission('sys:friendshipLink:edit') && isHasPermission('sys:friendshipLink:delete')" />
@@ -81,6 +89,11 @@ export default {
mixins: [JeroListMixin],
data () {
return {
/* 排序参数 */
isorter: {
column: 'sort',
order: 'asc'
},
columns: [
{
title: this.$t('serialNumber'),
@@ -135,7 +148,10 @@ export default {
}
},
methods: {
isHasPermission
isHasPermission,
toLink (href) {
window.open(href)
}
}
}
</script>
+10 -1
View File
@@ -43,6 +43,14 @@
:loading="loading"
@change="handleTableChange">
<!--增加数据字典双语翻译的插槽-->
<template slot="dictText" slot-scope="text, record, index, column">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</template>
<div class="table-text">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</div>
</a-tooltip>
</template>
<!-- 字符串超长截取省略号显示-->
<span slot="logContent" slot-scope="text">
<j-ellipsis :value="text" :length="40"/>
@@ -112,7 +120,8 @@ export default {
{
title: this.$t('log.logType'),
dataIndex: 'logType_dictText',
align: 'center'
align: 'center',
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('createTime'),
+10 -1
View File
@@ -48,6 +48,14 @@
:loading="loading"
@change="handleTableChange">
<!--增加数据字典双语翻译的插槽-->
<template slot="dictText" slot-scope="text, record, index, column">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</template>
<div class="table-text">{{ (isChinese() ? text : record[column.key + 'En']) || (isChinese() ? text : record[column.key + 'En']) === 0 ? (isChinese() ? text : record[column.key + 'En']) : global.emptyLine }}</div>
</a-tooltip>
</template>
<div slot="expandedRowRender" slot-scope="record" style="margin: 0">
<div style="margin-bottom: 5px"><a-badge status="success" style="vertical-align: middle;"/><span style="vertical-align: middle;">{{ $t('log.requestMethod') }}:{{ record.method }}</span></div>
<div><a-badge status="processing" style="vertical-align: middle;"/><span style="vertical-align: middle;">{{ $t('log.requestParam') }}:{{ record.requestParam }}</span></div>
@@ -127,7 +135,8 @@ export default {
{
title: this.$t('log.logType'),
dataIndex: 'logType_dictText',
align: 'center'
align: 'center',
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('createTime'),
+2 -1
View File
@@ -100,7 +100,8 @@ export default {
title: this.$t('user.gender'),
align: 'center',
width: 100,
dataIndex: 'sex_dictText'
dataIndex: 'sex_dictText',
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('phoneNumber'),
+55 -30
View File
@@ -65,12 +65,24 @@
:labelCol="labelCol"
:wrapperCol="wrapperCol"
v-show="!roleDisabled">
<j-multi-select-tag
<!--<j-multi-select-tag-->
<!-- :disabled="disableSubmit"-->
<!-- v-model="model.selectedroles"-->
<!-- :options="rolesOptions"-->
<!-- :placeholder="$t('pleaseSelect') + $t('role')">-->
<!--</j-multi-select-tag>-->
<a-select
:placeholder="$t('pleaseSelect') + $t('role')"
:disabled="disableSubmit"
v-model="model.selectedroles"
:options="rolesOptions"
:placeholder="$t('pleaseSelect') + $t('role')">
</j-multi-select-tag>
mode="tags"
:filter-option="filterOption"
>
<a-select-option v-for="item in rolesOptions" :key="item.value" :value="item.label">
{{ item.label }}
</a-select-option>
</a-select>
</a-form-model-item>
<!--部门分配-->
@@ -99,23 +111,23 @@
</a-form-model-item>
-->
<a-form-model-item :label="$t('user.identity')" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-model="model.userIdentity" @change="identityChange" :disabled="disableSubmit">
<a-radio :value="1">{{ $t('user.ordinaryUsers') }}</a-radio>
<a-radio :value="2">{{ $t('user.superior') }}</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item :label="$t('user.responsibleDepartment')"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
v-if="departIdShow===true">
<j-multi-select-tag
:disabled="disableSubmit"
v-model="model.departIds"
:options="nextDepartOptions"
:placeholder="$t('pleaseSelect') + $t('user.responsibleDepartment')">
</j-multi-select-tag>
</a-form-model-item>
<!-- <a-form-model-item :label="$t('user.identity')" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-radio-group v-model="model.userIdentity" @change="identityChange" :disabled="disableSubmit">-->
<!-- <a-radio :value="1">{{ $t('user.ordinaryUsers') }}</a-radio>-->
<!-- <a-radio :value="2">{{ $t('user.superior') }}</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-model-item>-->
<!-- <a-form-model-item :label="$t('user.responsibleDepartment')"-->
<!-- :labelCol="labelCol"-->
<!-- :wrapperCol="wrapperCol"-->
<!-- v-if="departIdShow===true">-->
<!-- <j-multi-select-tag-->
<!-- :disabled="disableSubmit"-->
<!-- v-model="model.departIds"-->
<!-- :options="nextDepartOptions"-->
<!-- :placeholder="$t('pleaseSelect') + $t('user.responsibleDepartment')">-->
<!-- </j-multi-select-tag>-->
<!-- </a-form-model-item>-->
<!-- update--end--autor:wangshuai-----date:20200108------for新增身份和负责部门------ -->
<!--手写章用于企标制修订流程最后一个节点在线编辑的手写章信息维护-->
<!--<a-form-model-item :label="$t('user.handStamp')" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
@@ -128,13 +140,21 @@
<!--</a-form-model-item>-->
<a-form-model-item :label="$t('user.gender')" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-select v-model="model.sex"
:placeholder="disableSubmit ? '' : $t('pleaseSelect') + $t('user.gender')"
:getPopupContainer="(target) => target.parentNode"
:disabled="disableSubmit">
<a-select-option :value="1">{{ $t('user.male') }}</a-select-option>
<a-select-option :value="2">{{ $t('user.female') }}</a-select-option>
</a-select>
<j-dict-select-tag
:placeholder="disableSubmit ? '' : $t('pleaseSelect') + $t('user.gender')"
:getPopupContainer="(target) => target.parentNode"
:disabled="disableSubmit"
v-model="model.sex"
dict-code="sex"
>
</j-dict-select-tag>
<!--<a-select v-model="model.sex"-->
<!-- :placeholder="disableSubmit ? '' : $t('pleaseSelect') + $t('user.gender')"-->
<!-- :getPopupContainer="(target) => target.parentNode"-->
<!-- :disabled="disableSubmit">-->
<!-- <a-select-option :value="1">{{ $t('user.male') }}</a-select-option>-->
<!-- <a-select-option :value="2">{{ $t('user.female') }}</a-select-option>-->
<!--</a-select>-->
</a-form-model-item>
<a-form-model-item :label="$t('user.mailbox')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="email">
@@ -270,6 +290,9 @@ export default {
}
},
methods: {
filterOption (input, option) {
return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
add () {
this.refresh()
this.validatorRules.phone = [{ validator: this.validatePhone }]
@@ -283,7 +306,7 @@ export default {
// 根据屏幕宽度自适应抽屉宽度
this.resetScreenSize()
that.model = Object.assign({}, {
selectedroles: '',
selectedroles: undefined,
selecteddeparts: ''
}, record)
// 身份为上级显示负责部门,否则不显示
@@ -344,7 +367,7 @@ export default {
getUserRoles (userid) {
queryUserRole({ userid: userid }).then((res) => {
if (res.success) {
this.model.selectedroles = res.result.join(',')
this.model.selectedroles = res.result
}
})
},
@@ -407,7 +430,9 @@ export default {
if (this.model.userIdentity !== 2) {
this.model.departIds = ''
}
if (Array.isArray(this.model.selectedroles)) {
this.model.selectedroles = this.model.selectedroles.join(',')
}
// 对密码、邮箱、手机号进行加密
const encrypt = new JSEncrypt()
encrypt.setPublicKey(that.rsaPublicKey)
@@ -136,6 +136,10 @@ export default {
permissionIds: that.checkedKeys.join(','),
lastpermissionIds: that.defaultCheckedKeys.join(',')
}
// 只勾选父节点确定后,再次打开点击父子关联时,节点只是回显,没有被真实勾上,这里需要拿到所有子集的id
if (!that.checkStrictly) {
params.permissionIds = that.collectAllRelatedKeys(this.treeData, [...that.checkedKeys]).join(',')
}
that.loading = true
console.log('请求参数:', params)
saveRolePermission(params).then((res) => {
@@ -166,6 +170,36 @@ export default {
console.log(this.defaultCheckedKeys)
})
})
},
/**
* 返回父子关联的keys
* @param tree - 树结构
* @param keys - 当前勾选的keys
* @return {any[]} - 返回所有父子关联的key
*/
collectAllRelatedKeys (tree, keys) {
const result = new Set() // 使用集合来避免重复
function findAndCollectNodes (nodes) {
for (const node of nodes) {
if (keys.includes(node.key)) {
collectAllDescendants(node)
} else if (node.children) {
findAndCollectNodes(node.children)
}
}
}
function collectAllDescendants (node) {
if (!result.has(node.key)) {
result.add(node.key)
}
if (node.children) {
for (const child of node.children) {
collectAllDescendants(child)
}
}
}
findAndCollectNodes(tree)
return Array.from(result)
}
},
watch: {
+1 -1
View File
@@ -72,7 +72,7 @@ const editIcons = ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'dif
const dataIcons = ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders']
const webIcons = ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping']
const logoIcons = ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo']
const selfIcons = ['icon-kucun_crm', 'icon-24gf-folderOpen', 'icon-qicheweixiu', 'icon-yujing', 'icon-shezhi', 'icon-shouye', 'icon-file-star', 'icon-file-set', 'icon-a-iconfontgerenzhongxin1', 'icon-yingyong', 'icon-fill-message-square']
const selfIcons = ['icon-kucun_crm', 'icon-24gf-folderOpen', 'icon-qicheweixiu', 'icon-yujing', 'icon-shezhi', 'icon-shouye', 'icon-file-star', 'icon-file-set', 'icon-a-iconfontgerenzhongxin1', 'icon-yingyong', 'icon-fill-message-square', 'icon-xiaoxi-mian--', 'icon-yun', 'icon-rizhi']
export default {
name: 'Icons',
props: {
@@ -100,10 +100,10 @@
</a-form-model-item>
<!--是否必填-->
<!--<a-form-model-item :label="$t('system.tag.required')" prop="fieldMustInput">-->
<!-- <j-dict-select-tag type="list" v-model="form.fieldMustInput" dictCode="yn"-->
<!-- :placeholder="$t('pleaseSelect') + $t('system.tag.required')" />-->
<!--</a-form-model-item>-->
<a-form-model-item :label="$t('system.tag.required')" prop="fieldMustInput">
<j-dict-select-tag type="list" v-model="form.fieldMustInput" dictCode="yn"
:placeholder="$t('pleaseSelect') + $t('system.tag.required')" />
</a-form-model-item>
<!--使用范围-->
<!--<a-form-model-item :label="$t('system.tag.usableRange')" prop="usableRange">-->
<!-- <j-multi-select-tag v-model="form.usableRange"-->
@@ -53,24 +53,25 @@
</a-form-model-item>
</a-col>
<!-- 字段名称 正式环境 需要注释掉开发环境可以先留着方便使用-->
<a-col :span="24" v-if="canOpeFlag">
<a-form-model-item :label="$t('system.tag.fieldName')" prop="dbFieldName">
<a-input
v-model.trim="form.dbFieldName"
:placeholder="$t('pleaseEnter') + $t('system.tag.fieldName')"
:maxLength="60"
></a-input>
</a-form-model-item>
</a-col>
<!-- <a-col :span="24" v-if="canOpeFlag">-->
<!-- <a-form-model-item :label="$t('system.tag.fieldName')" prop="dbFieldName">-->
<!-- <a-input-->
<!-- v-model.trim="form.dbFieldName"-->
<!-- :placeholder="$t('pleaseEnter') + $t('system.tag.fieldName')"-->
<!-- :maxLength="60"-->
<!-- ></a-input>-->
<!-- </a-form-model-item>-->
<!-- </a-col>-->
<!-- 属性类型-->
<a-col :span="24">
<a-form-model-item :label="$t('system.tag.attributeType')" prop="fieldShowType">
<j-dict-select-tag
type="list" v-model="form.fieldShowType"
dictCode="field_show_type"
type="list"
v-model="form.fieldShowType"
:placeholder="$t('pleaseSelect') + $t('system.tag.attributeType')"
:disabled="disabledEdit"
show-search
:options="fieldShowTypeOptions"
@change="fieldShowTypeChange"
/>
<!-- @change="form.dictId = undefined"-->
@@ -196,7 +197,7 @@
<script>
import { addTag, editTag, getShowAreaData, queryDictName } from '../../../../api/api'
import { addTag, ajaxGetDictItems, editTag, getDictByCode, getShowAreaData, queryDictName } from '../../../../api/api'
import JDictSelectTag from '../../../../components/dict/JDictSelectTag'
import { FieldType, TagsAttributeTypeEnums, TagsTypeEnums } from '../../../../enums/commonEnums'
@@ -257,7 +258,7 @@ export default {
{
required: true,
message: this.$t('pleaseEnter') + this.$t('system.tag.attributeNameEnglish'),
trigger: 'change'
trigger: 'blur'
},
// { max: 50, message: this.$t('cantExeed') + '50' + this.$t('characters'), trigger: 'blur' },
{ validator: this.test }
@@ -326,7 +327,8 @@ export default {
contentOption: [],
contentOptionSelect: [],
contentOptionTree: [],
moduleArr: TagsTypeEnums.getItemList()
moduleArr: TagsTypeEnums.getItemList(),
fieldShowTypeOptions: [] //
}
},
watch: {
@@ -334,7 +336,17 @@ export default {
this.initFlags(val)
}
},
created () {
this.getFieldShowTypeOptions()
},
methods: {
getFieldShowTypeOptions () {
ajaxGetDictItems('field_show_type').then(res => {
if (res.success) {
this.fieldShowTypeOptions = res.result.filter(item => ![FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value, FieldType.TREE_MODAL_SELECT_SEARCH_CHILD.value].includes(item.value))
}
})
},
filterOption (input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
@@ -391,6 +403,10 @@ export default {
if (formData.fieldShowType === FieldType.TEXTAREA.value) {
formData.dbLength = formData.dbLength || 500
}
// treeFirstHref
if (formData.fieldShowType === FieldType.TREE_MODAL_SELECT.value) {
formData.treeFirstHref = '/laws/dictTree/page'
}
let Func = addTag
if (this.isEdit) {
Func = editTag
@@ -445,7 +461,7 @@ export default {
val = val + ''
// this.contentFlag=val
//
if (val === FieldType.TREE.value || val === FieldType.TREE_SINGLE.value || val === FieldType.TREE_MODAL_SELECT.value) {
if (val === FieldType.TREE.value || val === FieldType.TREE_SINGLE.value || val === FieldType.TREE_MODAL_SELECT.value || val === FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value) {
this.contentOption = [...this.contentOptionTree]
this.isTagContent = true
} else if (val === FieldType.OPTION_SINGLE.value || val === FieldType.OPTION_MORE.value) {
@@ -491,7 +507,7 @@ export default {
}
})
//
if (this.form.fieldShowType === FieldType.TREE.value || this.form.fieldShowType === FieldType.TREE_SINGLE.value || this.form.fieldShowType === FieldType.TREE_MODAL_SELECT.value) {
if (this.form.fieldShowType === FieldType.TREE.value || this.form.fieldShowType === FieldType.TREE_SINGLE.value || this.form.fieldShowType === FieldType.TREE_MODAL_SELECT.value || this.form.fieldShowType === FieldType.TREE_MODAL_SELECT_SEARCH_DIFF.value) {
this.contentOption = [...this.contentOptionTree]
this.isTagContent = true
} else if (this.form.fieldShowType === FieldType.OPTION_SINGLE.value || this.form.fieldShowType === FieldType.OPTION_MORE.value) {
@@ -233,7 +233,7 @@ export default {
dictId: this.dictId,
isTagDict: 1,
pageNo: 1,
pageSize: 10
pageSize: 1000
}
getDictTreeList(params).then(res => {
if (res.success) {
@@ -30,10 +30,10 @@
</div>
<div class="table-operator">
<!--新增-->
<!-- <a-button icon="plus" type="primary" v-if="record.isReadOnly === IsReadOnlyEnums.configurable.value || record.isReadOnly === IsReadOnlyEnums.subConfigurable.value" @click="handleAdd" v-has="'sys:dict:operation'">{{ $t('newlyAdded') }}</a-button>-->
<a-button icon="plus" type="primary" @click="handleAdd" v-has="'sys:dict:operation'">{{ $t('newlyAdded') }}</a-button>
<!-- <a-button icon="plus" type="primary" v-if="dictRecord.isReadOnly === IsReadOnlyEnums.configurable.value || dictRecord.isReadOnly === IsReadOnlyEnums.subConfigurable.value" @click="handleAdd" v-has="'sys:dict:operation'">{{ $t('newlyAdded') }}</a-button>-->
<a-button icon="plus" type="primary" @click="handleAdd" v-if="dictRecord.isReadOnly === IsReadOnlyEnums.configurable.value || dictRecord.isReadOnly === IsReadOnlyEnums.subConfigurable.value" v-has="'sys:dict:operation'">{{ $t('newlyAdded') }}</a-button>
<!--批量删除-->
<a-button type="primary" icon="delete" ghost v-if="record.isReadOnly === IsReadOnlyEnums.configurable.value || record.isReadOnly === IsReadOnlyEnums.subConfigurable.value" @click="batchDel" v-has="'sys:dict:operation'">{{ $t('batchDelete') }}</a-button>
<a-button type="primary" icon="delete" ghost v-if="dictRecord.isReadOnly === IsReadOnlyEnums.configurable.value || dictRecord.isReadOnly === IsReadOnlyEnums.subConfigurable.value" @click="batchDel" v-has="'sys:dict:operation'">{{ $t('batchDelete') }}</a-button>
</div>
<j-table
@@ -84,7 +84,7 @@ export default {
title: this.$t('system.tag.dictionaryConfiguration'),
width: 1000,
confirmLoading: false,
record: {},
dictRecord: {}, //
commonColumns: [
{
//
@@ -175,8 +175,8 @@ export default {
},
methods: {
show (record) {
this.record = record
this.attributeType = Number(this.record.attributeType) //
this.dictRecord = record
this.attributeType = Number(this.dictRecord.attributeType) //
//
if (this.attributeType === TagsAttributeTypeEnums.SELECT.value) {
this.url = { ...this.dictUrl }
@@ -202,7 +202,7 @@ export default {
this.onClose()
},
handleAdd () {
this.$refs.modalForm.add(this.record.id)
this.$refs.modalForm.add(this.dictRecord.id)
this.$refs.modalForm.title = this.$t('newlyAdded')
this.$refs.modalForm.disableSubmit = false
},
@@ -103,7 +103,7 @@ export default {
align: 'center',
width: 100,
dataIndex: 'fieldShowType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('system.tag.fieldLength'),
@@ -127,7 +127,7 @@ export default {
width: 170
}
],
canOpeFlag: process.env.VUE_APP_TAG_FLAG === '0', //
canOpeFlag: true, // process.env.VUE_APP_TAG_FLAG === '0', //
operationList: [
//
{
+2 -2
View File
@@ -136,7 +136,7 @@ export default {
title: this.$t('system.tag.attributeType'),
width: 100,
dataIndex: 'fieldShowType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('system.tag.fieldLength'),
@@ -154,7 +154,7 @@ export default {
title: this.$t('system.tag.showArea'),
width: 100,
dataIndex: 'showArea_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
+4 -4
View File
@@ -96,7 +96,7 @@ export default {
align: 'center',
width: 100,
dataIndex: 'attributeType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('system.tag.describe'),
@@ -120,7 +120,7 @@ export default {
width: 100
}
],
canOpeFlag: process.env.VUE_APP_TAG_FLAG === '0', //
// canOpeFlag: process.env.VUE_APP_TAG_FLAG === '0', //
// dataSource: [],
url: {
list: 'sys/dict/tagDictPage',
@@ -150,7 +150,7 @@ export default {
clickEvent: 'handleEdit',
has: 'sys:dict:operation',
show: (record) => {
return (this.canOpeFlag || record.isReadOnly === IsReadOnlyEnums.configurable.value)
return (record.isReadOnly === IsReadOnlyEnums.configurable.value)
}
},
//
@@ -159,7 +159,7 @@ export default {
clickEvent: 'handleDelete',
has: 'sys:dict:operation',
show: (record) => {
return (this.canOpeFlag || record.isReadOnly === IsReadOnlyEnums.configurable.value)
return (record.isReadOnly === IsReadOnlyEnums.configurable.value)
}
}
]
+1 -1
View File
@@ -26,7 +26,7 @@ export default {
tabArr: [
{ name: '外来标准法规', showText: this.$t('system.tag.foreignStandardRegulations'), value: 1, comp: StandardList },
{ name: '企业标准', showText: this.$t('system.tag.enterpriseStandards'), value: 3, comp: StandardList },
{ name: '条款拆分', showText: this.$t('system.tag.clauseSplitting'), value: 4, comp: ClauseSplittingList }
// { name: '', showText: this.$t('system.tag.clauseSplitting'), value: 4, comp: ClauseSplittingList }
]
}
},
+142 -250
View File
@@ -1,101 +1,76 @@
<template>
<div class="main">
<a-form v-if="!mobile" :form="form" class="user-layout-login" ref="formLogin" id="formLogin">
<a-form :form="form" class="user-layout-login" ref="formLogin" id="formLogin" hideRequiredMark>
<div class="user-box">
<span class="title">用户登录</span>
<a-row>
<a-col :span="3"></a-col>
<a-col :span="18">
<a-form-item>
<div class="lang-box">
<a-dropdown :trigger="['click']">
<div class="lang-btn">
<a-icon type="global" style="font-size: 16px;" />
<span style="margin: 0 4px">{{ $t('login.language') }}</span>
<a-icon type="down" />
</div>
<a-menu slot="overlay" style="width: 100%;" @click="changeLang">
<a-menu-item key="zh-cn">中文</a-menu-item>
<a-menu-item key="en-us">English</a-menu-item>
</a-menu>
</a-dropdown>
</div>
<span class="title">{{ $t('login.userLogin') }}</span>
<a-row style="width: 80%; margin: auto;">
<a-col>
<a-form-item :label="$t('login.account')">
<a-input
size="large"
v-decorator="['username',{initialValue:'', rules: validatorRules.username.rules,validateTrigger: 'blur'}]"
v-decorator="['username',validatorRules.username]"
type="text"
placeholder="请输入帐号">
<a-icon slot="prefix" type="user" :style="{ color: '#B3B7C2',fontSize:'20px' }" />
:placeholder="$t('pleaseEnter') + $t('login.account')">
</a-input>
</a-form-item>
</a-col>
<a-col :span="3"></a-col>
</a-row>
<a-row>
<a-col :span="3"></a-col>
<a-col :span="18">
<a-form-item>
<a-col>
<a-form-item :label="$t('login.password')">
<a-input
v-decorator="['password',{initialValue:'', rules: validatorRules.password.rules,validateTrigger: 'blur'}]"
v-decorator="['password',validatorRules.password]"
size="large"
:type="passwordType"
:type="passwordStatus ? 'text' : 'password'"
autocomplete="false"
placeholder="请输入密码"
:placeholder="$t('pleaseEnter') + $t('login.password')"
@paste.native.capture.prevent="handleOperate"
>
<a-icon title="显示密码"
@click="passwordType='text'"
<a-icon :title="$t('login.showPassword')"
@click="passwordStatus = !passwordStatus"
slot="suffix"
v-if="passwordType==='password'"
type="eye"
:type="passwordStatus ? 'eye' : 'eye-invisible'"
:style="{ color: '#B3B7C2',fontSize:'20px' }" />
<a-icon title="隐藏密码"
@click="passwordType='password'"
slot="suffix"
v-else
type="eye-invisible"
:style="{ color: '#B3B7C2',fontSize:'20px' }" />
<a-icon slot="prefix" type="lock" :style="{ color: '#B3B7C2',fontSize:'20px' }" />
</a-input>
</a-form-item>
</a-col>
<a-col :span="3"></a-col>
</a-row>
<a-row style="margin-bottom: 2%;">
<a-col :span="3"></a-col>
<a-col :span="12">
<a-form-item>
<a-col>
<a-form-item :label="$t('login.code')">
<a-input
class="input-code"
v-decorator="['inputCode',validatorRules.inputCode]"
size="large"
type="text"
@change="inputCodeChange"
autocomplete="off"
placeholder="请输入验证码">
<a-icon slot="prefix" type="safety" :style="{ color: '#B3B7C2',fontSize:'20px'}" />
:placeholder="$t('pleaseEnter') + $t('login.code')">
<template slot="suffix">
<img v-if="requestCodeSuccess"
style="margin: 6px; height: 36px;"
:src="randCodeImage"
@click="handleChangeCheckCode"
alt="" />
<img v-else
style="margin: 6px; height: 36px;"
src="../../assets/checkcode.png"
@click="handleChangeCheckCode"
alt="" />
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="6" style="text-align: right">
<img v-if="requestCodeSuccess"
style="margin-top: 2px;"
:src="randCodeImage"
@click="handleChangeCheckCode"
alt="" />
<img v-else
style="margin-top: 2px;"
src="../../assets/checkcode.png"
@click="handleChangeCheckCode"
alt="" />
</a-col>
<a-col :span="3"></a-col>
</a-row>
<!--<a-row style="margin-bottom: 2%;">-->
<!-- <a-col :span="3"></a-col>-->
<!-- <a-col :span="7">-->
<!-- <a-form-item>-->
<!-- <a-checkbox v-decorator="['rememberMe', {initialValue: true, valuePropName: 'checked'}]">自动登录</a-checkbox>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :span="6"></a-col>-->
<!-- <a-col :span="5" style="text-align: right;color: #1891FF;">-->
<!-- <a-form-item>-->
<!-- <router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">-->
<!-- 忘记密码-->
<!-- </router-link>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!--</a-row>-->
<a-row class="login-btn">
<a-col :span="3"></a-col>
<a-col :span="18">
<a-col class="login-btn">
<a-form-item>
<a-button
block
@@ -105,102 +80,7 @@
:loading="loginBtn"
@click.stop.prevent="handleSubmit"
:disabled="loginBtn">
{{ loginBtn ? '登录中' : '登录' }}
</a-button>
</a-form-item>
</a-col>
<a-col :span="3"></a-col>
</a-row>
</div>
</a-form>
<a-form v-if="mobile"
:form="form"
class="user-layout-login user-layout-login-mobile"
ref="formLogin"
id="formLogin">
<div class="user-box user-box-mobile">
<a-row>
<a-col :span="24">
<a-form-item>
<a-input
size="large"
v-decorator="['username',{initialValue:'', rules: validatorRules.username.rules,validateTrigger: 'blur'}]"
type="text"
placeholder="请输入帐号">
<a-icon slot="prefix" type="user" :style="{ color: '#B3B7C2',fontSize:'20px' }" />
</a-input>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-form-item>
<a-input
v-decorator="['password',{initialValue:'', rules: validatorRules.password.rules,validateTrigger: 'blur'}]"
size="large"
type="password"
autocomplete="false"
placeholder="请输入密码"
>
<a-icon slot="prefix" type="lock" :style="{ color: '#B3B7C2',fontSize:'20px' }" />
</a-input>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="14">
<a-form-item>
<a-input
v-decorator="['inputCode',validatorRules.inputCode]"
size="large"
type="text"
@change="inputCodeChange"
placeholder="请输入验证码">
<a-icon slot="prefix" type="safety" :style="{ color: '#B3B7C2',fontSize:'20px'}" />
</a-input>
</a-form-item>
</a-col>
<a-col :span="10" style="text-align: right">
<img v-if="requestCodeSuccess"
style="margin-top: 2px;"
:src="randCodeImage"
@click="handleChangeCheckCode"
alt="" />
<img v-else
style="margin-top: 2px;"
src="../../assets/checkcode.png"
@click="handleChangeCheckCode"
alt="" />
</a-col>
</a-row>
<a-row>
<a-col :span="10">
<a-form-item>
<a-checkbox v-decorator="['rememberMe', {initialValue: true, valuePropName: 'checked'}]">自动登录
</a-checkbox>
</a-form-item>
</a-col>
<a-col :span="4"></a-col>
<a-col :span="9" style="text-align: right;color: #1891FF;">
<a-form-item>
<router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">
忘记密码
</router-link>
</a-form-item>
</a-col>
</a-row>
<a-row class="login-btn">
<a-col :span="24">
<a-form-item>
<a-button
block
size="large"
type="primary"
htmlType="submit"
:loading="loginBtn"
@click.stop.prevent="handleSubmit"
:disabled="loginBtn">
{{ loginBtn ? '登录中' : '登录' }}
{{ $t('login.login') }}
</a-button>
</a-form-item>
</a-col>
@@ -211,14 +91,14 @@
</template>
<script>
import { mapActions } from 'vuex'
import { timeFix } from '@/utils/util'
import { isMobile, timeFix } from '@/utils/util'
import Vue from 'vue'
import { ACCESS_TOKEN/* , ENCRYPTED_STRING, USER_INFO */ } from '@/store/mutation-types'
import { postAction, getAction } from '@/api/manage'
import { getRSAPublicKey } from '@/utils/encryption.js'
import { JSEncrypt } from 'jsencrypt'
// const Base64 = require('js-base64').Base64
import moment from 'moment/moment'
export default {
components: {},
@@ -236,30 +116,28 @@ export default {
},
validatorRules: {
username: {
rules: [{
required: true,
message: '请输入用户名!'
}, { validator: this.handleUsernameOrEmail }]
rules: [
{ required: true, message: this.$t('pleaseEnter') + this.$t('login.account') },
{ validator: this.handleUsernameOrEmail }
],
validateTrigger: 'blur'
},
password: {
rules: [{
required: true,
message: '请输入密码!',
validator: 'click'
}]
rules: [
{ required: true, message: this.$t('pleaseEnter') + this.$t('login.password'), validator: 'click' }
],
validateTrigger: 'blur'
},
mobile: { rules: [{ validator: this.validateMobile }] },
captcha: {
rule: [{
required: true,
message: '请输入验证码!'
}]
rule: [
{ required: true, message: this.$t('pleaseEnter') + this.$t('login.code') }
]
},
inputCode: {
rules: [{
required: true,
message: '请输入验证码!'
}]
rules: [
{ required: true, message: this.$t('pleaseEnter') + this.$t('login.code') }
]
}
},
velorifiedCode: '',
@@ -270,7 +148,7 @@ export default {
randCodeImage: '',
requestCodeSuccess: false,
rsaPublicKey: '',
passwordType: 'password' // passwordType : password , text
passwordStatus: false //
}
},
created () {
@@ -282,6 +160,12 @@ export default {
},
methods: {
...mapActions(['Login', 'Logout', 'PhoneLogin']),
changeLang ({ key }) {
localStorage.setItem('language', key)
moment.locale(key)
this.$i18n.locale = key
this.$root.Bus.$emit('switchLanguage', key)
},
handleUsernameOrEmail (rule, value, callback) {
const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
if (regex.test(value)) {
@@ -329,7 +213,7 @@ export default {
const that = this
this.form.validateFields(['mobile'], { force: true }, (err, values) => {
if (!values.mobile) {
that.cmsFailed('请输入手机号')
that.cmsFailed(this.$t('pleaseEnter') + this.$t('login.phone'))
} else if (!err) {
this.state.smsSendBtn = true
const interval = window.setInterval(() => {
@@ -340,7 +224,7 @@ export default {
}
}, 1000)
const hide = this.$message.loading('验证码发送中..', 0)
const hide = this.$message.loading(this.$t('login.codeSending') + '..', 0)
const smsParams = {}
smsParams.mobile = values.mobile
smsParams.smsmode = '0'
@@ -391,21 +275,21 @@ export default {
this.$router.push({ path: '/' }).catch((/* res */) => {
})
this.$notification.success({
message: '欢迎',
description: `${timeFix()},欢迎回来`
message: this.$t('login.welcome'),
description: `${timeFix()}${this.$t('login.welcomeBack')}`
})
},
cmsFailed (err) {
this.$notification.error({
message: '验证码发送失败',
message: this.$t('login.codeSendFail'),
description: err,
duration: 4
})
},
requestFailed (err) {
this.$notification.error({
message: '登录失败',
description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
message: this.$t('login.loginFailMessage'),
description: ((err.response || {}).data || {}).message || err.message || this.$t('login.requestFailMessage'),
duration: 4
})
@@ -422,14 +306,14 @@ export default {
if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)) {
callback()
} else {
callback(new Error('您的手机号码格式不正确!'))
callback(new Error(this.$t('login.checkPhoneMessage')))
}
},
validateInputCode (rule, value, callback) {
if (!value || this.verifiedCode === this.inputCodeContent) {
callback()
} else {
callback(new Error('您输入的验证码不正确!'))
callback(new Error(this.$t('login.checkCodeMessage')))
}
},
generateCode (value) {
@@ -453,31 +337,6 @@ export default {
}
}
}
//
function isMobile () {
const userAgentInfo = navigator.userAgent
const mobileAgents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']
let mobileFlag = false
// userAgent
for (let v = 0; v < mobileAgents.length; v++) {
if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
mobileFlag = true
break
}
}
const screenWidth = window.screen.width
const screenHeight = window.screen.height
//
if (screenWidth < 500 && screenHeight < 800) {
mobileFlag = true
}
return mobileFlag
}
</script>
<style lang="less" scoped>
@@ -485,22 +344,20 @@ function isMobile () {
padding-left: 40px;
}
.ant-row {
margin-bottom: 4%;
}
.main {
height: 100%;
background-image: url("~@/assets/image/loginBg.png");
background-size: cover;
background-position: center;
.user-layout-login {
z-index: 99;
width: 24%;
height: 50%;
padding: 3% 0 3% 0;
width: 28%;
height: fit-content;
padding: 30px 30px 70px;
min-width: 332px;
min-height: 460px;
background: #fff;
border-radius: 20px;
position: absolute;
right: 8%;
top: 50%;
@@ -510,41 +367,76 @@ function isMobile () {
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
justify-content: space-between;
flex-direction: column;
.lang-box {
display: flex;
justify-content: flex-end;
align-items: center;
font-size: 14px;
}
.title {
display: block;
color: #1891FF;
font-size: 28px;
font-weight: 500;
margin: 0 0 5% 0;
margin: 18px 0 48px 0;
text-align: center;
font-family: PingFang SC, PingFang SC, sans-serif;
font-weight: 600;
font-size: 30px;
color: rgba(0,0,0,0.9);
line-height: 35px;
}
/deep/.ant-input-lg {
height: 48px;
}
/deep/ .ant-form-item-label {
line-height: 16px;
margin-bottom: 12px;
}
.input-code {
/deep/ input {
padding-right: 130px;
}
/deep/ .ant-input-suffix {
right: 6px;
}
}
.login-btn {
margin-bottom: 0;
font-size: 10px;
margin-top: 48px;
/deep/button {
height: 58px;
font-weight: 500;
font-size: 18px;
}
}
}
}
// 1366
@media screen and (max-width: 1366px) {
.user-layout-login {
width: 30%;
padding: 20px 30px;
.user-layout-login-mobile {
right: 0;
width: 100%;
min-width: 0 !important;
height: 46% !important;
background: transparent;
min-height: 0;
padding: 0 2rem 0 2rem;
position: absolute;
top: 50%;
margin-top: 6rem;
transform: translateY(-50%);
.user-box {
.title {
margin: 18px 0 40px 0;
font-size: 30px;
line-height: 35px;
}
.ant-row {
margin-bottom: 0;
/deep/ .ant-input-lg {
height: 40px;
}
.login-btn {
margin-top: 28px;
/deep/ button {
height: 48px;
font-size: 16px;
}
}
}
}
}
}
+2 -2
View File
@@ -147,8 +147,8 @@ export default {
},
requestFailed (err) {
this.$notification.error({
message: '登录失败',
description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
message: this.$t('login.loginFailMessage'),
description: ((err.response || {}).data || {}).message || err.message || this.$t('login.requestFailMessage'),
duration: 4
})
this.loginBtn = false
+5 -5
View File
@@ -86,15 +86,15 @@ export default {
this.$router.replace({ path: INDEX_MAIN_PAGE_PATH })
// TODO
this.$notification.success({
message: '欢迎',
description: `${timeFix()},欢迎回来`
message: this.$t('login.welcome'),
description: `${timeFix()}${this.$t('login.welcomeBack')}`
})
},
requestFailed (err) {
this.$error({
title: '登录失败',
content: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
okText: '重新登陆',
title: this.$t('login.loginFailMessage'),
content: ((err.response || {}).data || {}).message || err.message || this.$t('login.requestFailMessage'),
okText: this.$t('login.reLogin'),
onOk () {
window.location.reload()
},
@@ -61,7 +61,10 @@
<template v-if="currentNode !== 1">
<!-- 清单编号 -->
<a-col :span="24">
<a-form-item :labelCol="longLabelCol" :wrapperCol="longWrapperCol" :label="$t('listNumber')" :colon="formItemColon">
<a-form-item
:labelCol="$i18n.locale === EN ? longLabelColEn : longLabelCol"
:wrapperCol="$i18n.locale === EN ? longWrapperColEn : longWrapperCol"
:label="$t('listNumber')" :colon="formItemColon">
<a-input placeholder=""
disabled
:maxLength="50"
@@ -70,7 +73,10 @@
</a-col>
<!-- 清单名称 -->
<a-col :span="24">
<a-form-item :labelCol="longLabelCol" :wrapperCol="longWrapperCol" :label="$t('listName')" :colon="formItemColon">
<a-form-item
:labelCol="$i18n.locale === EN ? longLabelColEn : longLabelCol"
:wrapperCol="$i18n.locale === EN ? longWrapperColEn : longWrapperCol"
:label="$t('listName')" :colon="formItemColon">
<a-input placeholder=""
disabled
:maxLength="50"
@@ -79,7 +85,10 @@
</a-col>
<!-- 国家/地区 -->
<a-col :span="24">
<a-form-item :labelCol="longLabelCol" :wrapperCol="longWrapperCol" :label="$t('countryRegion')" :colon="formItemColon">
<a-form-item
:labelCol="$i18n.locale === EN ? longLabelColEn : longLabelCol"
:wrapperCol="$i18n.locale === EN ? longWrapperColEn : longWrapperCol"
:label="$t('countryRegion')" :colon="formItemColon">
<s-tree-select v-decorator="['country', validatorRules.country]"
:getPopupContainer="triggerNode=> triggerNode.parentNode"
style="width: 100%"
@@ -571,21 +580,17 @@ export default {
},
//
userSelectModalChange (userIds) {
this.approvalInfoForm.validateFields((err, values) => {
if (!err) {
this.loading = true
const param = Object.assign({}, values)
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
this.loading = true
const param = {}
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
},
@@ -51,6 +51,7 @@
tree-checkable
treeCheckStrictly
disabled
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:placeholder="disabled ? '' : $t('autoTakeout')" />
</a-form-model-item>
</div>
@@ -213,21 +214,21 @@ export default {
align: 'center',
width: 180,
dataIndex: 'country_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.applicableVehicleType'),
align: 'center',
width: 180,
dataIndex: 'applicableVehicle_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.authenticationObject'),
align: 'center',
width: 180,
dataIndex: 'authenticationObject_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.certifiedDeliverables'),
@@ -241,14 +242,14 @@ export default {
align: 'center',
width: 180,
dataIndex: 'type_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.dynamicType'),
align: 'center',
width: 180,
dataIndex: 'dynamicType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.mainControlDepartment'),
@@ -262,7 +263,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'mainDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.relatedDepartment'),
@@ -276,14 +277,14 @@ export default {
align: 'center',
width: 180,
dataIndex: 'associateDeptProfMode_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.marketListReleaseProcess.requirementType'),
align: 'center',
width: 180,
dataIndex: 'requireType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('remarks'),
@@ -498,21 +498,17 @@ export default {
},
//
userSelectModalChange (userIds) {
this.approvalInfoForm.validateFields((err, values) => {
if (!err) {
this.loading = true
const param = Object.assign({}, values)
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
this.loading = true
const param = {}
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
},
@@ -124,9 +124,40 @@
tree-checkable
treeCheckStrictly
:disabled="disabled"
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:placeholder="disabled ? '' : $t('pleaseSelect')+$t('workCenter.newRegulationImportProcess.applicableMarket')" />
</a-form-model-item>
</div>
<!-- 主管部门 -->
<div class="box-title-text form-flex-item">
<div class="title-text">
<span class="required">*</span>
<span class="title-text-text" :title="$t('workCenter.newRegulationImportProcess.competentDepartment')">
{{ $t('workCenter.newRegulationImportProcess.competentDepartment') }}
</span>
</div>
<a-form-model-item class="item-model" prop="competentDepartment">
<j-select-depart v-model="formInline.competentDepartment"
:disabled="disabled"
:multi="true"
:backDepart="true" />
</a-form-model-item>
</div>
<!-- 主控部门 -->
<div class="box-title-text form-flex-item">
<div class="title-text">
<span class="required">*</span>
<span class="title-text-text" :title="$t('workCenter.newRegulationImportProcess.mainControlDepartment')">
{{ $t('workCenter.newRegulationImportProcess.mainControlDepartment') }}
</span>
</div>
<a-form-model-item class="item-model" prop="mainControlDepartment">
<j-select-depart v-model="formInline.mainControlDepartment"
:disabled="disabled"
:multi="true"
:backDepart="true" />
</a-form-model-item>
</div>
<!-- 抄送人员 -->
<div class="box-title-text form-flex-item">
<div class="title-text">
@@ -146,7 +177,7 @@
</a-form-model-item>
</div>
<!-- 法规要求简要描述 -->
<div class="box-title-text form-flex-item">
<div class="box-title-text form-flex-item form-flex-item-full">
<div class="title-text">
<span class="title-text-text" :title="$t('workCenter.newRegulationImportProcess.briefDescription')">
{{ $t('workCenter.newRegulationImportProcess.briefDescription') }}
@@ -226,6 +257,22 @@ export default {
trigger: 'change'
}
],
//
competentDepartment: [
{
required: true,
message: this.$t('workCenter.newRegulationImportProcess.competentDepartment') + this.$t('cannotEmpty'),
trigger: 'change'
}
],
//
mainControlDepartment: [
{
required: true,
message: this.$t('workCenter.newRegulationImportProcess.mainControlDepartment') + this.$t('cannotEmpty'),
trigger: 'change'
}
],
//
copyUser: [
{
@@ -328,4 +375,8 @@ export default {
/deep/ .ant-form-item-children > * {
width: 100%;
}
.form-flex-item-full {
width: 100%;
}
</style>
@@ -97,7 +97,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('processName'),
@@ -140,7 +140,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -75,7 +75,7 @@ export default {
align: 'center',
width: 300,
dataIndex: 'prcType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('processName'),
@@ -113,7 +113,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('processName'),
@@ -162,7 +162,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -117,7 +117,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('processName'),
@@ -160,7 +160,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'prcStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{
title: this.$t('operation'),
@@ -112,7 +112,7 @@ export default {
align: 'center',
width: 260,
dataIndex: 'prcType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('processName'),
@@ -148,7 +148,7 @@
<!-- 主排查人分发设计工程师评估 -->
<template v-else-if="[3, 4].includes(currentNode)">
<!-- 驳回 -->
<a-button type="danger" ghost :loading="loading" @click="handleReject" icon="close" :disabled="rejectDisabled">{{ $t('reject') }}</a-button>
<a-button v-if="!rejectDisabled" type="danger" ghost :loading="loading" @click="handleReject" icon="close">{{ $t('reject') }}</a-button>
<!-- 转办 -->
<a-button type="primary" ghost :loading="loading" @click="handleTurnTo" icon="arrow-up">{{ $t('turnTo') }}</a-button>
<!-- 保存 -->
@@ -628,21 +628,17 @@ export default {
},
//
userSelectModalChange (userIds) {
this.approvalInfoForm.validateFields((err, values) => {
if (!err) {
this.loading = true
const param = Object.assign({}, values)
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
this.loading = true
const param = {}
param.userId = userIds
param.taskId = this.$route.query.taskId
processTransfer(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
this.loading = false
}
})
},
@@ -4,7 +4,7 @@
<div>
<j-expand-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="expandTable"
rowKey="id"
:columns="columns"
@@ -18,7 +18,10 @@
<!--条文内容-->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -29,8 +32,10 @@
style="width: 100%"
:placeholder="$t('pleaseSelect')"
dict-code="evaluation_result"
:getPopupContainer="(node) => node.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode"
:disabled="disabled"
@change="resultChange(record)"
@dropdownVisibleChange="resultDropdownVisibleChange"
v-model="record.result">
</j-dict-select-tag>
</template>
@@ -105,7 +110,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.evaluationResult'),
@@ -298,6 +303,19 @@ export default {
}
return data
},
// ,
resultDropdownVisibleChange (open) {
if (!open) {
return
}
const table = this.$refs.expandTable
if (table) {
const scrollBox = table.$el.querySelector('.ant-table-body')
if (scrollBox) {
scrollBox.scrollLeft = scrollBox.scrollWidth
}
}
},
// ,,,,,,
resultChange (record) {
const index = this.dataSource.findIndex(item => item.id === record.id)
@@ -321,6 +339,8 @@ export default {
}
</script>
<style scoped>
<style scoped lang="less">
.dropdown-class {
z-index: 9999
}
</style>
@@ -91,9 +91,10 @@
<j-upload
return-id
v-model="formInline.modelFile"
fileType="xlsx,xls"
fileType="xls"
:number="1"
:multiple="false"
@change="modelFileChange"
:disabled="isRejectedData">
</j-upload>
</a-form-model-item>
@@ -113,11 +114,12 @@
@numberChange="marketRegulationNumberChange"
:name-str="formInline.applicableMarketNo"
:disabled="isRejectedData"
selectOnly
:placeholder="$t('pleaseSelect')+$t('applicableMarket')" />
</a-form-model-item>
</div>
<!-- 是否与上一版相同 -->
<div class="box-title-text form-flex-item">
<!-- 是否与上一版相同,是添加标准的新增的数据并且分解单来源不是不带入时显示 -->
<div v-if="standardDataSource[0] && standardDataSource[0].standardId && standardDataSource[0].splitFileSource !== DecompositionSource.NO_INPUT.value" class="box-title-text form-flex-item">
<div class="title-text">
<span class="required">*</span>
<span class="title-text-text" :title="$t('workCenter.regulatoryComplianceCheckProcess.isAlike')">
@@ -129,6 +131,7 @@
:placeholder="$t('pleaseSelect') + this.$t('workCenter.regulatoryComplianceCheckProcess.isAlike')"
dict-code="yn"
:disabled="isRejectedData"
@change="isSameLastVersionChange"
v-model="formInline.isSameLastVersion">
</j-dict-select-tag>
</a-form-model-item>
@@ -191,7 +194,7 @@
<div>
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="uid"
:columns="columns"
@@ -211,7 +214,10 @@
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -219,7 +225,7 @@
<!-- 操作栏 -->
<div slot="action" slot-scope="{record}" class="action-span-cell">
<a @click="handleDelete(record.uid)" class="operate-del-btn" :disabled="disabled">{{ $t('delete') }}</a>
<a @click="handleDelete(record.uid)" class="operate-del-btn" :class="disabled ? 'del-btn-disabled' : ''" :disabled="disabled">{{ $t('delete') }}</a>
</div>
</j-table>
@@ -265,7 +271,7 @@ const FILE_TYPE_PDF = 'pdf'
const CAN_PREVIEW_FILE_SUFFIX = ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx']
const uidGenerator = () => {
return '-' + parseInt(Math.random() * 10000 + 1, 10)
return '-' + parseInt(Math.random() * 1000000 + 1, 10)
}
export default {
@@ -287,6 +293,7 @@ export default {
data () {
return {
StandardSource,
DecompositionSource,
loading: false,
formInline: {},
splitFileSourceList: [], //
@@ -336,7 +343,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'standardState_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.decompositionSingleSource'),
@@ -444,7 +451,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('responsibleDepartment'),
@@ -475,7 +482,8 @@ export default {
id: ''
}
},
isRejectedData: false //
isRejectedData: false, //
isChangeStandardAfterClickGenerate: true //
}
},
mounted () {
@@ -495,6 +503,11 @@ export default {
if (this.standardDataSource[0].standardId) {
this.initInterpretGetFileByStandardId(this.standardDataSource[0].standardId)
}
// json
console.log('------------isChangeStandardAfterClickGenerate', data.isChangeStandardAfterClickGenerate)
if (data.isChangeStandardAfterClickGenerate) {
this.isChangeStandardAfterClickGenerate = data.isChangeStandardAfterClickGenerate === '1'
}
const formInline = {}
formInline.modelFile = data.standardInfo.modelFile
formInline.applicableMarket = data.standardInfo.applicableMarket
@@ -518,6 +531,8 @@ export default {
// businessInfoDTO
const data = {}
data.standardInfo = Object.assign({}, this.standardDataSource[0], this.formInline)
// json,
data.isChangeStandardAfterClickGenerate = this.isChangeStandardAfterClickGenerate ? '1' : '0'
data.detailInfoList = JSON.parse(JSON.stringify(this.dataList))
return data
},
@@ -530,6 +545,11 @@ export default {
//
this.$message.warning(this.$t('workCenter.regulatoryComplianceCheckProcess.pleaseGenerate'))
data = false
} else if (!this.isChangeStandardAfterClickGenerate) {
//
//
this.$message.warning(this.$t('workCenter.regulatoryComplianceCheckProcess.pleaseAnewGenerate'))
data = false
} else {
data.standardInfo = Object.assign({}, this.standardDataSource[0], this.formInline)
data.detailInfoList = JSON.parse(JSON.stringify(this.dataList))
@@ -563,8 +583,20 @@ export default {
},
//
splitFileSourceChange () {
//
this.isChangeStandardAfterClickGenerate = false
this.$forceUpdate()
},
//
modelFileChange () {
//
this.isChangeStandardAfterClickGenerate = false
},
//
isSameLastVersionChange () {
//
this.isChangeStandardAfterClickGenerate = false
},
//
showContent (val) {
this.$refs.splitClauseDetail.open(val)
@@ -615,6 +647,7 @@ export default {
//
obj.standardState = result.standard_state
obj.standardState_dictText = result.standard_state_dictText
obj.standardState_dictTextEn = result.standard_state_dictTextEn
//
obj.splitFileSource = DecompositionSource.NO_INPUT.value
//
@@ -623,6 +656,8 @@ export default {
obj.newAuthImplDate = result.new_auth_impl_date
this.standardDataSource[0] = obj
this.isGetDataAfter = true
//
this.isChangeStandardAfterClickGenerate = false
} else {
this.$message.warning(res.message)
}
@@ -646,6 +681,8 @@ export default {
manualAddOk (result, isEdit) {
console.log(result)
this.standardDataSource[0] = Object.assign({}, result)
//
this.isChangeStandardAfterClickGenerate = false
this.$emit('processNameChange', (result.standardNumber || '') + '-' + (result.standardName || '') + '-' + '法规符合性排查')
this.$forceUpdate()
},
@@ -689,6 +726,10 @@ export default {
this.$emit('loading', true)
//
const param = Object.assign({}, this.standardDataSource[0], this.formInline)
//
if ((param.standardId && param.splitFileSource === DecompositionSource.NO_INPUT.value) || !param.standardId) {
param.isSameLastVersion = undefined
}
regulatoryComplianceCheckGenerate(param).then(res => {
if (res.success) {
this.$message.success(res.message)
@@ -699,6 +740,8 @@ export default {
})
this.dataSource = JSON.parse(JSON.stringify(dataSource))
this.dataList = JSON.parse(JSON.stringify(dataSource))
//
this.isChangeStandardAfterClickGenerate = true
} else {
if (Array.isArray(res.message) && res.message.length > 0) {
this.messageLineFeed(this.$t('fileUploadError'), res.message)
@@ -4,7 +4,7 @@
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="standardNumber"
:columns="columns"
@@ -15,7 +15,10 @@
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -99,7 +102,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('responsibleDepartment'),
@@ -120,7 +123,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'result_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.theStatusNotMeetRequirements'),
@@ -30,7 +30,7 @@
<div>
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="id"
:columns="columns"
@@ -40,7 +40,10 @@
@change="handleTableChange">
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -138,7 +141,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
}
],
dataSource: [],
@@ -11,7 +11,7 @@
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="standardNumber"
:columns="columns"
@@ -22,7 +22,10 @@
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -190,7 +193,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('responsibleDepartment'),
@@ -211,7 +214,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'result_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.theStatusNotMeetRequirements'),
@@ -172,6 +172,7 @@ export default {
resultChange (value) {
this.model.result = value
this.model.result_dictText = this.$refs.resultRef.dictOptions.find(item => item.value === value).text
this.model.result_dictTextEn = this.$refs.resultRef.dictOptions.find(item => item.value === value).enText
// ,,,,,,
this.model.remark = ''
this.model.material = ''
@@ -40,7 +40,7 @@
<div>
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="id"
:columns="columns"
@@ -51,7 +51,10 @@
@change="handleTableChange">
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -65,7 +68,7 @@
<!-- 操作区域 -->
<div v-if="!disabled" class="table-operator">
<!-- 导入 -->
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" :data="importData" @change="handleImportExcel">
<a-button icon="download" type="primary" ghost>{{ $t('import') }}</a-button>
</a-upload>
<!-- 导出, 文件名称标准编号+标准名称+符合性排查 -->
@@ -77,7 +80,7 @@
<div>
<j-expand-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="expandTable"
rowKey="id"
:columns="columnsEvaluate"
@@ -91,7 +94,10 @@
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -102,8 +108,10 @@
style="width: 100%"
:placeholder="disabled ? '' : $t('pleaseSelect')"
dict-code="evaluation_result"
:getPopupContainer="(node) => node.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode"
:disabled="disabled"
@change="resultChange(record)"
@dropdownVisibleChange="resultDropdownVisibleChange"
v-model="record.result">
</j-dict-select-tag>
</template>
@@ -224,6 +232,9 @@ export default {
},
exportFileName () {
return this.formInline.standardNumber + this.formInline.standardName + '符合性排查'
},
importData () {
return {taskId: this.$route.query.taskId}
}
},
data () {
@@ -321,7 +332,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('designEngineer'),
@@ -375,7 +386,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.evaluationResult'),
@@ -860,6 +871,19 @@ export default {
//
showContent (val) {
this.$refs.splitClauseDetail.open(val)
},
// ,
resultDropdownVisibleChange (open) {
if (!open) {
return
}
const table = this.$refs.expandTable
if (table) {
const scrollBox = table.$el.querySelector('.ant-table-body')
if (scrollBox) {
scrollBox.scrollLeft = scrollBox.scrollWidth
}
}
}
}
}
@@ -4,7 +4,7 @@
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="standardNumber"
:columns="columns"
@@ -15,7 +15,10 @@
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -113,7 +116,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('responsibleDepartment'),
@@ -134,7 +137,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'result_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.regulatoryComplianceCheckProcess.theStatusNotMeetRequirements'),
@@ -14,7 +14,7 @@
<div>
<j-table
:can-drag="true"
:scroll="{x: '100%'}"
:scroll="{x: '100%', y: '50vh'}"
ref="table"
rowKey="id"
:columns="columns"
@@ -25,7 +25,10 @@
@change="handleTableChange">
<!-- 条款内容 -->
<template slot="item_content" slot-scope="{text, record}">
<div class="table-text" v-if="text || text === 0" @click="showContent(text,record)">
<a class="link-a" v-if="text && !text.replace(/<.*?>/ig, '')" @click="showContent(text,record)">
{{ $t('view') }}
</a>
<div class="table-text" v-else-if="text || text === 0" @click="showContent(text,record)">
{{ text && text !== 'null' ? text.replace(/<.*?>/ig, ' ') : '' }}
</div>
<div class="table-text" v-else>{{ global.emptyLine }}</div>
@@ -116,7 +119,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'modelStatus_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('designEngineer'),
@@ -62,7 +62,7 @@
:label="$t('workCenter.regulatoryComplianceCheckProcess.resolutionAttachment')">
<j-upload return-id
ref="splitFileRef"
fileType="xlsx,xls"
fileType="xls"
:multiple="false"
:number="1"
@change="splitFileChange"
@@ -147,6 +147,7 @@ export default {
const valueArr = value.split(this.$refs.standardState.spliter)
const arr = this.$refs.standardState.dictOptions.filter(item => valueArr.includes(item.value))
this.model.standardState_dictText = arr.map(item => item.title).join(',')
this.model.standardState_dictTextEn = arr.map(item => item.enText).join(',')
},
//
splitFileChange (value) {
@@ -166,6 +167,8 @@ export default {
const isEdit = this.model.standardNumber
const formData = Object.assign(values)
formData.splitFile_dictText = this.model.splitFile_dictText
formData.standardState_dictText = this.model.standardState_dictText
formData.standardState_dictTextEn = this.model.standardState_dictTextEn
this.$emit('ok', formData, isEdit)
this.confirmLoading = false
this.close()
@@ -659,7 +659,12 @@ export default {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warn(res.message)
//
if (res.code === 500) {
this.messageLineFeedByBr(this.$t('operationFailed'), res.message)
} else {
this.$message.warn(res.message)
}
}
}).catch((err) => {
if (err && err.message && tabList.includes(err.message)) {
@@ -770,6 +775,34 @@ export default {
return Promise.all(promiseList).catch(() => {
throw new Error('base')
})
},
/**
* 对包含<br/>的后端错误信息进行处理
* @param title
* @param content
*/
messageLineFeedByBr (title, content) {
// <br> </br> <br/>
content = content.replace(/<br>|<\/br>|<br\/>/g, ';')
const messageArr = content.split(';')
const htmlDom = []
messageArr.map(tt => {
if (tt) {
htmlDom.push((<div>{tt}</div>))
}
})
this.$warning({
title: title,
closable: true,
width: 800,
content: () => <div>
{htmlDom}
</div>
})
this.$nextTick(() => {
document.getElementsByClassName('ant-modal-confirm-btns')[0].style = 'display: inline-block'
document.getElementsByClassName('ant-modal-confirm-content')[0].style = 'max-height: calc(100vh - 300px);overflow-y: auto;'
})
}
}
}
@@ -9,10 +9,9 @@
<!-- 导入(标准主解读人节点 && 选择不分发时) -->
<a-upload v-if="isMainInterpreterDistribute && !isDistribute"
:data="importParams"
:disabled="disabledImport"
name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importUrl"
@change="handleImport">
<a-button type="primary" icon="download" :disabled="disabledImport" ghost>{{ $t('import') }}</a-button>
<a-button type="primary" icon="download" ghost>{{ $t('import') }}</a-button>
</a-upload>
<!-- 批量编辑解读人填写 -->
<a-button type="primary" ghost @click="handleBatchEdit" v-if="showBatchEditBtn">
@@ -56,9 +55,9 @@
:nameStr="record.interpretPersonIds_dictText" />
</template>
<template v-slot:action="{text, record}">
<a v-if="showEditBtn" @click="handleEdit(record)" class="table-ope-btn">{{ $t('edit') }}</a>
<a v-if="showEditBtn" :disabled="disabled" @click="handleEdit(record)" class="table-ope-btn">{{ $t('edit') }}</a>
<a-divider v-if="showEditBtn && showDeleteBtn" type="vertical" />
<a v-if="showDeleteBtn" @click="handleDelete(record[rowKey])" class="operate-del-btn">{{ $t('delete') }}</a>
<a v-if="showDeleteBtn" :disabled="disabled" @click="handleDelete(record[rowKey])" class="operate-del-btn">{{ $t('delete') }}</a>
</template>
</j-table>
<!--条文内容-->
@@ -201,7 +200,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'isSameAsPrevVersion_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.explanationOfChangePoints'),
@@ -229,7 +228,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'keyController_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.responsibleDepartment'),
@@ -243,7 +242,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'responsibleModule_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.relatedDepartments'),
@@ -257,35 +256,35 @@ export default {
align: 'center',
width: 180,
dataIndex: 'relatedModule_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.applications'),
align: 'center',
width: 180,
dataIndex: 'applications_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.powerType'),
align: 'center',
width: 180,
dataIndex: 'powerType_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.professionalField'),
align: 'center',
width: 180,
dataIndex: 'domainArea_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.configurationRequirements'),
align: 'center',
width: 180,
dataIndex: 'configurationRequirements_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ //
title: this.$t('workCenter.standardInterpretationProcess.newCertificationImplementationDate'),
@@ -376,7 +375,7 @@ export default {
align: 'center',
width: 180,
dataIndex: 'investigationStage_dictText',
scopedSlots: { customRender: 'text' }
scopedSlots: { customRender: 'dictText' }
},
{ // P3
title: this.$t('workCenter.standardInterpretationProcess.pThree'),
@@ -473,7 +472,7 @@ export default {
columns.push(...this.columnsExtend)
}
//
if (!this.disabled && !noActionCoumnsNodes.includes(this.currentNodeId)) {
if (!noActionCoumnsNodes.includes(this.currentNodeId)) {
columns.push(this.actionColumn)
}
return columns
@@ -579,9 +578,9 @@ export default {
* @param info
*/
handleImport (info) {
// 500MB
if (info.file.size > 1024 * 1024 * 500) {
this.$message.error('导入文件最大500MB')
// 20MB
if (info.file.size > 1024 * 1024 * 20) {
this.$message.error(this.$t('importMaxMsg', { size: '20MB' }))
info.fileList.pop()
return
}
@@ -937,6 +936,7 @@ export default {
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.clause-table-container {
margin-bottom: 20px;
}
@@ -26,14 +26,13 @@
<j-dict-select-tag dict-code="yn"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.sameAsPreviousVersion')"
@nameChange="(name) => nameChange(name, 'isSameAsPrevVersion')"
@dictChange="(name) => dictChange(name, 'isSameAsPrevVersion')"
v-decorator="['isSameAsPrevVersion']"/>
</a-form-item>
<!--相对上一版变化点说明-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.explanationOfChangePoints')" :colon="false">
<a-textarea :placeholder="$t('pleaseEnter') + $t('workCenter.standardInterpretationProcess.explanationOfChangePoints')"
:maxLength="500"
:rows="4"
<a-input :placeholder="$t('pleaseEnter') + $t('workCenter.standardInterpretationProcess.explanationOfChangePoints')"
:maxLength="50"
:disabled="disabled"
v-decorator="['changeDescription']" />
</a-form-item>
@@ -46,26 +45,33 @@
</a-form-item>
<!--涉及系统/部件-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.involvingSystemsComponents')" :colon="false">
<tree-selection :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.involvingSystemsComponents')"
filedName="partName"
type="checkbox"
options-href="/laws/standard/partName/"
:nameStr="model.partName"
:disabled="disabled"
@nameChange="nameChange"
v-decorator="['partName']" />
<tree-data-selection :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.involvingSystemsComponents')"
v-decorator="['partName']"
fieldName="partName"
:nameStr="model.partName_dictText"
:disabled="disabled"
@nameChange="nameChange"
optionsHref="/laws/standard/partName/queryFirstList"/>
<!--<tree-selection :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.involvingSystemsComponents')"-->
<!-- filedName="partName"-->
<!-- type="checkbox"-->
<!-- options-href="/laws/standard/partName/"-->
<!-- :nameStr="model.partName_dictText"-->
<!-- :disabled="disabled"-->
<!-- @nameChange="nameChange"-->
<!-- v-decorator="['partName']" />-->
</a-form-item>
<!--关键控制器-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.keyController')" :colon="false">
<j-multi-select-tag dict-code="key_controller"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.keyController')"
@nameChange="(name) => nameChange(name, 'keyController')"
@dictChange="(name) => dictChange(name, 'keyController')"
v-decorator="['keyController']"/>
</a-form-item>
<!--责任部门-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.responsibleDepartment')" :colon="false">
<j-select-depart :placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.responsibleDepartment')"
<j-select-depart :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.responsibleDepartment')"
:backDepart="true"
:disabled="disabled"
multi
@@ -79,12 +85,12 @@
<j-multi-select-tag dict-code="responsible_module"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.responsibleDepartmentModule')"
@nameChange="(name) => nameChange(name, 'responsibleModule')"
@dictChange="(name) => dictChange(name, 'responsibleModule')"
v-decorator="['responsibleModule']"/>
</a-form-item>
<!--关联部门-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.relatedDepartments')" :colon="false">
<j-select-depart :placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.relatedDepartments')"
<j-select-depart :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.relatedDepartments')"
:backDepart="true"
:disabled="disabled"
multi
@@ -98,7 +104,7 @@
<j-multi-select-tag dict-code="related_module"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.relatedDepartmentsModule')"
@nameChange="(name) => nameChange(name, 'relatedModule')"
@dictChange="(name) => dictChange(name, 'relatedModule')"
v-decorator="['relatedModule']"/>
</a-form-item>
<!--适用车型-->
@@ -106,7 +112,7 @@
<j-multi-select-tag dict-code="applicable_vehicle_type"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.applications')"
@nameChange="(name) => nameChange(name, 'applications')"
@dictChange="(name) => dictChange(name, 'applications')"
v-decorator="['applications']"/>
</a-form-item>
<!--动力类型-->
@@ -114,7 +120,7 @@
<j-multi-select-tag dict-code="dynamic_type"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.powerType')"
@nameChange="(name) => nameChange(name, 'powerType')"
@dictChange="(name) => dictChange(name, 'powerType')"
v-decorator="['powerType']"/>
</a-form-item>
<!--专业领域-->
@@ -126,6 +132,7 @@
tree-checkable
treeCheckStrictly
@change="treeNameChange($event, 'domainArea')"
:replaceFields="{title: isChinese() ? 'title' : 'enTitle'}"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.professionalField')"/>
</a-form-item>
<!--配置需求-->
@@ -133,26 +140,26 @@
<j-multi-select-tag dict-code="configuration_requirements"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.configurationRequirements')"
@nameChange="(name) => nameChange(name, 'configurationRequirements')"
@dictChange="(name) => dictChange(name, 'configurationRequirements')"
v-decorator="['configurationRequirements']"/>
</a-form-item>
<!--新认证车实施日期-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.newCertificationImplementationDate')" :colon="false">
<j-multiple-date-picker :placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.newCertificationImplementationDate')"
<j-multiple-date-picker :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.newCertificationImplementationDate')"
fieldName="newCerImplementDate"
:disabled="disabled"
v-decorator="['newCerImplementDate']" />
</a-form-item>
<!--新生产车实施日期-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.newProduceImplementationDate')" :colon="false">
<j-multiple-date-picker :placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.newProduceImplementationDate')"
<j-multiple-date-picker :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.newProduceImplementationDate')"
fieldName="newProductionImplementation"
:disabled="disabled"
v-decorator="['newProductionImplementation']" />
</a-form-item>
<!--注册日期-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.registrationDate')" :colon="false">
<j-multiple-date-picker :placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.registrationDate')"
<j-multiple-date-picker :placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.registrationDate')"
fieldName="registrationDate"
:disabled="disabled"
v-decorator="['registrationDate']" />
@@ -160,7 +167,7 @@
<!--企业标准-->
<a-form-item :label="$t('workCenter.standardInterpretationProcess.enterpriseStandards')" :colon="false">
<standard-selection :source="StandardSource.ENTERPRISE.value"
:placeholder="$t('pleaseEnter')+$t('workCenter.standardInterpretationProcess.enterpriseStandards')"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.enterpriseStandards')"
:disabled="disabled"
:disabledSourceSearch="true"
type="radio"
@@ -228,7 +235,7 @@
<j-multi-select-tag dict-code="investigation_stage"
:disabled="disabled"
:placeholder="$t('pleaseSelect')+$t('workCenter.standardInterpretationProcess.investigationStage')"
@nameChange="(name) => nameChange(name, 'investigationStage')"
@dictChange="(name) => dictChange(name, 'investigationStage')"
v-decorator="['investigationStage']"/>
</a-form-item>
<!--P3证明符合性的交付物名称-->
@@ -267,13 +274,14 @@
<script>
import JMultipleDatePicker from '@comp/JMultipleDatePicker'
import StandardSelection from '@comp/selection/StandardSelection'
import TreeSelection from '@comp/selection/TreeSelection'
import { StandardSource } from '@/enums/commonEnums'
import STreeSelect from '@comp/STreeSelect'
import { getFormDictTreeList } from '@api/api'
import { findNodeByField } from '@/utils/util'
import TreeDataSelection from '@comp/selection/TreeDataSelection'
export default {
name: 'InterpretationClauseTableModal',
components: { STreeSelect, TreeSelection, StandardSelection, JMultipleDatePicker },
components: { TreeDataSelection, STreeSelect, StandardSelection, JMultipleDatePicker },
data () {
return {
StandardSource,
@@ -346,6 +354,20 @@ export default {
}
})
},
//
dictChange (dict, field) {
console.log('字典回显', dict, field)
if (Array.isArray(dict)) {
this.model[field + '_dictText'] = dict.map(item => item.text).join(',')
this.model[field + '_dictTextEn'] = dict.map(item => item.enText).join(',')
} else if (dict) {
this.model[field + '_dictText'] = dict.text
this.model[field + '_dictTextEn'] = dict.enText
} else {
this.model[field + '_dictText'] = ''
this.model[field + '_dictTextEn'] = ''
}
},
//
nameChange (name, field) {
this.model[field + '_dictText'] = name
@@ -355,15 +377,21 @@ export default {
//
if (!depart) {
this.model[field + '_dictText'] = ''
this.model[field + '_dictTextEn'] = ''
}
},
//
departNameChange (departList, field) {
this.model[field + '_dictText'] = departList.map(item => item.text).join(',')
this.model[field + '_dictTextEn'] = departList.map(item => item.text).join(',')
},
//
treeNameChange (list, field) {
this.model[field + '_dictText'] = list.map(item => item.label).join(',')
console.log('tree', list, field)
// value
const nodes = list.map(item => findNodeByField(this.professionalFieldTreeList, item.value, 'value'))
this.model[field + '_dictText'] = nodes.map(item => item.title).join(',')
this.model[field + '_dictTextEn'] = nodes.map(item => item.enTitle).join(',')
}
}
}
@@ -220,7 +220,10 @@ export default {
importParams: {
standardInterp: '',
standardId: '',
splitInfoId: ''
splitInfoId: '',
nodeId: '',
taskId: '',
projectId: ''
},
//
disabledImport: false
@@ -306,11 +309,13 @@ export default {
return obj
},
setData (data) {
console.log(data)
const info = data.data.processStandardInterpret || {}
this.importParams.standardInterp = info.id
this.importParams.standardId = info.standardId
this.importParams.splitInfoId = info.splitInfoId
this.importParams.nodeId = this.$route.query.nodeId
this.importParams.taskId = this.$route.query.taskId
this.importParams.projectId = this.$route.query.projectId
this.dataSource = [info]
this.formInline = info
//
@@ -352,6 +357,9 @@ export default {
this.isNextStep = true
this.$nextTick(() => {
this.$refs.interpretationClauseTable.setData(this.clauseDataSource)
if (!this.isDistribute) {
this.userForm.setFieldsValue(this.formInline)
}
})
}
})