Преглед на файлове

pm第一轮平台测试部分bug修复

pm преди 3 месеца
родител
ревизия
5623815b89

+ 3 - 4
src/api/basic/mappoint/index.ts

@@ -39,10 +39,9 @@ export const updateIsMapPoint = async (data: MapPointVO) => {
 }
 
 // 删除地图点位数据配置
-export const deleteIsMapPointByIds = async (id: number) => {
-  return await request.post({
-    url: '/iscs/map-point/deleteMapPointList',
-    params: { ids: id }
+export const deleteIsMapPointByIds = async (ids: number) => {
+  return await request.delete({
+    url: '/iscs/map-point/deleteMapPointList?ids='+ids,
   })
 }
 

+ 2 - 2
src/api/hw/type/padLockType/index.ts

@@ -48,7 +48,7 @@ export const updatepadLockTypeApi = async (data: PadLockTypeVO) => {
 // 删除挂锁类型信息
 export const delpadLockTypeApi = async (ids: number) => {
   return await request.delete({
-    url: '/iscs/lock-type/deleteLockTypeList',
-    params: { ids: ids }
+    url: '/iscs/lock-type/deleteLockTypeList?ids=' + ids,
+
   })
 }

+ 9 - 6
src/views/Basicdata/mappoint/index.vue

@@ -36,7 +36,7 @@
           @click="handleDelete"
           v-hasPermi="['iscs:map-point:delete']"
         >
-          <Icon icon="ep:delete" class="mr-5px" /> 删除
+          <Icon icon="ep:delete" class="mr-5px" /> 批量删除
         </el-button>
       </el-form-item>
     </el-form>
@@ -186,11 +186,18 @@ const formRef = ref()
 const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: any[]) => {
 
+  ids.value = selection.map(item => item.id)
+  console.log(ids.value,'ids.value')
+  multiple.value = !selection.length
+}
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {
   try {
     const Pointsids=id||ids.value
+    console.log(Pointsids,'Pointsids')
     await message.delConfirm()
     await MapPointApi.deleteIsMapPointByIds(Pointsids)
     message.success(t('common.delSuccess'))
@@ -198,11 +205,7 @@ const handleDelete = async (id: number) => {
   } catch {}
 }
 
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: any[]) => {
-  ids.value = selection.map(item => item.id)
-  multiple.value = !selection.length
-}
+
 
 /** 初始化 **/
 onMounted(() => {

+ 4 - 2
src/views/CustomStepTemplate/CS/index.vue

@@ -308,10 +308,12 @@ const viewStepDetail = (row) => {
     }
   })
 }
-let stepCounter = 1
+
 // 生成新的表格行
 const createNewRow = () => {
-  const stepNumber = stepCounter++
+
+  // 新序号 = 最大序号 + 1
+  const stepNumber = tableData.value.length + 1
   return {
     stepCode: `step_${stepNumber}`,
     isPreset: undefined,

+ 9 - 1
src/views/CustomWorkflow/CW/CreateView.vue

@@ -49,7 +49,7 @@
 import TableView from './TableView.vue'
 import WorkflowView from './WorkFlowView.vue'
 import * as ModeApi from '@/api/custonWorkflow/index'
-
+import { useTagsViewStoreWithOut } from '@/store/modules/tagsView'
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 const router = useRouter()
@@ -134,6 +134,14 @@ onBeforeRouteLeave((to, from, next) => {
   }
 })
 const goBack = () => {
+  // 获取 tagsView store
+  const tagsViewStore = useTagsViewStoreWithOut()
+
+  // 获取当前路由对象
+  const currentRoute = router.currentRoute.value
+
+  // 方法1:精确删除当前标签(推荐)
+  tagsViewStore.delVisitedView(currentRoute)
   router.push('/CustomWorkflow/CW')
 }
 

+ 9 - 0
src/views/CustomWorkflow/CW/UpdateView.vue

@@ -49,6 +49,7 @@
 import TableView from './TableView.vue'
 import WorkflowView from './WorkFlowView.vue'
 import * as ModeApi from '@/api/custonWorkflow/index'
+import {useTagsViewStoreWithOut} from "@/store/modules/tagsView";
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
@@ -83,6 +84,14 @@ const SaveWorkflowMode = async () => {
 }
 
 const goBack = () => {
+  // 获取 tagsView store
+  const tagsViewStore = useTagsViewStoreWithOut()
+
+  // 获取当前路由对象
+  const currentRoute = router.currentRoute.value
+
+  // 方法1:精确删除当前标签(推荐)
+  tagsViewStore.delVisitedView(currentRoute)
   router.push('/CustomWorkflow/CW')
 }
 onMounted(() => {

+ 4 - 4
src/views/CustomWorkflow/CW/index.vue

@@ -208,17 +208,17 @@ const resetQuery = () => {
 
 /** 添加/修改/查看操作 */
 const openForm = (type: string, id?: number) => {
-  if (type === 'create') {
+  if (type == 'create') {
     router.push({
       name: 'CreateView',
-      query: { id: id, type: 'create' }
+      query: {  type: 'create' }
     })
-  } else if (type === 'update') {
+  } else if (type == 'update') {
     router.push({
       name: 'UpdateView',
       query: { id: id, type: 'update', }
     })
-  } else if (type === 'view') {
+  } else if (type == 'view') {
     router.push({
       name: 'CheckView',
       query: { id: id, type: 'view' }

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

@@ -26,15 +26,15 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="设备/工艺" prop="machineryId">
-        <el-tree-select
-          v-model="queryParams.machineryId"
-          :data="machineryOptions"
-          :props="{ label: 'machineryName', value: 'id', children: 'children' }"
-          placeholder="选择设备/工艺"
-          class="!w-240px"
-        />
-      </el-form-item>
+<!--      <el-form-item label="设备/工艺" prop="machineryId">-->
+<!--        <el-tree-select-->
+<!--          v-model="queryParams.machineryId"-->
+<!--          :data="machineryOptions"-->
+<!--          :props="{ label: 'machineryName', value: 'id', children: 'children' }"-->
+<!--          placeholder="选择设备/工艺"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </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>

+ 1 - 0
src/views/dv/technology/WordstationTree.vue

@@ -66,6 +66,7 @@ const getWorkstationTree = async () => {
 
 /** 树节点点击事件 */
 const handleNodeClick = (data: any) => {
+  searchValue.value = data.workstationName // 将选中的节点名称赋值给搜索框
   emit('node-click', data)
 }
 

+ 112 - 80
src/views/dv/technology/technologyDetail/CraftDetail.vue

@@ -4,17 +4,20 @@
       <el-radio-button label="craftInfo">工艺信息</el-radio-button>
       <el-radio-button label="deviceList">设备列表</el-radio-button>
       <el-radio-button label="Loto">锁定站</el-radio-button>
-      <el-radio-button label="sopList">SOP列表</el-radio-button>
+      <!--      <el-radio-button label="sopList">SOP列表</el-radio-button>-->
     </el-radio-group>
 
     <!-- 工艺信息 -->
     <div v-if="tabPosition === 'craftInfo'">
       <TinyMCE
-        v-model:value="formData.content"
+        v-model:value="formData.remark"
         :height="700"
         placeholder="请输入内容..."
         @update:value="handleContentChange"
       />
+      <el-button type="primary" @click="handleSave" :loading="loading">
+        {{ loading ? '保存中...' : '保存内容' }}
+      </el-button>
     </div>
 
     <!-- 设备列表 -->
@@ -102,63 +105,68 @@
     <!-- SOP列表 -->
     <div v-if="tabPosition === 'sopList'">
       <ContentWrap>
-          <el-button v-hasPermi="['iscs:machinery:create']" type="primary" plain @click="handleAddSop">
-            <Icon icon="ep:plus" />
-            新增
-          </el-button>
-
-          <el-button
-            v-hasPermi="['iscs:machinery:delete']"
-            type="danger"
-            plain
-            :disabled="multiple"
-            @click="handleSopDelete"
-          >
-            <Icon icon="ep:delete" />
-            批量删除
-          </el-button>
+        <el-button
+          v-hasPermi="['iscs:machinery:create']"
+          type="primary"
+          plain
+          @click="handleAddSop"
+        >
+          <Icon icon="ep:plus" />
+          新增
+        </el-button>
+
+        <el-button
+          v-hasPermi="['iscs:machinery:delete']"
+          type="danger"
+          plain
+          :disabled="multiple"
+          @click="handleSopDelete"
+        >
+          <Icon icon="ep:delete" />
+          批量删除
+        </el-button>
       </ContentWrap>
       <ContentWrap>
-      <el-table
-        v-loading="loading"
-        :data="sopList"
-        row-key="sopId"
-        @selection-change="handleSopSelectionChange"
-      >
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column prop="sopName" label="SOP名称" />
-        <el-table-column prop="machineryName" label="工作内容" />
-        <el-table-column label="操作" align="center" width="200">
-          <template #default="{ row }">
-            <el-button
-              v-hasPermi="['iscs:machinery:edit']"
-              type="primary"
-              link
-              @click="handleSopUpdate(row)"
-            >
-              <Icon icon="ep:edit" />
-              编辑
-            </el-button>
-            <el-button
-              v-hasPermi="['iscs:machinery:remove']"
-              type="danger"
-              link
-              @click="handleSopDelete(row)"
-            >
-              <Icon icon="ep:delete" />
-              删除
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination
-        v-if="sopTotal > 0"
-        v-model:total="sopTotal"
-        v-model:page="queryParams.pageNo"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getSopList"
-      />
+        <el-table
+          v-loading="loading"
+          :data="sopList"
+          row-key="sopId"
+          @selection-change="handleSopSelectionChange"
+        >
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column prop="sopName" label="SOP名称" />
+          <el-table-column prop="machineryName" label="工作内容" />
+          <el-table-column label="操作" align="center" width="200">
+            <template #default="{ row }">
+              <el-button
+                v-hasPermi="['iscs:machinery:edit']"
+                type="primary"
+                link
+                @click="handleSopUpdate(row)"
+              >
+                <Icon icon="ep:edit" />
+                编辑
+              </el-button>
+              <el-button
+                v-hasPermi="['iscs:machinery:remove']"
+                type="danger"
+                link
+                @click="handleSopDelete(row)"
+              >
+                <Icon icon="ep:delete" />
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-if="sopTotal > 0"
+          v-model:total="sopTotal"
+          v-model:page="queryParams.pageNo"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getSopList"
+        />
       </ContentWrap>
     </div>
 
@@ -283,13 +291,12 @@ import { useI18n } from 'vue-i18n'
 import { useMessage } from '@/hooks/web/useMessage'
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import * as TechnologyApi from '@/api/dv/technology'
-import * as MardDeptApi from "@/api/system/marsdept/index"
+import * as MardDeptApi from '@/api/system/marsdept/index'
 import * as LotoApi from '@/api/dv/lotoStation'
 import * as SopApi from '@/api/sop/index'
 
 import MapData from './MapData.vue'
 import TinyMCE from '@/components/TinyMCE/index.vue'
-import {getSopPage} from "@/api/sop/index";
 
 defineOptions({ name: 'TechnologyDetail' })
 
@@ -323,7 +330,7 @@ const dialogTitle = ref('')
 const formLoading = ref(false)
 const formRef = ref()
 const formData = ref({
-  machineryId: undefined,
+  id: undefined,
   parentId: undefined,
   machineryName: '',
   machineryCode: '',
@@ -331,10 +338,37 @@ const formData = ref({
   lotoId: undefined,
   machineryImg: undefined,
   machineryType: '设备',
-  content: undefined
+  remark: undefined
 })
-const handleContentChange = (content: string) => {
+// 保存设备信息数据
+const handleSave = async () => {
+  if (!formData.value.remark.trim()) {
+    return ElMessage.warning('请输入内容')
+  }
+  const data = await TechnologyApi.getTechnologyInfo(route.query.machineryId)
+  formData.value.id = data.id
+  formData.value.parentId = data.parentId
+  formData.value.machineryName = data.machineryName
+  formData.value.machineryCode = data.machineryCode
+  formData.value.workstationId = data.workstationId
+  formData.value.lotoId = data.lotoId
+  formData.value.machineryImg = data.machineryImg
+  formData.value.machineryType = data.machineryType
+  loading.value = true
+
+  try {
+    await TechnologyApi.updateTechnology(formData.value)
+    ElMessage.success('保存成功')
+  } catch (error) {
+    ElMessage.error('保存失败')
+    console.error('API错误:', error)
+  } finally {
+    loading.value = false
+  }
+}
+const handleContentChange = async (content: string) => {
   console.log('内容变化:', content)
+  formData.value.remark = content
 }
 
 // 表单校验规则
@@ -383,6 +417,8 @@ const getList = async () => {
       machineryType: '设备'
     }
     const res = await TechnologyApi.listTechnology(data)
+    const dataById = await TechnologyApi.getTechnologyInfo(route.query.machineryId)
+    formData.value = dataById
     deviceList.value = res.list
     total.value = res.total
   } finally {
@@ -408,17 +444,15 @@ const getSopList = async () => {
 
 /** 获取选项数据 */
 const getOptions = async () => {
-
-
   // 获取设备工艺树
-  const techRes = await TechnologyApi.listTechnology({ pageNo:1,pageSize: -1 })
+  const techRes = await TechnologyApi.listTechnology({ pageNo: 1, pageSize: -1 })
   machineryOptions.value = techRes.list
   // 获取岗位树
-  const marsRes = await MardDeptApi.listMarsDept({ pageNo:1,pageSize: -1 })
+  const marsRes = await MardDeptApi.listMarsDept({ pageNo: 1, pageSize: -1 })
   workstationOptions.value = marsRes.list
 
   // 获取电柜列表
-  const lotoRes = await LotoApi.listLoto({ pageNo:1,pageSize: -1 })
+  const lotoRes = await LotoApi.listLoto({ pageNo: 1, pageSize: -1 })
   lotoOptions.value = lotoRes.list.map((item) => ({
     value: item.id,
     label: item.lotoName
@@ -431,20 +465,20 @@ const open = async (type: string, id?: number) => {
   dialogTitle.value = t('action.' + type)
 
   resetForm()
-
-  console.log(formData.value,'formData')
   if (id) {
     formLoading.value = true
     try {
-      formData.value = await TechnologyApi.getTechnologyInfo(id)
+      const data = await TechnologyApi.getTechnologyInfo(id)
+      console.log(data, 'data')
+      formData.value = data
     } finally {
       formLoading.value = false
     }
-  }else{
-    const detail= await TechnologyApi.getTechnologyInfo(route.query.machineryId)
-    formData.value.lotoId=detail.lotoId
-    formData.value.workstationId=detail.workstationId
-    formData.value.parentId=route.query.machineryId
+  } else {
+    const detail = await TechnologyApi.getTechnologyInfo(route.query.machineryId)
+    formData.value.lotoId = detail.lotoId
+    formData.value.workstationId = detail.workstationId
+    formData.value.parentId = route.query.machineryId
   }
 }
 
@@ -456,7 +490,7 @@ const openSop = async (type: string, id?: number) => {
   if (id) {
     formLoading.value = true
     try {
-      // sopFormData.value = await SopApi.selectIsMarsSopById(id)
+      sopFormData.value = await SopApi.selectSopById(id)
     } finally {
       formLoading.value = false
     }
@@ -475,7 +509,7 @@ const handleAddSop = () => {
 
 /** 修改设备 */
 const handleUpdate = (row: any) => {
-  open('update', row.machineryId)
+  open('update', row.id)
 }
 
 /** 修改SOP */
@@ -513,7 +547,7 @@ const submitForm = async () => {
   formLoading.value = true
   try {
     const data = formData.value
-    if (data.machineryId) {
+    if (data.id) {
       await TechnologyApi.updateTechnology(data)
       message.success(t('common.updateSuccess'))
     } else {
@@ -559,8 +593,6 @@ const submitSopForm = async () => {
 //   }
 // }
 
-
-
 /** 重置设备表单 */
 const resetForm = () => {
   formData.value = {

+ 64 - 5
src/views/dv/technology/technologyDetail/DeviceDetail.vue

@@ -7,7 +7,15 @@
 
     <!-- 设备信息 -->
     <div v-if="tabPosition === 'deviceInfo'">
-      <Tinymce />
+      <TinyMCE
+        v-model:value="formData.remark"
+        :height="700"
+        placeholder="请输入内容..."
+        @update:value="handleContentChange"
+      />
+      <el-button type="primary" @click="handleSave" :loading="loading">
+        {{ loading ? '保存中...' : '保存内容' }}
+      </el-button>
     </div>
 
     <!-- LOTO站 -->
@@ -26,17 +34,68 @@ import { useI18n } from 'vue-i18n'
 import { useMessage } from '@/hooks/web/useMessage'
 
 import MapData from './MapData.vue'
-import Tinymce from '@/components/TinyMCE/index.vue'
-
+import TinyMCE from '@/components/TinyMCE/index.vue'
+import * as TechnologyApi from '@/api/dv/technology'
 defineOptions({ name: 'DeviceDetail' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 const route = useRoute()
-
+const loading = ref(false)
 const tabPosition = ref('deviceInfo')
+const formData = ref({
+  id: undefined,
+  parentId: undefined,
+  machineryName: '',
+  machineryCode: '',
+  workstationId: undefined,
+  lotoId: undefined,
+  machineryImg: undefined,
+  machineryType: '设备',
+  remark: undefined
+})
+// 保存设备信息数据
+const handleSave = async () => {
+  if (!formData.value.remark.trim()) {
+    return ElMessage.warning('请输入内容')
+  }
+  const data = await TechnologyApi.getTechnologyInfo(route.query.machineryId)
+  formData.value.id = data.id
+  formData.value.parentId = data.parentId
+  formData.value.machineryName = data.machineryName
+  formData.value.machineryCode = data.machineryCode
+  formData.value.workstationId = data.workstationId
+  formData.value.lotoId = data.lotoId
+  formData.value.machineryImg = data.machineryImg
+  formData.value.machineryType = data.machineryType
+  loading.value = true
 
-
+  try {
+    await TechnologyApi.updateTechnology(formData.value)
+    ElMessage.success('保存成功')
+  } catch (error) {
+    ElMessage.error('保存失败')
+    console.error('API错误:', error)
+  } finally {
+    loading.value = false
+  }
+}
+const handleContentChange = async (content: string) => {
+  console.log('内容变化:', content)
+  formData.value.remark = content
+}
+const getList = async () => {
+  loading.value = true
+  try {
+    const dataById = await TechnologyApi.getTechnologyInfo(route.query.machineryId)
+    formData.value = dataById
+  } finally {
+    loading.value = false
+  }
+}
+onMounted(()=>{
+  getList()
+})
 </script>
 
 <style scoped>

+ 21 - 4
src/views/hw/hardware/information/index.vue

@@ -207,15 +207,32 @@ const defaultProps = {
   children: 'children',
   label: 'label'
 }
-
+/** 专门用于接口参数的日期格式化函数 */
+const formatDate = (date) => {
+  if (!date) return '';
+  // 转换为Date对象(处理可能的时间戳或字符串)
+  const targetDate = typeof date === 'number' ? new Date(date) : new Date(date);
+  // 格式化为YYYY-MM-DD HH:mm:ss格式(根据后端接口要求调整)
+  const year = targetDate.getFullYear();
+  const month = String(targetDate.getMonth() + 1).padStart(2, '0');
+  const day = String(targetDate.getDate()).padStart(2, '0');
+  const hours = String(targetDate.getHours()).padStart(2, '0');
+  const minutes = String(targetDate.getMinutes()).padStart(2, '0');
+  const seconds = String(targetDate.getSeconds()).padStart(2, '0');
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+};
 /** 查询硬件列表 */
 const getList = async () => {
   loading.value = true
   try {
     // 处理时间范围
-    if (createTime.value) {
-      queryParams.startTime = dateFormatter(createTime.value[0])
-      queryParams.endTime = dateFormatter(createTime.value[1])
+    if (createTime.value && Array.isArray(createTime.value) && createTime.value.length === 2) {
+      const [start, end] = createTime.value;
+      if (start && end) {
+        // 使用专门的接口日期格式化函数
+        queryParams.startTime = formatDate(start);
+        queryParams.endTime = formatDate(end);
+      }
     }
     const data = await HardwareApi.listHardware(queryParams)
     list.value = data.list

+ 1 - 1
src/views/hw/hardware/lockset/LocksetForm.vue

@@ -213,7 +213,7 @@ const getLockTypeList = async () => {
 const getMaterialList = async () => {
   const data = { pageNo: 1, pageSize: -1 }
   const response = await MaterialApi.listMaterials(data)
-  materialsOptions.value = response.records.map(item => ({
+  materialsOptions.value = response.list.map(item => ({
     value: item.materialsCabinetId,
     label: item.materialsName
   }))

+ 5 - 5
src/views/hw/type/padlocktype/index.vue

@@ -55,8 +55,8 @@
       :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
     >
 <!--      <el-table-column prop="lockTypeCode" label="挂锁类型编码" width="260" align="center" />-->
-      <el-table-column prop="lockTypeName" label="挂锁类型名称" width="260" align="center" />
-      <el-table-column label="挂锁类型图标" width="260" align="center">
+      <el-table-column prop="lockTypeName" label="挂锁类型名称"  align="center" />
+      <el-table-column label="挂锁类型图标"  align="center">
         <template #default="{ row }">
           <el-image
             v-if="row.lockTypeIcon"
@@ -66,7 +66,7 @@
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column label="挂锁类型图片" width="260" align="center">
+      <el-table-column label="挂锁类型图片"  align="center">
         <template #default="{ row }">
           <el-image
             v-if="row.lockTypeImg"
@@ -76,8 +76,8 @@
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column prop="lockTypeSpec" label="挂锁型号" width="260" align="center" />
-      <el-table-column label="操作" align="center" width="200">
+      <el-table-column prop="lockTypeSpec" label="挂锁型号"  align="center" />
+      <el-table-column label="操作" align="center" >
         <template #default="scope">
           <el-button
             link

+ 3 - 3
src/views/sopm/sop/PointView/CardView.vue

@@ -59,9 +59,9 @@
                 删除分组
               </div>
             </div>
-            <div class="tab-content2">
+            <div class="tab-content2"  >
               <!-- 分组内容 - 使用 vue-konva 渲染点位 -->
-              <v-stage :config="{ width: 380, height: 220 }" class="right-konva-container">
+              <v-stage :config="{ width: 600, height: 220,}" class="right-konva-container">
                 <v-layer>
                   <template v-for="(pointId, index) in group.pointIds" :key="pointId">
                     <v-group
@@ -305,7 +305,7 @@ const getTextConfig = (point: any) => ({
 
 // 右侧分组内点位的 group 配置
 const getGroupPointConfig = (pointId: number, index: number) => {
-  const itemsPerRow = Math.floor(280 / (groupPointWidth + groupPointGapX))
+  const itemsPerRow = Math.floor(380 / (groupPointWidth + groupPointGapX))
   const row = Math.floor(index / itemsPerRow)
   const col = index % itemsPerRow
   return {