xyc
3 天以前 53052625c7c520744a4ca061e204ec9594ca67f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<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>