pm 2 месяцев назад
Родитель
Сommit
ca39148965

+ 2 - 2
src/api/basic/mapconfig/index.ts

@@ -21,8 +21,8 @@ export interface PageParam {
 export const getIsMapPage = async (params: PageParam) => {
   return await request.get({ url: '/iscs/map/getMapPage', params })
 }
-export const getNotUsedMap = async () => {
-  return await request.get({ url: '/iscs/map/getNotUsedMap' })
+export const getNotUsedMap = async (mapId:number) => {
+  return await request.get({ url: '/iscs/map/getNotUsedMap',params: { mapId } })
 }
 // 查询地图参数详细
 export const selectIsMapById = async (id: number) => {

+ 2 - 1
src/api/material/doorException/index.ts

@@ -16,7 +16,8 @@ export interface DoorExceptionQuery {
 //  (传递参数exceptionType是1就是柜门异常)
 export const doorExceptionPage = async (params: DoorExceptionQuery) => {
   return await request.get({
-    url: '/iscs/cabinet-open-record/getCabinetOpenRecordPage',
+    // url: '/iscs/cabinet-open-record/getCabinetOpenRecordPage',
+    url: '/iscs/exception/getExceptionPage',
     params
   })
 }

+ 2 - 1
src/api/material/exception/index.ts

@@ -15,7 +15,8 @@ export interface ExceptionQuery {
 // 查询物资异常列表 (传递参数exceptionType是1就是柜门异常 现在是归还异常)
 export const returnExceptionPage = async (params: ExceptionQuery) => {
   return await request.get({
-    url: '/iscs/exception/getExceptionPage',
+    // url: '/iscs/exception/getExceptionPage',
+    url: '/iscs/exception-misplace/getExceptionMisplacePage',
     params
   })
 }

+ 1 - 1
src/api/material/manualException/index.ts

@@ -47,7 +47,7 @@ export const listManualException = async (params: ManualExceptionQuery) => {
 
 // 查询人工传入异常详情
 export const getExceptionInfo = async (id: number) => {
-  return await request.get({ url: '/iscs/exception/selectExceptionById', params: { exceptionId: id } })
+  return await request.get({ url: '/iscs/exception/selectExceptionById', params: { id: id } })
 }
 
 // 新增人工传入异常

+ 25 - 11
src/layout/components/ToolHeader.vue

@@ -14,8 +14,9 @@ import TenantVisit from '@/layout/components/TenantVisit/index.vue'
 import { useAppStore } from '@/store/modules/app'
 import { useDesign } from '@/hooks/web/useDesign'
 import { checkPermi } from '@/utils/permission'
+import * as Agent from '@/api/system/notify/agent/index'
 // 先导入图片
-import todoIcon from '../../assets/images/topTodo.png';
+import todoIcon from '../../assets/images/topTodo.png'
 
 const { getPrefixCls, variables } = useDesign()
 
@@ -58,6 +59,21 @@ export default defineComponent({
     // 代办数量
     const router = useRouter()
     const documentTodos = ref(0)
+    const queryParams = reactive({
+      pageNum: 1,
+      pageSize: -1,
+      queryType: '0', // 默认全部
+      startTime: '',
+      endTime: ''
+    })
+    onMounted(() => {
+      getAgentNum()
+    })
+    const getAgentNum = async () => {
+      const agentData = await Agent.getMyAgent(queryParams)
+      documentTodos.value = agentData.handleAgent.length
+      console.log(agentData, 'agentData')
+    }
     // 代办:处理跳转逻辑
     const handleNewPageJump = () => {
       router.push({ name: 'Agent' })
@@ -81,11 +97,11 @@ export default defineComponent({
           </div>
         ) : undefined}
         <div class="h-full flex items-center">
-          {hasTenantVisitPermission.value ? <TenantVisit/> : undefined}
+          {hasTenantVisitPermission.value ? <TenantVisit /> : undefined}
           {screenfull.value ? (
             <Screenfull class="custom-hover" color="var(--top-header-text-color)"></Screenfull>
           ) : undefined}
-          {search.value ? <RouterSearch isModal={false}/> : undefined}
+          {search.value ? <RouterSearch isModal={false} /> : undefined}
           {size.value ? (
             <SizeDropdown class="custom-hover" color="var(--top-header-text-color)"></SizeDropdown>
           ) : undefined}
@@ -98,14 +114,9 @@ export default defineComponent({
           {message.value ? (
             <Message class="custom-hover" color="var(--top-header-text-color)"></Message>
           ) : undefined}
-          <div
-            class="custom-hover p-2 cursor-pointer"
-            onClick={handleNewPageJump}
-            title="待办"
-          >
+          <div class="custom-hover p-2 cursor-pointer" onClick={handleNewPageJump} title="待办">
             {documentTodos.value > 0 ? (
-              <ElBadge value={documentTodos.value} max={10} class="item">
-                // 然后在模板中使用
+              <ElBadge value={documentTodos.value} max={10} class="itemAgent" badge-style="">
                 <img
                   src={todoIcon}
                   style="width: 1.2em; height: 1.2em; vertical-align: middle;"
@@ -113,7 +124,6 @@ export default defineComponent({
                 />
               </ElBadge>
             ) : (
-              // 然后在模板中使用
               <img
                 src={todoIcon}
                 style="width: 1.2em; height: 1.2em; vertical-align: middle;"
@@ -140,4 +150,8 @@ $prefix-cls: #{$namespace}-tool-header;
   margin-top: 10px;
   margin-right: 40px;
 }
+.itemAgent {
+  margin-top: -8px;
+  margin-right: 30px;
+}
 </style>

+ 59 - 40
src/views/Exceptions/Exception/index.vue

@@ -42,12 +42,7 @@
         />
       </el-form-item>
       <el-form-item label="状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="请选择状态"
-          clearable
-          class="!w-240px"
-        >
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.MATERIAL_EXCEPTION_STATUS)"
             :key="dict.value"
@@ -65,8 +60,9 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
+          class="!w-240px"
+          @clear="handleClearTime(createTime)"
         />
-
       </el-form-item>
       <el-form-item label="异常解除时间">
         <el-date-picker
@@ -77,22 +73,27 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
+          class="!w-240px"
+          @clear="handleClearTime2(handleTime)"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" />
+          搜索
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" />
+          重置
+        </el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
 
   <!-- 列表 -->
   <ContentWrap>
-    <el-table
-      v-loading="loading"
-      :data="exceptionList"
-    >
-      <el-table-column label="编号" align="center" prop="misplaceId" />
+    <el-table v-loading="loading" :data="exceptionList">
+      <el-table-column label="编号" align="center" prop="id" />
       <el-table-column label="物资柜" align="center" prop="loanFromName" />
       <el-table-column label="物资名称" align="center" prop="materialsName" />
       <el-table-column label="归还柜" align="center" prop="restitutionToName" />
@@ -102,8 +103,16 @@
           <dict-tag :type="DICT_TYPE.MATERIAL_EXCEPTION_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="异常发生时间" align="center" prop="occurTime" :formatter="dateFormatter" />
-      <el-table-column label="异常解除时间" align="center" prop="handleTime" :formatter="dateFormatter" />
+      <el-table-column
+        label="异常发生时间"
+        align="center"
+        prop="occurTime"
+      />
+      <el-table-column
+        label="异常解除时间"
+        align="center"
+        prop="handleTime"
+      />
     </el-table>
     <Pagination
       v-model:total="total"
@@ -116,10 +125,10 @@
 
 <script lang="ts" setup>
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { dateFormatter,getDateRange } from '@/utils/formatTime'
 import * as ExceptionApi from '@/api/material/exception'
 import * as CabinetApi from '@/api/material/information'
-import {returnExceptionPage} from "@/api/material/exception";
+import { returnExceptionPage } from '@/api/material/exception'
 
 defineOptions({ name: 'MaterialException' })
 
@@ -155,13 +164,19 @@ const getList = async () => {
   loading.value = true
   try {
     // 处理时间范围
-    if (createTime.value?.length === 2) {
-      queryParams.startTime = dateFormatter(createTime.value[0])
-      queryParams.endTime = dateFormatter(createTime.value[1])
+    // if (createTime.value?.length == 2) {
+    //   queryParams.startTime = getDateRange(createTime.value[0])
+    //   queryParams.endTime = getDateRange(createTime.value[1])
+    // }
+    if (Array.isArray(createTime.value) && createTime.value.length == 2) {
+      const [startTime, endTime] = getDateRange(createTime.value[0], createTime.value[1])
+      queryParams.startTime = startTime
+      queryParams.endTime = endTime
     }
-    if (handleTime.value?.length === 2) {
-      queryParams.handleStartTime = dateFormatter(handleTime.value[0])
-      queryParams.handleEndTime = dateFormatter(handleTime.value[1])
+    if (Array.isArray(handleTime.value) && handleTime.value?.length == 2) {
+      const [startTime, endTime] = getDateRange(handleTime.value[0], handleTime.value[1])
+      queryParams.handleStartTime = startTime
+      queryParams.handleEndTime = endTime
     }
     const data = await ExceptionApi.returnExceptionPage(queryParams)
     exceptionList.value = data.list
@@ -175,7 +190,7 @@ const getList = async () => {
 const getCabinetList = async () => {
   const data = await CabinetApi.getMaterialsCabinets({ pageNo: 1, pageSize: -1 })
   if (data?.list) {
-    cabinets.value = data.list.map(item => ({
+    cabinets.value = data.list.map((item) => ({
       value: item.id,
       label: item.cabinetName
     }))
@@ -192,25 +207,29 @@ const handleQuery = () => {
 const resetQuery = () => {
   createTime.value = null
   handleTime.value = null
+  queryParams.startTime = undefined
+  queryParams.endTime = undefined
+  queryParams.handleStartTime = undefined
+  queryParams.handleEndTime = undefined
   queryFormRef.value?.resetFields()
   handleQuery()
 }
 
-// /** 清空时间范围 */
-// const handleClearTime = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.startTime = undefined
-//     queryParams.endTime = undefined
-//   }
-// }
-//
-// /** 清空处理时间范围 */
-// const handleClearTime2 = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.handleStartTime = undefined
-//     queryParams.handleEndTime = undefined
-//   }
-// }
+/** 清空时间范围 */
+const handleClearTime = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.startTime = undefined
+    queryParams.endTime = undefined
+  }
+}
+
+/** 清空处理时间范围 */
+const handleClearTime2 = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.handleStartTime = undefined
+    queryParams.handleEndTime = undefined
+  }
+}
 
 /** 初始化 */
 onMounted(async () => {

+ 38 - 30
src/views/Exceptions/doorException/index.vue

@@ -47,6 +47,7 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
+          @clear="handleClearTime(createTime)"
           class="!w-290px"
         />
       </el-form-item>
@@ -59,6 +60,7 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
+          @clear="handleClearTime2(handleTime)"
           class="!w-290px"
         />
       </el-form-item>
@@ -75,15 +77,15 @@
       v-loading="loading"
       :data="exceptionList"
     >
-      <el-table-column label="编号" align="center" prop="misplaceId" />
-      <el-table-column label="物资柜" align="center" prop="loanFromName" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="物资柜" align="center" prop="exceptionCategoryName" />
       <el-table-column label="状态" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.MATERIAL_EXCEPTION_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="异常发生时间" align="center" prop="occurTime" :formatter="dateFormatter" />
-      <el-table-column label="异常解除时间" align="center" prop="handleTime" :formatter="dateFormatter" />
+      <el-table-column label="异常发生时间" align="center" prop="raiseTime" />
+      <el-table-column label="异常解除时间" align="center" prop="handleTime" />
     </el-table>
     <Pagination
       v-model:total="total"
@@ -96,7 +98,7 @@
 
 <script lang="ts" setup>
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { dateFormatter,getDateRange } from '@/utils/formatTime'
 import * as doorExceptionApi from '@/api/material/doorException'
 import * as CabinetApi from '@/api/material/information'
 import {doorExceptionPage} from "@/api/material/doorException";
@@ -151,10 +153,10 @@ const queryParams = reactive({
   exceptionType: '1',
   loanFromId: undefined,
   status: undefined,
-  startTime: undefined,
-  endTime: undefined,
-  handleStartTime: undefined,
-  handleEndTime: undefined
+  startRaiseTime: undefined,
+  endRaiseTime: undefined,
+  startHandleTime: undefined,
+  endHandleTime: undefined
 })
 
 const queryFormRef = ref() // 搜索的表单
@@ -164,13 +166,15 @@ const getList = async () => {
   loading.value = true
   try {
     // 处理时间范围
-    if (createTime.value?.length === 2) {
-      queryParams.startTime = dateFormatter(createTime.value[0])
-      queryParams.endTime = dateFormatter(createTime.value[1])
+    if (Array.isArray(createTime.value) && createTime.value?.length == 2) {
+      const [startTime, endTime] = getDateRange(createTime.value[0], createTime.value[1])
+      queryParams.startRaiseTime = startTime
+      queryParams.endRaiseTime = endTime
     }
-    if (handleTime.value?.length === 2) {
-      queryParams.handleStartTime = dateFormatter(handleTime.value[0])
-      queryParams.handleEndTime = dateFormatter(handleTime.value[1])
+    if (Array.isArray(handleTime.value) && handleTime.value?.length == 2) {
+      const [startTime, endTime] = getDateRange(handleTime.value[0], handleTime.value[1])
+      queryParams.startHandleTime = startTime
+      queryParams.endHandleTime = endTime
     }
     const data = await doorExceptionApi.doorExceptionPage(queryParams)
     exceptionList.value = data.list
@@ -201,25 +205,29 @@ const handleQuery = () => {
 const resetQuery = () => {
   createTime.value = null
   handleTime.value = null
+  queryParams.startRaiseTime = undefined
+  queryParams.endRaiseTime = undefined
+  queryParams.startHandleTime = undefined
+  queryParams.endHandleTime = undefined
   queryFormRef.value?.resetFields()
   handleQuery()
 }
 
-// /** 清空时间范围 */
-// const handleClearTime = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.startTime = undefined
-//     queryParams.endTime = undefined
-//   }
-// }
-//
-// /** 清空处理时间范围 */
-// const handleClearTime2 = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.handleStartTime = undefined
-//     queryParams.handleEndTime = undefined
-//   }
-// }
+/** 清空时间范围 */
+const handleClearTime = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.startRaiseTime = undefined
+    queryParams.endRaiseTime = undefined
+  }
+}
+
+/** 清空处理时间范围 */
+const handleClearTime2 = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.startHandleTime = undefined
+    queryParams.endHandleTime = undefined
+  }
+}
 
 /** 初始化 */
 onMounted(async () => {

+ 61 - 37
src/views/Exceptions/manualException/index.vue

@@ -79,8 +79,8 @@
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
-
-
+          class="!w-240px"
+          @clear="handleClearTime(raiseTime)"
         />
       </el-form-item>
       <el-form-item label="异常解除时间">
@@ -92,12 +92,19 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
-
+          class="!w-240px"
+          @clear="handleClearTime2(handleTime)"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" />
+          搜索
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" />
+          重置
+        </el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
@@ -110,14 +117,14 @@
       <el-radio-button label="third">已处理</el-radio-button>
     </el-radio-group>
 
-    <el-table
-      v-loading="loading"
-      :data="exceptionList"
-    >
-      <el-table-column label="编号" align="center" prop="exceptionId" />
+    <el-table v-loading="loading" :data="exceptionList">
+      <el-table-column label="编号" align="center" prop="id" />
       <el-table-column label="异常分类" align="center" prop="exceptionCategory">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.CLASSIFICATION_OF_EXCEPTIONS" :value="scope.row.exceptionCategory" />
+          <dict-tag
+            :type="DICT_TYPE.CLASSIFICATION_OF_EXCEPTIONS"
+            :value="scope.row.exceptionCategory"
+          />
         </template>
       </el-table-column>
       <el-table-column label="异常来源" align="center" prop="sourceName" />
@@ -129,8 +136,18 @@
           <dict-tag :type="DICT_TYPE.MANUAL_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="异常发生时间" align="center" prop="raiseTime" :formatter="dateFormatter" />
-      <el-table-column label="异常解除时间" align="center" prop="handleTime" :formatter="dateFormatter" />
+      <el-table-column
+        label="异常发生时间"
+        align="center"
+        prop="raiseTime"
+
+      />
+      <el-table-column
+        label="异常解除时间"
+        align="center"
+        prop="handleTime"
+
+      />
       <el-table-column label="操作" align="center">
         <template #default="scope">
           <el-button link type="primary" @click="handleCheck(scope.row)">查看</el-button>
@@ -151,10 +168,10 @@
 
 <script lang="ts" setup>
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { dateFormatter,getDateRange } from '@/utils/formatTime'
 import * as ExceptionApi from '@/api/material/manualException'
 import ExceptionDetail from './ExceptionDetail.vue'
-import {listManualException} from "@/api/material/manualException";
+import { listManualException } from '@/api/material/manualException'
 
 defineOptions({ name: 'MaterialManualException' })
 
@@ -218,7 +235,8 @@ const queryParams = reactive({
   endHandleTime: undefined,
   startRaiseTime: undefined,
   endRaiseTime: undefined,
-  status: undefined
+  status: undefined,
+  isUpload:1 //区分人工异常喝物资柜门异常,1是人工
 })
 
 const queryFormRef = ref() // 搜索的表单
@@ -235,13 +253,15 @@ const getList = async () => {
   loading.value = true
   try {
     // 处理时间范围
-    if (raiseTime.value?.length === 2) {
-      queryParams.startRaiseTime = dateFormatter(raiseTime.value[0])
-      queryParams.endRaiseTime = dateFormatter(raiseTime.value[1])
+    if (Array.isArray(raiseTime.value) && raiseTime.value?.length == 2) {
+      const [startTime, endTime] = getDateRange(raiseTime.value[0], raiseTime.value[1])
+      queryParams.startRaiseTime = startTime
+      queryParams.endRaiseTime = endTime
     }
-    if (handleTime.value?.length === 2) {
-      queryParams.startHandleTime = dateFormatter(handleTime.value[0])
-      queryParams.endHandleTime = dateFormatter(handleTime.value[1])
+    if (Array.isArray(handleTime.value) && handleTime.value?.length == 2) {
+      const [startTime, endTime] = getDateRange(handleTime.value[0], handleTime.value[1])
+      queryParams.startHandleTime = startTime
+      queryParams.endHandleTime = endTime
     }
     const data = await ExceptionApi.listManualException(queryParams)
     exceptionList.value = data.list
@@ -261,25 +281,29 @@ const handleQuery = () => {
 const resetQuery = () => {
   raiseTime.value = null
   handleTime.value = null
+  queryParams.startRaiseTime = undefined
+  queryParams.endRaiseTime = undefined
+  queryParams.startHandleTime = undefined
+  queryParams.endHandleTime = undefined
   queryFormRef.value?.resetFields()
   handleQuery()
 }
 
-// /** 清空时间范围 */
-// const handleClearTime = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.startRaiseTime = undefined
-//     queryParams.endRaiseTime = undefined
-//   }
-// }
-//
-// /** 清空处理时间范围 */
-// const handleClearTime2 = (value: [Date, Date] | null) => {
-//   if (!value) {
-//     queryParams.startHandleTime = undefined
-//     queryParams.endHandleTime = undefined
-//   }
-// }
+/** 清空时间范围 */
+const handleClearTime = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.startRaiseTime = undefined
+    queryParams.endRaiseTime = undefined
+  }
+}
+
+/** 清空处理时间范围 */
+const handleClearTime2 = (value: [Date, Date] | null) => {
+  if (!value) {
+    queryParams.startHandleTime = undefined
+    queryParams.endHandleTime = undefined
+  }
+}
 
 /** 查看详情 */
 const handleCheck = (row: any) => {

+ 5 - 4
src/views/dv/lotoStation/LotoStationForm.vue

@@ -73,7 +73,7 @@ import * as MapconfigApi from '@/api/basic/mapconfig/index'
 import * as  HardwareApi from '@/api/hw/hardware/information/index'
 import * as  MarsDeptApi from '@/api/system/marsdept'
 import {  handleTree } from '@/utils/tree'
-import {getNotUsedMap} from "@/api/basic/mapconfig/index";
+
 defineOptions({ name: 'LotoStationForm' })
 
 const { t } = useI18n() // 国际化
@@ -97,7 +97,8 @@ const formData = ref({
 
 const formRules = reactive({
   lotoName: [{ required: true, message: '锁定站名称不能为空', trigger: 'blur' }],
-  workstationId: [{ required: true, message: '岗位不能为空', trigger: 'blur' }]
+  workstationId: [{ required: true, message: '岗位不能为空', trigger: 'blur' }],
+  mapId:[{required:true,message:'地图名称不能为空',trigger:'blur'}],
 })
 
 const formRef = ref() // 表单 Ref
@@ -106,7 +107,7 @@ const mapOptions = ref([]) // 地图选项
 const hardWareList = ref([]) // 硬件列表
 
 /** 打开弹窗 */
-const open = async (type: string, id?: number) => {
+const open = async (type: string, id?: number,mapId?:number) => {
   dialogVisible.value = true
   dialogTitle.value = t('action.' + type)
   formType.value = type
@@ -125,7 +126,7 @@ const open = async (type: string, id?: number) => {
   marsOptions.value = handleTree(deptRes.list)
 
   // 获取地图数据 (getNotUsedMap这个接口可以筛选已经被使用的就不再出现 未被使用的才出现)
-  const mapRes = await MapconfigApi.getNotUsedMap()
+  const mapRes = await MapconfigApi.getNotUsedMap(mapId)
   mapOptions.value = mapRes
 
   // 获取硬件数据

+ 3 - 3
src/views/dv/lotoStation/index.vue

@@ -85,7 +85,7 @@
           <el-button
             link
             type="primary"
-            @click="openForm('update', scope.row.id)"
+            @click="openForm('update', scope.row.id,scope.row.mapId)"
             v-hasPermi="['iscs:station:update']"
           >
             修改
@@ -173,8 +173,8 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
+const openForm = (type: string, id?: number,mapId?:number) => {
+  formRef.value.open(type, id,mapId)
 }
 
 /** 删除按钮操作 */

+ 20 - 14
src/views/hw/hardware/padLocks/PadLockForm.vue

@@ -77,7 +77,7 @@
       <el-form-item label="状态" prop="exStatus">
         <el-radio-group v-model="formData.exStatus">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.PADLOCK_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.PADLOCK_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >
@@ -102,7 +102,7 @@
 
 <script lang="ts" setup>
 import { ref, reactive } from 'vue'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from '@/utils/dict'
 import { handleTree } from '@/utils/tree'
 import * as PadLockApi from '@/api/hw/hardware/padLock/index'
 import * as HardwareApi from '@/api/hw/hardware/information/index'
@@ -188,21 +188,27 @@ const submitForm = async () => {
 
 /** 重置表单 */
 const resetForm = () => {
-  formData.value = {
-    lockId: undefined,
-    hardwareId: undefined,
-    lockTypeId: undefined,
-    lockCode: '',
-    lockName: '',
-    lockNfc: '',
-    lockSpec: '',
-    exStatus: '1',
-    exRemark: ''
-  }
-  autoGenFlag.value = false
   formRef.value?.resetFields()
+
+  autoGenFlag.value = false
 }
 
+// const resetForm = () => {
+//   formData.value = {
+//     lockId: undefined,
+//     hardwareId: undefined,
+//     lockTypeId: undefined,
+//     lockCode: '',
+//     lockName: '',
+//     lockNfc: '',
+//     lockSpec: '',
+//     exStatus: '1',
+//     exRemark: ''
+//   }
+//   autoGenFlag.value = false
+//   formRef.value?.resetFields()
+// }
+
 /** 自动生成编码 */
 // const handleAutoGenChange = async (value: boolean) => {
 //   if (value) {

+ 3 - 3
src/views/hw/lockCabinet/LockCabinetForm.vue

@@ -64,7 +64,7 @@
       <el-form-item label="是否在线" prop="isOnline">
         <el-radio-group v-model="formData.isOnline">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.ISONLINE_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.ISONLINE_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >
@@ -75,7 +75,7 @@
       <el-form-item label="状态" prop="status">
         <el-radio-group v-model="formData.status">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.CABINET_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.CANBINET_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >
@@ -122,7 +122,7 @@
 
 <script lang="ts" setup>
 import { ref, reactive } from 'vue'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getIntDictOptions,getStrDictOptions} from '@/utils/dict'
 import { handleTree } from '@/utils/tree'
 import * as LockCabinetApi from '@/api/hw/hardware/lockCabinet/index'
 import * as HardwareApi from '@/api/hw/hardware/information/index'

+ 4 - 3
src/views/material/Inspectionrecords/index.vue

@@ -70,7 +70,8 @@
           start-placeholder="开始日期"
           end-placeholder="结束日期"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-
+          @clear="handleClearTime(checkDate)"
+          class="!w-240px"
         />
       </el-form-item>
       <el-form-item label="检查结果" prop="status">
@@ -124,7 +125,7 @@
       <el-table-column label="物资编号" align="center" prop="materialsId" />
       <el-table-column label="物资名称" align="center" prop="materialsName" />
       <el-table-column label="物资类型" align="center" prop="materialsTypeName" />
-      <el-table-column label="物资图片" align="center" prop="materialsTypePicture">
+      <el-table-column label="物资图片" align="center" prop="materialsTypePicture"  width="85">
         <template #default="scope">
           <UploadImg
             v-if="scope.row.materialsTypePicture"
@@ -342,7 +343,7 @@ const handleViewRecord = (row: any) => {
     emit('recordId', row.recordId)
   } else {
     router.push({
-      path: '/material/replacementrecords',
+      path: '/material/material/replacementrecords',
       query: {
         recordId: row.recordId
       }

+ 19 - 5
src/views/material/coll/index.vue

@@ -58,7 +58,8 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
-          :default-time="['00:00:00', '23:59:59']"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           @change="handleClearLoanTime"
           class="!w-240px"
         />
@@ -79,7 +80,8 @@
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
-          :default-time="['00:00:00', '23:59:59']"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           @change="handleClearRestitutionTime"
           class="!w-240px"
         />
@@ -87,7 +89,7 @@
       <el-form-item label="状态" prop="status">
         <el-select v-model="queryParams.status" placeholder="请选择状态" class="!w-240px">
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.RECORD_OF_COLLECTION)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.RECORD_OF_COLLECTION)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -127,7 +129,7 @@
       <el-table-column label="领取时间" align="center" prop="loanTime" />
       <el-table-column label="归还人" align="center" prop="restitutionUserName" />
       <el-table-column label="归还时间" align="center" prop="actualRestitutionTime" />
-      <el-table-column label="借出时长" align="center" prop="loanDuration" />
+      <el-table-column label="借出时长" align="center" prop="loanDuration" :formatter="formatLoanDuration"/>
       <el-table-column label="状态" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.RECORD_OF_COLLECTION" :value="scope.row.status" />
@@ -145,7 +147,7 @@
 </template>
 
 <script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getIntDictOptions,getStrDictOptions } from '@/utils/dict'
 import { handleTree } from '@/utils/tree'
 import * as LoanApi from '@/api/material/loan/index'
 import * as CabinetApi from '@/api/material/lockers/index'
@@ -220,6 +222,14 @@ const getList = async () => {
     loading.value = false
   }
 }
+const formatLoanDuration = (row) => {
+  const duration = row.loanDuration || ''
+  // 假设返回格式是 "0小时 18分 54秒"
+  return duration
+    .replace(/^0小时\s*/, '')   // 去掉开头的 "0小时"
+    .replace(/^0分\s*/, '')     // 如果有 "0分" 在最前面也去掉
+    .trim()
+}
 
 /** 获取物资柜列表 */
 const getCabinets = async () => {
@@ -255,6 +265,10 @@ const resetQuery = () => {
   loanTime.value = null
   restitutionTime.value = null
   queryFormRef.value?.resetFields()
+  queryParams.loanTimeStart = null
+  queryParams.loanTimeEnd = null
+  queryParams.restitutionTimeStart = null
+  queryParams.restitutionTimeEnd = null
   handleQuery()
 }
 

+ 15 - 10
src/views/material/information/MaterialForm.vue

@@ -16,6 +16,7 @@
               clearable
               placeholder="请选择绑定物资柜"
               class="!w-348px"
+              @clear="handleClearCabinet"
             >
               <el-option
                 v-for="dict in cabinets"
@@ -88,12 +89,12 @@
 <!--              <h3>{{ property.propertyName }}</h3>-->
               <div class="property-values">
                 <div
-                  v-for="value in PropertyValueList.filter((v) => v.propertyId === property.id)"
+                  v-for="value in PropertyValueList.filter((v) => v.propertyId == property.id)"
                   :key="value.id"
                   :class="[
                     'property-value',
                     {
-                      selected: selectedValues[property.id] === value.id
+                      selected: selectedValues[property.id] == value.id
                     }
                   ]"
                   @click="selectValue(property.id, value.id)"
@@ -269,13 +270,17 @@ onMounted(async () => {
   const data = await MaterialTypeApi.listType(params)
   materialtypeOptions.value = handleTree(data.list, 'id', 'parentId')
   const cabinet = await MaterialCabinetApi.listMaterialsCabinet(params)
-  cabinets.value = cabinet.list.map((cabinet) => {
-    return {
-      value: cabinet.id,
-      label: cabinet.cabinetName
-    }
-  })
+  cabinets.value = cabinet.list.map((cabinet) => ({
+    value: cabinet.id,
+    label: cabinet.cabinetName
+  })).concat({ value: 0, label: '空' })
 })
+
+// 清空时执行
+const handleClearCabinet = () => {
+  formData.value.materialsCabinetId = 0
+}
+
 // 监听物资类型变化
 watch(
   () => formData.value.materialsTypeId,
@@ -334,8 +339,8 @@ const selectValue = (propertyId: string, recordId: string) => {
         (v) => v.id == recordId // 使用 id 字段
       )
       return {
-        propertyId,
-        recordId,
+        propertyId: String(propertyId),
+        recordId: String(recordId),
         valueName: value.valueName,
         propertyName: property.propertyName
       }

+ 13 - 9
src/views/material/information/index.vue

@@ -110,6 +110,7 @@
           end-placeholder="结束日期"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           :picker-options="pickerOptions"
+          @clear="handleClearTime(createTime)"
           class="!w-240px"
         />
       </el-form-item>
@@ -345,6 +346,7 @@ const queryParams = reactive({
   supplier: undefined,
   expirationDate: undefined,
   recordId: undefined,
+  status: undefined,
   propertyId: undefined
 })
 
@@ -402,7 +404,7 @@ const filteredPropertyValues = computed(() => {
     return []
   }
   return PropertyValueList.value.filter(
-    (value) => value.propertyId === queryParams.propertyId
+    (value) => value.propertyId == queryParams.propertyId
   )
 })
 const route=useRoute()
@@ -423,7 +425,7 @@ const setInitialCabinetId = () => {
     queryParams.materialsCabinetId = Number(route.query.cabinetId)
     visibleSelect.value = true
   } else {
-    queryParams.materialsCabinetId = 1
+    queryParams.materialsCabinetId = ''
   }
 }
 // 查询物资柜
@@ -476,6 +478,7 @@ const getTreeselect = async () => {
   const propertyData = await PropertyApi.PropertyPage({ pageSize: -1, pageNo: 1 })
   PropertyList.value = propertyData.list
   const propertyValueData = await PropertyValueApi.PropertyValuePage({ pageSize: -1, pageNo: 1 })
+  console.log(propertyValueData,'propertyValueData')
   PropertyValueList.value = propertyValueData.list
 }
 
@@ -516,6 +519,7 @@ const resetQuery = () => {
   queryParams.supplier = undefined
   queryParams.propertyId = undefined
   queryParams.recordId = undefined
+  queryParams.status = undefined
   handleQuery()
 }
 
@@ -560,11 +564,11 @@ const handlePropertyChange = () => {
   queryParams.recordId = undefined
 }
 
-// /** 日期清空处理 */
-// const handleClearTime = (value: any) => {
-//   if (value == null) {
-//     queryParams.startExpirationDate = undefined
-//     queryParams.endExpirationDate = undefined
-//   }
-// }
+/** 日期清空处理 */
+const handleClearTime = (value: any) => {
+  if (value == null) {
+    queryParams.startExpirationDate = undefined
+    queryParams.endExpirationDate = undefined
+  }
+}
 </script>

+ 6 - 3
src/views/material/inspectionplan/index.vue

@@ -37,11 +37,12 @@
         <el-date-picker
           v-model="createTime"
           type="datetimerange"
+          value-format="YYYY-MM-DD HH:mm:ss"
           range-separator="-"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
-          :default-time="['00:00:00', '23:59:59']"
-          @change="handleClearTime"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          @change="handleClearTime(createTime)"
           class="!w-240px"
         />
       </el-form-item>
@@ -404,6 +405,8 @@ const handleQuery = () => {
 const resetQuery = () => {
   createTime.value = null
   queryFormRef.value?.resetFields()
+  queryParams.startTime = null
+  queryParams.endTime = null
   handleQuery()
 }
 
@@ -445,7 +448,7 @@ const handleViewRecord = (row: any) => {
     })
   } else {
     router.push({
-      path: '/material/Inspectionrecords',
+      path: '/material/material/Inspectionrecords',
       query: {
         planId: row.id,
         planName: row.planName

+ 5 - 5
src/views/material/instructions/index.vue

@@ -82,11 +82,11 @@
           <el-button link type="primary" @click="handlePreview(scope.row)">查看</el-button>
         </template>
       </el-table-column>
-      <el-table-column label="详情" align="center">
-        <template #default="scope">
-          <el-button link type="primary" @click="handleDetail(scope.row)">查看</el-button>
-        </template>
-      </el-table-column>
+<!--      <el-table-column label="详情" align="center">-->
+<!--        <template #default="scope">-->
+<!--          <el-button link type="primary" @click="handleDetail(scope.row)">查看</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="添加时间" align="center" prop="createTime" :formatter="dateFormatter" />
       <el-table-column label="操作" align="center" width="150">
         <template #default="scope">

+ 15 - 9
src/views/material/replacementrecords/index.vue

@@ -36,9 +36,10 @@
       <el-form-item label="原物资编号" prop="oldMaterialsId">
         <el-input
           v-model="queryParams.oldMaterialsId"
-          placeholder="请输入原物资编号"
+          placeholder="请输入原物资编号(数字格式)"
           clearable
           @keyup.enter="handleQuery"
+          @input="val => queryParams.oldMaterialsId = val.replace(/\D/g, '')"
           class="!w-240px"
         />
       </el-form-item>
@@ -54,9 +55,10 @@
       <el-form-item label="新物资编号" prop="newMaterialsId">
         <el-input
           v-model="queryParams.newMaterialsId"
-          placeholder="请输入新物资编号"
+          placeholder="请输入新物资编号(数字格式)"
           clearable
           @keyup.enter="handleQuery"
+          @input="val => queryParams.newMaterialsId = val.replace(/\D/g, '')"
           class="!w-240px"
         />
       </el-form-item>
@@ -86,8 +88,8 @@
           start-placeholder="开始日期"
           end-placeholder="结束日期"
           :shortcuts="dateShortcuts"
+          @change="handleClearTime(createTime)"
           class="!w-240px"
-          @change="handleClearTime"
         />
       </el-form-item>
       <el-form-item>
@@ -109,7 +111,7 @@
           </template>
         </el-table-column>
         <el-table-column label="物资类型" align="center" prop="materialsTypeName" />
-        <el-table-column label="物资图片" align="center" prop="materialsTypePicture">
+        <el-table-column label="物资图片" align="center" prop="materialsTypePicture"  width="85">
           <template #default="scope">
             <UploadImg
               v-if="scope.row.materialsTypePicture"
@@ -149,9 +151,8 @@
 import * as ReplaceApi from '@/api/material/replace/index'
 import * as lockerApi from '@/api/material/lockers/index'
 import * as TypeApi from '@/api/material/type'
-import { dateFormatter } from '@/utils/formatTime'
+import { getDateRange} from '@/utils/formatTime'
 import { handleTree } from '@/utils/tree'
-import router from "@/router";
 defineOptions({ name: 'MaterialReplaceRecord' })
 
 const { t } = useI18n() // 国际化
@@ -221,10 +222,12 @@ const getList = async () => {
   loading.value = true
   try {
     // 格式化日期
-    if (Array.isArray(createTime.value) && createTime.value.length === 2) {
-      queryParams.startTime = dateFormatter(createTime.value[0])
-      queryParams.endTime = dateFormatter(createTime.value[1])
+    if (Array.isArray(createTime.value) && createTime.value.length == 2) {
+      const [startTime, endTime] = getDateRange(createTime.value[0], createTime.value[1])
+      queryParams.startTime = startTime
+      queryParams.endTime = endTime
     }
+
     if(props.cabinetId||props.recordId){
       queryParams.cabinetId = Number(props.cabinetId)
       if(props.recordId){
@@ -243,6 +246,7 @@ const getList = async () => {
     if (route.query.cabinetId || props.cabinetId) {
       visibleSelect.value = true
     }
+    console.log(queryParams,'查询参数')
     const data = await ReplaceApi.listChangeRecord(queryParams)
     changeRecordList.value = data.list
     total.value = data.total
@@ -275,6 +279,8 @@ const queryFormRef=ref()
 /** 重置按钮操作 */
 const resetQuery = () => {
   createTime.value = []
+  queryParams.startTime = undefined
+  queryParams.endTime = undefined
   queryFormRef.value?.resetFields()
   handleQuery()
 }

+ 255 - 168
src/views/sopm/sop/ExecutePlan.vue

@@ -15,186 +15,198 @@
       </div>
     </div>
     <div class="tab-content">
-      <section>
-        <span>启用执行计划:</span>
-        <el-switch
-          v-model="sopExcuteData.enableExecutionPlan"
-          size="small"
-          :active-value="1"
-          :inactive-value="0"
-          @change="handleExecutionPlanChange"
-        />
-      </section>
-      <section>
-        <span>执行频率单位:</span>
-        <el-radio-group v-model="sopExcuteData.frequencyUnit" @change="handlefrequencyUnitChange">
-          <el-radio label="day" :value="3">天</el-radio>
-          <el-radio label="week" :value="2">周</el-radio>
-          <el-radio label="month" :value="1">月</el-radio>
-          <el-radio label="year" :value="0">年</el-radio>
-        </el-radio-group>
-      </section>
-
-      <!-- 天 -->
-      <section v-if="sopExcuteData.frequencyUnit == 3">
-        <span> 执行频率:</span>每
-        <el-input-number
-          v-model="sopExcuteData.frequency"
-          :min="1"
-          :max="3650"
-          class="mx-4"
-          controls-position="right"
-        />
-        天
-      </section>
-
-      <!-- 周 -->
-      <section v-else-if="sopExcuteData.frequencyUnit == 2">
-        <span>执行频率:</span> 每
-        <el-input-number
-          v-model="sopExcuteData.frequency"
-          :min="1"
-          :max="520"
-          class="mx-4"
-          controls-position="right"
-        />
-        周 &nbsp;&nbsp;&nbsp;&nbsp; 在 &nbsp;&nbsp;
-        <el-select v-model="sopExcuteData.timePoint" placeholder="选择星期" style="width: 115px">
-          <el-option label="星期一" value="星期一" />
-          <el-option label="星期二" value="星期二" />
-          <el-option label="星期三" value="星期三" />
-          <el-option label="星期四" value="星期四" />
-          <el-option label="星期五" value="星期五" />
-          <el-option label="星期六" value="星期六" />
-          <el-option label="星期日" value="星期日" />
-        </el-select>
-      </section>
-
-      <!-- 月 -->
-      <section v-else-if="sopExcuteData.frequencyUnit == 1">
-        <span>执行频率:</span> 每
-        <el-input-number
-          v-model="sopExcuteData.frequency"
-          :min="1"
-          :max="120"
-          class="mx-4"
-          controls-position="right"
-        />
-        月 第
-        <el-input-number
-          v-model="sopExcuteData.timePoint"
-          :min="1"
-          :max="3650"
-          class="mx-4"
-          controls-position="right"
-          @change="handleTimePointChange"
-        />
-        日
-      </section>
-
-      <!-- 年 -->
-      <section v-else-if="sopExcuteData.frequencyUnit == 0">
-        <span>执行频率:</span> 每
-        <el-input-number
-          v-model="sopExcuteData.frequency"
-          :min="1"
-          :max="10"
-          class="mx-4"
-          controls-position="right"
-        />
-        年 第
-        <el-input-number
-          v-model="sopExcuteData.timePoint"
-          :min="1"
-          :max="3650"
-          class="mx-4"
-          controls-position="right"
-          @change="handleTimePointChange"
-        />
-        天
-      </section>
-      <section
-        ><span>作业开始时间:</span>
-        <el-time-picker
-          v-model="sopExcuteData.startTime"
-          placeholder="请选择"
-          :picker-options="{
-            selectableRange: '00:00:00 - 23:59:59'
-          }"
-          format="HH:mm:ss"
-          value-format="HH:mm:ss"
-        />
-      </section>
-      <section>
-        <span>作业预估时长:</span>
-        <el-time-picker
-          v-model="sopExcuteData.duration"
-          placeholder="请选择"
-          :picker-options="{
-            selectableRange: '00:00:00 - 23:59:59'
-          }"
-          format="HH:mm:ss"
-          value-format="HH:mm:ss"
-        />
-      </section>
-      <section>
-        <span> 计划终止:</span>
-        <el-select v-model="sopExcuteData.endType" placeholder="" style="width: 115px">
-          <el-option
-            v-for="dict in getStrDictOptions(DICT_TYPE.SOP_PLAN_TERMINATE_TYPE)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
+      <el-form
+        ref="formRef"
+        :model="sopExcuteData"
+        :rules="formRules"
+        label-width="120px"
+      >
+        <!-- 启用执行计划 -->
+        <el-form-item label="启用执行计划" prop="enableExecutionPlan">
+          <el-switch
+            v-model="sopExcuteData.enableExecutionPlan"
+            size="small"
+            :active-value="1"
+            :inactive-value="0"
+            @change="handleExecutionPlanChange"
           />
-        </el-select>
-        <el-date-picker
-          style="margin-left: 15px"
-          v-if="sopExcuteData.endType == 0 && sopExcuteData.endType !== '' "
-          v-model="sopExcuteData.endValue"
-          type="date"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          placeholder="请选择"
-        />
-        <div v-if="sopExcuteData.endType == 2">
+        </el-form-item>
+
+        <!-- 执行频率单位 -->
+        <el-form-item label="执行频率单位" prop="frequencyUnit">
+          <el-radio-group v-model="sopExcuteData.frequencyUnit" @change="handlefrequencyUnitChange">
+            <el-radio :value="3">天</el-radio>
+            <el-radio :value="2">周</el-radio>
+            <el-radio :value="1">月</el-radio>
+            <el-radio :value="0">年</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <!-- 天 -->
+        <el-form-item v-if="sopExcuteData.frequencyUnit == 3" label="执行频率" prop="frequency">
+          每
           <el-input-number
-            v-model="sopExcuteData.endValue"
+            v-model="sopExcuteData.frequency"
             :min="1"
-            :max="10"
+            :max="3650"
             class="mx-4"
             controls-position="right"
-          />
-          次后
+          /> 天
+        </el-form-item>
+
+        <!-- 周 -->
+        <div v-else-if="sopExcuteData.frequencyUnit == 2" style="display:flex">
+          <el-form-item label="执行频率" prop="frequency">
+            每
+            <el-input-number
+              v-model="sopExcuteData.frequency"
+              :min="1"
+              :max="520"
+              class="mx-4"
+              controls-position="right"
+            /> 周
+          </el-form-item>
+          <el-form-item label="在" prop="timePoint">
+            <el-select v-model="sopExcuteData.timePoint" placeholder="选择星期" style="width: 115px">
+              <el-option label="星期一" value="星期一" />
+              <el-option label="星期二" value="星期二" />
+              <el-option label="星期三" value="星期三" />
+              <el-option label="星期四" value="星期四" />
+              <el-option label="星期五" value="星期五" />
+              <el-option label="星期六" value="星期六" />
+              <el-option label="星期日" value="星期日" />
+            </el-select>
+          </el-form-item>
+        </div>
+
+        <!-- 月 -->
+        <div v-else-if="sopExcuteData.frequencyUnit == 1" style="display:flex">
+          <el-form-item label="执行频率" prop="frequency">
+            每
+            <el-input-number
+              v-model="sopExcuteData.frequency"
+              :min="1"
+              :max="120"
+              class="mx-4"
+              controls-position="right"
+            /> 月
+          </el-form-item>
+          <el-form-item label="第" prop="timePoint">
+            <el-input-number
+              v-model="sopExcuteData.timePoint"
+              :min="1"
+              :max="31"
+              class="mx-4"
+              controls-position="right"
+            /> 日
+          </el-form-item>
         </div>
-      </section>
-      <section>
-        <span>非工作日:</span>
-        <el-select v-model="sopExcuteData.nonWorkDay" placeholder="" style="width: 115px" @change="handlenonWorkMoveDayChange()">
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.SOP_PLAN_NOWORKING)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
+
+        <!-- 年 -->
+        <div v-else-if="sopExcuteData.frequencyUnit == 0"  style="display:flex">
+          <el-form-item label="执行频率" prop="frequency">
+            每
+            <el-input-number
+              v-model="sopExcuteData.frequency"
+              :min="1"
+              :max="10"
+              class="mx-4"
+              controls-position="right"
+            /> 年
+          </el-form-item>
+          <el-form-item label="第" prop="timePoint">
+            <el-input-number
+              v-model="sopExcuteData.timePoint"
+              :min="1"
+              :max="365"
+              class="mx-4"
+              controls-position="right"
+            /> 天
+          </el-form-item>
+        </div>
+
+        <!-- 作业开始时间 -->
+        <el-form-item label="作业开始时间" prop="startTime">
+          <el-time-picker
+            v-model="sopExcuteData.startTime"
+            placeholder="请选择"
+            format="HH:mm:ss"
+            value-format="HH:mm:ss"
+          />
+        </el-form-item>
+
+        <!-- 作业预估时长 -->
+        <el-form-item label="作业预估时长" prop="duration">
+          <el-time-picker
+            v-model="sopExcuteData.duration"
+            placeholder="请选择"
+            format="HH:mm:ss"
+            value-format="HH:mm:ss"
           />
-        </el-select>
-        <div v-if="sopExcuteData.nonWorkDay == 2 || sopExcuteData.nonWorkDay == 3">
+        </el-form-item>
+
+        <!-- 计划终止 -->
+        <div style="display:flex">
+          <el-form-item label="计划终止" prop="endType">
+            <el-select v-model="sopExcuteData.endType" style="width: 115px" @change="handleEndTypeChange">
+              <el-option v-for="dict in getStrDictOptions(DICT_TYPE.SOP_PLAN_TERMINATE_TYPE)"
+                         :key="dict.value"
+                         :label="dict.label"
+                         :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item v-if="sopExcuteData.endType == 0" label="终止日期" prop="endValue">
+            <el-date-picker
+              v-model="sopExcuteData.endValue"
+              type="date"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              placeholder="请选择"
+              :disabled-date="disabledBeforeToday"
+            />
+          </el-form-item>
+          <el-form-item v-if="sopExcuteData.endType == 2" label="执行次数" prop="endValue">
+            <el-input-number
+              v-model="sopExcuteData.endValue"
+              :min="1"
+              :max="10"
+              class="mx-4"
+              controls-position="right"
+            /> 次后
+          </el-form-item>
+        </div>
+
+
+        <!-- 非工作日 -->
+        <div style="display:flex">
+        <el-form-item label="非工作日" prop="nonWorkDay">
+          <el-select v-model="sopExcuteData.nonWorkDay" style="width: 115px">
+            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.SOP_PLAN_NOWORKING)"
+                       :key="dict.value"
+                       :label="dict.label"
+                       :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="sopExcuteData.nonWorkDay == 2 || sopExcuteData.nonWorkDay == 3" label="顺延天数" prop="nonWorkMoveDay">
           <el-input-number
             v-model="sopExcuteData.nonWorkMoveDay"
             :min="1"
             :max="10"
             class="mx-4"
             controls-position="right"
-          />
-          工作日
+          /> 工作日
+        </el-form-item>
         </div>
-      </section>
-      <div class="btnstyle">
-        <el-button plain v-if="ExcuteplanVisible == false" @click="submit">修改</el-button>
-        <el-button type="primary" plain @click="submit" v-if="ExcuteplanVisible == true"
-          >新建</el-button
-        >
-        <el-button plain @click="goBack">取消</el-button>
-      </div>
+
+        <!-- 按钮 -->
+        <div class="btnstyle">
+          <el-button plain v-if="ExcuteplanVisible == false" @click="submit">修改</el-button>
+          <el-button type="primary" plain v-if="ExcuteplanVisible == true" @click="submit">新建</el-button>
+          <el-button plain @click="goBack">取消</el-button>
+        </div>
+      </el-form>
     </div>
   </ContentWrap>
   <!--  预览计划-->
@@ -228,6 +240,7 @@ const router = useRouter()
 const route = useRoute()
 const message = useMessage() // 消息弹窗
 const tableData = ref([])
+const formRef = ref(null)
 const sopExcuteData = reactive({
   sopId: route.query.id,
   frequencyUnit: 3,
@@ -241,6 +254,61 @@ const sopExcuteData = reactive({
   nonWorkMoveDay: '',
   enableExecutionPlan:0,
 })
+// 校验规则
+const formRules = {
+  // enableExecutionPlan: [{ required: true, message: '请选择是否启用执行计划', trigger: 'change' }],
+  frequencyUnit: [{ required: true, message: '请选择执行频率单位', trigger: 'change' }],
+  frequency: [{ required: true, message: '请输入执行频率', trigger: 'blur' }],
+  timePoint: [
+    {
+      required: true,
+      message: '请输入时间点',
+      trigger: 'change',
+      validator: (rule, value, callback) => {
+        if ((sopExcuteData.frequencyUnit == 2 || sopExcuteData.frequencyUnit == 1 || sopExcuteData.frequencyUnit == 0) && !value) {
+          callback(new Error('请输入时间点'))
+        } else {
+          callback()
+        }
+      }
+    }
+  ],
+  startTime: [{ required: true, message: '请选择作业开始时间', trigger: 'change' }],
+  duration: [{ required: true, message: '请选择作业预估时长', trigger: 'change' }],
+  endType: [{ required: true, message: '请选择计划终止方式', trigger: 'change' }],
+  endValue: [
+    {
+      required: true,
+      message: '请输入终止值',
+      trigger: 'blur',
+      validator: (rule, value, callback) => {
+        if (sopExcuteData.endType == 0 && !value) {
+          callback(new Error('请选择终止日期'))
+        } else if (sopExcuteData.endType == 2 && !value) {
+          callback(new Error('请输入执行次数'))
+        } else {
+          callback()
+        }
+      }
+    }
+  ],
+  nonWorkDay: [{ required: true, message: '请选择非工作日处理方式', trigger: 'change' }],
+  nonWorkMoveDay: [
+    {
+      required: true,
+      message: '请输入顺延天数',
+      trigger: 'blur',
+      validator: (rule, value, callback) => {
+        if ((sopExcuteData.nonWorkDay == 2 || sopExcuteData.nonWorkDay == 3) && !value) {
+          callback(new Error('请输入顺延天数'))
+        } else {
+          callback()
+        }
+      }
+    }
+  ]
+}
+
 
 const ExcuteplanVisible = ref(false) // 判断sop执行计划是新增还是修改
 // 添加初始化标志位
@@ -329,12 +397,31 @@ const handlenonWorkMoveDayChange=()=>{
   }
 }
 
+// 计划终止切换时清空后面日期数据
+const handleEndTypeChange = (val) => {
+  // 切换到 0(终止日期)或 2(执行次数)时,清空 endValue
+  if (val == 0 || val == 2) {
+    sopExcuteData.endValue = ''
+  }
+}
+
+// 计划执行日期当前日期之前时间不可选条件判断
+const disabledBeforeToday = (time) => {
+  const today = new Date()
+  today.setHours(0, 0, 0, 0) // 清零时分秒
+  return time.getTime() < today.getTime() // 小于今天的禁用
+}
+
+
 // 创建按钮事件
 const submit = async () => {
   try {
+    // 先做表单校验
+    await formRef.value.validate()
+
+    // 新增执行计划
     let data
     let successMessage
-    // 新增执行计划
     if (sopExcuteData.frequencyUnit == '3') {
       sopExcuteData.timePoint = 0
     }
@@ -357,7 +444,7 @@ const submit = async () => {
       message.success(successMessage)
     }
   } catch (error) {
-    console.error('保存失败:', error)
+    // console.error('保存失败:', error)
     message.error('保存失败')
   }
 }

+ 9 - 2
src/views/sopm/sop/NotificationRules.vue

@@ -189,9 +189,16 @@ const getNotifyData = async () => {
       //   .join('<br/>')  // ✅ 多行显示,用 <br/> 拼接
 
       const detailDisplay = (item.notifyConfigDetailRespVOList || [])
-        .filter(d => d.isClient == 1) // 过滤当事人
+        .filter(d => d.status == 1) // 过滤当事人
         .map(d => {
-          const role = `${d.roleName || '未知角色'}(当事人)`; // 这里就直接拼接了
+          // const role = `${d.roleName || '未知角色'}(当事人)`; // 这里就直接拼接了
+          // return `${role}:${d.notifyTemplateName || '-'}`;
+          let role;
+          if (d.isClient == 1) {
+            role = `${d.roleName || '未知角色'}(当事人)`;
+          } else {
+            role = `${d.roleName || '未知角色'}`;
+          }
           return `${role}:${d.notifyTemplateName || '-'}`;
         })
         .join('<br/>');

+ 92 - 111
src/views/sopm/sop/NotificationUpdate.vue

@@ -4,109 +4,78 @@
       <span class="tab-title">添加规则</span>
     </div>
     <div class="checkContent">
-      <section>
-        <span>通知规则种类: </span>
-        <el-select v-model="noticeData.type" placeholder="请选择" style="width: 260px">
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.NOTICE_RULES_TYPE)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </section>
-      <section>
-        <span>规则:</span>
-        <el-select v-model="noticeData.rule" placeholder="请选择" style="width: 260px">
-          <!--          作业通知-->
-          <el-option
-            v-show="noticeData.type == 1"
-            v-for="dict in getStrDictOptions(DICT_TYPE.JOB_NOTICE_RULES)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-          <!--          操作通知-->
-          <el-option
-            v-show="noticeData.type == 3"
-            v-for="dict in getIntDictOptions(DICT_TYPE.ACTION_NOTICE_RULES)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-          <!--    提前通知-->
-          <el-option
-            v-show="noticeData.type == 0"
-            v-for="dict in getIntDictOptions(DICT_TYPE.ADVANCE_NOTICE_RULES)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-          <!--   步骤通知-->
-          <el-option
-            v-for="item in actionNoticeList"
-            :key="item.id"
-            :label="item.stepTitleShort"
-            :value="item.id"
-            v-show="noticeData.type == 2"
-          />
-        </el-select>
-      </section>
-      <section>
-        <span>通知时间:</span>
-        <el-select v-model="noticeData.notifyTimeType" placeholder="请选择" style="width: 260px">
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.NOTICE_TIME_TYPE)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-        <i v-if="noticeData.notifyTimeType == 0 || noticeData.notifyTimeType == 2">
-          <el-input-number
-            v-model="timeParts.day"
-            :min="0"
-            :max="10"
-            class="mx-4"
-            controls-position="right"
-          />
-          天
-          <el-input-number
-            v-model="timeParts.hour"
-            :min="0"
-            :max="23"
-            class="mx-4"
-            controls-position="right"
-          />
-          时
-          <el-input-number
-            v-model="timeParts.minute"
-            :min="0"
-            :max="59"
-            class="mx-4"
-            controls-position="right"
-          />
-          分
-          <el-input-number
-            v-model="timeParts.second"
-            :min="0"
-            :max="59"
-            class="mx-4"
-            controls-position="right"
+      <el-form :model="noticeData" :rules="rules" ref="noticeForm" label-width="110px">
+        <el-form-item label="通知规则种类" prop="type">
+          <el-select v-model="noticeData.type" placeholder="请选择" style="width: 260px">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.NOTICE_RULES_TYPE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="规则" prop="rule">
+          <el-select v-model="noticeData.rule" placeholder="请选择" style="width: 260px">
+            <el-option
+              v-show="noticeData.type == 1"
+              v-for="dict in getStrDictOptions(DICT_TYPE.JOB_NOTICE_RULES)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+            <el-option
+              v-show="noticeData.type == 3"
+              v-for="dict in getIntDictOptions(DICT_TYPE.ACTION_NOTICE_RULES)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+            <el-option
+              v-show="noticeData.type == 0"
+              v-for="dict in getIntDictOptions(DICT_TYPE.ADVANCE_NOTICE_RULES)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+            <el-option
+              v-for="item in actionNoticeList"
+              :key="item.id"
+              :label="item.stepTitleShort"
+              :value="item.id"
+              v-show="noticeData.type == 2"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="通知时间" prop="notifyTimeType">
+          <el-select v-model="noticeData.notifyTimeType" placeholder="请选择" style="width: 260px">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.NOTICE_TIME_TYPE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+          <template v-if="noticeData.notifyTimeType == 0 || noticeData.notifyTimeType == 2">
+            <el-input-number v-model="timeParts.day" :min="0" :max="10" class="mx-4" style="width: 100px" /> 天
+            <el-input-number v-model="timeParts.hour" :min="0" :max="23" class="mx-4" style="width: 100px" /> 时
+            <el-input-number v-model="timeParts.minute" :min="0" :max="59" class="mx-4" style="width: 100px" /> 分
+            <el-input-number v-model="timeParts.second" :min="0" :max="59" class="mx-4" style="width: 100px" /> 秒
+          </template>
+        </el-form-item>
+
+        <el-form-item label="通知区域" prop="workstationId">
+          <el-tree-select
+            style="width: 260px"
+            v-model="noticeData.workstationId"
+            :data="workstationOptions"
+            :props="{ label: 'label', children: 'children', value: 'id' }"
+            placeholder="请选择岗位"
           />
-          秒
-        </i>
-      </section>
-      <section>
-        <span>通知区域:</span>
-        <el-tree-select
-          style="width: 260px"
-          v-model="noticeData.workstationId"
-          :data="workstationOptions"
-          :props="{ label: 'label', children: 'children', value: 'id' }"
-          placeholder="请选择岗位"
-        />
-      </section>
+        </el-form-item>
+      </el-form>
     </div>
   </ContentWrap>
   <!--  通知角色与通知模板-->
@@ -123,7 +92,7 @@
           <el-radio label="showNotice" :value="1">仅显示通知</el-radio>
         </el-radio-group>
       </p>
-      <el-table v-loading="loading" :data="filteredTableData" border style="width: 80%">
+      <el-table v-loading="loading" :data="filteredTableData" border style="width: 80%;">
         <el-table-column prop="roleName" label="角色" width="180" />
         <el-table-column label="是否通知" align="center" width="100">
           <template #default="scope">
@@ -132,7 +101,7 @@
         </el-table-column>
         <el-table-column label="仅通知当事人" align="center" width="110">
           <template #default="scope">
-            <el-switch v-model="scope.row.isClient" :active-value="1" :inactive-value="0" />
+            <el-switch v-model="scope.row.isClient" :active-value="1" :inactive-value="0" :disabled="scope.row.status !== 1"/>
           </template>
         </el-table-column>
         <el-table-column label="通知模板" align="center">
@@ -140,7 +109,8 @@
             <span>{{ scope.row.notifyTemplateName }}</span>
             <i
               style="margin-left: 8px; color: #409eff; cursor: pointer; font-style: normal"
-              @click="changeTemplate(scope.row)"
+              :style="{ color: scope.row.status !== 1 ? '#ccc' : '#409eff', pointerEvents: scope.row.status !== 1 ? 'none' : 'auto' }"
+              @click="scope.row.status == 1 && changeTemplate(scope.row)"
             >
               {{ scope.row.notifyTemplateName ? '更换' : '选择' }}
             </i>
@@ -338,6 +308,14 @@ const filteredTableData = computed(() => {
   if (status.value == 0) return tableData.value
   return tableData.value.filter((item) => item.status == 1)
 })
+const noticeForm = ref(null)
+const rules = {
+  type: [{ required: true, message: '请选择通知规则种类', trigger: 'change' }],
+  rule: [{ required: true, message: '请选择规则', trigger: 'change' }],
+  notifyTimeType: [{ required: true, message: '请选择通知时间', trigger: 'change' }],
+  workstationId: [{ required: true, message: '请选择通知区域', trigger: 'change' }],
+}
+
 
 onMounted(() => {
   getActionNoticeData() //步骤操作的规则数据
@@ -482,11 +460,9 @@ const changeTemplate = async (row) => {
 // 新增确认
 const submit = async () => {
   try {
+    // 先做表单校验
+    await noticeForm .value.validate()
     let data
-    // let successMessage
-    //   新增
-    console.log(route.query.type, 'ggggdata')
-
     // 如果是类型 0 或 2,需要做时间转换
     if (noticeData.notifyTimeType == 0 || noticeData.notifyTimeType == 2) {
       const totalSeconds =
@@ -534,6 +510,8 @@ const submit = async () => {
 
 // 修改确认
 const submitUpdate = async () => {
+  // 先做表单校验
+  await noticeForm .value.validate()
   if (noticeData.notifyTimeType == 0 || noticeData.notifyTimeType == 2) {
     const totalSeconds =
       timeParts.day * 86400 + timeParts.hour * 3600 + timeParts.minute * 60 + timeParts.second
@@ -555,11 +533,13 @@ const submitUpdate = async () => {
       id: item.notifyConfigId // 有id则为修改,无id则为新增
     }))
   }
+
   // const data = await NotificationRules.updateNotifyConfig(payload)
   const data = await NotificationRules.insertNotifyConfig(payload)
 
   if (data) {
     ElMessage.success('更新成功')
+    goBack()
   }
 }
 
@@ -611,7 +591,7 @@ const resetQuery = () => {
 
 .checkContent {
   width: 95%;
-  height: 200px;
+  height:200px;
   margin: 10px auto;
 
   section {
@@ -635,8 +615,9 @@ const resetQuery = () => {
 
 .tableCon {
   width: 95%;
-  min-height: 300px;
+  max-height: 460px;
   margin: auto;
+  overflow-y: auto;
 
   p {
     margin: 20px 0;

+ 3 - 3
src/views/system/notify/agent/index.vue

@@ -79,7 +79,7 @@
               v-if="queryParams.queryType == 3"
               v-model="customDateRange"
               type="daterange"
-              value-format="yyyy-MM-dd HH:mm:ss"
+              value-format="YYYY-MM-DD HH:mm:ss"
               range-separator="To"
               start-placeholder="开始日期"
               end-placeholder="结束日期"
@@ -113,7 +113,7 @@ import * as JobApi from '@/api/job/index'
 
 const router = useRouter()
 // const route = useRoute()
-const activeName = ref('first')
+const activeName = ref('second')
 // 查询参数
 const queryParams = reactive({
   pageNum: 1,
@@ -162,7 +162,7 @@ const handleQueryTypeChange = () => {
 
 // 处理自定义日期选择
 const handleCustomDateChange = (val) => {
-  if (val && val.length === 2) {
+  if (val && val.length == 2) {
     queryParams.startTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss')
     queryParams.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss')
     getAgentData()

+ 1 - 1
src/views/system/notify/template/NotifyTemplateSendForm.vue

@@ -5,7 +5,7 @@
       v-loading="formLoading"
       :model="formData"
       :rules="formRules"
-      label-width="140px"
+      label-width="200px"
     >
       <el-form-item label="模板内容" prop="content">
         <el-input