Merge remote-tracking branch 'origin/dev_20230808_OTA'
# Conflicts: # jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectStatusBoardServiceImpl.java # jero-web/src/common/lang/en-us.js # jero-web/src/common/lang/zh-cn.js
This commit is contained in:
@@ -1926,5 +1926,32 @@ module.exports = {
|
||||
processInitiationOne:'Process Initiation',
|
||||
taskHandlingOne:'Task Handling',
|
||||
taskReview:'Task Review',
|
||||
softwareversion:'Software version',
|
||||
softwareplatform:'Software platform',
|
||||
softwarereleasetime:'Software release time',
|
||||
theme:'theme',
|
||||
influencestatute:'Influence statute',
|
||||
vdrste:'VDR status',
|
||||
impactdescription:'Impact description',
|
||||
authenticationimpact:'Authentication impact',
|
||||
impactstatement:'Impact statement',
|
||||
certificationdeclaration:'Certification declaration',
|
||||
matchingstate:'Matching state',
|
||||
issuenotice:'Issue notice',
|
||||
applyforrematch:'Apply for rematch',
|
||||
notificationsent:'Is a notification sent?',
|
||||
VDRDetails:'VDR Details',
|
||||
applicationprojectversion:'Application project version',
|
||||
selectlocked:'You can select only the data whose matching status is locked',
|
||||
otastatus:'OTA status',
|
||||
Matchingstatestatistics:'Matching state statistics',
|
||||
OTaauthenticationprogressstatistics:'OTA authentication progress statistics',
|
||||
tobematched:'To be matched',
|
||||
Pendingapproval:'To be approved',
|
||||
lock:'lock',
|
||||
datacannotbeedited:'This data cannot be edited',
|
||||
Rematchornot:'Rematch or not',
|
||||
Modifyremarks:'Modify remarks',
|
||||
Reasonforreturn:'Reason for return',
|
||||
maintenanceTemplate:'Maintenance template',
|
||||
}
|
||||
@@ -3883,4 +3883,31 @@ module.exports = {
|
||||
taskHandlingOne:'任务办理',
|
||||
taskReview:'任务审查',
|
||||
maintenanceTemplate:'维护模板',
|
||||
softwareversion:'软件版本',
|
||||
softwareplatform:'软件平台',
|
||||
softwarereleasetime:'软件发布时间',
|
||||
theme:'主题',
|
||||
influencestatute:'影响法规',
|
||||
vdrste:'VDR状态',
|
||||
impactdescription:'影响描述',
|
||||
authenticationimpact:'认证影响',
|
||||
impactstatement:'影响说明',
|
||||
certificationdeclaration:'认证申报',
|
||||
matchingstate:'匹配状态',
|
||||
issuenotice:'下发通知',
|
||||
applyforrematch:'申请重新匹配',
|
||||
notificationsent:'是否下发通知?',
|
||||
VDRDetails:'VDR详情',
|
||||
applicationprojectversion:'应用项目版本',
|
||||
selectlocked:'只能选择匹配状态为锁定的数据',
|
||||
otastatus:'OTA状态',
|
||||
Matchingstatestatistics:'匹配状态统计',
|
||||
OTaauthenticationprogressstatistics:'OTA认证进度统计',
|
||||
tobematched:'待匹配',
|
||||
Pendingapproval:'待审批',
|
||||
lock:'锁定',
|
||||
datacannotbeedited:'该数据不能进行编辑',
|
||||
Rematchornot:'是否重新匹配',
|
||||
Modifyremarks:'修改备注',
|
||||
Reasonforreturn:'退回原因'
|
||||
}
|
||||
@@ -11,6 +11,7 @@
|
||||
<a-select v-else-if="tagType=='select'" allowClear :getPopupContainer="getPopupContainer"
|
||||
show-search
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
:placeholder="placeholder" :disabled="disabled" :value="getValueSting" @change="handleInput">
|
||||
<!-- <a-select-option :value="null">{{$t('pleaseSelect')}}</a-select-option>-->
|
||||
<a-select-option v-for="(item, key) in dictOptionsValue"
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
<!--重新匹配-->
|
||||
<template>
|
||||
<a-modal
|
||||
:title="$t('applyforrematch')"
|
||||
:width="600"
|
||||
:visible="visible"
|
||||
:confirm-loading="confirmLoading"
|
||||
:maskClosable="false"
|
||||
@ok="handleOk"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<span class="Required">*</span>
|
||||
<span class="title-text-text" :title="$t('projectVersion')">
|
||||
{{$t('projectVersion')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="projectVersion">
|
||||
<a-select
|
||||
class="box-input propbox"
|
||||
style="width: 90%"
|
||||
v-model='formInline.projectVersion'
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
:getPopupContainer="triggerNode=> triggerNode.parentNode"
|
||||
allowClear
|
||||
:placeholder="$t('PleaseSelect')+$t('projectVersion')">
|
||||
<!-- <a-select-option :value="null">{{$t('pleaseSelect')}}</a-select-option>-->
|
||||
<a-select-option v-for="(item, key) in projectVersionList"
|
||||
:label='item.versionName'
|
||||
:key="key"
|
||||
:value="item.projectId">
|
||||
<span style="display: inline-block;width: 100%" :title=" item.versionName">
|
||||
{{ item.versionName }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction, putAction } from '@/api/manage'
|
||||
import moment from 'moment'
|
||||
|
||||
export default {
|
||||
name: 'settingList',
|
||||
props: ['url'],
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
confirmLoading: false,
|
||||
transittime:false,
|
||||
returntime:false,
|
||||
propflag: false,
|
||||
projectVersionList:[],
|
||||
formInline: {
|
||||
bazt:undefined,
|
||||
batjsj:'',
|
||||
tgthsj:'',
|
||||
bz:'',
|
||||
},
|
||||
rules: {
|
||||
projectVersion: [
|
||||
{
|
||||
required: true,
|
||||
message: this.$t('projectVersion') + this.$t('cannotEmpty'),
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
// batjsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('filingtime') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// bz: [
|
||||
// { min: 1, max: 500, message: this.$t('cantExeed') + '500' + this.$t('characters'), trigger: 'blur' }
|
||||
// ],
|
||||
// tgthsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
},
|
||||
ids: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
edit(row,vehicleTypeCode) {
|
||||
this.ids = row
|
||||
this.vehicleTypeCode = vehicleTypeCode
|
||||
this.getprojectList()
|
||||
this.visible = true
|
||||
this.$nextTick(() => {
|
||||
this.formInline = {}
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
})
|
||||
},
|
||||
getprojectList(){
|
||||
getAction('/ota/otaManageApplyEO/getProjectVersionList', {carMarket:this.vehicleTypeCode}).then((res) => {
|
||||
if (res.success) {
|
||||
this.projectVersionList = res.result
|
||||
} else {
|
||||
}
|
||||
})
|
||||
},
|
||||
handleOk() {
|
||||
this.$refs.ruleForm.validate(valid => {
|
||||
if (valid) {
|
||||
let query = {
|
||||
...this.formInline,
|
||||
ids:this.ids.join(',')
|
||||
}
|
||||
this.confirmLoading = true
|
||||
getAction('/ota/otaManageApplyEO/applyRematch', query).then((res) => {
|
||||
if (res.success) {
|
||||
this.$message.success(this.$t('OperationSuccessful'))
|
||||
this.visible = false
|
||||
this.confirmLoading = false
|
||||
this.ids = []
|
||||
this.$emit('getList')
|
||||
} else {
|
||||
this.$message.warning(this.$t('operationFailed'))
|
||||
this.confirmLoading = false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleCancel() {
|
||||
this.formInline = {}
|
||||
this.ids = []
|
||||
this.visible = false
|
||||
},
|
||||
// dateChange(item) {
|
||||
// this.formInline[item.db_field_name] = this.formInline[item.db_field_name] ? moment(this.formInline[item.db_field_name]).format('YYYY-MM-DD') : ''
|
||||
// }
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.formAdd .ant-form-item-label {
|
||||
width: 130px;
|
||||
}
|
||||
|
||||
.formAdd .ant-form-item-control-wrapper {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*.formAdd .ant-form-item {*/
|
||||
/* margin-bottom: 20px;*/
|
||||
/*}*/
|
||||
|
||||
.itemModel .ant-form-item-control-wrapper {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--single {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection__rendered {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker-input {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-input-number-input-wrap {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
width: 144px;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
height: 38px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.title-text-text {
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.formAdd {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 3px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,286 @@
|
||||
<!--批量设置-->
|
||||
<template>
|
||||
<a-modal
|
||||
:title="$t('BatchSetting')"
|
||||
:width="600"
|
||||
:visible="visible"
|
||||
:confirm-loading="confirmLoading"
|
||||
:maskClosable="false"
|
||||
@ok="handleOk"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<!-- <span class="Required">*</span>-->
|
||||
<span class="title-text-text" :title="$t('projectVersion')">
|
||||
{{$t('projectVersion')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="projectVersion">
|
||||
<a-select
|
||||
class="box-input propbox"
|
||||
style="width: 90%"
|
||||
v-model='formInline.projectVersion'
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
:getPopupContainer="triggerNode=> triggerNode.parentNode"
|
||||
allowClear
|
||||
:placeholder="$t('PleaseSelect')+$t('projectVersion')">
|
||||
<!-- <a-select-option :value="null">{{$t('pleaseSelect')}}</a-select-option>-->
|
||||
<a-select-option v-for="(item, key) in projectVersionList"
|
||||
:label='item.versionName'
|
||||
:key="key"
|
||||
:value="item.projectId">
|
||||
<span style="display: inline-block;width: 100%" :title=" item.versionName">
|
||||
{{ item.versionName }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<!-- <span class="Required">*</span>-->
|
||||
<span class="title-text-text" :title="$t('CertificationProgress')">
|
||||
{{$t('CertificationProgress')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="bazt">
|
||||
<j-dict-select-tag class="box-input" v-model="formInline.attestationSchedule"
|
||||
:placeholder="$t('PleaseSelect')+$t('CertificationProgress')"
|
||||
:type="'select'"
|
||||
style="width: 90%"
|
||||
:triggerChange="false" :dictCode="'certification_progress'"/>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<!-- <span class="Required">*</span>-->
|
||||
<span class="title-text-text" :title="$t('remarks')">
|
||||
{{$t('remarks')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="bz">
|
||||
<a-textarea :placeholder="$t('pleaseEnter')+$t('remarks')"
|
||||
v-model="formInline.remark"
|
||||
style="width: 90%"
|
||||
:maxLength="200"
|
||||
:rows="4"/>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction, putAction } from '@/api/manage'
|
||||
import moment from 'moment'
|
||||
|
||||
export default {
|
||||
name: 'settingList',
|
||||
props: ['url'],
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
confirmLoading: false,
|
||||
transittime:false,
|
||||
returntime:false,
|
||||
propflag: false,
|
||||
formInline: {
|
||||
bazt:undefined,
|
||||
batjsj:'',
|
||||
tgthsj:'',
|
||||
bz:'',
|
||||
},
|
||||
projectVersionList:[],
|
||||
rules: {
|
||||
// bazt: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('recordstatus') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// batjsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('filingtime') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// bz: [
|
||||
// { min: 1, max: 500, message: this.$t('cantExeed') + '500' + this.$t('characters'), trigger: 'blur' }
|
||||
// ],
|
||||
// tgthsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
},
|
||||
ids: '',
|
||||
vehicleTypeCode:'',
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
edit(row,vehicleTypeCode) {
|
||||
this.ids = row
|
||||
this.vehicleTypeCode = vehicleTypeCode
|
||||
this.getprojectList()
|
||||
this.visible = true
|
||||
this.$nextTick(() => {
|
||||
this.formInline = {}
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
})
|
||||
},
|
||||
getprojectList(){
|
||||
getAction('/ota/otaManageApplyEO/getProjectVersionList', {carMarket:this.vehicleTypeCode}).then((res) => {
|
||||
if (res.success) {
|
||||
this.projectVersionList = res.result
|
||||
} else {
|
||||
}
|
||||
})
|
||||
},
|
||||
handleOk() {
|
||||
this.$refs.ruleForm.validate(valid => {
|
||||
if (valid) {
|
||||
let OtaManageApplyEO = JSON.parse(JSON.stringify(this.ids))
|
||||
let query = {
|
||||
list: OtaManageApplyEO,
|
||||
...this.formInline,
|
||||
}
|
||||
this.confirmLoading = true
|
||||
postAction('/ota/otaManageApplyEO/updateVdrBatch', query).then((res) => {
|
||||
if (res.success) {
|
||||
// this.$message.success(this.$t('OperationSuccessful'))
|
||||
this.visible = false
|
||||
this.confirmLoading = false
|
||||
this.ids = []
|
||||
this.$emit('msgForm',res.result.msgList)
|
||||
// this.$emit('getList')
|
||||
} else {
|
||||
this.$message.warning(this.$t('operationFailed'))
|
||||
this.confirmLoading = false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleCancel() {
|
||||
this.formInline = {}
|
||||
this.ids = []
|
||||
this.visible = false
|
||||
},
|
||||
// dateChange(item) {
|
||||
// this.formInline[item.db_field_name] = this.formInline[item.db_field_name] ? moment(this.formInline[item.db_field_name]).format('YYYY-MM-DD') : ''
|
||||
// }
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.formAdd .ant-form-item-label {
|
||||
width: 130px;
|
||||
}
|
||||
|
||||
.formAdd .ant-form-item-control-wrapper {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*.formAdd .ant-form-item {*/
|
||||
/* margin-bottom: 20px;*/
|
||||
/*}*/
|
||||
|
||||
.itemModel .ant-form-item-control-wrapper {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--single {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection__rendered {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker-input {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-input-number-input-wrap {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
width: 144px;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
height: 38px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.title-text-text {
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.formAdd {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 3px;
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<a-table
|
||||
:components="drag(columnshistory,'columnshistory')"
|
||||
class="table"
|
||||
:columns="columnshistory"
|
||||
:pagination="false"
|
||||
:scroll="{x: '100%',y: 400}"
|
||||
:data-source="dataSourcehistory"
|
||||
>
|
||||
<span slot="content" slot-scope="text,record">
|
||||
<a-tooltip placement="topLeft">
|
||||
<template slot="title">
|
||||
<span v-html="text"></span>
|
||||
</template>
|
||||
<span v-html="text"></span>
|
||||
</a-tooltip>
|
||||
</span>
|
||||
<span slot="detailText" slot-scope="text,record">
|
||||
<span class="text" :title="text">
|
||||
{{text && text.length > 38?text.slice(0,37)+'...':text}}
|
||||
</span>
|
||||
</span>
|
||||
</a-table>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
|
||||
export default {
|
||||
name: 'historyTable.vue',
|
||||
props:['columnshistory','dataSourcehistory'],
|
||||
mixins:[ResizeHeader, ResizeColumnProvide],
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,223 @@
|
||||
<!--拒绝原因-->
|
||||
<template>
|
||||
<a-modal
|
||||
:title="$t('Reasonforreturn')"
|
||||
:width="600"
|
||||
:visible="visible"
|
||||
:confirm-loading="confirmLoading"
|
||||
:maskClosable="false"
|
||||
@ok="handleOk"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<span class="Required">*</span>
|
||||
<span class="title-text-text" :title="$t('Reasonforreturn')">
|
||||
{{$t('Reasonforreturn')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="rejectReason">
|
||||
<a-textarea :placeholder="$t('pleaseEnter')+$t('Reasonforreturn')"
|
||||
v-model="formInline.rejectReason"
|
||||
style="width: 90%"
|
||||
:maxLength="200"
|
||||
:rows="4"/>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction, putAction } from '@/api/manage'
|
||||
import moment from 'moment'
|
||||
|
||||
export default {
|
||||
name: 'settingList',
|
||||
props: ['url'],
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
confirmLoading: false,
|
||||
transittime:false,
|
||||
returntime:false,
|
||||
propflag: false,
|
||||
formInline: {
|
||||
bazt:undefined,
|
||||
batjsj:'',
|
||||
tgthsj:'',
|
||||
bz:'',
|
||||
},
|
||||
rules: {
|
||||
rejectReason: [
|
||||
{
|
||||
required: true,
|
||||
message: this.$t('Reasonforreturn') + this.$t('cannotEmpty'),
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
// batjsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('filingtime') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// bz: [
|
||||
// { min: 1, max: 500, message: this.$t('cantExeed') + '500' + this.$t('characters'), trigger: 'blur' }
|
||||
// ],
|
||||
// tgthsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
},
|
||||
ids: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
edit(row) {
|
||||
this.ids = row
|
||||
this.visible = true
|
||||
this.$nextTick(() => {
|
||||
this.formInline = {}
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
})
|
||||
},
|
||||
handleOk() {
|
||||
this.$refs.ruleForm.validate(valid => {
|
||||
if (valid) {
|
||||
let query = {
|
||||
...this.formInline,
|
||||
ids:this.ids.join(',')
|
||||
}
|
||||
this.confirmLoading = true
|
||||
getAction('/ota/otaManageApplyEO/reject', query).then((res) => {
|
||||
if (res.success) {
|
||||
this.visible = false
|
||||
this.confirmLoading = false
|
||||
this.ids = []
|
||||
this.$emit('msgForm',res.result.msgList)
|
||||
// this.$emit('getList')
|
||||
} else {
|
||||
this.$message.warning(this.$t('operationFailed'))
|
||||
this.confirmLoading = false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleCancel() {
|
||||
this.formInline = {}
|
||||
this.ids = []
|
||||
this.visible = false
|
||||
},
|
||||
// dateChange(item) {
|
||||
// this.formInline[item.db_field_name] = this.formInline[item.db_field_name] ? moment(this.formInline[item.db_field_name]).format('YYYY-MM-DD') : ''
|
||||
// }
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.formAdd .ant-form-item-label {
|
||||
width: 130px;
|
||||
}
|
||||
|
||||
.formAdd .ant-form-item-control-wrapper {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*.formAdd .ant-form-item {*/
|
||||
/* margin-bottom: 20px;*/
|
||||
/*}*/
|
||||
|
||||
.itemModel .ant-form-item-control-wrapper {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--single {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection__rendered {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker-input {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-input-number-input-wrap {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
width: 144px;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
height: 38px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.title-text-text {
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.formAdd {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 3px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,220 @@
|
||||
<!--批量设置-->
|
||||
<template>
|
||||
<a-modal
|
||||
:title="$t('Modifyremarks')"
|
||||
:width="600"
|
||||
:visible="visible"
|
||||
:confirm-loading="confirmLoading"
|
||||
:maskClosable="false"
|
||||
@ok="handleOk"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text">
|
||||
<!-- <span class="Required">*</span>-->
|
||||
<span class="title-text-text" :title="$t('remarks')">
|
||||
{{$t('remarks')}}</span>
|
||||
</div>
|
||||
<a-form-model-item class="itemModel" prop="bz">
|
||||
<a-textarea :placeholder="$t('pleaseEnter')+$t('remarks')"
|
||||
v-model="formInline.remark"
|
||||
style="width: 90%"
|
||||
:maxLength="200"
|
||||
:rows="4"/>
|
||||
</a-form-model-item>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction, putAction } from '@/api/manage'
|
||||
import moment from 'moment'
|
||||
|
||||
export default {
|
||||
name: 'settingList',
|
||||
props: ['url'],
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
confirmLoading: false,
|
||||
transittime:false,
|
||||
returntime:false,
|
||||
propflag: false,
|
||||
formInline: {
|
||||
|
||||
},
|
||||
projectVersionList:[],
|
||||
rules: {
|
||||
// bazt: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('recordstatus') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// batjsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('filingtime') + this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
// bz: [
|
||||
// { min: 1, max: 500, message: this.$t('cantExeed') + '500' + this.$t('characters'), trigger: 'blur' }
|
||||
// ],
|
||||
// tgthsj: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: this.$t('cannotEmpty'),
|
||||
// trigger: 'change'
|
||||
// }
|
||||
// ],
|
||||
},
|
||||
row: {}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
edit(row) {
|
||||
this.row = row
|
||||
this.formInline.remark = row.remark == '-'?'':row.remark
|
||||
this.visible = true
|
||||
this.$nextTick(() => {
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
})
|
||||
},
|
||||
handleOk() {
|
||||
this.$refs.ruleForm.validate(valid => {
|
||||
if (valid) {
|
||||
// let query = {
|
||||
// ...this.formInline,
|
||||
// }
|
||||
this.confirmLoading = true
|
||||
// postAction('ota/otaBaSjList/batchRecord', query).then((res) => {
|
||||
// if (res.success) {
|
||||
// this.$message.success(this.$t('OperationSuccessful'))
|
||||
// this.visible = false
|
||||
// this.confirmLoading = false
|
||||
// this.$emit('remarkForm',this.formInline,this.ids)
|
||||
// } else {
|
||||
// this.$message.warning(this.$t('operationFailed'))
|
||||
// this.confirmLoading = false
|
||||
// }
|
||||
// })
|
||||
this.$emit('remarkForm',this.formInline.remark,this.row.id)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleCancel() {
|
||||
this.formInline = {}
|
||||
this.ids = ''
|
||||
this.visible = false
|
||||
},
|
||||
// dateChange(item) {
|
||||
// this.formInline[item.db_field_name] = this.formInline[item.db_field_name] ? moment(this.formInline[item.db_field_name]).format('YYYY-MM-DD') : ''
|
||||
// }
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.formAdd .ant-form-item-label {
|
||||
width: 130px;
|
||||
}
|
||||
|
||||
.formAdd .ant-form-item-control-wrapper {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*.formAdd .ant-form-item {*/
|
||||
/* margin-bottom: 20px;*/
|
||||
/*}*/
|
||||
|
||||
.itemModel .ant-form-item-control-wrapper {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--single {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection__rendered {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-calendar-picker-input {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
.box-input .ant-input-number-input-wrap {
|
||||
line-height: 38px;
|
||||
height: 38px;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
width: 144px;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
height: 38px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.title-text-text {
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.formAdd {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 3px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,262 @@
|
||||
<!--VDR详情-->
|
||||
<template>
|
||||
<div>
|
||||
<a-drawer
|
||||
:title="$t('VDRDetails')"
|
||||
:maskClosable="false"
|
||||
:width="800"
|
||||
placement="right"
|
||||
:closable="true"
|
||||
@close="handleCancel"
|
||||
:visible="visible"
|
||||
style="height: 100%;overflow: auto;padding-bottom: 53px;">
|
||||
<a-spin :spinning="confirmLoading">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{'VDR'}}</span>
|
||||
<span class="title-text-text" :title="form.vdr">
|
||||
{{form.vdr}}</span>
|
||||
</div>
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('theme')}}</span>
|
||||
<span class="title-text-text" :title="form.summary">
|
||||
{{form.summary}}</span>
|
||||
</div>
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text' style='width:300px'>{{$t('authenticationimpact')}}</span>
|
||||
<span class="title-text-text" :title="form.homologationImpact">
|
||||
{{form.homologationImpact}}</span>
|
||||
</div>
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('influencestatute') + '-CN'}}</span>
|
||||
<span class="title-text-text" :title="form.impactCnHomo">
|
||||
{{form.impactCnHomo}}</span>
|
||||
</div>
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('influencestatute') + '-EU'}}</span>
|
||||
<span class="title-text-text" :title="form.impactEuHomo">
|
||||
{{form.impactEuHomo}}</span>
|
||||
</div>
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
<div style='margin-bottom: 10px;font-weight: bold;'>{{$t('applicationprojectversion')}}</div>
|
||||
<div v-for='(item,index) in vdrList' :key='index'>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="24">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text' style="width: 300px">{{item.versionName}}</span>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="12">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('certificationStartOne')}}</span>
|
||||
<span class="title-text-text" :title="item.attestationStartTime?item.attestationStartTime:'--'">
|
||||
{{item.attestationStartTime?item.attestationStartTime:'--'}}</span>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('certificationdeclaration')}}</span>
|
||||
<span class="title-text-text" :title="item.certificationSubmission?item.certificationSubmission:'--'">
|
||||
{{item.certificationSubmission?item.certificationSubmission:'--'}}</span>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="12">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('certificationEnd')}}</span>
|
||||
<span class="title-text-text" :title="item.attestationEndTime?item.attestationEndTime:'--'">
|
||||
{{item.attestationEndTime?item.attestationEndTime:'--'}}</span>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<div class='detail-box'>
|
||||
<span class='detail-text'>{{$t('CertificationProgress')}}</span>
|
||||
<span class="title-text-text" :title="item.attestationSchedule?item.attestationSchedule:'--'">
|
||||
{{item.attestationSchedule?item.attestationSchedule:'--'}}</span>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
|
||||
</a-spin>
|
||||
<div class="drawer-bootom-button">
|
||||
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('close')}}</a-button>
|
||||
<!-- <a-button type="primary" @click="handleSubmit" :loading="confirmLoading">{{$t('submit')}}</a-button>-->
|
||||
</div>
|
||||
</a-drawer>
|
||||
<uploadFile ref="uploadFile" :acceptcode="acceptcode" @uploadSuccess="uploadSuccess"/>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction } from '@/api/manage'
|
||||
import uploadFile from '@/components/uploadFile/file'
|
||||
import { mapGetters } from 'vuex'
|
||||
|
||||
export default {
|
||||
name:"addModel",
|
||||
components:{
|
||||
uploadFile
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
disabled: false,
|
||||
showButton:false,
|
||||
confirmLoading: false,
|
||||
acceptcode:'',
|
||||
projectNameList: [],
|
||||
DeliverableTreeList: [],
|
||||
form:{
|
||||
VDR:'',
|
||||
theme:'',
|
||||
authenticationimpact:'',
|
||||
influencestatuteCn:'',
|
||||
influencestatuteEu:'',
|
||||
},
|
||||
vdrList:[],
|
||||
url:{
|
||||
addModel:''
|
||||
},
|
||||
record:{},
|
||||
car:'',
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
...mapGetters(['userInfo']),
|
||||
addModel(record,val) {
|
||||
this.form=record
|
||||
this.car = val
|
||||
getAction('/ota/otaManageApplyEO/getVersionInfo', {vdr:this.form.vdr,car:this.car}).then((res) => {
|
||||
if (res.success) {
|
||||
this.vdrList = res.result
|
||||
} else {
|
||||
}
|
||||
})
|
||||
this.visible = true
|
||||
this.confirmLoading = false
|
||||
console.log('555',record);
|
||||
},
|
||||
handleCancel() {
|
||||
this.visible = false
|
||||
},
|
||||
/** 上传文件的回调 */
|
||||
uploadSuccess(data) {
|
||||
let attIdList = []
|
||||
if (data && data.length > 0) {
|
||||
data.map(item => {
|
||||
attIdList.push(item.id || data.name)
|
||||
})
|
||||
}
|
||||
/** 赋值给当前对应的表单文件 */
|
||||
this.formInline[this.uploadName] = attIdList.join(',')
|
||||
this.formInline = { ...this.formInline }
|
||||
},
|
||||
isEdit(){
|
||||
this.disabled=false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
/*align-items: center;*/
|
||||
}
|
||||
.detail-box{
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.detail-text{
|
||||
display: inline-block;
|
||||
width: 95px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.title-text {
|
||||
width: 250px;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
height: 42px;
|
||||
line-height: 48px;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
height: 38px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
min-height: 40px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.header-text {
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.drawer-bootom-button {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
z-index: 100;
|
||||
border-top: 1px solid #e8e8e8;
|
||||
padding: 10px 16px;
|
||||
text-align: right;
|
||||
left: 0;
|
||||
background: #fff;
|
||||
border-radius: 0 0 2px 2px;
|
||||
}
|
||||
|
||||
.icon-text {
|
||||
font-size: 16px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,448 @@
|
||||
<!--ota管理-->
|
||||
<template>
|
||||
<a-card :bordered="false">
|
||||
<div class="table-page-search-wrapper">
|
||||
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||
<a-row :gutter="24">
|
||||
<a-col :md="6" :sm="8">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text" :title="$t('softwareversion')">
|
||||
<span>{{ $t('softwareversion') }}</span>
|
||||
</div>
|
||||
<a-select :placeholder="$t('PleaseSelect')+$t('softwareplatform')"
|
||||
class="box-input"
|
||||
:getPopupContainer="triggerNode=> triggerNode.parentNode"
|
||||
allowClear
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
v-model="queryParam.plannedBpLaunchBatch">
|
||||
<a-select-option v-for="(item, key) in softwareversionList"
|
||||
:label='item'
|
||||
:key="key"
|
||||
:value="item">
|
||||
<span style="display: inline-block;width: 100%" :title=" item">
|
||||
{{ item }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
</a-col>
|
||||
|
||||
<!-- <a-col :md="6" :sm="8">-->
|
||||
<!-- <div class="box-title-text">-->
|
||||
<!-- <div class="title-text" :title="$t('softwareplatform')">-->
|
||||
<!-- <span>{{ $t('softwareplatform') }}</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <a-select :placeholder="$t('PleaseSelect')+$t('softwareplatform')"-->
|
||||
<!-- class="box-input"-->
|
||||
<!-- :getPopupContainer="triggerNode=> triggerNode.parentNode"-->
|
||||
<!-- allowClear-->
|
||||
<!-- showSearch-->
|
||||
<!-- optionFilterProp="children"-->
|
||||
<!-- :autoClearSearchValue="false"-->
|
||||
<!-- v-model="queryParam.softwareplatform">-->
|
||||
<!-- <a-select-option v-for="(item, key) in softwareplatformList"-->
|
||||
<!-- :key="key"-->
|
||||
<!-- :value="item.value">-->
|
||||
<!-- <span style="display: inline-block;width: 100%" :title=" item.name">-->
|
||||
<!-- {{ item.name }}-->
|
||||
<!-- </span>-->
|
||||
<!-- </a-select-option>-->
|
||||
<!-- </a-select>-->
|
||||
<!-- </div>-->
|
||||
<!-- </a-col>-->
|
||||
|
||||
<a-col :md="6" :sm="8">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text" :title="$t('vehicleType')">
|
||||
<span>{{ $t('vehicleType') }}</span>
|
||||
</div>
|
||||
<a-select :placeholder="$t('PleaseSelect')+$t('vehicleType')"
|
||||
class="box-input"
|
||||
:getPopupContainer="triggerNode=> triggerNode.parentNode"
|
||||
allowClear
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
v-model="queryParam.appliedVehicleProject">
|
||||
<a-select-option v-for="(item, key) in vehicleTypeList"
|
||||
:label='item'
|
||||
:key="key"
|
||||
:value="item">
|
||||
<span style="display: inline-block;width: 100%" :title=" item">
|
||||
{{ item }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
</a-col>
|
||||
|
||||
<a-col :md="6" :sm="8">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text" :title="$t('market')">
|
||||
<span>{{ $t('market') }}</span>
|
||||
</div>
|
||||
<a-select :placeholder="$t('PleaseSelect')+$t('market')"
|
||||
class="box-input"
|
||||
:getPopupContainer="triggerNode=> triggerNode.parentNode"
|
||||
allowClear
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
v-model="queryParam.market">
|
||||
<a-select-option v-for="(item, key) in marketList"
|
||||
:label='item'
|
||||
:key="key"
|
||||
:value="item">
|
||||
<span style="display: inline-block;width: 100%" :title=" item">
|
||||
{{ item }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
</a-col>
|
||||
<template v-if="toggleSearchStatus">
|
||||
<a-col :md="6" :sm="8">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text" :title="$t('softwarereleasetime')">
|
||||
<span>{{ $t('softwarereleasetime') }}</span>
|
||||
</div>
|
||||
<a-range-picker
|
||||
class="box-input"
|
||||
@change="onChange"
|
||||
style='margin-left: -1px'
|
||||
v-model="queryParam.releaseDate"
|
||||
:disabled="false"/>
|
||||
</div>
|
||||
</a-col>
|
||||
</template>
|
||||
<span style="float: right;overflow: hidden;margin-right: 11px" class="table-page-search-submitButtons">
|
||||
<a-col :md="6" :sm="24">
|
||||
<a @click="handleToggleSearch">
|
||||
{{ !toggleSearchStatus ? $t('open') : $t('away') }}
|
||||
<a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
|
||||
</a>
|
||||
<a-button class="box-button" style="margin-left: 8px" @click="searchReset">{{ $t('reset') }}</a-button>
|
||||
<a-button class="box-button" style="margin-left: 8px" type="primary" @click="searchQuery">{{ $t('query') }}</a-button>
|
||||
</a-col>
|
||||
</span>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</div>
|
||||
<div class="table-operator">
|
||||
<div class="operator-text" @click="handleExportManage"
|
||||
v-has="'ota:export'">
|
||||
<a-icon type="export" :rotate="-90" />
|
||||
{{ $t('export') }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<a-table ref="table" size="middle" :components="drag(columns, 'columns')" :loading="loading" :pagination="false"
|
||||
:scroll="{ x: '100%', y: 'calc(100vh - 140px)' }" rowKey="id" :data-source="dataSource"
|
||||
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :columns="columns">
|
||||
<!-- -->
|
||||
<span slot="operation" slot-scope="text,record">
|
||||
<a class="text-operation" @click="detailclick(record)">{{ $t('See') }}</a>
|
||||
</span>
|
||||
</a-table>
|
||||
<div class="page" v-if="dataSource && dataSource.length > 0">
|
||||
<a-pagination :show-total="total => $t('total') + ` ${total} ` + $t('strip')" show-quick-jumper show-size-changer
|
||||
:page-size.sync="pageSize" :total="total" :current="pageNo" @change="pageOnChange"
|
||||
@showSizeChange="SizeChange" />
|
||||
</div>
|
||||
</div>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction, postAction, deleteAction,downloadFile } from '@/api/manage'
|
||||
import { mapGetters } from 'vuex'
|
||||
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
|
||||
import ImportFile from '@/components/ImportFileData/index'
|
||||
import moment from 'moment'
|
||||
|
||||
export default {
|
||||
name: 'index',
|
||||
components: {
|
||||
ImportFile
|
||||
},
|
||||
mixins: [ResizeHeader, ResizeColumnProvide],
|
||||
data() {
|
||||
return {
|
||||
//url传参严格按照当前命名
|
||||
url: {
|
||||
list: '/lawsTechnologyEvaluation/lawsTechnologyEvaluationEO/page',
|
||||
deleteBatch: '/lawsTechnologyEvaluation/lawsTechnologyEvaluationEO/deleteBatch',
|
||||
exportData: '/ota/otaBaCxList/exportData',
|
||||
importZipUrl: '/ota/otaBaCxList/importData',//导入
|
||||
},
|
||||
number:'',
|
||||
visible: false,
|
||||
loading: false,
|
||||
toggleSearchStatus: false,
|
||||
dataSource: [],
|
||||
selectedRowKeys: [],
|
||||
selectedRowKeysRecord: [],
|
||||
serialNumber: '',
|
||||
total: 0,
|
||||
pageSize: 10,
|
||||
pageNo: 1,
|
||||
CategoryTreeList: [],
|
||||
softwareversionList: [],
|
||||
softwareplatformList: [],
|
||||
vehicleTypeList: [],
|
||||
marketList: [],
|
||||
queryParam: {
|
||||
},
|
||||
formInline: {},
|
||||
rules: {
|
||||
whetherTobring: [
|
||||
{
|
||||
required: true,
|
||||
message: this.$t('standardDecompositionDocument') + this.$t('cannotEmpty'),
|
||||
trigger: 'change'
|
||||
}
|
||||
]
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
title: this.$t('softwareversion'),
|
||||
align: 'left',
|
||||
dataIndex: 'plannedBpLaunchBatch',
|
||||
ellipsis: true,
|
||||
width: 170
|
||||
},
|
||||
// {
|
||||
// title: this.$t('softwareplatform'),
|
||||
// align: 'left',
|
||||
// dataIndex: 'ggpc',
|
||||
// ellipsis: true,
|
||||
// width: 170
|
||||
// },
|
||||
{
|
||||
title: this.$t('market'),
|
||||
align: 'left',
|
||||
width: 170,
|
||||
ellipsis: true,
|
||||
dataIndex: 'market'
|
||||
},
|
||||
{
|
||||
title: this.$t('vehicleType'),
|
||||
align: 'left',
|
||||
width: 320,
|
||||
ellipsis: true,
|
||||
dataIndex: 'appliedVehicleProject'
|
||||
},
|
||||
{
|
||||
title: this.$t('softwarereleasetime'),
|
||||
align: 'left',
|
||||
width: 170,
|
||||
ellipsis: true,
|
||||
dataIndex: 'releaseDate'
|
||||
},
|
||||
{
|
||||
title: this.$t('operation'),
|
||||
align: 'left',
|
||||
fixed: 'right',
|
||||
width: 100,
|
||||
scopedSlots: { customRender: 'operation' }
|
||||
}
|
||||
],
|
||||
userInfoQuery: {},
|
||||
administrators: false
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getSelectData()
|
||||
this.getList()
|
||||
this.administrators = false
|
||||
},
|
||||
methods: {
|
||||
...mapGetters(['userInfo']),
|
||||
getSelectData(){
|
||||
getAction('/ota/otaManageApplyEO/getPullDownList', {}).then((res) => {
|
||||
if (res.success) {
|
||||
this.softwareversionList = res.result.plannedBpLaunchBatchList
|
||||
this.vehicleTypeList = res.result.carSet
|
||||
this.marketList = res.result.marketSet
|
||||
} else {
|
||||
}
|
||||
})
|
||||
},
|
||||
handleToggleSearch() {
|
||||
this.toggleSearchStatus = !this.toggleSearchStatus
|
||||
},
|
||||
searchQuery() {
|
||||
this.pageNo = 1
|
||||
this.getList()
|
||||
},
|
||||
searchReset() {
|
||||
this.queryParam = {}
|
||||
this.$route.query.serialNumber = ''
|
||||
this.$route.query.flowStatus = ''
|
||||
this.pageNo = 1
|
||||
this.getList()
|
||||
},
|
||||
pageOnChange(page) {
|
||||
this.pageNo = page
|
||||
this.getList()
|
||||
},
|
||||
SizeChange(page, pageSize) {
|
||||
this.pageNo = 1
|
||||
this.pageSize = pageSize
|
||||
this.getList()
|
||||
},
|
||||
getList() {
|
||||
let queryParam = JSON.parse(JSON.stringify(this.queryParam))
|
||||
Object.keys(queryParam).forEach(val => {
|
||||
if (queryParam[val] instanceof Array) {
|
||||
queryParam[val] = queryParam[val].join(',')
|
||||
}
|
||||
})
|
||||
let query = {
|
||||
pageNo: this.pageNo,
|
||||
pageSize: this.pageSize,
|
||||
...queryParam
|
||||
}
|
||||
this.loading = true
|
||||
getAction('/ota/otaManageApplyEO/getOtaPage', query).then((res) => {
|
||||
if (res.success) {
|
||||
if (res.result.current > 1 && res.result.records.length == 0) {
|
||||
this.pageNo = 1
|
||||
this.getList()
|
||||
return
|
||||
}
|
||||
this.dataSource = res.result.records || []
|
||||
this.total = res.result.total
|
||||
this.loading = false
|
||||
} else {
|
||||
this.loading = false
|
||||
}
|
||||
})
|
||||
},
|
||||
onSelectChange(value, record) {
|
||||
this.selectedRowKeys = value
|
||||
this.selectedRowKeysRecord = record
|
||||
},
|
||||
//导出
|
||||
handleExportManage() {
|
||||
// console.log('menuId',this.menuId)
|
||||
let dateName = moment(new Date()).format('YYYYMMDD')
|
||||
let name = 'OTA' + this.$t('softwareversion') + ' ' + dateName + '.xlsx'
|
||||
let long = localStorage.getItem('language')
|
||||
let cut = ''
|
||||
if (long && long == 'zh-cn') {
|
||||
this.cut = 'cn'
|
||||
} else if (long && long == 'en-us') {
|
||||
this.cut = 'en'
|
||||
}
|
||||
let query = {
|
||||
exportName: name,
|
||||
selections: this.selectedRowKeys.join(','),
|
||||
...this.queryParam,
|
||||
cut:this.cut
|
||||
}
|
||||
|
||||
downloadFile('ota/otaManageApplyEO/otaExportXls', name, query, this.selectClear)
|
||||
},
|
||||
// 查看
|
||||
detailclick(item){
|
||||
this.$router.push({
|
||||
path: '/components/detil',
|
||||
query: item
|
||||
})
|
||||
},
|
||||
onChange(value, dateString) {
|
||||
if (this.queryParam.releaseDate && this.queryParam.releaseDate.length > 0) {
|
||||
let dateOne = moment(dateString[0]).format('YYYY-MM-DD')
|
||||
let dateTwo = moment(dateString[1]).format('YYYY-MM-DD')
|
||||
this.queryParam.softwareIssueTimeStart = dateOne
|
||||
this.queryParam.softwareIssueTimeEnd = dateTwo
|
||||
} else {
|
||||
this.queryParam.releaseDate = []
|
||||
// this.queryParamOne[item + '_name'] = []
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.tree-select .ant-select-tree-dropdown {
|
||||
height: 298px !important;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
@import '~@assets/less/common.less';
|
||||
|
||||
.page {
|
||||
text-align: right;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
width: 20%;
|
||||
min-width: 110px;
|
||||
color: #000F16;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
margin-top: 3px;
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
width: 70%;
|
||||
height: 38px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.box-button {
|
||||
height: 38px;
|
||||
/*margin-top: 2px;*/
|
||||
}
|
||||
|
||||
.text-operation {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.itemModel {
|
||||
width: calc(100% - 130px);
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.Required {
|
||||
color: red;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
::v-deep .ant-table-row:first-child {
|
||||
background: #fff !important;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
::v-deep .ant-table-body {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
::v-deep .ant-table-placeholder {
|
||||
margin-top: 8px !important;
|
||||
}
|
||||
/deep/ .ant-calendar-range-picker-input{
|
||||
margin-left: -2px !important;
|
||||
}
|
||||
</style>
|
||||
@@ -474,6 +474,7 @@
|
||||
this.$message.success(this.$t('OperationSuccessful'))
|
||||
this.visible = false
|
||||
this.$emit('addModelList')
|
||||
// this.vdrClick()
|
||||
} else {
|
||||
this.$message.warning(res.message)
|
||||
this.confirmLoading = false
|
||||
@@ -482,6 +483,19 @@
|
||||
}
|
||||
})
|
||||
},
|
||||
// 跳转vdr
|
||||
// vdrClick(){
|
||||
// let _this = this
|
||||
// this.$confirm({
|
||||
// content: _this.$t('Rematchornot') + 'VDR',
|
||||
// onOk() {
|
||||
// let newUrl = _this.$router.resolve({
|
||||
// path:'otaAuthentication',
|
||||
// })
|
||||
// window.open(newUrl.href, '_blank')
|
||||
// }
|
||||
// })
|
||||
// },
|
||||
handleInput(value) {
|
||||
this.$nextTick(() => {
|
||||
this.formInline = { ...this.formInline }
|
||||
|
||||
@@ -0,0 +1,506 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="table-page-search-wrapper">
|
||||
<a-form layout="inline">
|
||||
<a-row :gutter="24">
|
||||
<a-col :md="6" :sm="10">
|
||||
<div class="box-title-text">
|
||||
<div class="title-text" :title="$t('softwareversion')">
|
||||
<span>{{ $t('softwareversion') }}</span>
|
||||
</div>
|
||||
<a-select v-model="queryParam.plannedBpLaunchBatch"
|
||||
class="box-input"
|
||||
@change="getonChange"
|
||||
showSearch
|
||||
optionFilterProp="label"
|
||||
:autoClearSearchValue="false"
|
||||
:getPopupContainer="triggerNode => triggerNode.parentNode" :popper-append-to-body="false">
|
||||
<a-select-option v-for="d in options" :key="d.plannedBpLaunchBatch" :label='d.plannedBpLaunchBatch' :value="d.plannedBpLaunchBatch">
|
||||
<span style="display: inline-block;width: 80%" :title=" d.plannedBpLaunchBatch">
|
||||
{{ d.plannedBpLaunchBatch }}
|
||||
</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col :md="6" :sm="10">
|
||||
<div class="box-title-text" v-if="this.options.length && this.options.length !== 0">
|
||||
<a-button class="box-button"
|
||||
style="line-height: 32px;margin-top: 5px;"
|
||||
@click="vdrcheckClick">{{ 'VDR' + $t('view')}}
|
||||
</a-button>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</div>
|
||||
<div class="box-content">
|
||||
<div class="box-content-left">
|
||||
<div id="main-top-Collect"></div>
|
||||
<div id="main-end-Collect"></div>
|
||||
<!-- <div class='main-table'>-->
|
||||
<!-- <table border="1" cellspacing="0" class="table">-->
|
||||
<!-- <tr>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('tobematched')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('Pendingapproval')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('lock')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('sendBack')}}</td>-->
|
||||
<!--<!– <td width="150px" height="50px" align="center">{{$t('notInvolved')}}</td>–>-->
|
||||
<!-- </tr>-->
|
||||
<!-- <tr>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #5087EC'>{{matchForm.to_be_matched}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #68BBC4'>{{matchForm.to_be_approved}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #58A55C'>{{matchForm.locked}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #F2BD42'>{{matchForm.rejected}}</span></td>-->
|
||||
<!--<!–/* <td height="80px" align="center"><span style='color: #BBBBBB'>{{matchForm.a}}</span></td>*/–>-->
|
||||
<!-- </tr>-->
|
||||
<!-- </table>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="box-content">-->
|
||||
<!-- <div class="box-content-left">-->
|
||||
|
||||
<!-- <div class='main-table' style='padding:10% 0;margin-left: -61px;'>-->
|
||||
<!-- <table border="1" cellspacing="0" class="table">-->
|
||||
<!-- <tr>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('Notatthe')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('inProgress')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('experimentPassed')}}</td>-->
|
||||
<!-- <td width="150px" height="50px" align="center">{{$t('experimentFailed')}}</td>-->
|
||||
<!-- <td width="190px" height="50px" align="center">{{$t('componentReportNotSubmitted')}}</td>-->
|
||||
<!-- <td width="190px" height="50px" align="center">{{$t('componentReportSubmitted')}}</td>-->
|
||||
<!-- <td width="190px" height="50px" align="center">{{$t('componentReportHasBeenStored')}}</td>-->
|
||||
<!-- </tr>-->
|
||||
<!-- <tr>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #BBBBBB'>{{authenticationForm.Not_start}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #F2BD42'>{{authenticationForm.In_progress}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #68BBC4'>{{authenticationForm.Test_passed}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #D95040'>{{authenticationForm.Test_failed}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #BBBBBB'>{{authenticationForm.Component_report_not_submitted}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #68BBC4'>{{authenticationForm.Component_report_submitted}}</span></td>-->
|
||||
<!-- <td height="80px" align="center"><span style='color: #58A55C'>{{authenticationForm.Component_report_has_been_stored}}</span></td>-->
|
||||
<!-- </tr>-->
|
||||
<!-- </table>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- <responsibilityList @responsibility="responsibility" ref="responsibilityListRef"/>-->
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as echarts from 'echarts'
|
||||
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
|
||||
// import responsibilityList from './responsibilityList'
|
||||
import 'echarts/lib/component/dataZoom'
|
||||
|
||||
export default {
|
||||
name: 'DeliverableStatusEchart',
|
||||
components: {
|
||||
// responsibilityList
|
||||
},
|
||||
props: {
|
||||
idList: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
queryParam: {
|
||||
plannedBpLaunchBatch: ''
|
||||
},
|
||||
options: [],
|
||||
collecting: [],
|
||||
notStart: [],
|
||||
submit: [],
|
||||
syncReport: [],
|
||||
collectingdata: [],
|
||||
notStartdata: [],
|
||||
submitdata: [],
|
||||
syncReportdata: [],
|
||||
dutyTerritory: [],
|
||||
collectingpercentage: [],
|
||||
collectingquantity: [],
|
||||
notStartpercentage: [],
|
||||
notStartquantity: [],
|
||||
submitpercentage: [],
|
||||
submitquantity: [],
|
||||
syncReportpercentage: [],
|
||||
syncReportquantity: [],
|
||||
vehicleTypeCode:'',
|
||||
softwareversion:'',
|
||||
releaseName:'',
|
||||
matchForm:{},
|
||||
authenticationForm:{},
|
||||
url: {
|
||||
getProjectDetailsStatistics: '/project/projectLibraryBase/getProjectDetailsStatistics'
|
||||
},
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getoptions()
|
||||
// this.getData()
|
||||
|
||||
},
|
||||
methods: {
|
||||
vdrcheckClick(){
|
||||
|
||||
},
|
||||
getData() {
|
||||
let query = {
|
||||
...this.queryParam,
|
||||
projectId:this.$route.query.id
|
||||
}
|
||||
getAction('ota/otaManageApplyEO/getStatisticalStatus', query).then((res) => {
|
||||
if (res.success) {
|
||||
if (res.result) {
|
||||
let mainTopDataSource = res.result.matchStatusMapList ? res.result.matchStatusMapList : []
|
||||
let mainEndDataSource = res.result.attestationScheduleMapList ? res.result.attestationScheduleMapList : []
|
||||
this.matchForm = res.result.matchStatusMap
|
||||
this.authenticationForm = res.result.attestationScheduleMap
|
||||
this.mainTopEcharts(mainTopDataSource)
|
||||
this.mainEndEcharts(mainEndDataSource)
|
||||
// this.mainRightEcharts(mainRightDataSource)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
getoptions() {
|
||||
let id = ''
|
||||
id = this.$route.query.id
|
||||
getAction('ota/otaManageApplyEO/getVdrListByProject', { projectId: id }).then((res) => {
|
||||
if (res.success) {
|
||||
this.options = res.result
|
||||
this.queryParam.plannedBpLaunchBatch = this.options[0].plannedBpLaunchBatch
|
||||
this.getData()
|
||||
// this.getData(this.queryParam.ctype)
|
||||
} else {
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
getonChange(value) {
|
||||
this.getData(value)
|
||||
},
|
||||
|
||||
getEcharts(chart, title, color, data) {
|
||||
var myChart = echarts.init(document.getElementById(chart))
|
||||
myChart.setOption({
|
||||
title: {
|
||||
text: title
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
textStyle: {
|
||||
fontWeight: 'normal',
|
||||
fontSize: 14,
|
||||
color: '#040B29',
|
||||
fontFamily: 'BlueSkyNoto'
|
||||
},
|
||||
formatter: function(parms) {
|
||||
let str = parms.marker + ' ' + parms.data.name + ' ' + parms.data.value + ' (' + parms.percent + '%)'
|
||||
return str
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
itemWidth: 12,
|
||||
itemHeight: 12,
|
||||
bottom: '0',
|
||||
left: 'center',
|
||||
itemGap: 30,
|
||||
icon: 'circle'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: title,
|
||||
type: 'pie',
|
||||
radius: ['40%', '54%'],
|
||||
avoidLabelOverlap: false,
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
color: color,
|
||||
data: data
|
||||
}
|
||||
]
|
||||
})
|
||||
myChart.on('click', (params) => {
|
||||
let query = {}
|
||||
if (params.seriesName == this.$t('regulatoryTaskConfirmation')) {
|
||||
query = {
|
||||
title: params.seriesName+'-'+params.name,
|
||||
projectLibraryId: this.$route.query.id,
|
||||
operatorType: 'queryFGTaskToConfirmStatistics',
|
||||
status: params.data.status
|
||||
}
|
||||
} else if (params.seriesName == this.$t('designCompliance')) {
|
||||
query = {
|
||||
title: params.seriesName+'-'+params.name,
|
||||
projectLibraryId: this.$route.query.id,
|
||||
operatorType: 'queryDesignStatistics',
|
||||
status: params.data.status
|
||||
}
|
||||
} else if (params.seriesName == this.$t('verifyCompliance')) {
|
||||
query = {
|
||||
title: params.seriesName+'-'+params.name,
|
||||
projectLibraryId: this.$route.query.id,
|
||||
operatorType: 'queryVerifyStatistics',
|
||||
status: params.data.status
|
||||
}
|
||||
}
|
||||
this.$refs.responsibilityListRef.getData(query)
|
||||
})
|
||||
},
|
||||
|
||||
mainTopEcharts(dataSource) {
|
||||
let data = []
|
||||
let color = []
|
||||
this.mainTopNum = 0
|
||||
if (dataSource && dataSource.length > 0) {
|
||||
this.dataSource = [{}]
|
||||
dataSource.forEach(res => {
|
||||
if (res.matchStatus == 'to_be_matched') {
|
||||
data.push({
|
||||
value: res.matchStatusCount,
|
||||
name: this.$t('tobematched'),
|
||||
color: '#5087EC',
|
||||
status: res.matchStatus
|
||||
})
|
||||
color.push('#5087EC')
|
||||
} else if (res.matchStatus == 'to_be_approved') {
|
||||
data.push({
|
||||
value: res.matchStatusCount,
|
||||
name: this.$t('Pendingapproval'),
|
||||
color: '#68BBC4',
|
||||
status: res.matchStatus
|
||||
})
|
||||
color.push('#68BBC4')
|
||||
} else if (res.matchStatus == 'locked') {
|
||||
data.push({
|
||||
value: res.matchStatusCount,
|
||||
name: this.$t('lock'),
|
||||
color: '#58A55C',
|
||||
status: res.matchStatus
|
||||
})
|
||||
color.push('#58A55C')
|
||||
} else if (res.matchStatus == 'rejected') {
|
||||
data.push({
|
||||
value: res.matchStatusCount,
|
||||
name: this.$t('sendBack'),
|
||||
color: '#F2BD42',
|
||||
status: res.matchStatus
|
||||
})
|
||||
color.push('#F2BD42')
|
||||
}
|
||||
this.mainTopNum += res.matchStatusCount
|
||||
})
|
||||
}
|
||||
this.getEcharts('main-top-Collect', this.$t('Matchingstatestatistics'), color, data)
|
||||
},
|
||||
|
||||
mainEndEcharts(dataSource) {
|
||||
let data = []
|
||||
let color = []
|
||||
this.mainTopNum = 0
|
||||
if (dataSource && dataSource.length > 0) {
|
||||
this.dataSource = [{}]
|
||||
console.log(dataSource)
|
||||
dataSource.forEach(res => {
|
||||
if (res.attestationSchedule == 'Not start') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('Notatthe'),
|
||||
color: '#BBBBBB',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#BBBBBB')
|
||||
} else if (res.attestationSchedule == 'In progress') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('inProgress'),
|
||||
color: '#F2BD42',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#F2BD42')
|
||||
} else if (res.attestationSchedule == 'Test failed') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('experimentFailed'),
|
||||
color: '#D95040',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#D95040')
|
||||
} else if (res.attestationSchedule == 'Component report not submitted') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('componentReportNotSubmitted'),
|
||||
color: '#BBBBBB',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#BBBBBB')
|
||||
} else if (res.attestationSchedule == 'Component report submitted') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('componentReportSubmitted'),
|
||||
color: '#68BBC4',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#68BBC4')
|
||||
} else if (res.attestationSchedule == 'Component report has been stored') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('componentReportHasBeenStored'),
|
||||
color: '#58A55C',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#58A55C')
|
||||
}else if (res.attestationSchedule == 'Test passed') {
|
||||
data.push({
|
||||
value: res.attestationScheduleCount,
|
||||
name: this.$t('experimentPassed'),
|
||||
color: '#68BBC4',
|
||||
status: res.attestationSchedule
|
||||
})
|
||||
color.push('#68BBC4')
|
||||
}
|
||||
this.mainTopNum += res.attestationScheduleCount
|
||||
})
|
||||
}
|
||||
this.getEcharts('main-end-Collect', this.$t('OTaauthenticationprogressstatistics'), color, data)
|
||||
},
|
||||
responsibility(item) {
|
||||
this.$emit('currentStatus', item)
|
||||
},
|
||||
vdrcheckClick(){
|
||||
this.options.forEach(item => {
|
||||
if(item.plannedBpLaunchBatch == this.queryParam.plannedBpLaunchBatch){
|
||||
this.vehicleTypeCode = item.appliedVehicleProject
|
||||
this.softwareversion = item.plannedBpLaunchBatch
|
||||
this.releaseName = item.updateDate
|
||||
}
|
||||
})
|
||||
let newUrl = this.$router.resolve({
|
||||
path:'/components/detil',
|
||||
query:{
|
||||
vehicleTypeCode:this.vehicleTypeCode,
|
||||
plannedBpLaunchBatch:this.softwareversion,
|
||||
releaseDate:this.releaseName
|
||||
},
|
||||
})
|
||||
window.open(newUrl.href, '_blank')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.box-content {
|
||||
width: 100%;
|
||||
height: 450px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.box-content-left {
|
||||
width: calc(100% - 12px);
|
||||
height: 450px;
|
||||
border: 2px #eff1f3 solid;
|
||||
border-radius: 6px;
|
||||
display: flex;
|
||||
|
||||
#main-top-Collect {
|
||||
width: 60%;
|
||||
height: 100%;
|
||||
padding: 24px 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#main-left-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 24px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#main-end-Collect {
|
||||
width: 60%;
|
||||
height: 100%;
|
||||
padding: 24px 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#main-bottom {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 24px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.main-table{
|
||||
width: 40%;
|
||||
padding: 10% 4%;
|
||||
}
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
width: calc(70% - 100px);
|
||||
height: 38px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.box-content-right {
|
||||
width: calc(50% - 12px);
|
||||
height: 398px;
|
||||
border: 2px #eff1f3 solid;
|
||||
|
||||
#main-right {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 24px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#main-right-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 24px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.box-title-text {
|
||||
line-height: 1.4;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
color: #000F16;
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
margin-right: 16px;
|
||||
margin-top: 3px;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.box-input {
|
||||
display: inline-block;
|
||||
width: calc(100% - 126px);
|
||||
height: 38px;
|
||||
margin-top: 2px;
|
||||
line-height: 38px;
|
||||
}
|
||||
</style>
|
||||
@@ -28,6 +28,9 @@
|
||||
<a-tab-pane :key="$t('nonConformance')" :tab="$t('nonConformance')">
|
||||
<nonConformance @currentStatus="currentStatus" v-if="activeKey == $t('nonConformance')"/>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane :key="$t('otastatus')" :tab="$t('otastatus')">
|
||||
<otastatus @currentStatus="currentStatus" :idList="idList" v-if="activeKey == $t('otastatus')"/>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</a-card>
|
||||
</template>
|
||||
@@ -37,6 +40,7 @@
|
||||
import certificationActivity from './certificationActivity'
|
||||
import parameterCollectionProgress from './parameterCollectionProgress'
|
||||
import nonConformance from './nonConformance'
|
||||
import otastatus from './otastatus'
|
||||
import { getAction, postAction } from '@/api/manage'
|
||||
|
||||
export default {
|
||||
@@ -45,7 +49,8 @@
|
||||
parameterCollectionProgress,
|
||||
regulatoryCompliance,
|
||||
certificationActivity,
|
||||
nonConformance
|
||||
nonConformance,
|
||||
otastatus
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@@ -515,6 +515,9 @@
|
||||
this.visible = false
|
||||
this.confirmLoading = false
|
||||
this.$emit('settingListForm')
|
||||
if(res.result.matchVdr == true){
|
||||
this.vdrClick()
|
||||
}
|
||||
} else {
|
||||
this.$message.warning(this.$t('operationFailed'))
|
||||
this.confirmLoading = false
|
||||
@@ -523,6 +526,19 @@
|
||||
}
|
||||
})
|
||||
},
|
||||
// 跳转vdr
|
||||
vdrClick(){
|
||||
let _this = this
|
||||
this.$confirm({
|
||||
content: _this.$t('Rematchornot') + 'VDR',
|
||||
onOk() {
|
||||
let newUrl = _this.$router.resolve({
|
||||
path:'otaAuthentication',
|
||||
})
|
||||
window.open(newUrl.href, '_blank')
|
||||
}
|
||||
})
|
||||
},
|
||||
handleCancel() {
|
||||
this.formInline = {}
|
||||
this.visible = false
|
||||
|
||||
Reference in New Issue
Block a user