Commit 6e94a8bc authored by jiaxu.yan's avatar jiaxu.yan

feat(体系审查页面): 场景部分 答题展示 场景变更显示 未答题展示 修改

parent cd436e41
......@@ -21,7 +21,7 @@ export function reviewDetailsSubmit(data) {
data
})
}
// 提交审查问卷
// 提交体系审查问卷
export function taskSubmit(data) {
return request({
url: '/system/review/task/submit',
......@@ -29,3 +29,28 @@ export function taskSubmit(data) {
data
})
}
// 启动车辆问卷审查任务
export function startReview(data) {
return request({
url: '/car/review/task/startReview',
method: 'post',
data
})
}
// 提交车辆问卷审查任务
export function submitReview(data) {
return request({
url: '/car/review/task/submitReview',
method: 'post',
data
})
}
// 查看车辆问卷审查任务详情
export function checkTaskDetail(data) {
return request({
url: '/car/review/task/view',
method: 'post',
data
})
}
\ No newline at end of file
......@@ -4,6 +4,8 @@
@import './element-ui.scss';
@import './sidebar.scss';
@import './btn.scss';
@import './process.scss';
@import url(//at.alicdn.com/t/c/font_4370984_m7nz5mfgt6.css);
body {
......
.file-prompt {
margin: 10px 0 10px 0;
background-color: #ebf5ff;
padding: 10px;
div {
padding-left: 10px;
i {
color: #409eff;
margin-right: 10px;
}
}
}
.scene-error {
color: red;
}
......@@ -33,8 +33,8 @@ export default {
resetQuery() {
// this.refs.queryForm.restForm() this.resetForm("queryForm");
this.queryParams = {
page: this.queryParams.pageNum,
size: this.queryParams.pageSize
pageNum: this.queryParams.pageNum,
pageSize: this.queryParams.pageSize
}
},
handleQuery() {
......
......@@ -3,7 +3,6 @@
* 用于 单条记录的增删查改
*/
import request from '@/utils/request'
;import d from 'highlight.js/lib/languages/d';
(function (root, factory) {
// CommonJS
if (typeof exports === 'object') {
......@@ -103,10 +102,11 @@ import request from '@/utils/request'
let url = ''
if (self.uuid == 0) {
url = self.settings.url + '/add'
delete self.id
} else {
url = self.settings.url + '/edit'
}
delete self.id
request({
url,
method: 'post',
......
/**
* 获取传入时间额当前时间的小时差
* @param {*} time
* @returns
*/
export function getHourDiff(time) {
// 获取当前时间
var now = new Date()
// 设置目标时间(这里为2021年9月30日)
var targetTime = new Date(time) // 注意月份从0开始计数,所以8表示九月
// 计算时间差(单位为毫秒)
var timeDiff = Math.abs(targetTime - now)
// 将时间差转换成小时
return Math.floor(timeDiff / (60 * 60 * 1000))
}
\ No newline at end of file
<template>
<div class="app-container">
<el-card class="custom-card">
<div slot="header" class="clearfix">
<span>填写检查表单(所属任务:{{ model.systemReviewTask.name }})</span>
<el-button icon="el-icon-back" class="back-btn" @click="handleBack">
返回
</el-button>
<el-button class="back-btn">意见表</el-button>
</div>
<div class="main-content">
<div class="prompt-message">
<span
>问卷填写情况:共{{ model.detailsList.length }}条审查细则,已完成{{
readNumber
}}条,未完成{{ model.detailsList.length - readNumber }}</span
>
<!-- <span class="center-text">有 3 条场景变更待处理</span>-->
<el-checkbox v-model="checked">仅显示未完成页面</el-checkbox>
</div>
<el-row>
<!-- 步骤条 -->
<el-col :span="2">
<div class="left-content" style="height: 300px; width: 110px">
<div v-for="(item, index) in model.detailsList" :key="index">
<div
:class="{
'exclamation-point': true,
'no-exclamation-point': false
}"
>
<div v-show="true" class="exclamation">!</div>
</div>
<div
class="no-select-circle"
:class="{
'select-circle': index === activeModel
}"
@click="handleCircle(index)"
>
<span class="inner-text">{{ index + 1 }}</span>
</div>
<span
v-show="item.result && item.result.passed !== null"
class="tick-class"
>
<i class="el-icon-check" />
</span>
</div>
</div>
</el-col>
<!-- 内容 -->
<el-col :span="22">
<el-form
ref="form"
class="right-content"
:model="form"
:rules="rules"
label-width="90px"
>
<el-form-item label="标准章节">
<span>{{ taskModel.chapter }}</span>
</el-form-item>
<el-form-item label="标准要求">
<span>{{ taskModel.standardText }}</span>
</el-form-item>
<el-form-item label="审查要点">
<span>{{ taskModel.reviewKeypointText }}</span>
</el-form-item>
<el-form-item label="审查细则">
<span>{{ taskModel.text }}</span>
</el-form-item>
<el-form-item :label="'符合场景'">
<template slot="label">
<span>符合场景</span>
<el-button
class="label-btn"
size="mini"
type="warning"
@click="handleAddScene"
>
<span>新增场景</span>
</el-button>
</template>
<div class="match-scene">
<div
v-for="(scene, key) in taskModel.reviewSceneList"
:key="key"
>
{{ scene.text }}
</div>
</div>
</el-form-item>
<el-form-item label="审查结果" prop="passed">
<el-radio-group v-model="form.passed">
<el-radio :label="1">符合</el-radio>
<el-radio :label="0">不符合</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="相关记录">
<el-row>
<el-col :span="8">
<div>
文件名称
<el-input
v-model="addData.fileName"
placeholder="请输入文件名称"
/>
</div>
</el-col>
<el-col :span="8" :offset="1">
<div>
章节条目或范围
<el-input
v-model="addData.chapterEntry"
placeholder="请输入具体章节条目或范围"
/>
</div>
</el-col>
</el-row>
//文件第一次提示
<div class="file-prompt">
<div>
<i class="el-icon-info"></i
>该文件第一次出现,请维护如下相关信息
</div>
</div>
//车企文件信息
<el-card>
<div slot="header" class="clearfix">
<span>车企文件信息</span>
</div>
<el-form
ref="fileRef"
:model="fileData"
label-width="100px"
class="file-form-class"
:rules="fileRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="企业名称" prop="enterpriseName">
<el-input
v-model="fileData.enterpriseName"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件名称" prop="fileName">
<el-input
v-model="fileData.fileName"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件版本" prop="fileVersion">
<el-input
v-model="fileData.fileVersion"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布日期" prop="releaseDate">
<el-date-picker
v-model="fileData.releaseDate"
type="date"
placeholder="选择日期"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件状态" prop="fileStatus">
<el-select
v-model="fileData.fileStatus"
placeholder="请选择"
style="width: 100%"
>
<el-option
v-for="item in dict.type.file_status"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="存储位置" prop="storageLocation">
<el-input
v-model="fileData.storageLocation"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="文件识别号"
prop="fileIdentification"
>
<el-input
v-model="fileData.fileIdentification"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件照片" prop="filePicture">
<ImageUpload
v-model="fileData.filePicture"
:limit="1"
></ImageUpload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-button
type="primary"
icon="el-icon-folder-add"
@click="handleSaveFile"
>保存车企文件</el-button
>
</el-card>
</el-form-item> -->
<el-form-item label="条目填写人">
<span>{{ name }}</span>
</el-form-item>
</el-form>
</el-col>
</el-row>
</div>
<div class="bottom-btn">
<el-button type="warning" @click="submitQuestionnaire(1)">
保存当前边界
</el-button>
<el-button type="primary" @click="submitQuestionnaire(2)"
>提交表格</el-button
>
</div>
</el-card>
<!-- 新增场景对话框 -->
<sence-dialog :dialog-manger="senceManger"></sence-dialog>
</div>
</template>
<script>
import { checkTaskDetail, reviewDetailsSubmit } from '@/api/task/task'
import senceDialog from './components/senceDialog.vue'
import { mapGetters } from 'vuex'
export default {
dicts: ['file_status'],
components: {
'sence-dialog': senceDialog
},
data() {
return {
senceManger: {
dialogVisible: false
},
form: {
passed: null
},
model: {
systemReviewTask: {},
reviewSceneChangeTasks: {},
detailsList: []
},
taskModel: {},
activeModel: 0,
checked: false,
rules: {
passed: [{ required: true, message: '请选择审查结果', trigger: 'blur' }]
},
fileRules: {
enterpriseName: [
{ required: true, message: '请输入企业名称', trigger: 'blur' }
],
fileName: [
{ required: true, message: '请输入文件名称', trigger: 'blur' }
],
fileVersion: [
{ required: true, message: '请输入文件版本', trigger: 'blur' }
],
releaseDate: [
{ required: true, message: '请选择发布日期', trigger: 'change' }
],
fileStatus: [
{ required: true, message: '请选择文件状态', trigger: 'change' }
],
storageLocation: [
{ required: true, message: '请输入存储位置', trigger: 'blur' }
],
fileIdentification: [
{ required: true, message: '请输入文件识别号', trigger: 'blur' }
],
filePicture: [
{ required: true, message: '请选择文件照片', trigger: 'change' }
]
},
// TODO 删除
checkedTwo: false,
checkedThree: false,
radio: 1,
addData: {
fileName: '',
chapterEntry: ''
},
fileData: {
enterpriseName: '',
fileStatus: '',
filePicture: '',
storageLocation: ''
},
value1: '',
taskId: ''
}
},
computed: {
readNumber() {
let num = 0
this.model.detailsList.map(i => {
if (i.result && i.result.passed !== null) {
num++
}
})
return num
},
...mapGetters(['name'])
},
mounted() {
this.taskId = this.$route.query.id
this.getTask()
},
methods: {
getTask() {
checkTaskDetail({
taskId: this.taskId
}).then(res => {
if (res.code === 200) {
this.model = res.data
this.handleCircle(0)
} else {
this.$modal.msgError(res.msg)
}
})
},
/**
* 点击左侧圆圈触发的回调函数
* @param item 圆圈对象
*/
handleCircle(index) {
this.activeModel = index
this.taskModel = JSON.parse(JSON.stringify(this.model.detailsList[index]))
if (this.taskModel.result) {
this.form = {
passed: this.taskModel.result.passed,
reviewDetailsId: this.taskModel.id,
taskId: this.taskId
}
} else {
this.form = {
passed: null,
reviewDetailsId: this.taskModel.id,
taskId: this.taskId
}
}
},
// 返回
handleBack() {
this.$router.go(-1)
},
// 新增场景
handleAddScene() {
this.senceManger.dialogVisible = true
},
// 保存当前条目
submitQuestionnaire(type) {
this.$refs.form.validate(valid => {
if (valid) {
reviewDetailsSubmit(this.form).then(res => {
if (res.code === 200) {
if (!this.model.detailsList[this.activeModel].result) {
this.model.detailsList[this.activeModel].result = { passed: 0 }
}
this.model.detailsList[this.activeModel].result.passed =
this.form.passed
this.$modal.msgSuccess('提交表格成功')
} else {
this.$modal.msgError(res.msg)
}
})
}
})
},
handleSaveFile() {
// vue表单校验
this.$refs.fileRef.validate(valid => {
if (valid) {
console.log('ddd')
}
})
}
}
}
</script>
<style scoped lang="scss">
.app-container {
padding: 20px;
.custom-card {
::v-deep.el-card__header {
background-color: #f9f9f9;
}
.back-btn {
margin-left: 10px;
float: right;
}
.other-btn {
float: right;
}
.main-content {
min-height: 550px;
.prompt-message {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 40px;
.center-text {
color: #f56c6c;
}
}
.left-content {
.tick-class {
float: right;
position: relative;
top: -1.8em;
left: -1em;
i {
color: #25c173;
}
}
.no-exclamation-point {
float: left;
width: 1px;
height: 1px;
padding-left: 30px;
}
.exclamation-point {
float: left;
margin-top: 6px;
margin-right: 10px;
position: relative;
width: 20px;
height: 20px;
border: 2px solid #f56c6c;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
font-weight: bold;
margin-bottom: 5px;
.exclamation {
position: absolute;
font-size: 12px;
color: #f56c6c;
font-weight: bold;
}
}
.no-select-circle {
cursor: pointer;
width: 35px;
height: 35px;
border: 3px solid #c0c0c0;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
font-weight: bold;
position: relative;
margin-bottom: 5px;
.inner-text {
position: absolute;
font-size: 16px;
z-index: 1;
color: #c0c0c0;
}
}
.select-circle {
cursor: pointer;
width: 35px;
height: 35px;
border: 3px solid #6ab3ff;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
font-weight: bold;
position: relative;
margin-bottom: 5px;
.inner-text {
position: absolute;
font-size: 16px;
z-index: 1;
color: #6ab3ff;
}
}
}
.right-content {
.file-form-class {
::v-deep.el-form-item {
margin-bottom: 20px;
}
}
.match-scene {
display: flex;
flex-direction: column;
background-color: #fafafa;
padding: 5px;
}
.file-prompt {
margin: 10px 0 10px 0;
background-color: #ebf5ff;
div {
padding-left: 10px;
i {
color: #409eff;
margin-right: 10px;
}
}
}
}
}
.bottom-btn {
display: flex;
justify-content: center;
}
}
}
.file-prompt {
margin: 0 0 10px 0;
padding: 10px;
background-color: #ebf5ff;
div {
font-size: 12px;
padding-left: 10px;
i {
color: #409eff;
margin-right: 10px;
}
}
}
.label-btn {
width: 60px;
span {
font-size: 12px;
position: relative;
right: 9px;
}
}
</style>
<template>
<page-standard>
<div slot="tab">
<el-radio-group v-model="pageType">
<el-radio-button
v-for="dict in dict.type.task_type"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio-button>
</el-radio-group>
</div>
<el-form
v-show="showSearch"
ref="queryForm"
......@@ -92,51 +81,113 @@
{{ item.leader ? item.leader : '---' }}
</div>
</div>
<div v-if="!isSysReview" class="card-cell">
<div class="card-cell">
<div class="cell-lable">子任务内容</div>
<div class="cell-value">
<div>
<el-link type="primary">{{ linkMap[item.docTypeOne] }}</el-link>
</div>
<div>
<el-link
v-if="item.docTypeTwo"
type="primary"
@click="handleTaskContent(linkMap[item.docTypeTwo])"
@click="handleSystemReviewTestContent('PENDING', item.id)"
>
{{ linkMap[item.docTypeTwo] }}
体系审查填写审查问卷
</el-link>
<template v-if="item.status !== 'NONE'">
<el-link
type="primary"
@click="handleSystemReviewTestContent(item.status, item.id)"
>
{{ getDictData(dict.type.system_review_test_btn, item.status) }}
</el-link>
<br />
</template>
<template v-if="item.reviewStatus !== 'NONE'">
<el-link
type="primary"
@click="
handleCarTypeReviewTaskContent(item.reviewStatus, item.id)
"
>
{{
getDictData(dict.type.test_cartype_task_btn, item.reviewStatus)
}}
</el-link>
<br />
</template>
<template v-if="item.testStatus !== 'NONE'">
<el-link
type="primary"
@click="handleCarTypeTestTaskContent(item.testStatus, item.id)"
>
{{
getDictData(dict.type.test_cartype_type_btn, item.testStatus)
}}
</el-link>
<br />
</template>
</div>
</div>
</div>
<div v-if="!isSysReview" class="card-cell status-multiple-cell">
<div class="card-cell status-multiple-cell">
<div class="cell-lable">子任务状态</div>
<div class="cell-value">
<div v-if="item.costTimeOne === 0" class="cell-value">● 未开始</div>
<template v-if="item.status !== 'NONE'">
<div
v-else
:class="[
'cell-value',
item.progressOne === 100 ? 'green' : 'yellow'
item.progressTwo === 100 ? 'green' : 'yellow'
]"
>
{{ item.progressOne === 100 ? '已完成(共耗时' : '已耗时('
}}{{ item.costTimeOne }}小时)
<span class="cell-value"
>
{{
getDictData(dict.type.system_review_test, item.status)
}}</span
>
<span
>{{ true ? '(共耗时' : '已耗时('
}}{{ item.costTimeOne }}小时)</span
>
</div>
<div v-if="item.costTimeTwo === 0" class="cell-value">● 未开始</div>
</template>
<template v-if="item.reviewStatus !== 'NONE'">
<div
v-if="item.costTimeTwo && item.costTimeTwo !== 0"
:class="[
'cell-value',
item.progressTwo === 100 ? 'green' : 'yellow'
]"
>
{{ item.progressTwo === 100 ? '已完成(共耗时' : '已耗时('
}}{{ item.costTimeTwo }}小时)
<span class="cell-value"
>
{{
getDictData(dict.type.test_cartype_task, item.reviewStatus)
}}</span
>
<span
>{{ true ? '(共耗时' : '已耗时('
}}{{ item.costTimeOne }}小时)</span
>
</div>
</template>
<template v-if="item.testStatus !== 'NONE'">
<div
:class="[
'cell-value',
item.progressTwo === 100 ? 'green' : 'yellow'
]"
>
<span class="cell-value"
>
{{
getDictData(dict.type.test_cartype_type, item.testStatus)
}}</span
>
<span
>{{ true ? '(共耗时' : '已耗时('
}}{{ item.costTimeOne }}小时)</span
>
</div>
</template>
</div>
</div>
<div v-if="!isSysReview" class="card-cell">
<div class="card-cell">
<div class="cell-lable">子任务完成进度</div>
<el-progress
class="cell-progress"
......@@ -152,38 +203,6 @@
:percentage="item.progressTwo"
></el-progress>
</div>
<div v-if="isSysReview" class="card-cell">
<div class="cell-lable">任务状态</div>
<div v-if="item.taskStatus === 'NEW'" class="cell-value">● 未开始</div>
<div v-if="item.taskStatus === 'PENDING'" class="cell-value yellow">
● 已耗时({{ getHourDiff(item.taskBeginTime) }}小时)
</div>
</div>
<div v-if="isSysReview" class="card-cell">
<div class="cell-lable">审查问卷</div>
<div class="cell-value">
<el-link
v-if="item.progress === 0"
type="primary"
@click="handleReviewForm(item.id)"
>查看检查表单</el-link
><br />
<el-link type="primary" @click="handleReviewQuestionnaire(item.id)"
>填写检查表单</el-link
><br />
<el-link type="primary" @click="handleConfirmFindings(item.id)"
>确认审查结果</el-link
>
</div>
</div>
<div v-if="isSysReview" class="card-cell">
<div class="cell-lable">完成进度</div>
<el-progress
class="cell-progress"
:stroke-width="12"
:percentage="item.progress"
></el-progress>
</div>
<div class="card-cell option-cell">
<div class="cell-lable"></div>
<div class="cell-value">
......@@ -255,22 +274,22 @@
import page from '@/mixins/page'
import taskDialog from './components/dialog'
import request from '@/utils/request'
import { getHourDiff } from '@/utils/diff'
export default {
dicts: ['sys_job_status', 'sys_scene_type', 'task_type'],
dicts: [
'sys_job_status',
'system_review_test_btn',
'test_cartype_type_btn',
'test_cartype_task_btn',
'system_review_test',
'test_cartype_type',
'test_cartype_task'
],
components: { taskDialog },
mixins: [page],
data() {
return {
// 子任务内容跳转文字map
linkMap: {
1: '查看车型审查问卷',
2: '查看车型检验方案',
3: '填写车型审查问卷',
4: '确认车型审查结果',
5: '查看车型审查记录',
6: '执行车型检验方案',
7: '确认车型检验结果'
},
dialogVisible: false,
pageType: '1', // 代办任务类型 1-体系审查 其他-车型测评
listUrl: '/system/review/task/findInProcess',
......@@ -286,8 +305,12 @@ export default {
},
watch: {
pageType(newValue) {
this.listUrl = newValue === '1' ? '/tasklist' : '/taskCarType'
this.loadData()
this.listUrl =
newValue === '1'
? '/system/review/task/findInProces'
: '/car/review/task/findPending'
this.resetQuery()
this.handleQuery()
}
},
methods: {
......@@ -338,47 +361,99 @@ export default {
path: '/processing/reviewReport'
})
},
handleReviewQuestionnaire(id) {
this.$router.push({
path: '/processing/write-check-form?id=' + id
})
},
handleReviewForm() {
this.$router.push({
path: '/processing/review-form',
query: { flag: '检查表单' }
})
},
// 查看文档检查表单跳转
handleCheckForm() {
handleConfirmFindings(id) {
this.$router.push({
path: '/processing/review-form'
path: '/processing/confirm-result?id=' + id
})
},
handleConfirmFindings(id) {
// 体系审查
handleSystemReviewTestContent(status, id) {
switch (status) {
// 查看体系审查检查表单
case 'NEW':
this.$router.push({
path: '/processing/confirm-result?id=' + id
path: '/processing/review-form?type=1&id=' + id
})
break
// 体系审查填写审查问卷
case 'PENDING':
this.$router.push({
path: '/processing/write-check-form?id=' + id
})
break
// 确认体系审查检查表单
case 'CONFIRM':
this.$router.push({
path: '/processing/confirm-result?type=1&id=' + id
})
break
}
},
handleTaskContent(msg) {
if (msg === '确认车型检验结果') {
// 车型测试
handleCarTypeTestTaskContent(status, id) {
switch (status) {
// 查看试验方案
case 'NEW':
this.$router.push({
path: '/processing/review-form?type=3&id=' + id
})
break
// 执行试验方案
case 'PENDING':
this.$router.push({
path: '/processing/vehicle-type'
})
break
// 确认测试结果
case 'CONFIRM':
this.$router.push({
path: '/processing/vehicle-type'
})
break
}
},
getHourDiff(time) {
// 获取当前时间
var now = new Date()
// 设置目标时间(这里为2021年9月30日)
var targetTime = new Date(time) // 注意月份从0开始计数,所以8表示九月
// 计算时间差(单位为毫秒)
var timeDiff = Math.abs(targetTime - now)
// 将时间差转换成小时
return Math.floor(timeDiff / (60 * 60 * 1000))
// 车型检验
handleCarTypeReviewTaskContent(status, id) {
switch (status) {
// 查看车型检查表单
case 'NEW':
this.$router.push({
path: '/processing/review-form?type=2&id=' + id
})
break
// 填写车型检查表单
case 'PENDING':
this.$router.push({
path: '/processing/type-check-form?id=' + id
})
break
// 确认车型检验结果
case 'CONFIRM':
this.$router.push({
path: '/processing/confirm-result?type=2&id=' + id
})
break
// 查看车型审查记录
case 'FINISH':
this.$router.push({
path: '/processing/vehicle-type'
})
}
},
getHourDiff,
getDictData(options, value) {
const item = options.filter(v => v.value === value)
if (item.length > 0) {
return item[0].label
} else {
return null
}
}
}
}
......@@ -392,7 +467,7 @@ export default {
color: rgb(153 153 153);
flex-direction: column;
flex-wrap: nowrap;
min-width: 111px;
min-width: 120px;
}
.status-multiple-cell {
......
<template>
<el-card>
<div slot="header" class="clearfix">
<span>车企文件信息</span>
</div>
<el-form
ref="fileRef"
:model="fileData"
label-width="100px"
class="file-form-class"
:rules="fileRules"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="企业名称" prop="enterpriseName">
<el-input
v-model="fileData.enterpriseName"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件名称" prop="fileName">
<el-input
v-model="fileData.fileName"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件版本" prop="fileVersion">
<el-input
v-model="fileData.fileVersion"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布日期" prop="releaseDate">
<el-date-picker
v-model="fileData.releaseDate"
type="date"
placeholder="选择日期"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件状态" prop="fileStatus">
<el-select
v-model="fileData.fileStatus"
placeholder="请选择"
style="width: 100%"
>
<el-option
v-for="item in dict.type.file_status"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="存储位置" prop="storageLocation">
<el-input
v-model="fileData.storageLocation"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件识别号" prop="fileIdentification">
<el-input
v-model="fileData.fileIdentification"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件照片" prop="filePicture">
<ImageUpload
v-model="fileData.filePicture"
:limit="1"
></ImageUpload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-button type="primary" icon="el-icon-folder-add" @click="handleSaveFile"
>保存车企文件</el-button
>
</el-card>
</template>
<script>
export default {
dicts: ['file_status'],
data() {
return {
fileRules: {
enterpriseName: [
{ required: true, message: '请输入企业名称', trigger: 'blur' }
],
fileName: [
{ required: true, message: '请输入文件名称', trigger: 'blur' }
],
fileVersion: [
{ required: true, message: '请输入文件版本', trigger: 'blur' }
],
releaseDate: [
{ required: true, message: '请选择发布日期', trigger: 'change' }
],
fileStatus: [
{ required: true, message: '请选择文件状态', trigger: 'change' }
],
storageLocation: [
{ required: true, message: '请输入存储位置', trigger: 'blur' }
],
fileIdentification: [
{ required: true, message: '请输入文件识别号', trigger: 'blur' }
],
filePicture: [
{ required: true, message: '请选择文件照片', trigger: 'change' }
]
},
fileData: {
enterpriseName: '',
fileStatus: '',
filePicture: '',
storageLocation: ''
}
}
},
methods: {
handleSaveFile() {
// vue表单校验
this.$refs.fileRef.validate(valid => {
if (valid) {
console.log('ddd')
}
})
}
}
}
</script>
<style scoped lang="scss">
.file-form-class {
::v-deep.el-form-item {
margin-bottom: 20px;
}
}
</style>
<template>
<el-dialog
title="新增场景对话框"
:visible.sync="dialogManger.dialogVisible"
width="35%"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="handleSceneClose"
>
<div class="file-prompt">
<div>
<i
class="el-icon-info"
/>新增场景,需要组织评审,评审通过后新增场景自动进入场景库。
</div>
</div>
<el-form
ref="sceneForm"
:model="sceneForm"
:rules="sceneRules"
label-width="80px"
class="scene-form"
>
<el-form-item label="评审类型" prop="reviewType">
<!-- 下拉框 -->
<el-select
v-model="sceneForm.reviewType"
placeholder="请选择评审类型"
style="width: 100%"
>
<el-option
v-for="item in reviewTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="场景分类" prop="sceneClassification">
<el-select
v-model="sceneForm.sceneClassification"
placeholder="请选择评审类型"
style="width: 100%"
>
<el-option
v-for="item in reviewTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="场景内容" prop="sceneContent">
<el-input
v-model="sceneForm.sceneContent"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item label="评审人员" prop="assessor">
<div>组长-xxx</div>
<div>组员-xxx、xxx、xxx</div>
</el-form-item>
<el-form-item label="备注信息" prop="remark">
<el-input
v-model="sceneForm.remark"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleSceneClose()">取 消</el-button>
<el-button type="primary" @click="handleSaveNewScene()">
确 定
</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
dicts: ['file_status'],
props: {
dialogManger: {
type: Object,
default() {
return {
dialogVisible: false
}
}
}
},
data() {
return {
sceneForm: {},
sceneRules: {
reviewType: [
{ required: true, message: '请选择评审类型', trigger: 'change' }
],
sceneClassification: [
{ required: true, message: '请选择场景分类', trigger: 'change' }
],
sceneContent: [
{ required: true, message: '请输入场景内容', trigger: 'blur' }
]
},
reviewTypeOptions: []
}
},
methods: {
// 新增场景对话框关闭时触发的回调函数
handleSceneClose() {
this.dialogManger.dialogVisible = false
this.$refs.sceneForm.resetFields()
},
/**
* 保存新场景
*/
handleSaveNewScene() {
// vue表单校验vue表单校验
this.$refs.sceneForm.validate(valid => {
if (valid) {
this.handleSceneClose()
}
})
}
}
}
</script>
<template>
<el-dialog
title="符合场景"
:visible.sync="dialogManger.dialogVisible"
width="45%"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="handleSceneClose"
>
<div class="match-scene">
<div v-for="(scene, key) in dialogManger.data" :key="key">
{{ scene.text }}
<template v-if="scene.operation">
{{ scene.operation }}
</template>
</div>
</div>
<el-button
class="label-btn mt10"
size="mini"
type="warning"
@click="handleAddScene"
>
<span>新增场景</span>
</el-button>
<!-- 新增场景对话框 -->
<scene-dialog :dialog-manger="sceneManger"></scene-dialog
></el-dialog>
</template>
<script>
import sceneDialog from './sceneDialog.vue'
export default {
components: {
'scene-dialog': sceneDialog
},
props: {
dialogManger: {
type: Object,
default() {
return {
dialogVisible: false,
data: {}
}
}
}
},
data() {
return {
sceneManger: {
dialogVisible: false
}
}
},
methods: {
// 新增场景
handleAddScene() {
this.sceneManger.dialogVisible = true
},
handleSceneClose() {
this.dialogManger.dialogVisible = false
}
}
}
</script>
......@@ -6,7 +6,6 @@
<el-button icon="el-icon-back" class="back-btn" @click="handleBack">
返回
</el-button>
<el-button class="back-btn">意见表</el-button>
</div>
<div class="main-content">
<div class="prompt-message">
......@@ -15,6 +14,10 @@
readNumber
}}条,未完成{{ model.detailsList.length - readNumber }}</span
>
<span v-if="taskModel.warnTasks" class="scene-error"
><i class="el-icon-warning-outline"></i>
{{ taskModel.warnTasks.length }} 条场景变更待处理</span
>
<!-- <span class="center-text">有 3 条场景变更待处理</span>-->
<el-checkbox v-model="checked">仅显示未完成页面</el-checkbox>
</div>
......@@ -22,14 +25,14 @@
<!-- 步骤条 -->
<el-col :span="2">
<div class="left-content" style="height: 300px; width: 110px">
<div v-for="(item, index) in model.detailsList" :key="index">
<div v-for="(item, index) in detailsList" :key="index">
<div
:class="{
'exclamation-point': true,
'no-exclamation-point': false
'exclamation-point': item.warn,
'no-exclamation-point': !item.warn
}"
>
<div v-show="true" class="exclamation">!</div>
<div v-show="item.warn" class="exclamation">!</div>
</div>
<div
class="no-select-circle"
......@@ -68,9 +71,15 @@
<span>{{ taskModel.reviewKeypointText }}</span>
</el-form-item>
<el-form-item label="审查细则">
<i
v-if="!taskModel.warn"
class="scene-button"
@click="sceneView(taskModel.reviewSceneList)"
></i
>
<span>{{ taskModel.text }}</span>
</el-form-item>
<el-form-item :label="'符合场景'">
<el-form-item v-if="taskModel.warn" :label="'符合场景'">
<template slot="label">
<span>符合场景</span>
<el-button
......@@ -87,8 +96,31 @@
v-for="(scene, key) in taskModel.reviewSceneList"
:key="key"
>
<template
v-if="scene.operation && scene.operation === 'DELETE'"
>
<del>
{{ scene.text }}
</del>
</template>
<template v-else>
{{ scene.text }}
</template>
<template
v-if="scene.operation && scene.operation === 'ADD'"
>
<span class="add-scene"> (新增) </span>
</template>
<template
v-if="scene.operation && scene.operation === 'DELETE'"
>
<span class="del-scene"> (删除) </span>
</template>
</div>
<el-button class="confirm-button" type="primary" plain=""
>已处理</el-button
>
</div>
</el-form-item>
<el-form-item label="审查结果" prop="passed">
......@@ -97,15 +129,27 @@
<el-radio :label="0">不符合</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="相关记录">
<el-form-item label="相关记录">
<el-row>
<el-col :span="8">
<div>
文件名称
<el-input
<el-select
v-model="addData.fileName"
filterable
allow-create
default-first-option
placeholder="请输入文件名称"
/>
@change="fileNameChange"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
</el-col>
<el-col :span="8" :offset="1">
......@@ -118,121 +162,16 @@
</div>
</el-col>
</el-row>
//文件第一次提示
<div class="file-prompt">
<!-- //文件第一次提示 -->
<div class="file-prompt mt10">
<div>
<i class="el-icon-info"></i
>该文件第一次出现,请维护如下相关信息
</div>
</div>
//车企文件信息
<el-card>
<div slot="header" class="clearfix">
<span>车企文件信息</span>
</div>
<el-form
ref="fileRef"
:model="fileData"
label-width="100px"
class="file-form-class"
:rules="fileRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="企业名称" prop="enterpriseName">
<el-input
v-model="fileData.enterpriseName"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件名称" prop="fileName">
<el-input
v-model="fileData.fileName"
placeholder="请输入"
></el-input>
<!-- //车企文件信息 -->
<company-file></company-file>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件版本" prop="fileVersion">
<el-input
v-model="fileData.fileVersion"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布日期" prop="releaseDate">
<el-date-picker
v-model="fileData.releaseDate"
type="date"
placeholder="选择日期"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="文件状态" prop="fileStatus">
<el-select
v-model="fileData.fileStatus"
placeholder="请选择"
style="width: 100%"
>
<el-option
v-for="item in dict.type.file_status"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="存储位置" prop="storageLocation">
<el-input
v-model="fileData.storageLocation"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="文件识别号"
prop="fileIdentification"
>
<el-input
v-model="fileData.fileIdentification"
placeholder="请输入"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文件照片" prop="filePicture">
<ImageUpload
v-model="fileData.filePicture"
:limit="1"
></ImageUpload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-button
type="primary"
icon="el-icon-folder-add"
@click="handleSaveFile"
>保存车企文件</el-button
>
</el-card>
</el-form-item> -->
<el-form-item label="条目填写人">
<span>{{ name }}</span>
</el-form-item>
......@@ -241,33 +180,42 @@
</el-row>
</div>
<div class="bottom-btn">
<el-button type="warning" @click="submitQuestionnaire(1)">
保存当前边界
<el-button type="primary" plain @click="submitQuestionnaire(1)">
保存当前条目
</el-button>
<el-button type="primary" @click="submitQuestionnaire(2)"
>提交表格</el-button
>
</div>
</el-card>
<!-- 场景查看对话框 -->
<scene-view :dialog-manger="sceneViewManger"></scene-view>
<!-- 新增场景对话框 -->
<sence-dialog :dialog-manger="senceManger"></sence-dialog>
<scene-dialog :dialog-manger="sceneManger"></scene-dialog>
</div>
</template>
<script>
import { taskDetail, reviewDetailsSubmit } from '@/api/task/task'
import senceDialog from './components/senceDialog.vue'
import sceneView from './components/sceneView.vue'
import companyFile from './components/companyFile.vue'
import { mapGetters } from 'vuex'
import sceneDialog from './components/sceneDialog.vue'
export default {
dicts: ['file_status'],
components: {
'sence-dialog': senceDialog
'scene-dialog': sceneDialog,
'scene-view': sceneView,
'company-file': companyFile
},
data() {
return {
senceManger: {
sceneManger: {
dialogVisible: false
},
sceneViewManger: {
dialogVisible: false,
data: {}
},
form: {
passed: null
},
......@@ -279,35 +227,10 @@ export default {
taskModel: {},
activeModel: 0,
checked: false,
detailsList: [],
rules: {
passed: [{ required: true, message: '请选择审查结果', trigger: 'blur' }]
},
fileRules: {
enterpriseName: [
{ required: true, message: '请输入企业名称', trigger: 'blur' }
],
fileName: [
{ required: true, message: '请输入文件名称', trigger: 'blur' }
],
fileVersion: [
{ required: true, message: '请输入文件版本', trigger: 'blur' }
],
releaseDate: [
{ required: true, message: '请选择发布日期', trigger: 'change' }
],
fileStatus: [
{ required: true, message: '请选择文件状态', trigger: 'change' }
],
storageLocation: [
{ required: true, message: '请输入存储位置', trigger: 'blur' }
],
fileIdentification: [
{ required: true, message: '请输入文件识别号', trigger: 'blur' }
],
filePicture: [
{ required: true, message: '请选择文件照片', trigger: 'change' }
]
},
// TODO 删除
checkedTwo: false,
checkedThree: false,
......@@ -316,14 +239,11 @@ export default {
fileName: '',
chapterEntry: ''
},
fileData: {
enterpriseName: '',
fileStatus: '',
filePicture: '',
storageLocation: ''
},
changeTask: [],
changeTaskDetails: [],
value1: '',
taskId: ''
taskId: '',
options: []
}
},
......@@ -340,30 +260,94 @@ export default {
},
...mapGetters(['name'])
},
watch: {
checked(newV) {
if (newV) {
this.detailsList = this.model.detailsList.filter(item => {
return !item.result || item.result.passed === null
})
} else {
this.detailsList = this.model.detailsList
}
this.handleCircle(0)
}
},
mounted() {
this.taskId = this.$route.query.id
this.getTask()
},
methods: {
fileNameChange(value) {
console.log(value)
},
getTask() {
taskDetail({
taskId: this.taskId
}).then(res => {
if (res.code === 200) {
this.model = res.data
if (
this.model.reviewSceneChangeTasks &&
this.model.reviewSceneChangeTasks.length
) {
this.sceneChange(this.model.reviewSceneChangeTasks)
}
this.detailsList = this.model.detailsList
this.handleCircle(0)
} else {
this.$modal.msgError(res.msg)
}
})
},
/**
* 场景变更任务处理
*/
sceneChange(tasks) {
this.changeTask = []
this.changeTaskDetails = []
tasks.map(task => {
this.changeTask.push(task.detailsId)
this.changeTaskDetails.push(task)
})
this.model.detailsList.map(item => {
const index = this.changeTask.indexOf(item.id)
if (index !== -1) {
item.warn = true
item.warnTasks = []
item.warnTasks.push(this.changeTaskDetails[index])
const warnTask = this.changeTaskDetails[index]
item.reviewSceneList.map(scene => {
if (scene.id === warnTask.reviewSceneId) {
scene.operation = warnTask.operation === 'ADD' ? 'ADD' : 'DELETE'
}
})
} else {
item.warn = false
}
})
},
/**
* 新增场景
*/
handleAddScene() {
this.sceneManger.dialogVisible = true
},
/**
* 查看场景
* @param {*} data
*/
sceneView(data) {
this.sceneViewManger.dialogVisible = true
this.sceneViewManger.data = data
},
/**
* 点击左侧圆圈触发的回调函数
* @param item 圆圈对象
*/
handleCircle(index) {
this.activeModel = index
this.taskModel = JSON.parse(JSON.stringify(this.model.detailsList[index]))
if (this.detailsList.length) {
this.taskModel = JSON.parse(JSON.stringify(this.detailsList[index]))
if (this.taskModel.result) {
this.form = {
......@@ -378,15 +362,14 @@ export default {
taskId: this.taskId
}
}
} else {
this.taskModel = {}
}
},
// 返回
handleBack() {
this.$router.go(-1)
},
// 新增场景
handleAddScene() {
this.senceManger.dialogVisible = true
},
// 保存当前条目
submitQuestionnaire(type) {
this.$refs.form.validate(valid => {
......@@ -405,14 +388,6 @@ export default {
})
}
})
},
handleSaveFile() {
// vue表单校验
this.$refs.fileRef.validate(valid => {
if (valid) {
console.log('ddd')
}
})
}
}
}
......@@ -539,30 +514,17 @@ export default {
}
.right-content {
.file-form-class {
::v-deep.el-form-item {
margin-bottom: 20px;
}
}
.match-scene {
display: flex;
position: relative;
flex-direction: column;
background-color: #fafafa;
padding: 5px;
}
.file-prompt {
margin: 10px 0 10px 0;
background-color: #ebf5ff;
div {
padding-left: 10px;
i {
color: #409eff;
margin-right: 10px;
}
.confirm-button {
position: absolute;
bottom: 10px;
right: 10px;
}
}
}
......@@ -575,22 +537,6 @@ export default {
}
}
.file-prompt {
margin: 0 0 10px 0;
padding: 10px;
background-color: #ebf5ff;
div {
font-size: 12px;
padding-left: 10px;
i {
color: #409eff;
margin-right: 10px;
}
}
}
.label-btn {
width: 60px;
......@@ -600,4 +546,21 @@ export default {
right: 9px;
}
}
.scene-button {
background-color: rgba(87, 208, 146);
color: white;
border-radius: 100%;
padding: 5px;
cursor: pointer;
margin-right: 10px;
}
.add-scene {
color: red;
}
.del-scene {
color: #1891ff;
}
</style>
......@@ -136,6 +136,7 @@
>
</el-table-column>
<el-table-column
v-if="view == 1"
label="操作"
align="left"
min-width="160"
......@@ -192,6 +193,7 @@ export default {
return {
listUrl: '/system/enterprise/list',
showSearch: true,
view: '',
tableData: [],
dialogManger: {
dialogVisible: false,
......@@ -215,6 +217,9 @@ export default {
}
}
},
created() {
this.view = this.$route.query.view
},
methods: {
handleDelete(id) {
this.$modal
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment