获取设备列表、切换设备列表、开始生产接口和逻辑修改、结束任务联调、工艺信息联调、切换任务联调
13个文件已修改
316 ■■■■ 已修改文件
src/api/index.ts 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/task.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/craftModel.ts 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/devices.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/tasks.ts 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/ChannelCollapse.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/DeviceCheckList.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/ProcessInfo.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/ReportingRecordModal.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/TaskControl.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/TaskControlModal.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/components/TaskInfo.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.ts
@@ -1,5 +1,5 @@
import { request } from '@/common/utils'
import type { CraftParamsResponse, TasksGroupByChannel } from './task'
import type { CraftParamsResponse, TasksGroupByChannel, Task } from './task'
import type { PLCResponse } from './plc'
import type { Devices } from './device'
import type { CraftModel } from './craftModel'
@@ -28,6 +28,8 @@
  offset: number
  /** 查多少条 */
  limit: number
  /** 设备id */
  deviceID: string
}
/**
@@ -37,6 +39,25 @@
export function getTaskList(params: TaskListParams) {
  return request<BaseResponse<TasksGroupByChannel>>({
    url: '/api-s/v1/reportWork/taskList',
    method: 'get',
    params
  })
}
export interface TaskInfoParams {
  /** 设备id */
  deviceID: string
  /** 工序id */
  procedureID: number
}
/**
 * 获取任务详情
 * @param params
 */
export function getTaskInfo(params: TaskInfoParams) {
  return request<BaseResponse<Task>>({
    url: '/api-s/v1/reportWork/taskInfo',
    method: 'get',
    params
  })
@@ -106,6 +127,24 @@
  })
}
export interface ProcedureUpdateParams {
  isFinish: boolean
  isProcessing: boolean
  workOrderProcedureID: number
}
/**
 * 开始任务/完成任务 (原 获取工艺参数/结束任务)
 * @param params
 */
export function procedureUpdate(params: ProcedureUpdateParams) {
  return request<BaseResponse>({
    url: `/api-s/v1/reportWork/procedureUpdate`,
    method: 'post',
    data: params
  })
}
/**
 * 获取当前面板绑定的设备列表
 */
@@ -125,7 +164,7 @@
 */
export function apiSetCurrentDevice(data: SetCurrentDeviceParams) {
  return request<BaseResponse>({
    url: `/v1/device/setCurrentDeviceId`,
    url: `/api-s/v1/reportWork/setCurrentDeviceId`,
    method: 'post',
    data
  })
@@ -193,7 +232,7 @@
export interface ReportingRecordListParams {
  page?: number
  pageSize?: number
  procedureId: number
  workOrderProcedureID: number
}
/**
@@ -201,16 +240,17 @@
 */
export function apiGetReportingRecordList(params: ReportingRecordListParams) {
  return request<ListResponse<ReportingRecord[]>>({
    url: '/v1/reportWork/list',
    url: '/api-s/v1/reportWork/list',
    method: 'get',
    params
  })
}
export interface ReportWorkParams {
  procedureId: number
  workOrderProcedureID: number
  reportAmount: number
  workerID: string
  workerName: string
}
/**
@@ -218,7 +258,7 @@
 */
export function apiReportWork(params: ReportWorkParams) {
  return request<BaseResponse>({
    url: '/v1/reportWork/report',
    url: '/api-s/v1/reportWork/report',
    method: 'post',
    data: params
  })
src/api/task.ts
@@ -35,6 +35,7 @@
  /** 1 未生产 2生产中 3生产完成*/
  Status: 1 | 2 | 3
  procedure: ProcedureProcedure
  productProcedureID: string
}
export interface ProcedureProcedure {
@@ -54,6 +55,16 @@
  channel: number
}
export interface ParamsMap {
  [keyProp: string]: string
}
export interface ProcedureModel {
  number: string
  product: string
  procedure: string
  paramsMap: ParamsMap
}
export interface Task {
  Order: Order
  Procedure: Procedure
@@ -61,6 +72,7 @@
  AllProcedures: string[]
  CurrentProcedureIndex: number
  CanStarted: boolean
  ProcedureModel: ProcedureModel
}
export interface Material {
  materialId: string
src/stores/craftModel.ts
@@ -13,14 +13,35 @@
  function getCraftModelList() {
    if (taskStore.activeTask?.Procedure.ID) {
      craftModelList.value = []
      apiGetCraftModelList({
        procedureId: taskStore.activeTask?.Procedure.ID,
        page: page.value,
        pageSize: 6
      }).then((res) => {
        craftModelList.value = res.data ?? []
        total.value = res.total
      })
      console.log(taskStore, '8877994455')
      const procedureModel = taskStore.activeTask?.ProcedureModel
      const craftObj = [
        {
          ID: Number(taskStore.activeTask?.Procedure?.productProcedureID),
          CreatedAt: taskStore.activeTask?.Procedure?.CreatedAt,
          UpdatedAt: taskStore.activeTask?.Procedure?.UpdatedAt,
          DeletedAt: taskStore.activeTask?.Procedure?.DeletedAt,
          number: procedureModel?.number,
          product: procedureModel?.product,
          procedure: procedureModel?.procedure,
          Params: '',
          paramsMap: procedureModel?.paramsMap,
          deviceId: '',
          isUpdate: false,
          newParamsMap: '',
          newNumber: ''
        }
      ]
      craftModelList.value = craftObj ?? []
      // apiGetCraftModelList({
      //   procedureId: taskStore.activeTask?.Procedure.ID,
      //   page: page.value,
      //   pageSize: 6
      // }).then((res) => {
      //   craftModelList.value = res.data ?? []
      //   total.value = res.total
      // })
    }
  }
@@ -40,18 +61,19 @@
    if (taskStore.activeTask?.Procedure.ID && !loading.value && hasMore.value) {
      page.value++
      loading.value = true
      apiGetCraftModelList({
        procedureId: taskStore.activeTask?.Procedure.ID,
        page: page.value,
        pageSize: 6
      })
        .then((res) => {
          craftModelList.value = [...craftModelList.value, ...(res.data ?? [])]
          total.value = res.total
        })
        .finally(() => {
          loading.value = false
        })
      console.log(taskStore, '998877994455')
      // apiGetCraftModelList({
      //   procedureId: taskStore.activeTask?.Procedure.ID,
      //   page: page.value,
      //   pageSize: 6
      // })
      //   .then((res) => {
      //     craftModelList.value = [...craftModelList.value, ...(res.data ?? [])]
      //     total.value = res.total
      //   })
      //   .finally(() => {
      //     loading.value = false
      //   })
    }
  }
src/stores/devices.ts
@@ -25,11 +25,14 @@
    data: deviceRes,
    run: startDevicePolling,
    cancel: cancelDevicePolling
  } = useRequest(getDeviceList, {
    manual: true,
    pollingInterval: DEVICE_INFO_POLLING_DURATION,
    pollingWhenHidden: false
  })
  } = useRequest(
    getDeviceList
    //   {
    //   manual: true,
    //   pollingInterval: DEVICE_INFO_POLLING_DURATION,
    //   pollingWhenHidden: false
    // }
  )
  function startPollingDevice() {
    cancelDevicePolling()
src/stores/tasks.ts
@@ -1,8 +1,8 @@
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import type { Task, TasksGroupByChannel, TasksResponse } from '@/api/task'
import type { TaskListParams } from '@/api'
import { getTaskList } from '@/api'
import type { TaskListParams, TaskInfoParams } from '@/api'
import { getTaskList, getTaskInfo } from '@/api'
import { isNumber } from 'lodash-es'
export interface ChannelMoreBtnStatus {
@@ -25,7 +25,8 @@
    const params: TaskListParams = {
      type,
      offset: 0,
      limit: 3
      limit: 3,
      deviceID: localStorage.getItem('currentDeviceID') || ''
    }
    return getTaskList(params)
      .then((res) => {
@@ -52,8 +53,20 @@
    if (firstNotEmptyChannel) {
      const channelNumber = +firstNotEmptyChannel[0]
      activeTask.value = channels[channelNumber].Tasks[0]
      setActiveChannel(channelNumber)
      // activeTask.value = channels[channelNumber].Tasks[0]
      console.log(channels[channelNumber].Tasks[0].Procedure.ID, '1111')
      const params: TaskInfoParams = {
        deviceID: localStorage.getItem('currentDeviceID') || '',
        procedureID: channels[channelNumber].Tasks[0].Procedure.ID
      }
      return getTaskInfo(params)
        .then((res) => {
          activeTask.value = res.data
        })
        .catch((err) => {
          console.error(err)
        })
        .finally(() => {})
    } else {
      // 如果没有任务就清空当前选中的任务
      activeTask.value = undefined
@@ -69,8 +82,19 @@
  function autoSelectTask(channel: number) {
    const currentChannelTaskList = channels.value[channel].Tasks
    if (currentChannelTaskList?.length) {
      activeTask.value = currentChannelTaskList[0]
      setActiveChannel(channel)
      // activeTask.value = currentChannelTaskList[0].Procedure.ID
      const params: TaskInfoParams = {
        deviceID: localStorage.getItem('currentDeviceID') || '',
        procedureID: currentChannelTaskList[0].Procedure.ID
      }
      return getTaskInfo(params)
        .then((res) => {
          activeTask.value = res.data
        })
        .catch((err) => {
          console.error(err)
        })
        .finally(() => {})
    } else {
      const firstNotEmptyChannel = Object.entries(channels.value).find((ele) => {
        const taskList = (ele[1] as TasksResponse)?.Tasks
@@ -105,7 +129,8 @@
      type: currentType.value,
      channel: channelNumber,
      offset: taskLength,
      limit: 10
      limit: 10,
      deviceID: localStorage.getItem('currentDeviceID') || ''
    }
    getTaskList(params)
      .then((res) => {
src/views/dashboard/components/ChannelCollapse.vue
@@ -45,6 +45,9 @@
import { useTasksStore } from '@/stores/tasks'
import { ArrowDownBold, ArrowUpBold } from '@element-plus/icons-vue'
import { isNumber } from 'lodash-es'
import { getTaskInfo } from '@/api'
import type { TaskInfoParams } from '@/api'
import { storeToRefs } from 'pinia'
export interface ChannelCollapseProps {
  channels: TasksGroupByChannel
@@ -54,6 +57,7 @@
const activeChannel = ref<string[]>([])
const tasksStore = useTasksStore()
const { activeTask } = storeToRefs(tasksStore)
watchEffect(() => {
  // 通道数据变化后
@@ -67,11 +71,26 @@
}
function selectTask(task: Task | undefined) {
  tasksStore.setActiveTask(task)
  let channel = tasksStore?.activeTask?.Channel
  if (isNumber(channel)) {
    tasksStore.setActiveChannel(channel)
  console.log(task, 'iiiiiii')
  const params: TaskInfoParams = {
    deviceID: localStorage.getItem('currentDeviceID') || '',
    procedureID: Number(task?.Procedure.ID)
  }
  return getTaskInfo(params)
    .then((res) => {
      tasksStore.setActiveTask(res.data)
      let channel = tasksStore?.activeTask?.Channel
      if (isNumber(channel)) {
        tasksStore.setActiveChannel(channel)
      }
      // taskStore.activeTask?.value = res.data
    })
    .catch((err) => {
      console.error(err)
    })
    .finally(() => {})
  // tasksStore.setActiveTask(task)
}
</script>
src/views/dashboard/components/DeviceCheckList.vue
@@ -76,6 +76,7 @@
    })
    return
  }
  localStorage.setItem('currentDeviceID', selectedDevice.value || '')
  apiSetCurrentDevice({ currentDeviceID: selectedDevice.value })
    .then(() => {
      ElMessage({
src/views/dashboard/components/ProcessInfo.vue
@@ -13,17 +13,14 @@
    </div>
    <div v-if="craftModel.number == task?.Procedure?.processModelNumber" class="tip-current">当前使用</div>
    <div class="btn">
      <el-button
      <!-- <el-button
        type="primary"
        :loading="loading"
        :disabled="craftModel.isUpdate ? false : true"
        @click="onUpdateClick"
      >
        <!-- <el-icon v-if="loading" color="#fff" :size="16" class="refresh-top-icon">
          <Loading />
        </el-icon> -->
        更新工艺
      </el-button>
      </el-button> -->
    </div>
  </div>
</template>
src/views/dashboard/components/ReportingRecordModal.vue
@@ -78,7 +78,7 @@
    return
  }
  apiGetReportingRecordList({
    procedureId: procedureId
    workOrderProcedureID: procedureId
  })
    .then((res) => {
      if (res.code === 200) {
src/views/dashboard/components/TaskControl.vue
@@ -59,7 +59,7 @@
import { useDateFormat } from '@vueuse/core'
import TaskControlModal from '@/views/dashboard/components/TaskControlModal.vue'
import { CircleCloseFilled } from '@element-plus/icons-vue'
import { apiReportWork, finishTask } from '@/api'
import { apiReportWork, procedureUpdate } from '@/api'
import { ElMessage } from 'element-plus'
import ReportProductionModal from '@/views/dashboard/components/ReportProductionModal.vue'
import { usePLCStore } from '@/stores/plc'
@@ -103,7 +103,11 @@
        return true
      }
    }
    finishTask({ id: task!.value.Procedure.ID }).then(
    procedureUpdate({
      isFinish: true,
      isProcessing: false,
      workOrderProcedureID: Number(task!.value.Procedure.ID)
    }).then(
      (res) => {
        ElMessage({
          message: '操作成功!',
@@ -190,9 +194,10 @@
  // 有人员才可以报工
  if (workers.value[0].workerId) {
    apiReportWork({
      procedureId: task.value?.Procedure.ID,
      workOrderProcedureID: Number(task.value?.Procedure.ID),
      reportAmount: amount,
      workerID: workers.value[0].workerId
      workerID: workers.value[0].workerId,
      workerName: workers.value[0].workerName
    })
      .then((res) => {
        if (res.code === 200) {
src/views/dashboard/components/TaskControlModal.vue
@@ -7,7 +7,7 @@
      <div class="modal-content">
        <template v-if="['初始化', '计时中', '准备生产', '下发参数中'].includes(state.value as string)">
          <div class="content-title">
            <div class="content-title-item">当前任务:{{ task?.Procedure.procedure.procedureName || '' }}</div>
            <div class="content-title-item">当前任务:{{ task?.Procedure?.procedure?.procedureName || '' }}</div>
            <div class="content-title-item">
              生产数量:
              <div class="leaf-shape">
@@ -26,11 +26,11 @@
                    <div class="info-item">产品名称:{{ task.Order.productName || '' }}</div>
                    <div class="info-item">数量:{{ task.Order.amount || 0 }}{{ task.Order.unit }}</div>
                    <div class="info-item">交货日期:{{ task.Order.deliverDate || '' }}</div>
                    <div class="info-item">工时: {{ task.Procedure.procedure.workHours || '' }}</div>
                    <div class="info-item">工时: {{ task?.Procedure?.procedure?.workHours || '' }}</div>
                    <div class="info-item">
                      计划时间: {{ formatDate(task.Procedure.startTime) || '' }}
                      计划时间: {{ formatDate(task?.Procedure?.startTime) || '' }}
                      -
                      {{ formatDate(task.Procedure.endTime) }}
                      {{ formatDate(task?.Procedure?.endTime) }}
                    </div>
                    <div class="info-item">客户名称:{{ task.Order.customer || '' }}</div>
@@ -157,7 +157,7 @@
import { ref, toRefs, watch } from 'vue'
import BigButton from '@/views/dashboard/components/BigButton.vue'
import { CHANNEL_NAME_MAP } from '@/common/constants'
import { getCraftParams, sendProcessParams } from '@/api'
import { procedureUpdate, sendProcessParams } from '@/api'
import { useCountDown } from '@/common/composable'
import { storeToRefs } from 'pinia'
import { useTasksStore } from '@/stores/tasks'
@@ -210,18 +210,6 @@
  if (taskId) {
    craftParams.value = []
    getCraftParamsTip.value = ''
    getCraftParams({ id: taskId }).then(
      (res) => {
        craftParams.value = res.data.Params ?? []
        getCraftParamsTip.value = ''
      },
      (err) => {
        console.error(err)
        craftParams.value = []
        getCraftParamsTip.value = '获取工艺参数失败!'
      }
    )
  }
}
@@ -341,22 +329,38 @@
function startProduce() {
  send('开始生产')
  sendProcessParams({
    procedureId: task!.value!.Procedure.ID
  })
    .then(
      (res) => {
        deliveryTip.value = '下发成功'
        send('成功')
        countdown3s.startCountdown()
      },
      (err) => {
        console.error(err)
        deliveryTip.value = err.msg ? err.msg : '抱歉,工序下发失败!'
        send('失败')
      }
    )
    .finally(() => {})
  procedureUpdate({
    isFinish: false,
    isProcessing: true,
    workOrderProcedureID: Number(task!.value!.Procedure.ID)
  }).then(
    (res) => {
      deliveryTip.value = '下发成功'
      send('成功')
      countdown3s.startCountdown()
    },
    (err) => {
      console.error(err)
      deliveryTip.value = err.msg ? err.msg : '抱歉,工序下发失败!'
      send('失败')
    }
  )
  // sendProcessParams({
  //   procedureId: task!.value!.Procedure.ID
  // })
  //   .then(
  //     (res) => {
  //       deliveryTip.value = '下发成功'
  //       send('成功')
  //       countdown3s.startCountdown()
  //     },
  //     (err) => {
  //       console.error(err)
  //       deliveryTip.value = err.msg ? err.msg : '抱歉,工序下发失败!'
  //       send('失败')
  //     }
  //   )
  //   .finally(() => {})
}
/**
src/views/dashboard/components/TaskInfo.vue
@@ -23,7 +23,7 @@
      <div class="row">
        <div class="col">
          当前任务:
          <span>{{ task.Procedure.procedure.procedureName || '' }}</span>
          <span>{{ task.Procedure?.procedure?.procedureName || '' }}</span>
        </div>
        <div class="col">
          产品名称:
src/views/dashboard/index.vue
@@ -45,11 +45,11 @@
        </el-tab-pane>
        <el-tab-pane label="物料清单" name="物料清单">
          <InputMaterialsList
            :material-list="activeTask?.Procedure.procedure.inputMaterials"
            :material-list="activeTask?.Procedure?.procedure?.inputMaterials"
            @detail-click="showMaterialDetailModal"
          ></InputMaterialsList>
          <OutputMaterialsList
            :material-list="activeTask?.Procedure.procedure.outputMaterials"
            :material-list="activeTask?.Procedure?.procedure?.outputMaterials"
            @detail-click="showMaterialDetailModal"
          ></OutputMaterialsList>
        </el-tab-pane>
@@ -77,8 +77,8 @@
    <template #rightBlock2>
      <DeviceStatusInfo :type="1"></DeviceStatusInfo>
      <DeviceStatusInfo :device="deviceStore.deviceInfo" :type="2"></DeviceStatusInfo>
      <DeviceNumberInfo></DeviceNumberInfo>
    </template>
      <DeviceNumberInfo></DeviceNumberInfo> </template
    >当前任务:
    <template #rightBlock3>
      <SubTitle>知识库</SubTitle>
      <div class="task-detail-right-3">
@@ -187,6 +187,8 @@
// 启动 设备 轮询
const deviceStore = useDevicesStore()
deviceStore.startPollingDevice()
// console.log(deviceStore, '1111')
// localStorage.setItem('currentDeviceID', deviceStore.deviceInfo.currentDeviceID)
// 切换任务时获取对应任务的工艺模型信息
const craftModelStore = useCraftModelStore()
@@ -249,7 +251,9 @@
const currentWorkers = computed(() => {
  const channel = activeTask.value?.Channel
  if (isNumber(channel)) {
    return channels.value[channel].workers ?? []
    console.log(activeTask.value?.Procedure?.procedure?.workers, '99999')
    // return []
    return activeTask.value?.Procedure?.procedure?.workers ?? []
  } else {
    return []
  }