<template>
|
<div class="page">
|
<div class="page-title">
|
<div>
|
<h2>完工情况处理</h2>
|
<p>每一行代表一张派工单,只允许勾选一行;完工状态由业务按钮维护</p>
|
</div>
|
<el-button icon="el-icon-refresh" @click="load">刷新</el-button>
|
</div>
|
|
<div class="toolbar">
|
<el-input v-model="keyword" placeholder="派工单编号 / 故障编号 / 承修单位" clearable style="width:280px" @keyup.enter.native="load"></el-input>
|
<el-select v-model="status" clearable placeholder="完工状态" style="width:160px">
|
<el-option v-for="(meta, key) in completionStatuses" :key="key" :label="meta.text" :value="key"></el-option>
|
</el-select>
|
<el-button type="primary" icon="el-icon-search" @click="load">查询</el-button>
|
<div class="spacer"></div>
|
<span v-if="selectedRow" class="selection-tip">已选:{{ selectedRow.workOrderNo }}</span>
|
</div>
|
|
<div class="toolbar action-toolbar">
|
<el-button type="success" icon="el-icon-finished" :disabled="!selectedRow || selectedRow.completionStatus === 'COMPLETED'" @click="goCompletion">完工</el-button>
|
<el-button type="primary" icon="el-icon-time" :disabled="!canSetStatus" @click="setStatus('WAIT_TEST')">完工待试验</el-button>
|
<el-button icon="el-icon-refresh-left" :disabled="!canSetStatus" @click="setStatus('UNFINISHED')">未完工</el-button>
|
<el-button type="warning" icon="el-icon-box" :disabled="!canSetStatus" @click="setStatus('WAIT_PARTS')">待备件</el-button>
|
<el-button type="primary" plain icon="el-icon-star-on" :disabled="!selectedRow" @click="openScore">T员评分</el-button>
|
</div>
|
|
<div class="table-panel">
|
<el-table :data="rows" border stripe height="calc(100vh - 285px)" highlight-current-row @current-change="selectedRow = $event">
|
<el-table-column width="46" align="center">
|
<template slot-scope="{ row }"><el-radio v-model="selectedId" :label="row.id" @change="selectRow(row)"><span></span></el-radio></template>
|
</el-table-column>
|
<el-table-column prop="workOrderNo" label="派工单编号" width="155" fixed></el-table-column>
|
<el-table-column prop="completionStatus" label="完工状态" width="115" fixed>
|
<template slot-scope="{ row }"><el-tag size="mini" :type="completionMeta(row.completionStatus).type">{{ completionMeta(row.completionStatus).text }}</el-tag></template>
|
</el-table-column>
|
<el-table-column prop="xNo" label="X号" width="64"></el-table-column>
|
<el-table-column prop="equipmentName" label="装备名称" min-width="210" show-overflow-tooltip></el-table-column>
|
<el-table-column prop="contractorName" label="派单单位" min-width="160"></el-table-column>
|
<el-table-column prop="engineeringMajor" label="工程专业" width="100"></el-table-column>
|
<el-table-column prop="teamMajor" label="T队专业" width="100"></el-table-column>
|
<el-table-column prop="parentSystem" label="所属上级系统" min-width="130"></el-table-column>
|
<el-table-column prop="reportUnit" label="上报单位" min-width="120"></el-table-column>
|
<el-table-column prop="reportDate" label="上报时间" width="110"></el-table-column>
|
<el-table-column prop="reviewTime" label="XCB审核时间" width="160">
|
<template slot-scope="{ row }">{{ formatTime(row.reviewTime) }}</template>
|
</el-table-column>
|
<el-table-column prop="owner" label="负责人" width="90"></el-table-column>
|
<el-table-column prop="requestedFinishDate" label="要求完工日期" width="120"></el-table-column>
|
<el-table-column prop="engineeringNameDesc" label="工程名称及损坏情况" min-width="220" show-overflow-tooltip></el-table-column>
|
<el-table-column prop="faultImpact" label="故障影响" width="100"></el-table-column>
|
<el-table-column prop="faultNature" label="故障性质" width="90"></el-table-column>
|
<el-table-column prop="score" label="修后质量评分" width="115" align="center">
|
<template slot-scope="{ row }"><el-rate v-if="row.score" v-model="row.score" disabled></el-rate><span v-else>-</span></template>
|
</el-table-column>
|
<el-table-column prop="qualityOpinion" label="修后质量意见" min-width="180" show-overflow-tooltip></el-table-column>
|
<el-table-column prop="remark" label="备注" min-width="120" show-overflow-tooltip></el-table-column>
|
</el-table>
|
</div>
|
|
<el-dialog title="T员评分" :visible.sync="scoreVisible" width="520px" append-to-body>
|
<el-form :model="scoreForm" label-width="100px">
|
<el-form-item label="派工单"><b>{{ scoreForm.workOrderNo }}</b></el-form-item>
|
<el-form-item label="修后质量评分"><el-rate v-model="scoreForm.score" show-text :texts="['很差','较差','一般','良好','优秀']"></el-rate></el-form-item>
|
<el-form-item label="修后质量意见"><el-input v-model="scoreForm.opinion" type="textarea" :rows="3"></el-input></el-form-item>
|
</el-form>
|
<template slot="footer">
|
<el-button @click="scoreVisible = false">取消</el-button>
|
<el-button type="primary" :loading="saving" @click="saveScore">保存评分</el-button>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
<script>
|
import api from '@/api'
|
import { completionStatuses, statusMeta } from '@/utils/dict'
|
export default {
|
name: 'CompletionList',
|
data() {
|
return {
|
completionStatuses,
|
rows: [],
|
keyword: '',
|
status: '',
|
selectedId: null,
|
selectedRow: null,
|
scoreVisible: false,
|
saving: false,
|
scoreForm: { id: null, workOrderNo: '', score: 5, opinion: '' }
|
}
|
},
|
computed: {
|
canSetStatus() {
|
return this.selectedRow && this.selectedRow.completionStatus !== 'COMPLETED'
|
}
|
},
|
created() { this.load() },
|
methods: {
|
completionMeta(value) { return statusMeta(completionStatuses, value) },
|
formatTime(value) { return value ? String(value).replace('T', ' ').slice(0, 19) : '-' },
|
load() {
|
api.get('/work-orders', { params: { keyword: this.keyword, status: this.status } }).then(res => {
|
this.rows = res.data || []
|
if (this.selectedId && !this.rows.some(item => item.id === this.selectedId)) {
|
this.selectedId = null
|
this.selectedRow = null
|
}
|
})
|
},
|
selectRow(row) { this.selectedRow = row },
|
setStatus(status) {
|
const action = this.completionMeta(status).text
|
this.$confirm(`确定将 ${this.selectedRow.workOrderNo} 设置为“${action}”吗?`, '状态设置').then(() => {
|
return api.post('/work-orders/status', { id: this.selectedRow.id, status })
|
}).then(() => {
|
this.$message.success('完工状态已更新')
|
this.load()
|
}).catch(() => {})
|
},
|
goCompletion() {
|
this.$router.push({ path: '/completion/report', query: { workOrderId: this.selectedRow.id } })
|
},
|
openScore() {
|
this.scoreForm = {
|
id: this.selectedRow.id,
|
workOrderNo: this.selectedRow.workOrderNo,
|
score: this.selectedRow.score || 5,
|
opinion: this.selectedRow.qualityOpinion || ''
|
}
|
this.scoreVisible = true
|
},
|
saveScore() {
|
this.saving = true
|
api.post('/work-orders/score', this.scoreForm).then(() => {
|
this.$message.success('评分已写入派工单')
|
this.scoreVisible = false
|
this.load()
|
}).finally(() => { this.saving = false })
|
}
|
}
|
}
|
</script>
|
<style scoped>
|
.action-toolbar { background: #f8fafc; }
|
.selection-tip { color: #6d7f91; font-size: 13px; }
|
.el-radio ::v-deep .el-radio__label { display: none; }
|
</style>
|