|
|
@@ -82,7 +82,17 @@
|
|
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
</div>
|
|
|
-
|
|
|
+ <el-row :gutter="10" class="mb8">
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ icon=""
|
|
|
+ :disabled="!canAppeal"
|
|
|
+ @click="handleAppeal"
|
|
|
+ v-hasPermi="['gxt:orderScore:appeal']"
|
|
|
+ >发起申诉</el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
<!-- 工单评分列表 -->
|
|
|
<el-table
|
|
|
v-loading="loading"
|
|
|
@@ -91,7 +101,7 @@
|
|
|
style="width: 100%"
|
|
|
:max-height="tableHeight"
|
|
|
>
|
|
|
-<!-- <el-table-column type="selection" width="55" align="center" />-->
|
|
|
+ <el-table-column type="selection" width="55" align="center" />
|
|
|
<el-table-column label="工单编码" align="center" prop="workOrderProjectNo" :show-overflow-tooltip="true" />
|
|
|
<el-table-column label="工单类型" align="center" prop="orderType" >
|
|
|
<template #default="scope">
|
|
|
@@ -138,7 +148,7 @@
|
|
|
<el-button
|
|
|
type="success"
|
|
|
link
|
|
|
- v-if="scope.row.scoringStatus == 'to_final'"
|
|
|
+ v-if="scope.row.scoringStatus == 'to_final' || scope.row.scoringStatus == 'appealing'"
|
|
|
@click="handleFinalEvaluation(scope.row)"
|
|
|
v-hasPermi="['gxt:orderScore:finalEvaluation']"
|
|
|
><i class="fa fa-flag-checkered"></i>终评</el-button>
|
|
|
@@ -557,107 +567,233 @@
|
|
|
<!-- 终评对话框 -->
|
|
|
<el-dialog :title="finalEvaluationForm.orderType === 1 ? '维修工单终评' : '维保工单终评'" v-model="finalEvaluationDialogVisible" width="800px" append-to-body>
|
|
|
<el-form ref="finalEvaluationRef" :model="finalEvaluationForm" :rules="finalEvaluationRules" label-width="120px" label-position="top">
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="工单编码">
|
|
|
- <el-input v-model="finalEvaluationForm.workOrderProjectNo" disabled />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="风机编号">
|
|
|
- <el-input v-model="finalEvaluationForm.pcsDeviceName" disabled />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="场站">
|
|
|
- <el-input v-model="finalEvaluationForm.pcsStationName" disabled />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-form-item :label="finalEvaluationForm.orderType === 1 ? '维修总结' : '维保总结'">
|
|
|
- <el-input
|
|
|
- v-model="finalEvaluationForm.workSummary"
|
|
|
- type="textarea"
|
|
|
- disabled
|
|
|
- :rows="4"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="12" v-if="finalEvaluationForm.orderType === 1">
|
|
|
- <el-form-item label="检修类型">
|
|
|
- <el-select v-model="finalEvaluationForm.maintenanceType" disabled style="width: 100%">
|
|
|
- <el-option
|
|
|
- v-for="item in maintenanceTypeOptions"
|
|
|
- :key="item.value"
|
|
|
- :label="item.label"
|
|
|
- :value="item.value">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12" v-if="finalEvaluationForm.orderType === 2">
|
|
|
- <el-form-item label="维保类型">
|
|
|
- <el-select v-model="finalEvaluationForm.inspectionType" disabled style="width: 100%">
|
|
|
- <el-option
|
|
|
- v-for="item in inspectionTypeOptions"
|
|
|
- :key="item.inspectionTypeId"
|
|
|
- :label="getDictLabel(gxt_inspection_type, item.inspectionTypeId)"
|
|
|
- :value="item.inspectionTypeId.toString()">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="系数" prop="finalCoefficient">
|
|
|
- <el-input-number
|
|
|
- v-model="finalEvaluationForm.finalCoefficient"
|
|
|
- :min="finalEvaluationForm.orderType === 1 ? 0.5 : 0.8"
|
|
|
- :max="finalEvaluationForm.orderType === 1 ? 1.5 : 1.2"
|
|
|
- :step="0.01"
|
|
|
- style="width: 100%"
|
|
|
- controls-position="right"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-form-item v-if="finalEvaluationForm.orderType === 1 && finalEvaluationForm.feedbackReason" label="反馈理由" prop="feedbackReason">
|
|
|
+ <template v-if="finalEvaluationForm.orderType === 2" >
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="工单编码">
|
|
|
+ <el-input v-model="finalEvaluationForm.workOrderProjectNo" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="风机编号">
|
|
|
+ <el-input v-model="finalEvaluationForm.pcsDeviceName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="场站">
|
|
|
+ <el-input v-model="finalEvaluationForm.pcsStationName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-form-item :label="finalEvaluationForm.orderType === 1 ? '维修总结' : '维保总结'">
|
|
|
+ <el-input
|
|
|
+ v-model="finalEvaluationForm.workSummary"
|
|
|
+ type="textarea"
|
|
|
+ disabled
|
|
|
+ :rows="4"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12" v-if="finalEvaluationForm.orderType === 1">
|
|
|
+ <el-form-item label="检修类型">
|
|
|
+ <el-select v-model="finalEvaluationForm.maintenanceType" disabled style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="item in maintenanceTypeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="finalEvaluationForm.orderType === 2">
|
|
|
+ <el-form-item label="维保类型">
|
|
|
+ <el-select v-model="finalEvaluationForm.inspectionType" disabled style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="item in inspectionTypeOptions"
|
|
|
+ :key="item.inspectionTypeId"
|
|
|
+ :label="getDictLabel(gxt_inspection_type, item.inspectionTypeId)"
|
|
|
+ :value="item.inspectionTypeId.toString()">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="系数" prop="finalCoefficient">
|
|
|
+ <el-input-number
|
|
|
+ v-model="finalEvaluationForm.finalCoefficient"
|
|
|
+ :min="finalEvaluationForm.orderType === 1 ? 0.5 : 0.8"
|
|
|
+ :max="finalEvaluationForm.orderType === 1 ? 1.5 : 1.2"
|
|
|
+ :step="0.01"
|
|
|
+ style="width: 100%"
|
|
|
+ controls-position="right"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- 维保工单保持原有样式 -->
|
|
|
+ <el-form-item label="得分明细">
|
|
|
+ <el-table :data="finalEvaluationForm.scorePersonList" border style="width: 100%;">
|
|
|
+ <el-table-column label="检修员" align="center" prop="nickName" style="width: 50%;">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="自评得分" align="center" prop="selfScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.selfScore !== null && scope.row.selfScore !== undefined ? parseFloat(scope.row.selfScore).toFixed(2) : '' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="复评得分" align="center" prop="reviewScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.reviewScore !== null && scope.row.reviewScore !== undefined ? parseFloat(scope.row.reviewScore).toFixed(2) : '' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="终评得分" align="center" prop="finalScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input v-model="scope.row.finalScore"
|
|
|
+ :value="calculateFinalScore(scope.row.reviewScore, finalEvaluationForm.finalCoefficient)"
|
|
|
+ readonly
|
|
|
+ style="width: 100%;"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+<!-- <el-form-item v-if="finalEvaluationForm.orderType === 1 && finalEvaluationForm.feedbackReason" label="反馈理由" prop="feedbackReason">
|
|
|
<el-input
|
|
|
v-model="finalEvaluationForm.feedbackReason"
|
|
|
type="textarea"
|
|
|
:rows="3"
|
|
|
disabled
|
|
|
/>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="得分明细">
|
|
|
- <el-table :data="finalEvaluationForm.scorePersonList" border style="width: 100%;">
|
|
|
- <el-table-column label="检修员" align="center" prop="nickName" style="width: 50%;">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="自评得分" align="center" prop="selfScore">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.selfScore !== null && scope.row.selfScore !== undefined ? parseFloat(scope.row.selfScore).toFixed(2) : '' }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="复评得分" align="center" prop="reviewScore">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.reviewScore !== null && scope.row.reviewScore !== undefined ? parseFloat(scope.row.reviewScore).toFixed(2) : '' }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="终评得分" align="center" prop="finalScore">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.finalScore"
|
|
|
- :value="calculateFinalScore(scope.row.reviewScore, finalEvaluationForm.finalCoefficient)"
|
|
|
- readonly
|
|
|
- style="width: 100%;"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-form-item>
|
|
|
+ </el-form-item>-->
|
|
|
+ <!-- 维修工单终评界面添加标签页 -->
|
|
|
+ <el-tabs v-if="finalEvaluationForm.orderType === 1" v-model="activeFinalEvalTab">
|
|
|
+ <el-tab-pane label="终评信息" name="evaluation">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="工单编码">
|
|
|
+ <el-input v-model="finalEvaluationForm.workOrderProjectNo" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="风机编号">
|
|
|
+ <el-input v-model="finalEvaluationForm.pcsDeviceName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="场站">
|
|
|
+ <el-input v-model="finalEvaluationForm.pcsStationName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-form-item :label="finalEvaluationForm.orderType === 1 ? '维修总结' : '维保总结'">
|
|
|
+ <el-input
|
|
|
+ v-model="finalEvaluationForm.workSummary"
|
|
|
+ type="textarea"
|
|
|
+ disabled
|
|
|
+ :rows="4"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12" v-if="finalEvaluationForm.orderType === 1">
|
|
|
+ <el-form-item label="检修类型">
|
|
|
+ <el-select v-model="finalEvaluationForm.maintenanceType" disabled style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="item in maintenanceTypeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="finalEvaluationForm.orderType === 2">
|
|
|
+ <el-form-item label="维保类型">
|
|
|
+ <el-select v-model="finalEvaluationForm.inspectionType" disabled style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="item in inspectionTypeOptions"
|
|
|
+ :key="item.inspectionTypeId"
|
|
|
+ :label="getDictLabel(gxt_inspection_type, item.inspectionTypeId)"
|
|
|
+ :value="item.inspectionTypeId.toString()">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="系数" prop="finalCoefficient">
|
|
|
+ <el-input-number
|
|
|
+ v-model="finalEvaluationForm.finalCoefficient"
|
|
|
+ :min="finalEvaluationForm.orderType === 1 ? 0.5 : 0.8"
|
|
|
+ :max="finalEvaluationForm.orderType === 1 ? 1.5 : 1.2"
|
|
|
+ :step="0.01"
|
|
|
+ style="width: 100%"
|
|
|
+ controls-position="right"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-form-item label="得分明细">
|
|
|
+ <el-table :data="finalEvaluationForm.scorePersonList" border style="width: 100%;">
|
|
|
+ <el-table-column label="检修员" align="center" prop="nickName" style="width: 50%;">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="自评得分" align="center" prop="selfScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.selfScore !== null && scope.row.selfScore !== undefined ? parseFloat(scope.row.selfScore).toFixed(2) : '' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="复评得分" align="center" prop="reviewScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.reviewScore !== null && scope.row.reviewScore !== undefined ? parseFloat(scope.row.reviewScore).toFixed(2) : '' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="终评得分" align="center" prop="finalScore">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input v-model="scope.row.finalScore"
|
|
|
+ :value="calculateFinalScore(scope.row.reviewScore, finalEvaluationForm.finalCoefficient)"
|
|
|
+ readonly
|
|
|
+ style="width: 100%;"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="申诉信息" name="appeal">
|
|
|
+ <el-form-item label="申诉理由">
|
|
|
+ <el-input
|
|
|
+ v-model="finalEvaluationForm.appealReason"
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ disabled
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="申诉人">
|
|
|
+ <el-input v-model="finalEvaluationForm.appealUserName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="申诉时间">
|
|
|
+ <el-input v-model="finalEvaluationForm.appealTime" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+
|
|
|
</el-form>
|
|
|
|
|
|
<template #footer>
|
|
|
@@ -832,6 +968,63 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <!-- 申诉对话框 -->
|
|
|
+ <el-dialog title="发起申诉" v-model="appealDialogVisible" width="800px" append-to-body>
|
|
|
+ <el-form ref="appealRef" :model="appealForm" :rules="appealRules" label-width="120px" label-position="top">
|
|
|
+ <el-alert type="info" :closable="false" style="margin-bottom: 20px;">
|
|
|
+ 发起申诉操作,请输入申诉理由
|
|
|
+ </el-alert>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="工单编码">
|
|
|
+ <el-input v-model="appealForm.workOrderProjectNo" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="风机编号">
|
|
|
+ <el-input v-model="appealForm.pcsDeviceName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="场站">
|
|
|
+ <el-input v-model="appealForm.pcsStationName" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="发生时间">
|
|
|
+ <el-input v-model="appealForm.occurTime" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="原得分">
|
|
|
+ <el-input v-model="appealForm.originalScore" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-form-item label="申诉理由" prop="appealReason">
|
|
|
+ <el-input
|
|
|
+ v-model="appealForm.appealReason"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入申诉理由"
|
|
|
+ maxlength="500"
|
|
|
+ show-word-limit
|
|
|
+ :rows="6"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="closeAppealDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitAppeal">提交申诉</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -842,7 +1035,8 @@ import {
|
|
|
selfEvaluation,
|
|
|
review,
|
|
|
confirm,
|
|
|
- finalEvaluation
|
|
|
+ finalEvaluation,
|
|
|
+ appeal
|
|
|
} from "@/api/gxt/orderScore";
|
|
|
import { listScoreproject } from "@/api/gxt/scoreproject";
|
|
|
import { listMaintenanceCenters, listStationsByMaintenanceCenter } from "@/api/gxt/equipment"
|
|
|
@@ -872,6 +1066,7 @@ const selfEvaluationDialogVisible = ref(false);
|
|
|
const reviewDialogVisible = ref(false);
|
|
|
const confirmDialogVisible = ref(false);
|
|
|
const finalEvaluationDialogVisible = ref(false);
|
|
|
+const appealDialogVisible = ref(false); // 申诉对话框
|
|
|
|
|
|
// 表单相关
|
|
|
const queryRef = ref(null);
|
|
|
@@ -879,6 +1074,10 @@ const selfEvaluationRef = ref(null);
|
|
|
const reviewRef = ref(null);
|
|
|
const confirmRef = ref(null);
|
|
|
const finalEvaluationRef = ref(null);
|
|
|
+const appealRef = ref(null); // 申诉表单引用
|
|
|
+
|
|
|
+// 终评标签页控制
|
|
|
+const activeFinalEvalTab = ref('evaluation');
|
|
|
|
|
|
// 各种表单数据
|
|
|
const viewForm = ref({});
|
|
|
@@ -886,6 +1085,7 @@ const selfEvaluationForm = ref({});
|
|
|
const reviewForm = ref({});
|
|
|
const confirmForm = ref({});
|
|
|
const finalEvaluationForm = ref({});
|
|
|
+const appealForm = ref({}); // 申诉表单
|
|
|
|
|
|
// 人员列表
|
|
|
const scorePersonList = ref([]);
|
|
|
@@ -974,6 +1174,13 @@ const confirmRules = ref({
|
|
|
]
|
|
|
});
|
|
|
|
|
|
+// 申诉对话框表单验证规则
|
|
|
+const appealRules = ref({
|
|
|
+ appealReason: [
|
|
|
+ { required: true, message: "申诉理由不能为空", trigger: "blur" }
|
|
|
+ ]
|
|
|
+});
|
|
|
+
|
|
|
// 维保中心和场站选项
|
|
|
const maintenanceCenterOptions = ref([])
|
|
|
const stationOptions = ref([])
|
|
|
@@ -996,6 +1203,21 @@ function getDictLabel(dictOptions, value) {
|
|
|
return dict ? dict.label : '';
|
|
|
}
|
|
|
|
|
|
+// 判断是否可以选择并发起申诉
|
|
|
+const canAppeal = computed(() => {
|
|
|
+ // 只有当选择了且仅选择了一个维修工单,并且该工单状态为"待归档"或"已归档"时才允许发起申诉
|
|
|
+ if (ids.value.length !== 1) return false;
|
|
|
+
|
|
|
+ const selectedOrder = orderScoreList.value.find(item => item.id === ids.value[0]);
|
|
|
+ if (!selectedOrder) return false;
|
|
|
+
|
|
|
+ // 只有维修工单(orderType=1)才能发起申诉
|
|
|
+ if (selectedOrder.orderType !== 1) return false;
|
|
|
+
|
|
|
+ // 只有待归档(to_archive)或已归档(archived)状态才能发起申诉
|
|
|
+ return selectedOrder.scoringStatus === 'to_archive' || selectedOrder.scoringStatus === 'archived';
|
|
|
+});
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getList();
|
|
|
getMaintenanceCenterAndStationList();
|
|
|
@@ -1650,6 +1872,10 @@ function handleFinalEvaluation(row) {
|
|
|
scorePersonList: row.orderType === 1 ? (data.repairOrderPersonList || []) : (data.workOrderPersonList || []),
|
|
|
feedbackReason: row.orderType === 1 ? data.feedbackReason : null,
|
|
|
confirmStatus: data.confirmStatus,
|
|
|
+ // 申诉相关信息
|
|
|
+ appealReason: data.appealReason,
|
|
|
+ appealUserName: data.appealUserName,
|
|
|
+ appealTime: data.appealTime ? proxy.parseTime(data.appealTime, '{y}-{m}-{d} {h}:{i}') : null
|
|
|
};
|
|
|
|
|
|
// 如果是维保工单,根据风机型号获取维保类型选项
|
|
|
@@ -1662,6 +1888,9 @@ function handleFinalEvaluation(row) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ // 默认显示终评信息标签页
|
|
|
+ activeFinalEvalTab.value = 'evaluation';
|
|
|
+
|
|
|
finalEvaluationDialogVisible.value = true;
|
|
|
});
|
|
|
}
|
|
|
@@ -1697,6 +1926,169 @@ function submitFinalEvaluation() {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+/** 发起申诉操作 */
|
|
|
+function handleAppeal() {
|
|
|
+ // 获取选中的工单
|
|
|
+ const selectedOrder = orderScoreList.value.find(item => item.id === ids.value[0]);
|
|
|
+ if (!selectedOrder) {
|
|
|
+ proxy.$modal.msgError("未找到选中的工单");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否为维修工单
|
|
|
+ if (selectedOrder.orderType !== 1) {
|
|
|
+ proxy.$modal.msgError("只有维修工单才能发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查工单状态是否为"待归档"或"已归档"
|
|
|
+ if (selectedOrder.scoringStatus !== 'to_archive' && selectedOrder.scoringStatus !== 'archived') {
|
|
|
+ proxy.$modal.msgError("只有状态为\"待归档\"或\"已归档\"的工单才能发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查申诉时效性(本月工单或上月工单延期5天)
|
|
|
+ const now = new Date();
|
|
|
+ //const orderEndDate = new Date(selectedOrder.realEndTime);
|
|
|
+ const orderEndDate = new Date(selectedOrder.occurTime);
|
|
|
+
|
|
|
+ // 当前月份和年份
|
|
|
+ const currentYear = now.getFullYear();
|
|
|
+ const currentMonth = now.getMonth();
|
|
|
+ const currentDay = now.getDate();
|
|
|
+
|
|
|
+ // 工单完成月份和年份
|
|
|
+ const orderYear = orderEndDate.getFullYear();
|
|
|
+ const orderMonth = orderEndDate.getMonth();
|
|
|
+
|
|
|
+ // 判断是否符合申诉时效
|
|
|
+ let isValidAppealPeriod = false;
|
|
|
+ if (currentYear === orderYear && currentMonth === orderMonth) {
|
|
|
+ // 本月工单
|
|
|
+ isValidAppealPeriod = true;
|
|
|
+ } else if (currentYear === orderYear && currentMonth === orderMonth + 1) {
|
|
|
+ // 上月工单,在本月5号之前可申诉
|
|
|
+ if (currentDay <= 5) {
|
|
|
+ isValidAppealPeriod = true;
|
|
|
+ }
|
|
|
+ } else if (currentYear === orderYear + 1 && currentMonth === 0 && orderMonth === 11) {
|
|
|
+ // 跨年情况:当前1月,工单完成于上年12月,在1月5号之前可申诉
|
|
|
+ if (currentDay <= 5) {
|
|
|
+ isValidAppealPeriod = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isValidAppealPeriod) {
|
|
|
+ proxy.$modal.msgError("超出申诉时效,不能发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否已经申诉过(通过confirmStatus字段判断)
|
|
|
+ if(selectedOrder.confirmStatus == 3){
|
|
|
+ proxy.$modal.msgError("该工单已申诉,不能发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查当前用户是否有权限发起申诉(工作负责人或检修人员)
|
|
|
+ const currentUserId = userStore.id;
|
|
|
+ let hasPermission = false;
|
|
|
+ hasPermission = isUserInScoreList(selectedOrder)
|
|
|
+
|
|
|
+ // 检查是否为工作负责人
|
|
|
+ /*if (selectedOrder.teamLeaderId && selectedOrder.teamLeaderId === currentUserId) {
|
|
|
+ hasPermission = true;
|
|
|
+ }*/
|
|
|
+
|
|
|
+ // 检查是否为检修人员(需要获取工单详细信息)
|
|
|
+ /*if (!hasPermission) {
|
|
|
+ getOrderScore(selectedOrder.orderType, selectedOrder.id).then(response => {
|
|
|
+ const data = response.data;
|
|
|
+ const persons = data.repairOrderPersonList || [];
|
|
|
+
|
|
|
+ // 检查当前用户是否在检修人员列表中
|
|
|
+ for (const person of persons) {
|
|
|
+ if (person.userId && person.userId === currentUserId) {
|
|
|
+ hasPermission = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hasPermission) {
|
|
|
+ proxy.$modal.msgError("您没有权限对此工单发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化申诉表单
|
|
|
+ appealForm.value = {
|
|
|
+ orderType: selectedOrder.orderType,
|
|
|
+ id: selectedOrder.id,
|
|
|
+ workOrderProjectNo: selectedOrder.workOrderProjectNo,
|
|
|
+ pcsDeviceName: selectedOrder.pcsDeviceName,
|
|
|
+ pcsStationName: selectedOrder.pcsStationName,
|
|
|
+ occurTime: proxy.parseTime(selectedOrder.realEndTime, '{y}-{m}-{d} {h}:{i}'),
|
|
|
+ originalScore: getReviewerScore(data),
|
|
|
+ appealReason: ''
|
|
|
+ };
|
|
|
+
|
|
|
+ // 显示申诉对话框
|
|
|
+ appealDialogVisible.value = true;
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }*/
|
|
|
+ if (!hasPermission) {
|
|
|
+ proxy.$modal.msgError("您没有权限对此工单发起申诉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取工单详细信息
|
|
|
+ getOrderScore(selectedOrder.orderType, selectedOrder.id).then(response => {
|
|
|
+ const data = response.data;
|
|
|
+
|
|
|
+ // 初始化申诉表单
|
|
|
+ appealForm.value = {
|
|
|
+ orderType: selectedOrder.orderType,
|
|
|
+ id: selectedOrder.id,
|
|
|
+ workOrderProjectNo: selectedOrder.workOrderProjectNo,
|
|
|
+ pcsDeviceName: selectedOrder.pcsDeviceName,
|
|
|
+ pcsStationName: selectedOrder.pcsStationName,
|
|
|
+ occurTime: proxy.parseTime(selectedOrder.realEndTime, '{y}-{m}-{d} {h}:{i}'),
|
|
|
+ originalScore: getReviewerScore(data),
|
|
|
+ appealReason: ''
|
|
|
+ };
|
|
|
+
|
|
|
+ // 显示申诉对话框
|
|
|
+ appealDialogVisible.value = true;
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/** 关闭申诉对话框 */
|
|
|
+function closeAppealDialog() {
|
|
|
+ appealDialogVisible.value = false;
|
|
|
+ proxy.resetForm("appealRef");
|
|
|
+}
|
|
|
+
|
|
|
+/** 提交申诉 */
|
|
|
+function submitAppeal() {
|
|
|
+ proxy.$refs["appealRef"].validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ // 将申诉理由作为feedbackReason传递给后端
|
|
|
+ const appealData = {
|
|
|
+ orderType: appealForm.value.orderType,
|
|
|
+ id: appealForm.value.id,
|
|
|
+ appealReason: appealForm.value.appealReason, // 使用appealReason字段存储申诉理由
|
|
|
+ };
|
|
|
+
|
|
|
+ appeal(appealData).then(response => {
|
|
|
+ proxy.$modal.msgSuccess("申诉提交成功");
|
|
|
+ appealDialogVisible.value = false;
|
|
|
+ getList();
|
|
|
+ }).catch(error => {
|
|
|
+ proxy.$modal.msgError(error.message || "申诉提交失败");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
/** 判断用户是否在工单的评分人员列表中 */
|
|
|
function isUserInScoreList(row) {
|
|
|
// 获取工单的评分人员列表
|
|
|
@@ -1731,6 +2123,31 @@ function isUserConfirmed(row) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+// 获取当前用户的复评分数
|
|
|
+function getReviewerScore(data) {
|
|
|
+ // 获取当前登录用户ID
|
|
|
+ const currentUserId = userStore.id;
|
|
|
+
|
|
|
+ // 检查维修工单人员列表
|
|
|
+ if (data.repairOrderPersonList && Array.isArray(data.repairOrderPersonList)) {
|
|
|
+ const person = data.repairOrderPersonList.find(p => p.userId == currentUserId);
|
|
|
+ if (person && person.reviewScore !== null && person.reviewScore !== undefined) {
|
|
|
+ return parseFloat(person.reviewScore).toFixed(2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查维保工单人员列表
|
|
|
+ if (data.workOrderPersonList && Array.isArray(data.workOrderPersonList)) {
|
|
|
+ const person = data.workOrderPersonList.find(p => p.userId == currentUserId);
|
|
|
+ if (person && person.reviewScore !== null && person.reviewScore !== undefined) {
|
|
|
+ return parseFloat(person.reviewScore).toFixed(2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没找到复评分数,则返回空字符串
|
|
|
+ return '';
|
|
|
+}
|
|
|
+
|
|
|
function getMaintenanceCenterAndStationList() {
|
|
|
listMaintenanceCenters().then(response => {
|
|
|
maintenanceCenterOptions.value = response.data.map(item => {
|