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:
高嵩
2023-08-25 17:04:45 +08:00
68 changed files with 9738 additions and 16 deletions
+27
View File
@@ -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',
}
+27
View File
@@ -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>-->
<!--&lt;!&ndash; <td width="150px" height="50px" align="center">{{$t('notInvolved')}}</td>&ndash;&gt;-->
<!-- </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>-->
<!--&lt;!&ndash;/* <td height="80px" align="center"><span style='color: #BBBBBB'>{{matchForm.a}}</span></td>*/&ndash;&gt;-->
<!-- </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 + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + 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