车间能级提升-智能设备管理系统
zhuguifei
2025-04-29 d28bb7d7acdc4d27a553e5b6b2458d5e7ec43165
完成设备维修工单
已添加2个文件
已修改8个文件
915 ■■■■■ 文件已修改
eims-ui-mobile/src/pages.json 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/login/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/repair/feedback.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/repair/res-detail.vue 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/repair/res-list.vue 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/repair.d.ts 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/repair.ts 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/types/uni-pages.d.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages.json
@@ -209,6 +209,31 @@
      }
    },
    {
      "path": "pages/repair/feedback",
      "type": "page",
      "layout": "default",
      "needLogin": true,
      "style": {
        "navigationBarTitleText": "维修评价",
        "app-plus": {
          "titleNView": {
            "buttons": [
              {
                "text": "提交",
                "fontSize": "14px",
                "color": "#FFFFFF"
              },
              {
                "text": "",
                "fontSize": "14px",
                "color": "#FFFFFF"
              }
            ]
          }
        }
      }
    },
    {
      "path": "pages/repair/repair-add",
      "type": "page",
      "layout": "default",
@@ -258,6 +283,31 @@
      }
    },
    {
      "path": "pages/repair/res-detail",
      "type": "page",
      "layout": "default",
      "needLogin": true,
      "style": {
        "navigationBarTitleText": "维修明细",
        "app-plus": {
          "titleNView": {
            "buttons": [
              {
                "text": "提交",
                "fontSize": "14px",
                "color": "#FFFFFF"
              },
              {
                "text": "保存",
                "fontSize": "14px",
                "color": "#FFFFFF"
              }
            ]
          }
        }
      }
    },
    {
      "path": "pages/repair/res-list",
      "type": "page",
      "layout": "default",
eims-ui-mobile/src/pages/login/index.vue
@@ -42,10 +42,7 @@
      </wd-button>
      <view class="copyright-info">
        <text>
          ä¸Šæµ·å…°å®ä¼ æ„Ÿç§‘技股份有限公司
        </text>
        <text>上海兰宝传感科技股份有限公司</text>
      </view>
    </view>
  </wd-form>
@@ -129,7 +126,7 @@
  }
  userStore.setUserInfo(userInfo)
  const { query } = currRoute()
  uni.switchTab({ url: query.redirect })
  uni.switchTab({ url: '/pages/home/index' })
}
</script>
eims-ui-mobile/src/pages/repair/feedback.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
<route lang="json5" type="page">
{
  layout: 'default',
  needLogin: true,
  style: {
    navigationBarTitleText: '维修评价',
    'app-plus': {
      titleNView: {
        buttons: [
          {
            text: '提交',
            fontSize: '14px',
            color: '#FFFFFF',
          },
          {
            text: '',
            fontSize: '14px',
            color: '#FFFFFF',
          },
        ],
      },
    },
  },
}
</route>
<template>
  <view class="bg-base">
    <wd-card type="rectangle">
      <template #title>
        <view class="flex items-center menu-title-box">
          <view class="menu-indicator"></view>
          <view class="ml-1 text-xs">维修概览</view>
        </view>
      </template>
      <wd-steps :active="repairRecordList.length" vertical class="px-4">
        <wd-step v-for="(item,index) in repairRecordList"   >
          <template #title>
            <view class="flex items-center menu-title-box">
              <view class="ml-1 text-xs">{{ item?.operaResult }}</view>
            </view>
          </template>
          <template #description>
            <view class="flex items-center menu-title-box">
              <view class="ml-1 text-xs">{{ item?.operaUserName }}</view>
              <view class="ml-1 text-xs">{{ item?.handleTime }}</view>
            </view>
          </template>
        </wd-step>
      </wd-steps>
    </wd-card>
    <wd-cell-group use-slot border>
      <template #title>
        <view class="flex items-center menu-title-box">
          <view class="menu-indicator"></view>
          <view class="ml-1 text-xs">维修概览</view>
        </view>
      </template>
      <wd-cell title="维修满意度">
        <wd-rate v-model="repairFb.repairSatisfaction" change="handleChange"></wd-rate>
      </wd-cell>
      <wd-cell title="维修及时性">
        <wd-rate v-model="repairFb.repairTimeliness" change="handleChange"></wd-rate>
      </wd-cell>
      <wd-cell title="维修及态度">
        <wd-rate v-model="repairFb.serviceAttitude" change="handleChange"></wd-rate>
      </wd-cell>
      <wd-cell title="维修现场6S">
        <wd-rate v-model="repairFb.repairSs" change="handleChange"></wd-rate>
      </wd-cell>
      <wd-textarea
        label="结果反馈"
        label-width="200rpx"
        type="textarea"
        v-model="repairFb.fbResult"
        auto-height
        :maxlength="200"
        show-word-limit
        placeholder="请输入结果反馈"
        clearable
      />
      <wd-textarea
        label="意见或建议"
        label-width="200rpx"
        type="textarea"
        v-model="repairFb.suggestions"
        auto-height
        :maxlength="200"
        show-word-limit
        placeholder="请输入意见或建议"
        clearable
      />
    </wd-cell-group>
  </view>
</template>
<script setup lang="ts">
import { getRepairRes, getRepairFb, getRepairRecordList } from '@/service/repair'
import { reactive } from 'vue'
import { RepairResVO, RepairFbVO, RepairRecordVO } from '@/service/repair.d'
const repairRes = reactive<RepairResVO>({
  id: '',
  resCode: '',
  reqType: '',
  reqDesc: '',
  equName: '',
  assetNo: '',
  fixtureName: '',
  resReason: '',
  status: '',
  resHandle: '',
  resPrevent: '',
  fbId: '',
  remark: '',
})
const repairFb = reactive<RepairFbVO>({
  id: '',
  resCode: '',
  fbResult: '',
  suggestions: '',
  repairSatisfaction: 0,
  repairTimeliness: 0,
  serviceAttitude: 0,
  repairSs: 0,
})
const repairRecordList = ref<RepairRecordVO[]>([])
function handleChange({ value }) {
  console.log(value)
}
function getRepairRecord() {
  if(!repairRes.id){
     return false
  }
  const params = {
    resId: repairRes.id,
  }
  getRepairRecordList(params)
    .then((res: any) => {
      console.error(res)
      if(res?.code === 200){
        repairRecordList.value = res?.rows?.sort((a, b) => {
          if (a.handleTime < b.handleTime) {
            return -1
          }
          if (a.handleTime > b.handleTime) {
            return 1
          }
          return 0
        })
      }
    })
    .catch((res) => {})
}
function initRepairRes(id: any) {
  getRepairRes(id)
    .then((res: any) => {
      Object.assign(repairRes, res)
      if (repairRes.fbId != null) {
        getFeedBack(repairRes.fbId)
      }
      getRepairRecord()
    })
    .catch((res) => {})
}
function getFeedBack(id: any) {
  getRepairFb(id)
    .then((res: any) => {
      Object.assign(repairFb, res)
    })
    .catch((res) => {})
}
async function initData(options: any) {
  initRepairRes(options.id)
}
onLoad((options) => {
  initData(options)
})
</script>
<style scoped lang="scss">
.menu-indicator {
  width: 6rpx;
  height: 24rpx;
  border-radius: 10rpx;
  background-color: $uni-color-primary;
}
</style>
eims-ui-mobile/src/pages/repair/res-detail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,273 @@
<route lang="json5" type="page">
{
  layout: 'default',
  needLogin: true,
  style: {
    navigationBarTitleText: '维修明细',
    'app-plus': {
      titleNView: {
        buttons: [
          {
            text: '提交',
            fontSize: '14px',
            color: '#FFFFFF',
          },
          {
            text: '保存',
            fontSize: '14px',
            color: '#FFFFFF',
          },
        ],
      },
    },
  },
}
</route>
<template>
  <view class="bg-base container" safeAreaInsetTopBottom>
    <wd-form ref="form" :model="repairRes" :rules="rules">
      <wd-cell-group custom-class="group" title="报修信息" border>
        <wd-cell title="故障类型" title-width="200rpx" is-link>
          <text>{{ reqType?.dictLabel }}</text>
        </wd-cell>
        <wd-cell title="报修描述" :label="repairRes?.reqDesc" is-link />
      </wd-cell-group>
      <wd-cell-group
        v-if="repairRes?.reqType === '1'"
        custom-class="mt-2"
        title="设备信息"
        use-slot
        border
      >
        <wd-cell title="设备名称" title-width="200rpx" is-link>
          <text>{{ repairRes?.equName }}</text>
        </wd-cell>
        <wd-cell title="资产编号" title-width="200rpx" is-link>
          <text>{{ repairRes?.assetNo }}</text>
        </wd-cell>
      </wd-cell-group>
      <wd-cell-group
        v-if="repairRes?.reqType === '2'"
        custom-class="mt-2"
        title="工具信息"
        use-slot
        border
      >
        <wd-cell title="工具名称" title-width="200rpx" is-link>
          <text>{{ repairRes?.fixtureName }}</text>
        </wd-cell>
        <wd-cell title="资产编号" title-width="200rpx" is-link>
          <text>{{ repairRes?.assetNo }}</text>
        </wd-cell>
      </wd-cell-group>
      <wd-cell-group custom-class="mt-2" title="维修信息" use-slot border>
        <wd-textarea
          label="原因分析"
          label-width="200rpx"
          type="textarea"
          v-model="repairRes.resReason"
          auto-height
          :maxlength="200"
          show-word-limit
          placeholder="请输入原因分析"
          clearable
        />
        <wd-textarea
          label="处理措施"
          label-width="200rpx"
          type="textarea"
          v-model="repairRes.resHandle"
          auto-height
          :maxlength="200"
          show-word-limit
          placeholder="请输入处理措施"
          clearable
        />
        <wd-textarea
          label="预防措施"
          label-width="200rpx"
          type="textarea"
          v-model="repairRes.resPrevent"
          auto-height
          :maxlength="200"
          show-word-limit
          placeholder="请输入预防措施"
          clearable
        />
        <wd-textarea
          label="备注"
          label-width="200rpx"
          type="textarea"
          v-model="repairRes.remark"
          auto-height
          :maxlength="200"
          show-word-limit
          placeholder="请输入备注"
          clearable
        />
      </wd-cell-group>
      <view class="h-[2px] w-full bg-base"></view>
    </wd-form>
  </view>
</template>
<script setup lang="ts">
import { getRepairRes, updateRepairRes } from '@/service/repair'
import { RepairResVO } from '@/service/repair.d'
import { reactive, onMounted, ref } from 'vue'
import { FormRules } from 'wot-design-uni/components/wd-form/types'
import { useToast, useMessage } from 'wot-design-uni'
import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
import { DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
import { formatDate } from '@/utils/DateUtils'
const toast = useToast()
const message = useMessage()
const fileList = ref<[]>()
// æŠ¥ä¿®å•类型
const reqTypeList = ref<any>([])
const repairRes = reactive<RepairResVO>({
  id: '',
  resCode: '',
  reqType: '',
  reqDesc: '',
  equName: '',
  assetNo: '',
  fixtureName: '',
  resReason: '',
  status: '',
  resHandle: '',
  resPrevent: '',
  remark: '',
})
const rules: FormRules = {
  startTime: [
    {
      required: true,
      message: '请选择保养开始时间',
    },
  ],
}
function handleFileChange({ fileList }) {}
function initRepairRes(id: any) {
  getRepairRes(id)
    .then((res: any) => {
      Object.assign(repairRes, res)
    })
    .catch((res) => {})
}
async function initData(options: any) {
  initRepairRes(options.id)
  const reqList = await getDictInfo(DICT_REPAIR_REQ_TYPE)
  reqTypeList.value = reqList
}
function hanldeUpdateRepairRes(data: any, resolve: any) {
  updateRepairRes(data)
    .then((res: any) => {
      resolve(true)
      toastSucces()
      uni.$emit('res-list-refresh')
    })
    .catch((res) => {
      console.error(res)
    })
}
function toastSucces() {
  toast.success('操作成功')
}
function handleClickRight(data: any) {
  message
    .confirm({
      msg: '确定提交?',
      title: '提示',
      beforeConfirm: ({ resolve }) => {
        hanldeUpdateRepairRes(data, resolve)
      },
    })
    .then(() => {})
    .catch((error) => {
      console.log(error)
    })
}
onNavigationBarButtonTap((e) => {
  if (e.index === 0) {
    // ç®¡ç†å‘˜è§’色
    if (isLeader()) {
      toast.warning('当前登录角色不可操作')
    } else if (isOperatorOrRepair()) {
      switch (repairRes.status) {
        // å·²æŽ¥å•
        case '1':
          break
        // ç»´ä¿®ä¸­
        case '2':
          {
            const data = Object.assign({}, repairRes)
            // æäº¤ä¿®æ”¹çŠ¶æ€ä¸ºå®Œæˆ
            data.status = '3'
            // è®¾ç½®ç»´ä¿®å®Œæˆæ—¶é—´
            data.endTime = formatDate(new Date())
            handleClickRight(data)
          }
          break
        // å·²å®Œæˆ
        case '3':
          toast.warning('当前维修工单完成状态,不可操作')
          break
      }
    }
  } else if (e.index === 1) {
    if (isLeader()) {
      toast.warning('当前登录角色不可操作')
    } else if (isOperatorOrRepair()) {
      switch (repairRes.status) {
        // å·²æŽ¥å•
        case '1':
          break
        // ç»´ä¿®ä¸­
        case '2':
          {
            const data = Object.assign({}, repairRes)
            data.status = '2'
            // ä»…保存不修改状态
            handleClickRight(data)
          }
          break
        // å·²å®Œæˆ
        case '3':
          toast.warning('当前维修工单完成状态,不可操作')
          break
      }
    }
  }
})
const reqType = computed(() =>
  reqTypeList.value.find((item) => item.dictValue === repairRes.reqType),
)
onMounted(() => {})
onLoad((options) => {
  initData(options)
})
</script>
<style scoped lang="scss">
.container {
}
</style>
eims-ui-mobile/src/pages/repair/res-list.vue
@@ -61,7 +61,7 @@
            </view>
          </view>
        </template>
        <view class="flex h-[240rpx] items-center" @click.stop="itemClick(item)">
        <view class="flex h-[240rpx] items-center">
          <image
            v-if="item.reqType === '1'"
            class="slot-img text-center"
@@ -102,10 +102,10 @@
              </view>
              <view class="text-color-gray mt-1 text-mini">
                <text>开始时间: {{ item.startTime }}</text>
                <text>维修开始: {{ item.startTime }}</text>
              </view>
              <view class="text-color-gray mt-1 text-mini">
                <text>完成时间: {{ item.endTime }}</text>
                <text>维修结束: {{ item.endTime }}</text>
              </view>
              <view class="text-color-gray mt-1 text-mini">
                <text>维修人: {{ item.resUserName }}</text>
@@ -113,9 +113,75 @@
            </view>
          </view>
          <view>
            <wd-button v-if="item.status === '1'"  size="small" icon="edit-outline">开始维修</wd-button>
            <wd-button v-if="item.status === '2'"  size="small" icon="edit-outline">维修中</wd-button>
            <wd-button v-if="item.status === '3'"  size="small" icon="edit-outline">已完成</wd-button>
            <!--操作工或维修工角色-->
            <template v-if="isOperatorOrRepair()">
              <wd-button
                v-if="item.status === '1'"
                size="small"
                icon="edit-outline"
                @click.stop="handleStartRepair(item)"
              >
                å¼€å§‹ç»´ä¿®
              </wd-button>
              <wd-button
                v-else-if="item.status === '2'"
                size="small"
                icon="edit-outline"
                @click.stop="itemClick(item)"
              >
                ç»´ä¿®ä¸­
              </wd-button>
              <view class="h-full flex flex-col" v-else-if="item.status === '3'">
                <wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
                  è¯¦æƒ…
                </wd-button>
                <wd-button
                  class="mt-4"
                  size="small"
                  icon="edit-outline"
                  @click.stop="goToFeedBack(item)"
                  v-if="item.fbId === null"
                >
                  å†™è¯„ä»·
                </wd-button>
              </view>
            </template>
            <!--管理员角色-->
            <template v-else-if="isLeader()">
              <wd-button
                v-if="item.status === '1'"
                size="small"
                icon="warn-bold"
                disabled
                @click.stop="itemClick(item)"
              >
                å¾…ç»´ä¿®
              </wd-button>
              <wd-button
                v-else-if="item.status === '2'"
                size="small"
                icon="warn-bold"
                disabled
                @click.stop="itemClick(item)"
              >
                ç»´ä¿®ä¸­
              </wd-button>
              <view class="h-full flex flex-col" v-else-if="item.status === '3'">
                <wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
                  è¯¦æƒ…
                </wd-button>
                <wd-button
                  class="mt-4"
                  size="small"
                  icon="edit-outline"
                  @click.stop="goToFeedBack(item)"
                  v-if="item.fbId === null"
                >
                  å†™è¯„ä»·
                </wd-button>
              </view>
            </template>
          </view>
        </view>
      </wd-card>
@@ -126,9 +192,11 @@
<script setup lang="ts">
import { onMounted, getCurrentInstance, ref } from 'vue'
import { useToast, useMessage } from 'wot-design-uni'
import { getRepairResList, addRepairRes } from '@/service/repair'
import { getRepairResList, addRepairRes, updateRepairRes } from '@/service/repair'
import { DICT_REPAIR_RES_STATUS, DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
import { useUserStore } from '@/store'
import { formatDate } from '@/utils/DateUtils'
const userStore = useUserStore()
const message = useMessage()
@@ -181,11 +249,76 @@
 * æ¡ç›®ç‚¹å‡»äº‹ä»¶
 * @param item
 */
function itemClick(item: any) {}
function itemClick(item: any) {
  goToDetail(item)
}
/**
 * å¼€å§‹ç»´ä¿®
 * @param item
 */
function handleStartRepair(item: any) {
  // ç¡®è®¤å¼€å§‹ä¿®æ”¹çŠ¶æ€ä¸º2-维修中
  const data = Object.assign({}, item)
  // ç¡®è®¤å¼€å§‹ä¿®æ”¹çŠ¶æ€ä¸º2-维修中
  data.status = '2'
  // è®¾ç½®å¼€å§‹ç»´ä¿®æ—¶é—´
  data.startTime = formatDate(new Date())
  message
    .confirm({
      msg: '确定开始维修?',
      title: '提示',
      beforeConfirm: ({ resolve }) => {
        updateRepair(data, resolve)
      },
    })
    .then(() => {})
    .catch((error) => {
      console.log(error)
    })
}
/**
 * æ›´æ–°ç»´ä¿®å·¥å•
 * @param data
 * @param resolve
 */
function updateRepair(data: any, resolve: any) {
  updateRepairRes(data)
    .then((res: any) => {
      resolve(true)
      if (res?.code === 200) {
        reloadData()
        // ç»´ä¿®ä¸­çŠ¶æ€æ‰éœ€è¦è·³è½¬
        if (data?.status === '2') {
          goToDetail(data)
        }
      }
    })
    .catch((res) => {
      console.error(res)
    })
}
function goToDetail(item) {
  uni.navigateTo({
    url: `/pages/repair/res-detail?id=${item.id}`,
  })
}
function goToFeedBack(item) {
  uni.navigateTo({
    url: `/pages/repair/feedback?id=${item.id}`,
  })
}
onNavigationBarButtonTap((e) => {
  if (e.index === 0) {
    if (isLeader()) {
      toast.info('请登录维修工账号接单')
    } else if (isOperatorOrRepair()) {
    handleSelectReq()
    }
  }
})
@@ -240,8 +373,12 @@
  const sList: any = await getDictInfo(DICT_REPAIR_RES_STATUS)
  statusList.value.push(...sList)
}
onLoad((options) => {
onLoad(() => {
  initData()
  uni.$on('res-list-refresh', reloadData)
})
onUnload(() => {
  uni.$off('res-list-refresh', reloadData)
})
</script>
eims-ui-mobile/src/service/repair.d.ts
@@ -90,70 +90,192 @@
   *
   */
  id: number | string;
  // è¯„ä»·
  fbId?: number | string;
  /**
   * æŠ¥ä¿®å•id
   */
  reqId: number | string;
  reqId?: number | string;
  reqType?: string;
  reqDesc?: string;
  equName?: string;
  assetNo?: string;
  fixtureName?: string;
  /**
   * ç»´ä¿®å•号
   */
  resCode: string;
  resCode?: string;
  /**
   * ç»´ä¿®äºº
   */
  resUser: number;
  resUser?: number;
  /**
   * ç»´ä¿®äººéƒ¨é—¨
   */
  resDept: number;
  resDept?: number;
  /**
   * åŽŸå› åˆ†æž
   */
  resReason: string;
  resReason?: string;
  /**
   * å¤„理措施
   */
  resHandle: string;
  resHandle?: string;
  /**
   * é¢„防措施
   */
  resPrevent: string;
  resPrevent?: string;
  /**
   * ç»´ä¿®çŠ¶æ€(字典)
   */
  status: string;
  status?: string;
  /**
   * å¼€å§‹æ—¶é—´
   */
  startTime: string;
  startTime?: string;
  /**
   * ç»“束时间
   */
  endTime: string;
  endTime?: string;
  /**
   * ä½¿ç”¨å·¥å…·
   */
  useFixture: string;
  useFixture?: string;
  /**
   * ä½¿ç”¨å¤‡ä»¶
   */
  useParts: string;
  useParts?: string;
  /**
   * å¤‡æ³¨
   */
  remark: string;
  remark?: string;
}
export interface RepairFbVO {
  /**
   *
   */
  id: number | string;
  /**
   * ç»´ä¿®å·¥å•id
   */
  resId?: number | string;
  /**
   * ç»´ä¿®å·¥å•code
   */
  resCode?: string;
  /**
   * åé¦ˆç»“æžœ
   */
  fbResult?: string;
  /**
   * åé¦ˆäºº
   */
  fbUser?: number;
  /**
   * åé¦ˆäººéƒ¨é—¨
   */
  fbDept?: number;
  /**
   * åé¦ˆæ—¶é—´
   */
  fbTime?: string;
  /**
   * ç»´ä¿®åŠæ—¶æ€§(字典)
   */
  repairTimeliness?: number | string;
  /**
   * æœåŠ¡æ€åº¦
   */
  serviceAttitude?: number | string;
  /**
   * ç»´ä¿®çŽ°åœº6s
   */
  repairSs?: number | string;
  /**
   * ç»´ä¿®æ»¡æ„åº¦
   */
  repairSatisfaction?: number | string;
  /**
   * æ„è§æˆ–建议
   */
  suggestions?: string;
  /**
   * å¤‡æ³¨
   */
  remark?: string;
}
export interface RepairRecordVO {
  /**
   *
   */
  id: number | string;
  /**
   * æŠ¥ä¿®å•id
   */
  reqId?: number | string;
  /**
   * ç»´ä¿®å•id
   */
  resId?: number | string;
  /**
   * å¤„理时间
   */
  handleTime?: string;
  /**
   * æ“ä½œç”¨æˆ·
   */
  operaUser?: number;
  operaUserName?: string;
  /**
   * æ“ä½œ(字典)
   */
  opera?: string;
  /**
   * æ“ä½œç»“æžœ
   */
  operaResult?: string;
  /**
   * å¤‡æ³¨
   */
  remark?: string;
}
eims-ui-mobile/src/service/repair.ts
@@ -1,5 +1,5 @@
import { http } from '@/utils/http'
import type { RepairReqVO, RepairResVO } from './repair.d'
import type { RepairReqVO, RepairResVO, RepairFbVO, RepairRecordVO } from './repair.d'
type ID = number | string
/**
@@ -23,10 +23,6 @@
  return http.get<RepairReqVO[]>('/eims/repairReq/list', params)
}
/**
 * ç»´ä¿®å•列表
 */
@@ -34,9 +30,54 @@
  return http.get<RepairResVO[]>('/eims/repairRes/list', params)
}
/**
 * æŸ¥è¯¢ç»´ä¿®å•
 * @param data
 */
export const getRepairRes = (id: ID) => {
  return http.get<RepairResVO>(`/eims/repairRes/${id}`)
}
/**
 * æ–°å¢žç»´ä¿®å•
 * @param data
 */
export const addRepairRes = (data: any) => {
  return http.post<void>('/eims/repairRes/add', data)
}
/**
 * æ›´æ–°ç»´ä¿®å·¥å•
 * @param data
 */
export const updateRepairRes = (data: any) => {
  return http.put<void>('/eims/repairRes', data)
}
/**
 * æŸ¥è¯¢ç»´ä¿®è¯„ä»·
 * @param id
 */
export const getRepairFb = (id: ID) => {
  return http.get<RepairFbVO>(`/eims/repairFb/${id}`)
}
/**
 * æ–°å¢žç»´ä¿®è¯„ä»·
 * @param data
 */
export const addRepairFb = (data: any) => {
  return http.post<void>('/eims/repairFb', data)
}
/**
 * ç»´ä¿®è®°å½•列表
 */
export const getRepairRecordList = (params: any) => {
  return http.get<RepairRecordVO[]>('/eims/repairRecord/list', params)
}
eims-ui-mobile/src/types/uni-pages.d.ts
@@ -16,8 +16,10 @@
       "/pages/maint/maint-st" |
       "/pages/maint/order-detail" |
       "/pages/my/index" |
       "/pages/repair/feedback" |
       "/pages/repair/repair-add" |
       "/pages/repair/req-list" |
       "/pages/repair/res-detail" |
       "/pages/repair/res-list" |
       "/pages/spare/index";
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
@@ -140,6 +140,7 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date reqTime;//报修时间
    private String equName;//设备名称
    private String assetNo;//
    private String fixtureName;//工具名称
    private String faultType;//故障类别
    private String reqDeptName;//报修部门
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
@@ -18,9 +18,10 @@
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.eims.domain.*;
import org.dromara.eims.domain.vo.EimsEquVo;
import org.dromara.eims.domain.vo.EimsFixtureVo;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
import org.dromara.eims.mapper.EimsRepairRecordMapper;
import org.dromara.eims.mapper.EimsRepairReqMapper;
import org.dromara.eims.mapper.*;
import org.dromara.eims.utils.DataFilterUtil;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.vo.SysDeptVo;
@@ -29,7 +30,6 @@
import org.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsRepairResBo;
import org.dromara.eims.domain.vo.EimsRepairResVo;
import org.dromara.eims.mapper.EimsRepairResMapper;
import org.dromara.eims.service.IEimsRepairResService;
import org.springframework.transaction.annotation.Transactional;
@@ -49,6 +49,8 @@
    private final EimsRepairReqMapper reqMapper;
    private final SysDeptMapper deptMapper;
    private final EimsRepairRecordMapper recordMapper;
    private final EimsEquMapper equMapper;
    private final EimsFixtureMapper fixtureMapper;
    /**
     * æŸ¥è¯¢ç»´ä¿®å·¥å•
@@ -58,7 +60,27 @@
     */
    @Override
    public EimsRepairResVo queryById(Long id) {
        return baseMapper.selectVoById(id);
        EimsRepairResVo resVo = baseMapper.selectVoById(id);
        Long reqId = resVo.getReqId();
        if(reqId!=null){
            EimsRepairReqVo reqVo = reqMapper.selectVoById(reqId);
            resVo.setReqType(reqVo.getReqType());
            resVo.setReqCode(reqVo.getCode());
            if(reqVo.getEquId()!=null){
                EimsEquVo equVo = equMapper.selectVoById(reqVo.getEquId());
                resVo.setAssetNo(equVo.getAssetNo());
                resVo.setEquName(equVo.getEquName());
            }
            if(reqVo.getFixtureId()!=null){
                EimsFixtureVo fixtureVo = fixtureMapper.selectVoById(reqVo.getFixtureId());
                resVo.setFixtureName(fixtureVo.getFixtureName());
                resVo.setAssetNo(fixtureVo.getAssetNo());
            }
        }
        return resVo;
    }
    /**