Explorar o código

维修提取退回组件

HD_wangm hai 4 meses
pai
achega
9ef4d1c946

+ 221 - 0
ygtx-ui/src/components/repairOrder/return.vue

@@ -0,0 +1,221 @@
+<template>
+  <el-dialog title="退回" v-model="visible" width="800px" append-to-body @close="handleClose">
+    <el-alert type="info" :closable="false" style="border-color: #6d28d9; background-color: #f5f3ff; color: #5b21b6; height: 35px;">
+      <template #default>
+        <i class="fa fa-sign-in mr-2" style="color: #5b21b6;"> 请选择退回类型,填写退回原因,完成工单退回。</i>
+      </template>
+    </el-alert>
+    <h4 class="text-sm font-medium text-gray-800 mb-3"></h4>
+    <el-form ref="returnFormRef" :model="formData" :rules="returnRules" label-width="120px" label-position="top">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="工单编码">
+            <el-input v-model="formData.workOrderProjectNo" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="风机编号">
+            <el-input v-model="formData.pcsDeviceName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="工单状态">
+            <el-select v-model="formData.workOrderStatus" style="width: 100%" disabled>
+              <el-option
+                v-for="dict in workOrderStatusOptions"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="维保中心">
+            <el-input v-model="formData.gxtCenter" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="场站">
+            <el-input v-model="formData.pcsStationName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="品牌">
+            <el-input v-model="formData.brand" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="工作负责人">
+            <el-input v-model="formData.teamLeaderName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="退回类型" prop="returnType">
+            <el-select
+              v-model="formData.returnType"
+              placeholder="请选择退回类型"
+              style="width: 100%"
+              :disabled="formData.workOrderStatus === 'return'"
+            >
+              <el-option
+                v-for="dict in returnTypeOptions"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="退回原因" prop="returnReason">
+        <el-input
+          v-model="formData.returnReason"
+          type="textarea"
+          placeholder="请输入退回原因"
+          maxlength="100"
+          show-word-limit
+          :rows="3"
+          :disabled="formData.workOrderStatus === 'return'"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取 消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="submitLoading">确 定</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, defineProps, defineEmits, getCurrentInstance, watch } from 'vue'
+
+// 获取当前实例
+const { proxy } = getCurrentInstance()
+
+// 定义属性
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false
+  },
+  data: {
+    type: Object,
+    default: () => ({})
+  },
+  workOrderStatusOptions: {
+    type: Array,
+    default: () => ([])
+  },
+  returnTypeOptions: {
+    type: Array,
+    default: () => ([])
+  },
+  onSubmit: {
+    type: Function,
+    default: null
+  }
+})
+
+// 定义事件
+const emit = defineEmits(['update:modelValue', 'success'])
+
+// 响应式数据
+const visible = ref(false)
+const formData = ref({})
+const returnFormRef = ref()
+const submitLoading = ref(false)
+
+// 表单验证规则
+const returnRules = ref({
+  returnType: [
+    { required: true, message: "请选择退回类型", trigger: "change" }
+  ],
+  returnReason: [
+    { required: true, message: "请输入退回原因", trigger: "blur" }
+  ]
+})
+
+// 监听modelValue变化
+watch(() => props.modelValue, (val) => {
+  visible.value = val
+  if (val) {
+    // 初始化表单数据
+    formData.value = { ...props.data }
+  }
+})
+
+// 监听props.data变化
+watch(() => props.data, (newData) => {
+  if (visible.value) {
+    // 只有在对话框打开时才更新数据
+    formData.value = { ...newData }
+  }
+}, { deep: true })
+
+// 监听visible变化
+watch(visible, (val) => {
+  emit('update:modelValue', val)
+  if (val) {
+    // 打开对话框后重置表单验证错误
+    proxy.$nextTick(() => {
+      if (returnFormRef.value) {
+        returnFormRef.value.clearValidate()
+      }
+    })
+  }
+})
+
+// 关闭对话框
+const handleClose = () => {
+  visible.value = false
+}
+
+// 取消操作
+const handleCancel = () => {
+  visible.value = false
+}
+
+// 提交操作
+const handleSubmit = async () => {
+  if (!returnFormRef.value) return
+
+  await returnFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        submitLoading.value = true
+
+        // 调用父组件传入的提交函数
+        if (props.onSubmit && typeof props.onSubmit === 'function') {
+          if (formData.value.workOrderStatus == 'return' || formData.value.workOrderStatus == 'assigned') {
+            formData.value.workOrderStatus = "accept_return";
+          } else {
+            formData.value.workOrderStatus = "return";
+          }
+          await props.onSubmit(formData.value)
+        } else {
+          throw new Error("未提供提交方法")
+        }
+
+        proxy.$modal.msgSuccess("工单退回成功")
+        visible.value = false
+        emit('success')
+      } catch (error) {
+        proxy.$modal.msgError("操作失败: " + (error.message || "未知错误"))
+      } finally {
+        submitLoading.value = false
+      }
+    }
+  })
+}
+</script>
+
+<style scoped>
+/* 表单中的列间距调整 */
+:deep(.el-col) {
+  padding-left: 5px;
+  padding-right: 5px;
+}
+</style>

+ 60 - 5
ygtx-ui/src/views/gxt/orderMyTodo/index.vue

@@ -164,9 +164,22 @@
                 @click="handleAccept(scope.row)"
                 v-hasPermi="['gxt:repairOrder:accept']"
             ><i class="fa fa-check"></i>接单</el-button>
-
             <el-button
-                v-if="scope.row.workOrderStatus === 'to_finish' && (scope.row.teamLeaderId == userStore.id || userStore.roles.includes('admin'))"
+                v-if="scope.row.workOrderStatus === 'to_finish'&& (scope.row.teamLeaderId == userStore.id || userStore.roles.includes('admin')) && scope.row.orderType == '1'"
+                type="warning"
+                link
+                @click="handleReturn(scope.row)"
+                v-hasPermi="['gxt:repairOrder:return']"
+            ><i class="fa fa-sign-in"></i>退回</el-button> <!--结单退回,负责人退回至班长 -->
+            <el-button
+                v-if="scope.row.workOrderStatus === 'return'|| scope.row.workOrderStatus === 'assigned'"
+                type="warning"
+                link
+                @click="handleReturn(scope.row)"
+                v-hasPermi="['gxt:repairOrder:acceptReturn']"
+            ><i class="fa fa-sign-in"></i>退回</el-button> <!--接单退回,班长退回至下发环节 -->
+            <el-button
+                v-if="scope.row.workOrderStatus === 'to_finish' && (scope.row.teamLeaderId == userStore.id || userStore.roles.includes('admin')) && scope.row.orderType == '1'"
                 type="success"
                 link
                 @click="handleRepairOrderFinalize(scope.row)"
@@ -1588,6 +1601,16 @@
 <!--        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible" @onSelected="onMisInfoSelected" :pcsStationName="finalizeFormData.pcsStationName" :pcsDeviceName="finalizeFormData.pcsDeviceName"></MisInfoSelectSingle>-->
 <!--      </template>-->
     </FinalizeDialog>
+
+    <!-- 退回对话框 -->
+    <ReturnDialog
+        v-model="returnDialogVisible"
+        :data="returnForm"
+        :work-order-status-options="gxt_work_order_status"
+        :return-type-options="gxt_return_type"
+        :on-submit="submitReturnFromParent"
+        @success="handleReturnSuccess"
+    />
   </div>
 </template>
 
@@ -1614,7 +1637,7 @@ import preview from '@/components/FileUpload/preview.vue'
 import MisInfoSelectSingle from "@/components/misInfoSelect/single.vue";
 import useUserStore from '@/store/modules/user'
 import {
-  listRepairOrder,updateRepairOrder,finalizeRepairOrder,getRepairOrder
+  listRepairOrder,updateRepairOrder,finalizeRepairOrder,getRepairOrder,returnRepairOrder
 } from "@/api/gxt/repairOrder";
 import ResetDialog from '@/components/repairOrder/reset.vue'
 import {
@@ -1623,6 +1646,7 @@ import {
 } from "@/api/gxt/gxtOrder"
 import EquipmentSelectSingle from "@/components/equipmentSelect/single.vue"
 import FinalizeDialog from "@/components/repairOrder/finalize.vue";
+import ReturnDialog from "@/components/repairOrder/return.vue";
 
 const { proxy } = getCurrentInstance();
 const userStore = useUserStore();
@@ -1670,6 +1694,9 @@ const resetDialogVisible = ref(false);
 const assignRepairDialogVisible = ref(false);
 const assignWorkDialogVisible = ref(false);
 
+// 退回
+const returnDialogVisible = ref(false)
+
 // 维保中心选项
 const maintenanceCenterOptions = ref([]);
 
@@ -1711,6 +1738,9 @@ const resetFormData = ref({});
 const assignRepairForm = ref({});
 const assignWorkForm = ref({});
 
+// 退回表单
+const returnForm = ref({})
+
 // 工作负责人快速检索相关响应式数据
 const showTeamLeaderQuickSelect = ref(false);
 const quickTeamLeaderList = ref([]);
@@ -1757,7 +1787,8 @@ const {
   gxt_repair_method,
   gxt_reset_method,
   gxt_info_entry,
-  gxt_work_area
+  gxt_work_area,
+  gxt_return_type
 } = proxy.useDict(
   "gxt_maintenance_type",
   "gxt_work_order_status",
@@ -1769,7 +1800,8 @@ const {
   "gxt_repair_method",
   "gxt_reset_method",
   "gxt_info_entry",
-  "gxt_work_area"
+  "gxt_work_area",
+    "gxt_return_type"
 );
 
 // 表单验证规则
@@ -2913,6 +2945,29 @@ function handleFinalizeSuccess() {
 async function submitFinalizeFromParent(data) {
   await finalizeRepairOrder(data)
 }
+
+/** 退回 */
+function handleReturn(row) {
+  getRepairOrder(row.id).then(response => {
+    returnForm.value = response.data
+    if (row.workOrderStatus != 'return') {
+      returnForm.value.returnType = undefined
+      returnForm.value.returnReason = undefined
+    }
+    returnDialogVisible.value = true
+  })
+}
+
+// 用于传递给退回组件的提交方法
+async function submitReturnFromParent(data) {
+  await returnRepairOrder(data)
+}
+
+// 在提交退回成功后的回调函数
+function handleReturnSuccess() {
+  returnDialogVisible.value = false
+  getList()
+}
 </script>
 
 <style scoped>

+ 106 - 107
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -928,27 +928,15 @@
       @success="handleResetSuccess"
     />
 
-    <!-- 结束工单对话框 -->
-    <el-dialog title="结束工单" v-model="completeDialogVisible" width="600px" append-to-body @close="closeCompleteDialog">
-      <el-form ref="completeFormRef" :model="completeForm" :rules="completeRules" label-width="120px" label-position="top">
-        <el-form-item label="处理结果描述" prop="completeDescription">
-          <el-input
-              v-model="completeForm.completeDescription"
-              type="textarea"
-              placeholder="请输入处理结果描述"
-              maxlength="200"
-              show-word-limit
-              :rows="4"
-          />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="closeCompleteDialog">取 消</el-button>
-          <el-button type="primary" @click="submitComplete">确认结束</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    <!-- 退回对话框 -->
+    <ReturnDialog
+        v-model="returnDialogVisible"
+        :data="returnForm"
+        :work-order-status-options="gxt_work_order_status"
+        :return-type-options="gxt_return_type"
+        :on-submit="submitReturnFromParent"
+        @success="handleReturnSuccess"
+    />
 
     <!-- 评分对话框 -->
     <el-dialog title="工单评分" v-model="ratingDialogVisible" width="800px" append-to-body @close="closeRatingDialog">
@@ -1285,84 +1273,84 @@
     </el-dialog>
 
     <!-- 审批对话框 -->
-    <el-dialog title="退回" v-model="returnDialogVisible" width="800px" append-to-body @close="closeReturnDialog">
-      <el-alert type="info" :closable="false" style="border-color: #a855f7; background-color: #f8f5ff; color: #6d28d9; height: 35px;">
-        <template #default>
-          <i class="fa fa-sign-in mr-2" style="color: #6d28d9;"> 请选择退回类型,填写退回原因,完成工单退回。</i>
-        </template>
-      </el-alert>
-      <!-- 工单信息 -->
-      <h3 class="text-sm font-medium text-gray-800 mb-3"></h3>
-      <el-form ref="returnFormRef" :model="returnForm" :rules="returnRules" label-width="120px" label-position="top">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="工单编码"><el-input v-model="returnForm.workOrderProjectNo" disabled /></el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="风机编号"><el-input v-model="returnForm.pcsDeviceName" disabled /> </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="工单状态">
-              <el-select v-model="returnForm.workOrderStatus" style="width: 100%" disabled>
-                <el-option
-                    v-for="dict in gxt_work_order_status"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="维保中心"><el-input v-model="returnForm.gxtCenter" disabled /> </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="场站"><el-input v-model="returnForm.pcsStationName" disabled /> </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="品牌"><el-input v-model="returnForm.brand" disabled /> </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="工作负责人"><el-input v-model="returnForm.teamLeaderName" disabled /> </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="退回类型" prop="returnType">
-              <el-select v-model="returnForm.returnType" style="width: 100%" :disabled="returnForm.workOrderStatus === 'return'">
-                <el-option
-                    v-for="dict in gxt_return_type"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <!--        <el-form-item label="审批决定" prop="approvalStatus">
-                  <el-radio-group v-model="returnForm.approvalStatus" @change="toggleRejectionReason">
-                    <el-radio label="approved">通过</el-radio>
-                    <el-radio label="rejected">驳回</el-radio>
-                  </el-radio-group>
-                </el-form-item>-->
-        <el-form-item label="退回原因" prop="returnReason">
-          <el-input
-              v-model="returnForm.returnReason"
-              type="textarea"
-              placeholder="请输入退回原因"
-              maxlength="100"
-              show-word-limit
-              :rows="3"
-              :disabled="returnForm.workOrderStatus === 'return'"
-          />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="closeReturnDialog">取 消</el-button>
-          <el-button type="primary" @click="submitReturn()">退 回</el-button>
-        </div>
-      </template>
-    </el-dialog>
+<!--    <el-dialog title="退回" v-model="returnDialogVisible" width="800px" append-to-body @close="closeReturnDialog">-->
+<!--      <el-alert type="info" :closable="false" style="border-color: #a855f7; background-color: #f8f5ff; color: #6d28d9; height: 35px;">-->
+<!--        <template #default>-->
+<!--          <i class="fa fa-sign-in mr-2" style="color: #6d28d9;"> 请选择退回类型,填写退回原因,完成工单退回。</i>-->
+<!--        </template>-->
+<!--      </el-alert>-->
+<!--      &lt;!&ndash; 工单信息 &ndash;&gt;-->
+<!--      <h3 class="text-sm font-medium text-gray-800 mb-3"></h3>-->
+<!--      <el-form ref="returnFormRef" :model="returnForm" :rules="returnRules" label-width="120px" label-position="top">-->
+<!--        <el-row>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="工单编码"><el-input v-model="returnForm.workOrderProjectNo" disabled /></el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="风机编号"><el-input v-model="returnForm.pcsDeviceName" disabled /> </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="工单状态">-->
+<!--              <el-select v-model="returnForm.workOrderStatus" style="width: 100%" disabled>-->
+<!--                <el-option-->
+<!--                    v-for="dict in gxt_work_order_status"-->
+<!--                    :key="dict.value"-->
+<!--                    :label="dict.label"-->
+<!--                    :value="dict.value"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="维保中心"><el-input v-model="returnForm.gxtCenter" disabled /> </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="场站"><el-input v-model="returnForm.pcsStationName" disabled /> </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="品牌"><el-input v-model="returnForm.brand" disabled /> </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="工作负责人"><el-input v-model="returnForm.teamLeaderName" disabled /> </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="退回类型" prop="returnType">-->
+<!--              <el-select v-model="returnForm.returnType" style="width: 100%" :disabled="returnForm.workOrderStatus === 'return'">-->
+<!--                <el-option-->
+<!--                    v-for="dict in gxt_return_type"-->
+<!--                    :key="dict.value"-->
+<!--                    :label="dict.label"-->
+<!--                    :value="dict.value"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+<!--        &lt;!&ndash;        <el-form-item label="审批决定" prop="approvalStatus">-->
+<!--                  <el-radio-group v-model="returnForm.approvalStatus" @change="toggleRejectionReason">-->
+<!--                    <el-radio label="approved">通过</el-radio>-->
+<!--                    <el-radio label="rejected">驳回</el-radio>-->
+<!--                  </el-radio-group>-->
+<!--                </el-form-item>&ndash;&gt;-->
+<!--        <el-form-item label="退回原因" prop="returnReason">-->
+<!--          <el-input-->
+<!--              v-model="returnForm.returnReason"-->
+<!--              type="textarea"-->
+<!--              placeholder="请输入退回原因"-->
+<!--              maxlength="100"-->
+<!--              show-word-limit-->
+<!--              :rows="3"-->
+<!--              :disabled="returnForm.workOrderStatus === 'return'"-->
+<!--          />-->
+<!--        </el-form-item>-->
+<!--      </el-form>-->
+<!--      <template #footer>-->
+<!--        <div class="dialog-footer">-->
+<!--          <el-button @click="closeReturnDialog">取 消</el-button>-->
+<!--          <el-button type="primary" @click="submitReturn()">退 回</el-button>-->
+<!--        </div>-->
+<!--      </template>-->
+<!--    </el-dialog>-->
 
     <!-- 查看工单详情对话框 -->
     <el-dialog title="查看工单详情" v-model="viewDialogVisible" width="1000px" append-to-body>
@@ -1643,6 +1631,7 @@ import { watch } from 'vue'
 import { decryptParams } from '@/utils/encrypt'
 import ResetDialog from '@/components/repairOrder/reset.vue'
 import FinalizeDialog from '@/components/repairOrder/finalize.vue'
+import ReturnDialog from '@/components/repairOrder/return.vue'
 
 const { proxy } = getCurrentInstance()
 const { gxt_maintenance_type, gxt_work_order_status, gxt_order_priority_type,gxt_repair_order_flow_action_type,gxt_order_suspend_reason,gxt_repair_method,gxt_reset_method,gxt_return_type,gxt_info_entry,gxt_work_area } = proxy.useDict("gxt_maintenance_type", "gxt_work_order_status", "gxt_order_priority_type","gxt_repair_order_flow_action_type","gxt_order_suspend_reason","gxt_repair_method","gxt_reset_method","gxt_return_type","gxt_info_entry","gxt_work_area")
@@ -3328,14 +3317,14 @@ function handleApprove(row) {
 
 /** 退回 */
 function handleReturn(row) {
-    getRepairOrder(row.id).then(response => {
-      returnForm.value = response.data
-      if (row.workOrderStatus != 'return') {
-        returnForm.value.returnType = undefined
-        returnForm.value.returnReason = undefined
-      }
-      returnDialogVisible.value = true
-    })
+  getRepairOrder(row.id).then(response => {
+    returnForm.value = response.data
+    if (row.workOrderStatus != 'return') {
+      returnForm.value.returnType = undefined
+      returnForm.value.returnReason = undefined
+    }
+    returnDialogVisible.value = true
+  })
 }
 
 /** 提交退回 */
@@ -3465,7 +3454,17 @@ async function submitReset() {
   })
 }
 
+// 用于传递给退回组件的提交方法
+async function submitReturnFromParent(data) {
+  await returnRepairOrder(data)
+}
 
+// 在提交退回成功后的回调函数
+function handleReturnSuccess() {
+  returnDialogVisible.value = false
+  resetTimeOutOrder()
+  getList()
+}
 
 /** 检修人员选择变化 */
 function handleMembersChange(formName) {