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
<template>
  <el-dialog title="修改故障" :visible.sync="localVisible" width="960px" append-to-body @closed="clearValidate">
    <el-form ref="form" :model="form" :rules="rules" label-width="105px">
      <el-row :gutter="16">
        <el-col :span="8"><el-form-item label="故障编号"><el-input v-model="form.faultCode" readonly placeholder="保存后自动生成"></el-input></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="上报单位"><el-input v-model="form.reportUnit"></el-input></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="上报日期"><el-date-picker v-model="form.reportDate" type="date" value-format="yyyy-MM-dd" style="width:100%"></el-date-picker></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="X号"><el-select v-model="form.xNo" filterable placeholder="请选择X号" style="width:100%"><el-option v-for="item in xNumbers" :key="item" :label="item" :value="item"></el-option></el-select></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="负责人"><el-input v-model="form.owner"></el-input></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="T队专业"><el-select v-model="form.teamMajor" style="width:100%"><el-option v-for="item in teamMajors" :key="item.id" :label="item.name" :value="item.name"></el-option></el-select></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="工程专业"><el-select v-model="form.engineeringMajor" style="width:100%"><el-option v-for="item in engineeringMajors" :key="item.id" :label="item.name" :value="item.name"></el-option></el-select></el-form-item></el-col>
        <el-col :span="16">
          <el-form-item label="装备名称" prop="equipmentName">
            <el-input v-model="form.equipmentName" readonly :title="form.equipmentName" placeholder="点击右侧按钮从产品结构树选设备,可多选">
              <el-button slot="append" icon="el-icon-s-grid" @click="pickerVisible = true">选择装备</el-button>
            </el-input>
            <div v-if="selectedEquipmentIds.length" class="field-tip">已选 {{ selectedEquipmentIds.length }} 台设备</div>
          </el-form-item>
        </el-col>
        <el-col :span="16"><el-form-item label="所属上级系统"><el-input v-model="form.parentSystem" readonly :title="form.parentSystem"></el-input></el-form-item></el-col>
        <el-col :span="24"><el-form-item label="工程名称及损坏情况" prop="engineeringNameDesc"><el-input v-model="form.engineeringNameDesc" type="textarea" :rows="2"></el-input></el-form-item></el-col>
        <el-col :span="24"><el-form-item label="修理技术要求"><el-input v-model="form.repairRequirement" type="textarea" :rows="2"></el-input></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="故障影响"><el-select v-model="form.faultImpact" style="width:100%"><el-option v-for="item in impacts" :key="item" :label="item" :value="item"></el-option></el-select></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="故障性质"><el-select v-model="form.faultNature" style="width:100%"><el-option v-for="item in natures" :key="item" :label="item" :value="item"></el-option></el-select></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="是否自修"><el-switch v-model="form.isSelfRepair" :active-value="1" :inactive-value="0"></el-switch></el-form-item></el-col>
      </el-row>
      <el-row :gutter="16">
        <el-col :span="8"><el-form-item label="是否涉H"><el-switch v-model="form.isHRelated" :active-value="1" :inactive-value="0"></el-switch></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="是否监测项目"><el-switch v-model="form.isMonitorItem" :active-value="1" :inactive-value="0"></el-switch></el-form-item></el-col>
        <el-col :span="8"><el-form-item label="监测数值"><el-input v-model="form.monitorValue" :disabled="form.isMonitorItem !== 1"></el-input></el-form-item></el-col>
        <el-col :span="24"><el-form-item label="重大故障描述"><el-input v-model="form.majorFaultDesc" type="textarea" :rows="2"></el-input></el-form-item></el-col>
        <el-col :span="12"><el-form-item label="要求完工日期"><el-date-picker v-model="form.requestedFinishDate" type="date" value-format="yyyy-MM-dd" style="width:100%"></el-date-picker></el-form-item></el-col>
        <el-col :span="12"><el-form-item label="备注"><el-input v-model="form.remark"></el-input></el-form-item></el-col>
      </el-row>
    </el-form>
    <template slot="footer">
      <el-button @click="localVisible = false">取消</el-button>
      <el-button type="primary" :loading="saving" @click="save">保存</el-button>
    </template>
    <product-tree-picker :visible.sync="pickerVisible" :x-no="form.xNo" :selected-ids="selectedEquipmentIds" @select="onEquipmentSelected"></product-tree-picker>
  </el-dialog>
</template>
<script>
import api from '@/api'
import ProductTreePicker from '@/components/ProductTreePicker.vue'
 
export default {
  name: 'FaultEditDialog',
  components: { ProductTreePicker },
  props: {
    visible: { type: Boolean, default: false },
    fault: { type: Object, default: () => ({}) }
  },
  data() {
    return {
      localVisible: false,
      pickerVisible: false,
      saving: false,
      xNumbers: [],
      teamMajors: [],
      engineeringMajors: [],
      impacts: ['供气', '供电', '运行', '安全'],
      natures: ['一般', '重大'],
      form: {},
      rules: {
        equipmentName: [{ required: true, message: '请选择装备名称', trigger: 'change' }],
        engineeringNameDesc: [{ required: true, message: '请填写工程名称及损坏情况', trigger: 'blur' }]
      }
    }
  },
  computed: {
    selectedEquipmentIds() {
      const text = this.form && this.form.equipmentIds
      if (text) return String(text).split(',').map(item => item.trim()).filter(Boolean)
      return this.form && this.form.equipmentId ? [String(this.form.equipmentId)] : []
    }
  },
  watch: {
    visible(value) {
      this.localVisible = value
      if (value) this.initForm()
    },
    localVisible(value) { this.$emit('update:visible', value) }
  },
  created() {
    this.loadXNumbers()
    this.loadMajors()
  },
  methods: {
    initForm() {
      this.form = JSON.parse(JSON.stringify(this.fault || {}))
      if (!this.form.equipmentIds && this.form.equipmentId) {
        this.form.equipmentIds = String(this.form.equipmentId)
      }
    },
    loadMajors() {
      api.get('/system/team-majors').then(res => { this.teamMajors = res.data || [] })
      api.get('/system/engineering-majors').then(res => { this.engineeringMajors = res.data || [] })
    },
    loadXNumbers() {
      api.get('/system/tree', { params: { type: 'product' } }).then(res => {
        const values = []
        const walk = nodes => {
          if (!nodes) return
          nodes.forEach(node => {
            if (node.nodeType === 'X_NO' || node.nodeLevel === 2) values.push(node.name)
            walk(node.children)
          })
        }
        walk(res.data)
        this.xNumbers = Array.from(new Set(values.filter(Boolean))).sort((a, b) => a.localeCompare(b, 'zh-CN'))
      })
    },
    onEquipmentSelected(nodes) {
      const selected = Array.isArray(nodes) ? nodes : [nodes]
      this.form.equipmentIds = selected.map(node => node.id).join(',')
      this.form.equipmentId = selected.length ? selected[0].id : null
      this.form.equipmentName = selected.map(node => node.name).join('、')
      this.form.xNo = selected.length && selected[0].xNo ? selected[0].xNo : this.form.xNo
      const parentSystems = []
      selected.forEach(node => {
        const parent = (node.parentPathNames || []).join(' / ')
        if (parent && !parentSystems.includes(parent)) parentSystems.push(parent)
      })
      this.form.parentSystem = parentSystems.length ? parentSystems.join('、') : '未指定'
    },
    clearValidate() {
      if (this.$refs.form) this.$refs.form.clearValidate()
    },
    save() {
      this.$refs.form.validate(valid => {
        if (!valid) return
        this.saving = true
        api.put('/faults/' + this.form.id, this.form).then(res => {
          this.$message.success('保存成功')
          this.localVisible = false
          this.$emit('saved', res.data)
        }).finally(() => { this.saving = false })
      })
    }
  }
}
</script>
<style scoped>
.field-tip { margin-top: 4px; color: #7b8a99; font-size: 12px; line-height: 18px; }
</style>