|
|
@@ -0,0 +1,642 @@
|
|
|
+<template>
|
|
|
+ <el-dialog title="结单" v-model="visible" width="800px" append-to-body @close="handleClose">
|
|
|
+ <el-alert type="info" :closable="false" style="border-color: #14b8a6; background-color: #f0fdfa; color: #0d9488; height: 35px;">
|
|
|
+ <template #default>
|
|
|
+ <i class="fa fa-file-text-o mr-2" style="color: #0d9488;"> 请选择信息录入方式,并上传相关附件完成结单。</i>
|
|
|
+ </template>
|
|
|
+ </el-alert>
|
|
|
+ <h4 class="text-sm font-medium text-gray-800 mb-3"></h4>
|
|
|
+ <el-form ref="finalizeFormRef" :model="formData" :rules="finalizeRules" 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.faultCode" disabled /> </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="故障信息">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.faultBarcode"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入故障信息"
|
|
|
+ maxlength="100"
|
|
|
+ show-word-limit
|
|
|
+ :rows="3"
|
|
|
+ disabled
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="下发人"><el-input v-model="formData.assignUserName" disabled /> </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="下发时间"><el-input v-model="formData.assignTime" disabled /> </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="接单人"><el-input v-model="formData.acceptUserName" disabled /> </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="接单时间"><el-input v-model="formData.acceptTime" 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-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="信息录入" prop="infoEntry">
|
|
|
+ <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange">
|
|
|
+ <el-radio
|
|
|
+ v-for="dict in infoEntryOptions"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.value"
|
|
|
+ >
|
|
|
+ {{ dict.label }}
|
|
|
+ </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="formData.infoEntry == 1">
|
|
|
+ <el-form-item label="MIS工单编码" prop="misOrderNo" >
|
|
|
+ <el-input
|
|
|
+ v-model="formData.misOrderNo"
|
|
|
+ placeholder="请输入MIS工单编码或点击搜索选择"
|
|
|
+ clearable
|
|
|
+ @focus="handleMisNoInputFocus"
|
|
|
+ @blur="handleMisNoInputBlur"
|
|
|
+ @input="handleMisNoInput"
|
|
|
+ @clear="handleMisNoClear"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <el-button @click="handleSelectMisInfo" icon="Search"></el-button>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ <!-- 快速检索下拉框 -->
|
|
|
+ <div class="quick-select-dropdown" v-show="showMisNoQuickSelect && quickMisNoList.length > 0">
|
|
|
+ <div
|
|
|
+ v-for="item in quickMisNoList"
|
|
|
+ :key="item.misNo"
|
|
|
+ class="quick-select-item"
|
|
|
+ @click="handleMisNoQuickSelect(item)">
|
|
|
+ <span class="mis-no">{{ item.misNo }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="quick-select-dropdown no-data" v-show="showMisNoQuickSelect && quickMisNoList.length === 0 && formData.misOrderNo">
|
|
|
+ <div>未找到匹配的MIS工单</div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <!-- MIS选择组件 -->
|
|
|
+ <slot name="mis-info-select"></slot>
|
|
|
+ <el-col :span="12" v-if="formData.infoEntry == 2">
|
|
|
+ <el-form-item label="工作票编号" prop="workPermitNum">
|
|
|
+ <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="开始时间" prop="realStartTime">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="formData.realStartTime"
|
|
|
+ type="datetime"
|
|
|
+ format="YYYY-MM-DD HH:mm"
|
|
|
+ value-format="YYYY-MM-DD HH:mm"
|
|
|
+ placeholder="请选择开始时间"
|
|
|
+ style="width: 100%"
|
|
|
+ :readonly="formData.infoEntry == 1"
|
|
|
+ :disabled-date="disabledStartDate"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="工作部位" prop="workArea">
|
|
|
+ <el-select
|
|
|
+ v-model="formData.workArea"
|
|
|
+ multiple
|
|
|
+ placeholder="请选择工作部位"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in workAreaOptions"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="结束时间" prop="realEndTime">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="formData.realEndTime"
|
|
|
+ type="datetime"
|
|
|
+ format="YYYY-MM-DD HH:mm"
|
|
|
+ value-format="YYYY-MM-DD HH:mm"
|
|
|
+ placeholder="请选择结束时间"
|
|
|
+ style="width: 100%"
|
|
|
+ :readonly="formData.infoEntry == 1"
|
|
|
+ :disabled-date="disabledEndDate"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="检修人员" prop="workGroupMemberName">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.workGroupMemberName"
|
|
|
+ placeholder="请输入检修人员"
|
|
|
+ maxlength="200"
|
|
|
+ show-word-limit
|
|
|
+ :readonly="formData.infoEntry == 1"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="外委人员数(人)" prop="wwryNum">
|
|
|
+ <el-input-number
|
|
|
+ v-model="formData.wwryNum"
|
|
|
+ placeholder="请输入外委人员数"
|
|
|
+ controls-position="right"
|
|
|
+ style="width: 100%"
|
|
|
+ class="input-number-left"
|
|
|
+ :min="0"
|
|
|
+ :step="1"
|
|
|
+ :precision="0"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="外来人员数(人)" prop="wlryNum">
|
|
|
+ <el-input-number
|
|
|
+ v-model="formData.wlryNum"
|
|
|
+ placeholder="请输入外来人员数"
|
|
|
+ controls-position="right"
|
|
|
+ style="width: 100%"
|
|
|
+ class="input-number-left"
|
|
|
+ :min="0"
|
|
|
+ :step="1"
|
|
|
+ :precision="0"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="真实故障原因" prop="realContent">
|
|
|
+ <el-input v-model="formData.realFailureReason"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入真实故障原因,最多500字"
|
|
|
+ maxlength="500"
|
|
|
+ :rows="5"
|
|
|
+ show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="附件(可选)">
|
|
|
+ <preview :limit="8" v-model="formData.attachmentUrls" :filesize="5"></preview>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="handleCancel">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="handleSubmit">确认结单</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, defineProps, defineEmits, getCurrentInstance, computed, watch } from 'vue'
|
|
|
+import preview from '@/components/FileUpload/preview.vue'
|
|
|
+
|
|
|
+// 获取当前实例
|
|
|
+const { proxy } = getCurrentInstance()
|
|
|
+
|
|
|
+// 定义属性
|
|
|
+const props = defineProps({
|
|
|
+ modelValue: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ },
|
|
|
+ data: {
|
|
|
+ type: Object,
|
|
|
+ default: () => ({})
|
|
|
+ },
|
|
|
+ workOrderStatusOptions: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ([])
|
|
|
+ },
|
|
|
+ infoEntryOptions: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ([])
|
|
|
+ },
|
|
|
+ workAreaOptions: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ([])
|
|
|
+ },
|
|
|
+ onSubmit: {
|
|
|
+ type: Function,
|
|
|
+ default: null
|
|
|
+ },
|
|
|
+ listRepairOrder: {
|
|
|
+ type: Function,
|
|
|
+ default: null
|
|
|
+ },
|
|
|
+ listWorkPerson: {
|
|
|
+ type: Function,
|
|
|
+ default: null
|
|
|
+ },
|
|
|
+ listUserData: {
|
|
|
+ type: Function,
|
|
|
+ default: null
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 定义事件
|
|
|
+const emit = defineEmits(['update:modelValue', 'success', 'select-mis-info'])
|
|
|
+
|
|
|
+// 响应式数据
|
|
|
+const visible = ref(false)
|
|
|
+const formData = ref({})
|
|
|
+const finalizeFormRef = ref()
|
|
|
+const showMisNoQuickSelect = ref(false)
|
|
|
+const quickMisNoList = ref([])
|
|
|
+
|
|
|
+// 计算属性
|
|
|
+const workPermitNumProxy = computed({
|
|
|
+ get() {
|
|
|
+ return formData.value.workPermitNum
|
|
|
+ },
|
|
|
+ set(val) {
|
|
|
+ formData.value.workPermitNum = val
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 表单验证规则
|
|
|
+const finalizeRules = ref({
|
|
|
+ repairMethod: [
|
|
|
+ { required: true, message: "请选择维修方式", trigger: "change" }
|
|
|
+ ],
|
|
|
+ misOrderNo: [
|
|
|
+ { required: true, message: "MIS工单编码不能为空", trigger: "blur" }
|
|
|
+ ],
|
|
|
+ realStartTime: [
|
|
|
+ { required: true, message: "请选择开始时间", trigger: "change" },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value && new Date(value) > new Date() && formData.value.infoEntry == '2') {
|
|
|
+ callback(new Error('开始时间不能大于当前时间'));
|
|
|
+ } else if(value && new Date(value) < new Date(formData.value.acceptTime) && formData.value.infoEntry == '2') {
|
|
|
+ callback(new Error('开始时间不能小于接单时间'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'change'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ realEndTime: [
|
|
|
+ { required: true, message: "请选择结束时间", trigger: "change" },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value && new Date(value) > new Date() && formData.value.infoEntry == '2') {
|
|
|
+ callback(new Error('结束时间不能大于当前时间'));
|
|
|
+ } else if(value && new Date(value) < new Date(formData.value.realStartTime) && formData.value.infoEntry == '2') {
|
|
|
+ callback(new Error('结束时间不能小于开始时间'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'change'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ workGroupMemberName: [
|
|
|
+ { required: false, message: "请输入检修人员", trigger: "blur" },
|
|
|
+ {
|
|
|
+ validator: async (rule, value, callback) => {
|
|
|
+ // 如果值为空、关联MIS,直接通过验证
|
|
|
+ if (!value || formData.value.infoEntry == '1') {
|
|
|
+ return callback();
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 将输入的检修人员姓名按逗号分割
|
|
|
+ const names = value.split(',').map(name => name.trim());
|
|
|
+
|
|
|
+ // 验证每个检修人员是否存在于组织架构中
|
|
|
+ for (const name of names) {
|
|
|
+ if (name.length > 0) {
|
|
|
+ // 使用从属性传入的listUserData方法
|
|
|
+ if (!props.listUserData) {
|
|
|
+ return callback(new Error('系统配置错误:缺少用户数据查询方法'));
|
|
|
+ }
|
|
|
+ const response = await props.listUserData({nickName: name});
|
|
|
+ if (!response.rows || response.rows.length === 0) {
|
|
|
+ return callback(new Error(`检修人员"${name}"非系统内人员,请重新输入`));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return callback(new Error(`请正确输入检修人员名单`));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ } catch (error) {
|
|
|
+ callback(new Error('验证检修人员时发生错误'));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ workArea: [
|
|
|
+ { required: true, message: "请选择工作部位", trigger: "change" }
|
|
|
+ ],
|
|
|
+ workPermitNum: [
|
|
|
+ { required: true, message: "工作票编号不能为空", trigger: "blur" },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (formData.value.infoEntry == '2') {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('工作票编号不能为空'))
|
|
|
+ } else if (!/^[a-zA-Z0-9_\-\.]*$/.test(value)) {
|
|
|
+ callback(new Error('仅支持英文、数字、下划线'))
|
|
|
+ } else if (value.length > 20) {
|
|
|
+ callback(new Error('不能超过20个字符'))
|
|
|
+ } else {
|
|
|
+ // 验证唯一性
|
|
|
+ if (value && props.listRepairOrder) {
|
|
|
+ props.listRepairOrder({pageNum: 1, pageSize: 10, workPermitNum: value}).then(response => {
|
|
|
+ const gxtOrders = response.rows
|
|
|
+ if (gxtOrders.length > 0) {
|
|
|
+ if (gxtOrders[0].id != formData.value.id) {
|
|
|
+ callback(new Error('工作票编号已存在!'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ }).catch(() => {
|
|
|
+ callback()
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+})
|
|
|
+
|
|
|
+// 监听modelValue变化
|
|
|
+watch(() => props.modelValue, (val) => {
|
|
|
+ visible.value = val
|
|
|
+ if (val) {
|
|
|
+ // 初始化表单数据
|
|
|
+ formData.value = { ...props.data, selectedMembers: [] }
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 监听props.data变化
|
|
|
+watch(() => props.data, (newData) => {
|
|
|
+ if (visible.value) {
|
|
|
+ // 只有在对话框打开时才更新数据
|
|
|
+ formData.value = { ...newData, selectedMembers: [] }
|
|
|
+ }
|
|
|
+}, { deep: true })
|
|
|
+
|
|
|
+// 监听visible变化
|
|
|
+watch(visible, (val) => {
|
|
|
+ emit('update:modelValue', val)
|
|
|
+ if (val) {
|
|
|
+ // 打开对话框后重置表单验证错误
|
|
|
+ proxy.$nextTick(() => {
|
|
|
+ if (finalizeFormRef.value) {
|
|
|
+ finalizeFormRef.value.clearValidate()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 时间禁用函数
|
|
|
+const disabledStartDate = (time) => {
|
|
|
+ const getYYYYMMDD = (date) => {
|
|
|
+ const y = date.getFullYear();
|
|
|
+ const m = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
+ const d = String(date.getDate()).padStart(2, '0');
|
|
|
+ return `${y}-${m}-${d}`;
|
|
|
+ };
|
|
|
+
|
|
|
+ const today = getYYYYMMDD(new Date());
|
|
|
+
|
|
|
+ let acceptDateStr = null;
|
|
|
+ const acceptStr = formData.value.acceptTime;
|
|
|
+ if (acceptStr) {
|
|
|
+ acceptDateStr = acceptStr.split(' ')[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ const selectedDateStr = getYYYYMMDD(time);
|
|
|
+
|
|
|
+ // 如果没有 acceptTime,只禁用未来日期
|
|
|
+ if (!acceptDateStr) {
|
|
|
+ return selectedDateStr > today;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 要用:早于 acceptDate 或 晚于今天
|
|
|
+ return selectedDateStr < acceptDateStr || selectedDateStr > today;
|
|
|
+};
|
|
|
+
|
|
|
+const disabledEndDate = (time) => {
|
|
|
+ const getYYYYMMDD = (date) => {
|
|
|
+ const y = date.getFullYear();
|
|
|
+ const m = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
+ const d = String(date.getDate()).padStart(2, '0');
|
|
|
+ return `${y}-${m}-${d}`;
|
|
|
+ };
|
|
|
+
|
|
|
+ const today = getYYYYMMDD(new Date());
|
|
|
+
|
|
|
+ let acceptDateStr = null;
|
|
|
+ const acceptStr = formData.value.acceptTime;
|
|
|
+ const startStr = formData.value.realStartTime;
|
|
|
+ if (startStr) {
|
|
|
+ acceptDateStr = startStr.split(' ')[0];
|
|
|
+ } else if(acceptStr) {
|
|
|
+ acceptDateStr = acceptStr.split(' ')[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ const selectedDateStr = getYYYYMMDD(time);
|
|
|
+
|
|
|
+ // 如果没有 acceptTime,只禁用未来日期
|
|
|
+ if (!acceptDateStr) {
|
|
|
+ return selectedDateStr > today;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 要用:早于 acceptDate 或 晚于今天
|
|
|
+ return selectedDateStr < acceptDateStr || selectedDateStr > today;
|
|
|
+};
|
|
|
+
|
|
|
+// 关闭对话框
|
|
|
+const handleClose = () => {
|
|
|
+ visible.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 取消操作
|
|
|
+const handleCancel = () => {
|
|
|
+ visible.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 信息录入方式变化处理
|
|
|
+const handleInfoEntryChange = (val) => {
|
|
|
+ // 选中2工作票编号时修改其他值
|
|
|
+ if (val === '2') {
|
|
|
+ formData.value.misOrderNo = undefined;
|
|
|
+ formData.value.realStartTime = undefined;
|
|
|
+ formData.value.realEndTime = undefined;
|
|
|
+ formData.value.workGroupMemberName = undefined;
|
|
|
+ formData.value.repairOrderPersonList = [];
|
|
|
+ } else {
|
|
|
+ formData.value.workPermitNum = undefined;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// MIS工单相关处理函数
|
|
|
+const handleMisNoInputFocus = () => {
|
|
|
+ showMisNoQuickSelect.value = true
|
|
|
+}
|
|
|
+
|
|
|
+const handleMisNoInputBlur = () => {
|
|
|
+ // 延迟隐藏下拉框,确保点击选项能触发
|
|
|
+ setTimeout(() => {
|
|
|
+ showMisNoQuickSelect.value = false
|
|
|
+ }, 200)
|
|
|
+}
|
|
|
+
|
|
|
+const handleMisNoInput = (value) => {
|
|
|
+ const searchText = value.trim()
|
|
|
+ showMisNoQuickSelect.value = true
|
|
|
+ // 这里应该调用搜索函数
|
|
|
+}
|
|
|
+
|
|
|
+const handleMisNoClear = () => {
|
|
|
+ formData.value.misOrderNo = undefined
|
|
|
+}
|
|
|
+
|
|
|
+const handleSelectMisInfo = () => {
|
|
|
+ emit('select-mis-info')
|
|
|
+}
|
|
|
+
|
|
|
+const handleMisNoQuickSelect = (item) => {
|
|
|
+ formData.value.misOrderNo = item.misNo
|
|
|
+ showMisNoQuickSelect.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 提交操作
|
|
|
+const handleSubmit = async () => {
|
|
|
+ if (!finalizeFormRef.value) return
|
|
|
+
|
|
|
+ await finalizeFormRef.value.validate(async (valid) => {
|
|
|
+ if (valid) {
|
|
|
+ try {
|
|
|
+ // 根据维修方式清除不需要的字段
|
|
|
+ if (formData.value.repairMethod === '1') {
|
|
|
+ // 正常维修时清除复位方式
|
|
|
+ formData.value.resetMethod = undefined;
|
|
|
+ formData.value.workArea = Array.isArray(formData.value.workArea) ? formData.value.workArea.join(',')
|
|
|
+ : formData.value.workArea || ''
|
|
|
+ } else if (formData.value.repairMethod === '2') {
|
|
|
+ // 复位启机时清除MIS相关字段
|
|
|
+ formData.value.misOrderNo = undefined;
|
|
|
+ formData.value.realStartTime = undefined;
|
|
|
+ formData.value.realEndTime = undefined;
|
|
|
+ formData.value.workGroupMemberName = undefined;
|
|
|
+ formData.value.infoEntry = undefined;
|
|
|
+ formData.value.wwryNum = undefined;
|
|
|
+ formData.value.wlryNum = undefined;
|
|
|
+ formData.value.workArea = undefined;
|
|
|
+ formData.value.repairOrderPersonList = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 调用父组件传入的提交函数
|
|
|
+ if (props.onSubmit && typeof props.onSubmit === 'function') {
|
|
|
+ await props.onSubmit(formData.value)
|
|
|
+ } else {
|
|
|
+ throw new Error("未提供提交方法")
|
|
|
+ }
|
|
|
+
|
|
|
+ proxy.$modal.msgSuccess("工单结单成功")
|
|
|
+ visible.value = false
|
|
|
+ emit('success')
|
|
|
+ } catch (error) {
|
|
|
+ proxy.$modal.msgError("操作失败: " + (error.message || "未知错误"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+/* 表单中的列间距调整 */
|
|
|
+:deep(.el-col) {
|
|
|
+ padding-left: 5px;
|
|
|
+ padding-right: 5px;
|
|
|
+}
|
|
|
+.quick-select-dropdown {
|
|
|
+ position: absolute;
|
|
|
+ top: 100%;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ z-index: 1000;
|
|
|
+ max-height: 200px;
|
|
|
+ overflow-y: auto;
|
|
|
+ background: white;
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
+ border-top: none;
|
|
|
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
|
|
+}
|
|
|
+
|
|
|
+.quick-select-item {
|
|
|
+ padding: 8px 12px;
|
|
|
+ cursor: pointer;
|
|
|
+ border-bottom: 1px solid #f0f0f0;
|
|
|
+}
|
|
|
+
|
|
|
+.quick-select-item:hover {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+}
|
|
|
+
|
|
|
+.no-data {
|
|
|
+ text-align: center;
|
|
|
+ padding: 10px;
|
|
|
+ color: #909399;
|
|
|
+}
|
|
|
+
|
|
|
+.input-number-left :deep(.el-input__wrapper) {
|
|
|
+ justify-content: flex-start;
|
|
|
+}
|
|
|
+</style>
|