update 国内标准体系联调、车型项目库详情、用户新增编辑开启工号字段

This commit is contained in:
赵霄
2023-09-12 16:23:13 +08:00
parent 7b56d2e753
commit f6eacc1bcd
17 changed files with 729 additions and 323 deletions
+5 -2
View File
@@ -1,11 +1,14 @@
import { postAction } from './manage.js'
import { getAction, postAction } from './manage.js'
// 车型项目库-新增
const addVehicleItemLibrary = (params) => postAction('/projectLibrary/lawsProjectLibrary/add', params)
// 车型项目库-编辑
const editVehicleItemLibrary = (params) => postAction('/projectLibrary/lawsProjectLibrary/edit', params)
// 车型项目库-通过id获取详情
const queryByIdVehicleItemLibrary = (params) => getAction('/projectLibrary/lawsProjectLibrary/queryById', params)
export {
addVehicleItemLibrary,
editVehicleItemLibrary
editVehicleItemLibrary,
queryByIdVehicleItemLibrary
}
+6 -3
View File
@@ -13,15 +13,17 @@ const collectionDomesticStandard = (params) => postAction('', params)
// 国内标准法规-分享
const shareDomesticStandard = (params) => postAction('', params)
// 国内标准-体系新增
const addDomesticSystemTree = (params) => postAction('', params)
const addDomesticSystemTree = (params) => postAction('/laws/standard/lawsTreeNode/domestic/add', params)
// 国内标准-体系编辑
const editDomesticSystemTree = (params) => postAction('', params)
const editDomesticSystemTree = (params) => postAction('/laws/standard/lawsTreeNode/domestic/edit', params)
// 国内标准-体系删除
const deleteDomesticSystemTree = (params) => postAction('', params)
const deleteDomesticSystemTree = (params) => postAction('/laws/standard/lawsTreeNode/domestic/delete', params)
// 国内标准-配置标准
const configDomesticStandard = (params) => postAction('', params)
// 国内标准-移出标准
const removeDomesticStandard = (params) => postAction('', params)
// 国内标准-获取体系树
const getDomesticStandardTree = (params) => getAction('/laws/standard/lawsTreeNode/domestic', params)
// 海外标准-获取查询条件
const getOverseasStandardSearchForm = (params) => getAction('/laws/standard/overseas/getQueryCondition', params)
@@ -45,6 +47,7 @@ export {
deleteDomesticSystemTree,
configDomesticStandard,
removeDomesticStandard,
getDomesticStandardTree,
// 海外标准
getOverseasStandardSearchForm,
+156 -132
View File
@@ -1,4 +1,7 @@
@primary-color: #D52C26;
/* 页面不出全局滚动条的高度,如果在vue文件使用,就只能在style里引入common.less */
/*59px是用户信息那块,52px是标签,24px是上下的留白*/
@page-content-h: calc(100vh - 59px - 52px - 24px);
/*列表上方操作按钮区域*/
/*.ant-card-body .table-operator {
@@ -393,7 +396,7 @@
/*页面左右布局*/
.page-left-right-layout {
height: 85vh;
height: @page-content-h;
width: 100%;
.ant-card-body {
@@ -432,11 +435,6 @@
color: #86909c;
}
//子节点前面文件图标的颜色
.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop {
color: #1D2129;
}
.ant-tree-title {
overflow: hidden;
white-space: nowrap;
@@ -527,145 +525,171 @@
/*详情样式start*/
.detail-page {
padding: 24px;
}
.detail-page-title {
font-size: 20px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
color: #1D2129;
font-weight: 600;
text-align: center;
margin-bottom: 24px;
}
.detail-page-part {
border-radius: 8px;
border: 1px solid #E5E6EB;
margin-bottom: 20px;
}
.detail-page-part-title {
height: 56px;
background: rgba(245, 245, 245, 0.6);
border-radius: 8px 8px 0 0;
opacity: 1;
border-bottom: 1px solid #E5E6EB;
padding: 0 20px;
display: flex;
align-items: center;
justify-content: space-between;
}
.detail-page-part-title > span {
font-size: 16px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
font-weight: 550;
color: #1D2129;
}
.detail-page-part-title-operate-box {
.ant-btn > .anticon + span {
margin-left: 10px;
}
.ant-btn > .iconfont + span {
margin-left: 10px;
}
.ant-btn > .iconfont {
height: 20px;
}
}
.detail-page-part-form {
padding: 20px;
display: flex;
flex-wrap: wrap;
}
.detail-page-part-form-item {
width: calc((100% - 32px) / 3);
display: flex;
margin: 0 16px 16px 0;
label {
width: 40%;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
font-weight: 400;
color: #86909C;
}
span {
white-space: pre-wrap;
word-break: break-all;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #1D2129;
}
}
.detail-page-part-form-item:nth-child(3n) {
margin-right: 0;
}
/deep/ .detail-page-part-form-item {
width: calc((100% - 32px) / 3);
display: flex;
margin: 0 16px 16px 0;
label {
width: 40%;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
font-weight: 400;
color: #86909C;
}
span {
white-space: pre-wrap;
word-break: break-all;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #1D2129;
}
}
/deep/ .detail-page-part-form-item:nth-child(3n) {
margin-right: 0;
}
.detail-page-process-manuscript {
padding: 20px;
&-item {
padding: 20px 0;
border-bottom: 1px solid #E5E6EB;
}
&-title {
font-size: 20px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
color: #1D2129;
font-weight: 600;
text-align: center;
margin-bottom: 24px;
}
&-part {
border-radius: 8px;
border: 1px solid #E5E6EB;
margin-bottom: 20px;
}
&-part-title {
height: 56px;
background: rgba(245, 245, 245, 0.6);
border-radius: 8px 8px 0 0;
opacity: 1;
border-bottom: 1px solid #E5E6EB;
padding: 0 20px;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #86909C;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
&-part-title > span {
font-size: 16px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
font-weight: 550;
color: #1D2129;
}
&-part-title-operate-box {
.ant-btn > .anticon + span {
margin-left: 10px;
}
.ant-btn > .iconfont + span {
margin-left: 10px;
}
.ant-btn > .iconfont {
height: 20px;
}
}
&-part-form {
padding: 20px;
&-file {
display: flex;
flex-wrap: wrap;
&-item {
width: calc((100% - 32px) / 3);
display: flex;
margin: 0 16px 16px 0;
label {
width: 40%;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
font-weight: 400;
color: #86909C;
}
span {
white-space: pre-wrap;
word-break: break-all;
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #1D2129;
}
}
&-item:nth-child(3n) {
margin-right: 0;
}
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
&-process-manuscript {
padding: 20px;
&-file:last-child {
margin-bottom: 0;
}
&-item {
padding: 20px 0;
border-bottom: 1px solid #E5E6EB;
&-file-info {
display: flex;
align-items: center;
color: @primary-color;
cursor: pointer;
flex: 1;
width: 0;
}
&-file-info > .anticon {
margin-right: 8px;
}
&-file-name {
white-space: nowrap;
overflow: hidden;
flex: 1;
width: 0;
text-overflow: ellipsis;
}
&-file-operate {
.ant-btn > .anticon + span, .ant-btn > .iconfont + span {
margin-left: 10px;
}
&-title {
font-size: 16px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #86909C;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
&-file {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
&-file:last-child {
margin-bottom: 0;
}
&-file-info {
display: flex;
align-items: center;
color: @primary-color;
cursor: pointer;
flex: 1;
width: 0;
}
&-file-info > .anticon {
margin-right: 8px;
}
&-file-name {
white-space: nowrap;
overflow: hidden;
flex: 1;
width: 0;
text-overflow: ellipsis;
}
&-file-operate {
.ant-btn > .anticon + span, .ant-btn > .iconfont + span {
margin-left: 10px;
}
.ant-btn:first-child {
margin-left: 15px;
}
.ant-btn:first-child {
margin-left: 15px;
}
}
}
+10 -2
View File
@@ -1,7 +1,7 @@
module.exports = {
projectName: 'Project name', // 项目名称
workOrderNumber: 'Work order number', // 工作令编号
projectHealthStatus: 'Project health status', // 项目健康状态
projectHealthStatus: 'Project health', // 项目健康
// 车型项目库
vehicleItemLibrary: {
@@ -10,6 +10,14 @@ module.exports = {
projectSource: 'Project source', // 项目来源
projectName: 'Project name', // 项目名称
projectLeader: 'Project leader', // 项目负责人,
PMSDetails: 'PMS Details' // PMS详情
PMSDetails: 'PMS Details', // PMS详情
riskOverview: 'Risk overview', // 风险性总览
conform: 'Conform to', // 符合
inconformity: 'Inconformity', // 不符合
toBeVerified: 'To be verified', // 待验证
uninvolved: 'Not involve', // 不涉及
regulationsList: 'List of regulations', // 法规清单
standardNumberStandardName: 'Standard number/Standard name', // 标准号/标准名称
transfer: 'Transfer' // 调取
}
}
+10 -1
View File
@@ -9,6 +9,15 @@ module.exports = {
PMSInfoSynchronization: 'PMS信息同步',
projectSource: '项目来源',
projectLeader: '项目负责人',
PMSDetails: 'PMS详情'
PMSDetails: 'PMS详情',
noMatchItemDetails: '未符合项详情',
riskOverview: '风险性总览',
conform: '符合',
inconformity: '不符合',
toBeVerified: '待验证',
uninvolved: '不涉及',
regulationsList: '法规清单',
standardNumberStandardName: '标准号/标准名称',
transfer: '调取'
}
}
+99
View File
@@ -0,0 +1,99 @@
<template>
<a-spin :spinning="loading">
<div class="detail-container">
<div class="page-title">
<i class="iconfont icon-chexiao" @click="handleBack" />
<span class="page-title-text">{{ title }}</span>
<div class="custom-operate">
<slot name="titleRightCustom"></slot>
</div>
</div>
<div class="detail-content" :style="{padding: contentPadding + 'px'}">
<slot></slot>
</div>
</div>
</a-spin>
</template>
<script>
export default {
name: 'InternalDetailPage',
props: {
// 页面标题
title: {
type: String,
required: false,
default: null
},
// 是否需要自定义返回方法
needCustomBackFunc: {
type: Boolean,
required: false,
default: false
},
// 内容的内边距,默认是24
contentPadding: {
type: Number,
required: false,
default: 24
},
loading: {
type: Boolean,
required: false,
default: false
}
},
methods: {
handleBack () {
if (this.needCustomBackFunc) {
this.$emit('back')
return
}
this.$router.go(-1)
}
}
}
</script>
<style scoped lang="less">
@import "~@/assets/less/common";
.detail-container {
height: @page-content-h;
background-color: white;
}
.page-title {
height: 56px;
border-bottom: 1px solid #E5E6EB;
padding: 0 24px;
display: flex;
align-items: center;
.iconfont {
font-size: 24px;
color: @primary-color;
cursor: pointer;
margin-right: 12px;
}
&-text {
font-size: 16px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
font-weight: bold;
color: #1D2129;
flex: 1;
display: inline-block;
width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.detail-content {
height: calc(100% - 56px);
overflow: auto;
}
</style>
+3 -1
View File
@@ -52,7 +52,9 @@ export default {
dictCode: {
immediate: true,
handler () {
this.initDictData()
if (this.dictCode) {
this.initDictData()
}
}
}
},
+2 -2
View File
@@ -38,8 +38,8 @@ export const TagsAttributeTypeEnums = {
// 标准体系树节点类型
export const StandardSystemTreeNodeType = {
ROOT_NODE: { text: '根节点', value: '1' },
CHILD_NODE: { text: '子节点', value: '2' }
ROOT_NODE: { text: '根节点', value: 1 },
CHILD_NODE: { text: '子节点', value: 2 }
}
// 车型项目库-项目来源
+12
View File
@@ -424,6 +424,18 @@ export const JeroListMixin = {
},
handleImportByFileId (fileId) {
// TODO 完善通过文件id上传文件的方法
},
/**
* 循环操作按钮的操作
* @param operation
* @param record
*/
operationClick (operation, record) {
if (operation.clickEvent === 'handleDelete') {
this.handleDelete(record.id)
} else {
this[operation.clickEvent](record)
}
}
}
}
+45 -42
View File
@@ -1,7 +1,7 @@
<template>
<div class="exception">
<div class="img">
<img :src="config[type].img" alt=""/>
<img :src="config[type].img" alt="" />
</div>
<div class="content">
<h1>{{ config[type].title }}</h1>
@@ -38,51 +38,54 @@ export default {
</script>
<style lang="less" scoped>
.exception {
min-height: 500px;
height: 80%;
align-items: center;
.exception {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.img > img {
height: 260px;
}
.content {
margin-top: 24px;
h1 {
font-size: 20px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
color: #1D2129;
text-align: center;
font-weight: bold;
}
.desc {
font-size: 14px;
font-family: PingFang SC-Regular, PingFang SC, sans-serif;
color: #86909C;
line-height: 22px;
}
}
.action {
margin-top: 32px;
text-align: center;
margin-top: 150px;
}
}
.mobile {
.exception {
margin-top: 30px;
.img {
display: inline-block;
padding-right: 52px;
zoom: 1;
padding-right: unset;
img {
height: 360px;
max-width: 430px;
}
}
.content {
display: inline-block;
flex: auto;
h1 {
color: #434e59;
font-size: 72px;
font-weight: 600;
line-height: 72px;
margin-bottom: 24px;
}
.desc {
color: rgba(0, 0, 0, .45);
font-size: 20px;
line-height: 28px;
margin-bottom: 16px;
}
}
}
.mobile {
.exception {
margin-top: 30px;
.img {
padding-right: unset;
img {
height: 40%;
max-width: 80%;
}
height: 40%;
max-width: 80%;
}
}
}
}
</style>
+4 -3
View File
@@ -1,3 +1,4 @@
const noPermissionImage = require('../../assets/404.png')
const types = {
403: {
img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg',
@@ -5,9 +6,9 @@ const types = {
desc: '抱歉,你无权访问该页面'
},
404: {
img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg',
title: '404',
desc: '抱歉,你访问的页面不存在或无权访问'
img: noPermissionImage,
title: '暂无权限',
desc: '抱歉,无权访问此页面,请联系管理员'
},
500: {
img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg',
@@ -71,6 +71,15 @@
:scroll="{x: '100%'}"
@change="handleTableChange">
<!-- 项目名称-->
<template v-slot:projectName="{text, record}">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : global.emptyLine }}</template>
<div class="table-text can-click-table-text" v-if="text || text === 0" @click="handleDetail(record)">{{ text }}</div>
<div v-else class="table-text">{{ global.emptyLine }}</div>
</a-tooltip>
</template>
<template v-slot:operation="{text, record}">
<a @click="operationClick(operationList[0],record)">{{ operationList[0].text }}</a>
<a-divider type="vertical" />
@@ -124,7 +133,8 @@ export default {
dataIndex: 'projectName',
title: this.$t('projectLibrary.projectName'),
sorter: true,
width: 250
width: 250,
scopedSlots: { customRender: 'projectName' }
},
// 工作令编号
{
@@ -192,15 +202,13 @@ export default {
handlePMSInfoSynchronization () {
},
operationClick (operation, record) {
if (operation.clickEvent === 'handleDelete') {
this.handleDelete(record.id)
} else {
this[operation.clickEvent](record)
}
},
handleDetail () {
handleDetail ({ id, projectName }) {
this.$router.push({
path: '/projectLibrary/VehicleItemLibraryDetail',
query: {
id, projectName
}
})
}
}
}
@@ -0,0 +1,217 @@
<template>
<internal-detail-page :title="pageTitle" :loading="loading">
<template v-slot:titleRightCustom>
<a-button type="primary">{{ $t('projectLibrary.vehicleItemLibrary.noMatchItemDetails') }}</a-button>
</template>
<!--项目信息-->
<div class="project-form">
<!--项目来源-->
<div class="detail-page-part-form-item">
<label>{{ $t('projectLibrary.vehicleItemLibrary.projectSource') }}</label>
<span>{{ detailData.projectSource_dictText }}</span>
</div>
<!--项目名称-->
<div class="detail-page-part-form-item">
<label>{{ $t('projectLibrary.projectName') }}</label>
<span>{{ detailData.projectName }}</span>
</div>
<!--工作令编号-->
<div class="detail-page-part-form-item">
<label>{{ $t('projectLibrary.workOrderNumber') }}</label>
<span>{{ detailData.workNumber }}</span>
</div>
<!--项目负责人-->
<div class="detail-page-part-form-item">
<label>{{ $t('projectLibrary.vehicleItemLibrary.projectLeader') }}</label>
<span>{{ detailData.nameWorkNo }}</span>
</div>
<!--项目健康状态-->
<div class="detail-page-part-form-item">
<label>{{ $t('projectLibrary.projectHealthStatus') }}</label>
<span>{{ detailData.projectHealth_dictText }}</span>
</div>
</div>
<!--风险性总览-->
<a-table size="small" bordered :columns="riskOverviewColumns" :data-source="riskOverviewData"></a-table>
<!--法规清单-->
<div class="part-title">{{ $t('projectLibrary.vehicleItemLibrary.regulationsList') }}</div>
<!--查询区域-->
<div class="table-page-search-wrapper">
<a-form layout="inline">
<a-row :gutter="24">
<!--标准号/标准名称-->
<a-col :md="6" :sm="12">
<a-form-item :label="$t('projectLibrary.vehicleItemLibrary.standardNumberStandardName')">
<j-input :placeholder="$t('pleaseEnter') + $t('projectLibrary.vehicleItemLibrary.standardNumberStandardName')"
v-model="queryParam.projectName"></j-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="8">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchReset" icon="reload" ghost>{{ $t('reset') }}</a-button>
<a-button type="primary" @click="searchQuery" icon="search" style="margin-left: 8px" v-has="'vehicleItemLibrary:search'">
{{ $t('query') }}
</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<div class="table-operator">
<!-- 调取-->
<a-button type="primary" @click="handleTransfer" ghost v-has="'vehicleItemLibrary:add'">{{ $t('projectLibrary.vehicleItemLibrary.transfer') }}
</a-button>
<!-- 复制-->
<a-button type="primary" ghost @click="handleCopy" v-has="'vehicleItemLibrary:batchDel'">{{ $t('copy') }}</a-button>
<!-- 导出-->
<a-button icon="upload"
type="primary"
ghost
@click="handleExportXls($t('projectLibrary.vehicleItemLibrary.vehicleItemLibrary'))"
v-has="'vehicleItemLibrary:export'">
{{ $t('export') }}
</a-button>
</div>
<div>
<j-table
:columns="columns"
:dataSource="dataSource"
:can-drag="true"
rowKey="id"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
:pagination="ipagination"
:scroll="{x: '100%'}"
@change="handleTableChange">
<template v-slot:operation="{text, record}">
<a @click="operationClick(operationList[0],record)">{{ operationList[0].text }}</a>
<a-divider type="vertical" />
<a-dropdown placement="bottomCenter">
<a-icon type="more" class="operate-icon-btn operate-icon-more" />
<a-menu slot="overlay">
<a-menu-item v-for="(operation, index) in operationList.slice(operateMaxNum)" :key="index">
<a @click="operationClick(operation,record)">
<div class="operate-btn">
<!-- 编辑图标-->
<i class="iconfont icon-bianji operate-btn-icon" v-if="operation.text === $t('edit')" />
<!-- 删除图标-->
<i class="iconfont icon-shanchu_ operate-btn-icon" v-if="operation.text === $t('delete')" />
{{ operation.text }}
</div>
</a>
</a-menu-item>
</a-menu>
</a-dropdown>
</template>
</j-table>
</div>
</internal-detail-page>
</template>
<script>
import '@assets/less/common.less'
import InternalDetailPage from '../../../components/InternalDetailPage.vue'
import { queryByIdVehicleItemLibrary } from '../../../api/projectLibraryApi.js'
import { JeroListMixin } from '../../../mixins/JeroListMixin.js'
import JTable from '../../../components/jero/JTable.vue'
export default {
name: 'VehicleItemLibraryDetail',
components: { JTable, InternalDetailPage },
mixins: [JeroListMixin],
data () {
return {
loading: false,
detailData: {}, // 项目详情数据
// 风险项总览表头
riskOverviewColumns: [
{
title: this.$route.query.projectName + this.$t('projectLibrary.vehicleItemLibrary.riskOverview'),
children: [
// 符合
{
title: this.$t('projectLibrary.vehicleItemLibrary.conform'),
dataIndex: 'conform',
align: 'center',
width: 200
},
// 不符合
{
title: this.$t('projectLibrary.vehicleItemLibrary.inconformity'),
dataIndex: 'inconformity',
align: 'center',
width: 200
},
// 待验证
{
title: this.$t('projectLibrary.vehicleItemLibrary.toBeVerified'),
dataIndex: 'toBeVerified',
align: 'center',
width: 200
},
// 不涉及
{
title: this.$t('projectLibrary.vehicleItemLibrary.uninvolved'),
dataIndex: 'uninvolved',
align: 'center',
width: 200
}
]
}
],
riskOverviewData: [] // 风险项总览数据
}
},
computed: {
pageTitle () {
return `${this.$route.query.projectName}${this.$t('details')}`
}
},
created () {
this.loadDetailData()
},
methods: {
loadDetailData () {
this.loading = true
queryByIdVehicleItemLibrary({ id: this.$route.query.id }).then(res => {
if (res.success) {
this.detailData = Object.assign({}, res.result || {})
} else {
this.$message.warn(res.message)
}
}).finally(() => {
this.loading = false
})
},
handleTransfer () {
},
handleCopy () {
}
}
}
</script>
<style scoped lang="less">
.project-form {
display: flex;
flex-wrap: wrap;
}
.detail-page-part-form-item {
label {
width: 7em;
}
}
.part-title {
font-size: 16px;
font-family: PingFang SC-Medium, PingFang SC, sans-serif;
font-weight: bold;
color: #1D2129;
margin: 24px 0 15px 0;
}
</style>
@@ -3,7 +3,6 @@
:title="title"
:width="width"
:visible="visible"
switchFullscreen
:maskClosable="false"
:confirmLoading="confirmLoading"
:ok-text="$t('preservation')"
@@ -17,7 +16,7 @@
<!--项目来源-->
<a-col :span="12">
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('projectLibrary.vehicleItemLibrary.projectSource')">
<j-dict-select-tag v-decorator="['projectSource', validatorRules.projectSource]" dictCode="project_source" disabled
<j-dict-select-tag v-decorator="['projectSource', validatorRules.projectSource]" dict-code="project_source" disabled
:placeholder="$t('pleaseSelect') + $t('projectLibrary.vehicleItemLibrary.projectSource')" />
</a-form-item>
</a-col>
@@ -53,7 +52,7 @@
<!--项目健康度-->
<a-col :span="12">
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('projectLibrary.projectHealthStatus')">
<j-dict-select-tag v-decorator="['projectHealth', validatorRules.projectHealth]" dictCode="project_health"
<j-dict-select-tag v-decorator="['projectHealth', validatorRules.projectHealth]" dict-code="project_health"
:placeholder="$t('pleaseSelect') + $t('projectLibrary.projectHealthStatus')" />
</a-form-item>
</a-col>
@@ -2,44 +2,51 @@
<a-card :bordered="false" class="page-left-right-layout">
<!-- 树部分-->
<div class="page-left-box">
<!-- $t('standardRegulationLibrary.domesticStandard.treeSearchPlaceholder')-->
<a-input-search v-model="treeInput" :placeholder="$t('standardRegulationLibrary.domesticStandard.treeSearchPlaceholder')"
@search="handleTreeSearch" />
<a-tree :show-line="true" :show-icon="true" :tree-data="treeData" :selected-keys="selectedTreeKeys">
<a-icon type="folder" slot="folder" class="tree-icon" />
<a-spin :spinning="loading">
<!-- $t('standardRegulationLibrary.domesticStandard.treeSearchPlaceholder')-->
<a-input-search v-model="treeInput"
:placeholder="$t('standardRegulationLibrary.domesticStandard.treeSearchPlaceholder')"
@search="handleTreeSearch" />
<a-tree :show-line="true" :show-icon="true" :tree-data="treeData">
<a-icon type="folder" slot="folder" class="tree-icon" />
<a-icon type="file" slot="file" class="tree-icon" />
<template #custom="record">
<div class="tree-operate-node"
@mouseenter="handleTreeMouseover(record.key)"
@mouseleave="handleTreeMouseout(record.key)"
@click="handleSelectTreeNode(record)">
<a-tooltip>
<template #title>
{{ record.nodeName }}
<template #custom="record">
<div class="tree-operate-node"
@mouseenter="handleTreeMouseover(record.key)"
@mouseleave="handleTreeMouseout(record.key)"
@click="handleSelectTreeNode(record)">
<a-tooltip>
<template #title>
{{ record.nodeName }}
</template>
<span class="tree-node-custom-title">{{ record.nodeName }}</span>
</a-tooltip>
<template v-if="record.key === mouseInNodeKey">
<!-- 新增-->
<a-button icon="plus"
class="tree-operate-node-btn"
@click.stop="handleAddTreeNode(record)"
v-has="'domesticStandard:tree:add'"></a-button>
<!-- 编辑根节点不能编辑-->
<a-button class="tree-operate-node-btn"
@click.stop="handleEditTreeNode(record)"
v-has="'domesticStandard:tree:edit'"
v-if="record.nodeType !== StandardSystemTreeNodeType.ROOT_NODE.value">
<i class="iconfont icon-bianji" />
</a-button>
<!-- 删除根节点不能删除-->
<a-button class="tree-operate-node-btn"
v-has="'domesticStandard:tree:delete'"
v-if="record.nodeType !== StandardSystemTreeNodeType.ROOT_NODE.value"
@click.stop="handleDelTreeNode(record)">
<i class="iconfont icon-shanchu_" />
</a-button>
</template>
<span class="tree-node-custom-title">{{ record.nodeName }}</span>
</a-tooltip>
<template v-if="record.key === mouseInNodeKey">
<!-- 新增-->
<a-button icon="plus"
class="tree-operate-node-btn"
@click.stop="handleAddTreeNode(record)"
v-has="'domesticStandard:tree:add'"></a-button>
<!-- 编辑-->
<a-button class="tree-operate-node-btn" @click.stop="handleEditTreeNode(record)" v-has="'domesticStandard:tree:edit'">
<i class="iconfont icon-bianji" />
</a-button>
<!-- 删除根节点不能删除-->
<a-button class="tree-operate-node-btn"
v-has="'domesticStandard:tree:delete'"
v-if="record.nodeType !== StandardSystemTreeNodeType.ROOT_NODE.value"
@click.stop="handleDelTreeNode(record)">
<i class="iconfont icon-shanchu_" />
</a-button>
</template>
</div>
</template>
</a-tree>
</div>
</template>
</a-tree>
</a-spin>
</div>
<!-- 表格部分-->
<div class="page-right-box">
@@ -178,41 +185,19 @@ import Search from '../../../components/customField/Search.vue'
import JTable from '../../../components/jero/JTable.vue'
import DomesticStandardModal from './modules/DomesticStandardModal.vue'
import {
getDomesticStandardTableHeader,
getDomesticStandardSearchForm,
shareDomesticStandard,
deleteDomesticSystemTree,
configDomesticStandard,
removeDomesticStandard
deleteDomesticSystemTree,
getDomesticStandardSearchForm,
getDomesticStandardTableHeader,
getDomesticStandardTree,
removeDomesticStandard,
shareDomesticStandard
} from '../../../api/standardRegulationLibraryApi'
import { YesOrNoEnum, StandardSystemTreeNodeType, TagsTypeEnums } from '../../../enums/commonEnums'
import { StandardSystemTreeNodeType, TagsTypeEnums, YesOrNoEnum } from '../../../enums/commonEnums'
import UserSelectModal from '../../../components/selection/UserSelectModal.vue'
import DomesticSystemTreeModal from './modules/DomesticSystemTreeModal.vue'
import StandardSelectionModal from '../../../components/selection/StandardSelectionModal.vue'
const apiTreeData = [
{
nodeName: 'parent 1',
key: '0-0',
nodeType: '1',
child: [
{
nodeName: '张晨成',
key: '0-0-0',
child: [
{ nodeName: 'leaf', key: '0-0-0-0' },
{ nodeName: 'leaf', key: '0-0-0-1' }
]
},
{
nodeName: 'parent 1-1',
key: '0-0-1',
child: [{ key: '0-0-1-0', nodeName: 'zcvc' }]
}
]
}
]
export default {
name: 'DomesticStandardList',
components: { Search, JTable, DomesticStandardModal, UserSelectModal, DomesticSystemTreeModal, StandardSelectionModal },
@@ -280,7 +265,14 @@ export default {
* 获取树数据
*/
initTreeData () {
this.treeData = this.dealTreeData(apiTreeData)
getDomesticStandardTree().then(res => {
if (res.success) {
const treeData = res.result || []
this.treeData = this.dealTreeData(treeData)
} else {
this.$message.warn(res.message)
}
})
},
/**
* 处理树数据,加入自定义的节点插槽
@@ -289,11 +281,13 @@ export default {
*/
dealTreeData (treeData) {
return treeData.map(item => {
if (item.child && item.child.length > 0) {
if (item.children && item.children.length > 0) {
item.scopedSlots = { icon: 'folder', title: 'custom' }
item.children = this.dealTreeData(item.children)
} else if (item.nodeType === StandardSystemTreeNodeType.ROOT_NODE.value) {
item.scopedSlots = { icon: 'folder', title: 'custom' }
item.children = this.dealTreeData(item.child)
} else {
item.scopedSlots = { title: 'custom' }
item.scopedSlots = { icon: 'file', title: 'custom' }
}
return item
})
@@ -382,7 +376,7 @@ export default {
* @param dataRef
*/
handleAddTreeNode ({ dataRef }) {
this.$refs.treeModal.add({ parentId: dataRef.key })
this.$refs.treeModal.add({ parentId: dataRef.id, parentCode: dataRef.nodeCode })
},
/**
* 编辑树节点
@@ -400,7 +394,7 @@ export default {
title: this.$t('confirmDeletion'),
content: this.$t('areYouSure'),
onOk: () => {
deleteDomesticSystemTree({ ids: dataRef.id }).then((res) => {
deleteDomesticSystemTree({ id: dataRef.id }).then((res) => {
if (res.success) {
this.$message.success(res.message)
this.modalFormOk()
@@ -537,4 +531,8 @@ export default {
}
}
}
/deep/ .ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop {
display: none;
}
</style>
@@ -13,7 +13,7 @@
<a-input :placeholder="$t('pleaseEnter') + $t('standardRegulationLibrary.nodeName')"
@change="event => event.target.value = event.target.value.trim()"
:maxLength="50"
v-decorator="[ 'nodeName', validatorRules.nodeName]" />
v-decorator="['nodeName', validatorRules.nodeName]" />
</a-form-item>
</a-form>
@@ -69,6 +69,7 @@ export default {
if (!err) {
this.confirmLoading = true
const formData = Object.assign(this.model, values)
formData.nodeOrder = '0'
let submitFunc
if (this.model.id) {
submitFunc = editDomesticSystemTree
+69 -50
View File
@@ -23,32 +23,40 @@
<a-form-model ref="form" :model="model" :rules="validatorRules">
<a-form-model-item :label="$t('user.userAccount')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="username">
<a-input :placeholder="$t('pleaseEnter') + $t('user.userAccount')" :maxLength="50" v-model="model.username" :readOnly="!!model.id" :disabled="disableSubmit"/>
<a-input :placeholder="$t('pleaseEnter') + $t('user.userAccount')"
:maxLength="50"
v-model="model.username"
:readOnly="!!model.id"
:disabled="disableSubmit" />
</a-form-model-item>
<template v-if="!model.id">
<a-form-model-item :label="$t('user.loginPassword')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="password" >
<a-form-model-item :label="$t('user.loginPassword')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="password">
<a-input-password type="password" :placeholder="$t('pleaseEnter') + $t('user.loginPassword')" :maxLength="20" v-model="model.password" />
</a-form-model-item>
<a-form-model-item :label="$t('user.confirmPassword')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="confirmpassword" >
<a-input-password type="password" @blur="handleConfirmBlur" :maxLength="20" :placeholder="$t('user.reenterLoginPassword')" v-model="model.confirmpassword"/>
<a-form-model-item :label="$t('user.confirmPassword')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="confirmpassword">
<a-input-password type="password"
@blur="handleConfirmBlur"
:maxLength="20"
:placeholder="$t('user.reenterLoginPassword')"
v-model="model.confirmpassword" />
</a-form-model-item>
</template>
<a-form-model-item :label="$t('user.userName')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="realname">
<a-input :placeholder="$t('pleaseEnter') + $t('user.userName')" v-model="model.realname" :maxLength="50" :disabled="disableSubmit"/>
<a-input :placeholder="$t('pleaseEnter') + $t('user.userName')" v-model="model.realname" :maxLength="50" :disabled="disableSubmit" />
</a-form-model-item>
<!--<a-form-model-item label="工号" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!--<a-input placeholder="请输入工号" v-decorator.trim="[ 'workNo', validatorRules.workNo]" />-->
<!--</a-form-model-item>-->
<a-form-model-item label="工号" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入工号" v-model="model.workNo" />
</a-form-model-item>
<!--<a-form-model-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!--<j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', {}]"/>-->
<!--<j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', {}]"/>-->
<!--</a-form-model-item>-->
<a-form-model-item :label="$t('user.roleAssignment')" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled" >
<a-form-model-item :label="$t('user.roleAssignment')" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled">
<j-multi-select-tag
:disabled="disableSubmit"
v-model="model.selectedroles"
@@ -65,7 +73,8 @@
:multi="true"
@back="backDepartInfo"
:backDepart="true"
:treeOpera="true">></j-select-depart>
:treeOpera="true">>
</j-select-depart>
</a-form-model-item>
<!--租户分配
@@ -79,13 +88,13 @@
</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-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">
<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"
@@ -94,7 +103,7 @@
</j-multi-select-tag>
</a-form-model-item>
<!-- update--end--autor:wangshuai-----date:20200108------for新增身份和负责部门------ -->
<a-form-model-item :label="$t('user.heads')" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-form-model-item :label="$t('user.heads')" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-image-upload class="avatar-uploader"
:text="$t('upload')"
v-model="model.avatar"
@@ -104,28 +113,33 @@
</a-form-model-item>
<a-form-model-item :label="$t('user.gender')" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-select v-model="model.sex" :placeholder="$t('pleaseSelect') + $t('user.gender')" :getPopupContainer= "(target) => target.parentNode" :disabled="disableSubmit">
<a-select v-model="model.sex"
:placeholder="$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">
<a-input :placeholder="$t('pleaseEnter') + $t('user.mailbox')" v-model="model.email" :maxLength="50" :disabled="disableSubmit"/>
<a-input :placeholder="$t('pleaseEnter') + $t('user.mailbox')" v-model="model.email" :maxLength="50" :disabled="disableSubmit" />
</a-form-model-item>
<a-form-model-item :label="$t('phoneNumber')" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="phone">
<a-input :placeholder="$t('pleaseEnter') + $t('phoneNumber')" :disabled="isDisabledAuth('user:form:phone') || disableSubmit" v-model="model.phone" />
<a-input :placeholder="$t('pleaseEnter') + $t('phoneNumber')"
:disabled="isDisabledAuth('user:form:phone') || disableSubmit"
v-model="model.phone" />
</a-form-model-item>
<!-- <a-form-model-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <j-dict-select-tag v-model="model.activitiSync" placeholder="请选择是否同步工作流引擎" :type="'radio'" dictCode="activiti_sync"/>-->
<!-- </a-form-model-item>-->
<!-- <a-form-model-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <j-dict-select-tag v-model="model.activitiSync" placeholder="请选择是否同步工作流引擎" :type="'radio'" dictCode="activiti_sync"/>-->
<!-- </a-form-model-item>-->
</a-form-model>
</a-spin>
<div class="drawer-bootom-button" v-show="!disableSubmit">
<div class="drawer-bootom-button" v-show="!disableSubmit">
<a-popconfirm :title="$t('areYouWantDiscardEditing')" @confirm="handleCancel" :okText="$t('determine')" :cancelText="$t('cancel')">
<a-button style="margin-right: .8rem">{{ $t('cancel') }}</a-button>
</a-popconfirm>
@@ -166,7 +180,11 @@ export default {
validatorRules: {
username: [{ required: true, message: this.$t('pleaseEnter') + this.$t('user.userAccount') },
{ validator: this.validateUsername }],
password: [{ required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: this.$t('user.passwordConsists') },
password: [{
required: true,
pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
message: this.$t('user.passwordConsists')
},
{ validator: this.validateToNextPassword, trigger: 'change' }],
confirmpassword: [{ required: true, message: this.$t('user.reenterLoginPassword') },
{ validator: this.compareToFirstPassword }],
@@ -502,34 +520,35 @@ export default {
</script>
<style scoped>
.avatar-uploader > .ant-upload {
width:104px;
height:104px;
}
.ant-upload-select-picture-card i {
font-size: 49px;
color: #999;
}
.avatar-uploader > .ant-upload {
width: 104px;
height: 104px;
}
.ant-upload-select-picture-card .ant-upload-text {
margin-top: 8px;
color: #666;
}
.ant-upload-select-picture-card i {
font-size: 49px;
color: #999;
}
.ant-table-tbody .ant-table-row td{
padding-top:10px;
padding-bottom:10px;
}
.ant-upload-select-picture-card .ant-upload-text {
margin-top: 8px;
color: #666;
}
.drawer-bootom-button {
position: absolute;
bottom: -8px;
width: 100%;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
.ant-table-tbody .ant-table-row td {
padding-top: 10px;
padding-bottom: 10px;
}
.drawer-bootom-button {
position: absolute;
bottom: -8px;
width: 100%;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
</style>