소스 검색

pms 保养时间校验规则

zhangcl 2 달 전
부모
커밋
dbe17d8312

+ 1 - 1
src/locales/zh-CN.ts

@@ -497,7 +497,7 @@ export default {
   },
   operationFillForm:{
     team:'所属队伍',
-    sumTime:'累计运行时间(h)',
+    sumTime:'累计运行时间(H)',
     sumKil:'累计运行公里数(Km)',
     confirm:'确定',
     cancel:'取消',

+ 76 - 32
src/views/pms/iotmainworkorder/IotMainWorkOrder.vue

@@ -40,22 +40,6 @@
                 disabled
               />
             </el-form-item>
-            <!--
-            <el-form-item label="责任人" prop="devicePersons">
-              <el-input type="text" v-model="formData.devicePersons"  disabled/>
-            </el-form-item>
-
-            <el-form-item label="责任人" prop="responsiblePerson">
-              <el-select v-model="formData.responsiblePerson" filterable clearable style="width: 100%">
-                <el-option
-                  v-for="item in deptUsers"
-                  :key="item.id"
-                  :label="item.nickname"
-                  :value="item.id"
-                />
-              </el-select>
-            </el-form-item>
-            -->
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('fault.start')" prop="actualStartTime">
@@ -533,10 +517,76 @@ const formData = ref({
   status: undefined,
   devicePersons: '',
 })
+
 const formRules = reactive({
   name: [{ required: true, message: '工单名称不能为空', trigger: 'blur' }],
-  responsiblePerson: [{ required: true, message: '责任人不能为空', trigger: 'blur' }],
+  actualStartTime: [{
+    required: true,
+    message: t('fault.start') + '不能为空',
+    trigger: 'change'
+  }, {
+    validator: (rule, value, callback) => {
+      const now = dayjs();
+      const start = value ? dayjs(Number(value)) : null;
+
+      // 验证开始时间 <= 当前日期
+      if (start && start.isAfter(now)) {
+        callback(new Error(t('fault.start') + '不能超过当前日期'));
+        return;
+      }
+
+      const end = formData.value.actualEndTime
+        ? dayjs(Number(formData.value.actualEndTime))
+        : null;
+
+      // 只有当结束时间有效时,才比较开始和结束时间
+      if (end && end.isValid() && !end.isAfter(now)) {
+        if (start && start.isAfter(end)) {
+          callback(new Error(t('fault.start') + '不能超过' + t('fault.end')));
+          return;
+        }
+      }
+
+      // 触发结束时间的重新校验
+      if (formRef.value) {
+        formRef.value.validateField('actualEndTime', () => {});
+      }
+
+      callback();
+    },
+    trigger: 'change'
+  }],
+  actualEndTime: [{
+    required: true,
+    message: t('fault.end') + '不能为空',
+    trigger: 'change'
+  }, {
+    validator: (rule, value, callback) => {
+      const now = dayjs();
+      const end = value ? dayjs(Number(value)) : null;
+
+      // 验证结束时间 <= 当前日期
+      if (end && end.isAfter(now)) {
+        callback(new Error(t('fault.end') + '不能超过当前日期'));
+        return;
+      }
+
+      const start = formData.value.actualStartTime
+        ? dayjs(Number(formData.value.actualStartTime))
+        : null;
+
+      // 验证结束时间 >= 开始时间(仅当开始时间存在时)
+      if (start && end && end.isBefore(start)) {
+        callback(new Error(t('fault.end') + '必须大于等于' + t('fault.start')));
+        return;
+      }
+
+      callback();
+    },
+    trigger: 'change'
+  }]
 })
+
 const formRef = ref() // 表单 Ref
 
 interface MaterialFormExpose {
@@ -990,8 +1040,6 @@ const resetForm = () => {
   formRef.value?.resetFields()
 }
 
-
-
 onMounted(async () => {
   materialList.value = []
   const deptId = useUserStore().getUser.deptId
@@ -999,28 +1047,24 @@ onMounted(async () => {
   dept.value = await DeptApi.getDept(deptId)
   deptUsers.value = await UserApi.getDeptUsersByDeptId(deptId)
   formData.value.deptId = deptId
-
   try{
     formType.value = 'update'
     // 查询保养工单 主表数据
     const workOrder = await IotMainWorkOrderApi.getIotMainWorkOrder(id);
     formData.value = workOrder
-    // 查询保养责任人
-    // const personId = formData.value.responsiblePerson ? Number(formData.value.responsiblePerson) : 0;
-    /* UserApi.getUser(personId).then((res) => {
-      formData.value.responsiblePerson = res.nickname;
-    }) */
     // 查询保养工单 明细数据
     const data = await IotMainWorkOrderBomApi.getWorkOrderBOMs(queryParams);
     list.value = []
     if (Array.isArray(data)) {
-      list.value = data.map(item => ({
-        ...item,
-        // 这里可以添加必要的字段转换(如果有日期等需要格式化的字段)
-        lastNaturalDate: item.lastNaturalDate ? dayjs(item.lastNaturalDate).format('YYYY-MM-DD') : null
-      }))
-      // 同时查询所有设备的责任人
-      // await getDevicePersons();
+      // 添加过滤逻辑:只保留 status === 0 的记录
+      list.value = data
+        .filter(item => item.status === 0) // 关键过滤代码
+        .map(item => ({
+          ...item,
+          lastNaturalDate: item.lastNaturalDate
+            ? dayjs(item.lastNaturalDate).format('YYYY-MM-DD')
+            : null
+        }))
     }
   } catch (error) {
     console.error('数据加载失败:', error)

+ 66 - 17
src/views/pms/iotmainworkorder/IotMainWorkOrderAdd.vue

@@ -42,22 +42,6 @@
                 disabled
               />
             </el-form-item>
-            <!--
-            <el-form-item label="责任人" prop="devicePersons">
-              <el-input type="text" v-model="formData.devicePersons"  disabled/>
-            </el-form-item>
-
-            <el-form-item label="责任人" prop="responsiblePerson">
-              <el-select v-model="formData.responsiblePerson" filterable clearable style="width: 100%" disabled>
-                <el-option
-                  v-for="item in deptUsers"
-                  :key="item.id"
-                  :label="item.nickname"
-                  :value="item.id"
-                />
-              </el-select>
-            </el-form-item>
-            -->
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('fault.start')" prop="actualStartTime">
@@ -498,8 +482,73 @@ const getCurrentDeviceIds = (): number[] => {
 
 const formRules = reactive({
   name: [{ required: true, message: '工单名称不能为空', trigger: 'blur' }],
-  responsiblePerson: [{ required: true, message: '责任人不能为空', trigger: 'blur' }],
+  actualStartTime: [{
+    required: true,
+    message: t('fault.start') + '不能为空',
+    trigger: 'change'
+  }, {
+    validator: (rule, value, callback) => {
+      const now = dayjs();
+      const start = value ? dayjs(Number(value)) : null;
+
+      // 验证开始时间 <= 当前日期
+      if (start && start.isAfter(now)) {
+        callback(new Error(t('fault.start') + '不能超过当前日期'));
+        return;
+      }
+
+      const end = formData.value.actualEndTime
+        ? dayjs(Number(formData.value.actualEndTime))
+        : null;
+
+      // 只有当结束时间有效时,才比较开始和结束时间
+      if (end && end.isValid() && !end.isAfter(now)) {
+        if (start && start.isAfter(end)) {
+          callback(new Error(t('fault.start') + '不能超过' + t('fault.end')));
+          return;
+        }
+      }
+
+      // 触发结束时间的重新校验
+      if (formRef.value) {
+        formRef.value.validateField('actualEndTime', () => {});
+      }
+
+      callback();
+    },
+    trigger: 'change'
+  }],
+  actualEndTime: [{
+    required: true,
+    message: t('fault.end') + '不能为空',
+    trigger: 'change'
+  }, {
+    validator: (rule, value, callback) => {
+      const now = dayjs();
+      const end = value ? dayjs(Number(value)) : null;
+
+      // 验证结束时间 <= 当前日期
+      if (end && end.isAfter(now)) {
+        callback(new Error(t('fault.end') + '不能超过当前日期'));
+        return;
+      }
+
+      const start = formData.value.actualStartTime
+        ? dayjs(Number(formData.value.actualStartTime))
+        : null;
+
+      // 验证结束时间 >= 开始时间(仅当开始时间存在时)
+      if (start && end && end.isBefore(start)) {
+        callback(new Error(t('fault.end') + '必须大于等于' + t('fault.start')));
+        return;
+      }
+
+      callback();
+    },
+    trigger: 'change'
+  }]
 })
+
 const formRef = ref() // 表单 Ref
 
 interface MaterialFormExpose {

+ 3 - 29
src/views/pms/iotmainworkorder/IotMainWorkOrderDetail.vue

@@ -176,9 +176,9 @@
             />
           </template>
         </el-table-column>
-        <el-table-column :label="t('iotMaintain.numberOfMaterials')" align="center" width="100">
+        <el-table-column :label="t('common.status')" align="center" width="100">
           <template #default="scope">
-            {{ hasMaterial(scope.row.bomNodeId) ? '是' : '否' }}
+            {{ (scope.row.status === 0) ? '延时' : '完成' }}
           </template>
         </el-table-column>
         <el-table-column :label="t('iotMaintain.operation')" align="center" min-width="120px">
@@ -194,17 +194,6 @@
                   {{ t('form.set') }}
                 </el-button>
               </div>
-              <!--
-              <div style="margin-left: 12px">
-                <el-button
-                  link
-                  type="primary"
-                  @click="openMaterialForm(scope.row)"
-                >
-                  选择物料
-                </el-button>
-              </div>
-              -->
               <div style="margin-left: 12px">
                 <el-button
                   link
@@ -480,29 +469,23 @@
     @update:model-value="val => drawerVisible = val"
     :node-id="currentBomNodeId"
     :materials="materialList.filter(item => item.bomNodeId === currentBomNodeId)"
+    :hide-extra-columns="true"
   />
 </template>
 <script setup lang="ts">
-import { IotMaintainApi, IotMaintainVO } from '@/api/pms/maintain'
-import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
 import * as UserApi from '@/api/system/user'
 import { useUserStore } from '@/store/modules/user'
 import { ref } from 'vue'
-import type { ComponentPublicInstance } from 'vue'
 import { IotMaintenanceBomApi, IotMaintenanceBomVO } from '@/api/pms/iotmaintenancebom'
 import { IotMainWorkOrderBomApi, IotMainWorkOrderBomVO } from '@/api/pms/iotmainworkorderbom'
 import { IotMainWorkOrderBomMaterialApi, IotMainWorkOrderBomMaterialVO } from '@/api/pms/iotmainworkorderbommaterial'
-import { IotMaintenancePlanApi, IotMaintenancePlanVO } from '@/api/pms/maintenance'
 import { IotMainWorkOrderApi, IotMainWorkOrderVO } from '@/api/pms/iotmainworkorder'
 import { useTagsViewStore } from '@/store/modules/tagsView'
-import {CACHE_KEY, useCache} from "@/hooks/web/useCache";
-import MainPlanDeviceList from "@/views/pms/maintenance/MainPlanDeviceList.vue";
 import * as DeptApi from "@/api/system/dept";
 import {erpPriceTableColumnFormatter} from "@/utils";
 import dayjs from 'dayjs'
 import MaterialListDrawer from "@/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue";
 import WorkOrderMaterial from "@/views/pms/iotmainworkorder/WorkOrderMaterial.vue";
-import {IotMaintainMaterialsApi} from "@/api/pms/maintain/materials";
 import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
 
 /** 保养计划 表单 */
@@ -749,15 +732,6 @@ const submitForm = async () => {
     message.success(t('common.createSuccess'))
     close()
 
-    /* if (formType.value === 'create') {
-      await IotMaintenancePlanApi.createIotMaintenancePlan(data)
-      message.success(t('common.createSuccess'))
-      close()
-    } else {
-      await IotMaintainApi.updateIotMaintain(data)
-      message.success(t('common.updateSuccess'))
-      close()
-    } */
     // 发送操作成功的事件
     emit('success')
   } finally {

+ 8 - 5
src/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue

@@ -13,9 +13,9 @@
       <div v-loading="loading" style="height: 100%">
         <el-table :data="filteredMaterials" style="width: 100%">
           <el-table-column prop="bomNodeId" :label="t('bomList.bomNode')" width="180" v-if="false"/>
-          <el-table-column prop="factory" :label="t('workOrderMaterial.factory')" width="180" />
-          <el-table-column prop="costCenter" :label="t('workOrderMaterial.costCenter')" width="180" />
-          <el-table-column prop="projectDepartment" :label="t('workOrderMaterial.storageLocation')"  width="180" />
+          <el-table-column prop="factory" :label="t('workOrderMaterial.factory')" width="180" v-if="!hideExtraColumns"/>
+          <el-table-column prop="costCenter" :label="t('workOrderMaterial.costCenter')" width="180" v-if="!hideExtraColumns"/>
+          <el-table-column prop="projectDepartment" :label="t('workOrderMaterial.storageLocation')"  width="180" v-if="!hideExtraColumns"/>
           <el-table-column prop="materialName" :label="t('workOrderMaterial.materialName')" width="180" />
           <el-table-column prop="materialCode" :label="t('workOrderMaterial.materialCode')" width="180" />
           <el-table-column prop="unit" :label="t('workOrderMaterial.unit')" width="180" />
@@ -50,7 +50,6 @@
 import { ref, watch, defineOptions, defineEmits } from 'vue'
 import { ElMessage } from 'element-plus'
 import * as PmsMaterialApi from '@/api/pms/material'
-import {dateFormatter} from "@/utils/formatTime";
 const drawerVisible = ref<boolean>(false)
 const emit = defineEmits(['update:modelValue', 'add', 'delete'])
 const { t } = useI18n() // 国际化
@@ -80,7 +79,11 @@ const total = ref(0) // 列表的总页数
 const props = defineProps({
   modelValue: Boolean,
   nodeId: Number,
-  materials: Array // 接收父组件传递的完整物料列表
+  materials: Array, // 接收父组件传递的完整物料列表
+  hideExtraColumns: {
+    type: Boolean,
+    default: false
+  }
 })
 
 // 监听bom树节点ID变化