车间能级提升-智能设备管理系统
zhuguifei
2025-04-22 7a6dc6d28d36e4c3558391bac52d188d5075543f
1.完成移动端点检汇总和点检明细

2.完成后端接口
已添加5个文件
已修改19个文件
475 ■■■■■ 文件已修改
eims-ui-mobile/src/pages.json 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/home/index.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/inspect/insp-record.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/inspect/insp-st.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/maint/maint-st.vue 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/inspect.ts 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/maint.d.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/maint.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/types/uni-pages.d.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/utils/http.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/insp-st/data.tsx 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/insp-st/index.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/spare-inoutdt/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInspectRecordController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/InspectRecordBo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInspectRecordMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInspectRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectRecordServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectStMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages.json
@@ -114,6 +114,14 @@
      }
    },
    {
      "path": "pages/maint/maint-st",
      "type": "page",
      "layout": "default",
      "style": {
        "navigationBarTitleText": "保养汇总"
      }
    },
    {
      "path": "pages/my/index",
      "type": "page",
      "layout": "tabbar",
eims-ui-mobile/src/pages/home/index.vue
@@ -157,15 +157,15 @@
  }, */
  {
    id: 1,
    name: '点检概览',
    icon: '/static/menu/menu1.png',
    name: '点检汇总',
    icon: '/static/menu/menu2.png',
    path: 'pages/inspect/insp-st',
  },
  {
    id: 2,
    name: '点检汇总',
    icon: '/static/menu/menu2.png',
    path: 'pages/inspect/insp-st',
    name: '保养汇总',
    icon: '/static/menu/menu1.png',
    path: 'pages/maint/maint-st',
  },
  {
    id: 3,
eims-ui-mobile/src/pages/inspect/insp-record.vue
@@ -109,6 +109,18 @@
          </view>
        </wd-collapse-item>
      </wd-collapse>
      <view class="w-full h-[1rpx] bg-base"></view>
      <wd-textarea
        label="特记事项"
        label-width="200rpx"
        type="textarea"
        v-model="inspSt.specialNote"
        auto-height
        :maxlength="200"
        show-word-limit
        placeholder="请输入特记事项"
        clearable
      />
    </view>
  </z-paging>
</template>
@@ -116,7 +128,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import { useUserStore, useAccessStore, useSystemConfigStore } from '@/store'
import { getInspStRecordList, updateInspRecord, updateInspRecordBatch } from '@/service/inspect'
import { getInspStRecordList, updateInspectSt, updateInspRecordBatch } from '@/service/inspect'
import { useToast, useMessage } from 'wot-design-uni'
import type { CollapseInstance } from 'wot-design-uni/components/wd-collapse/types'
const message = useMessage()
@@ -134,10 +146,14 @@
}
interface InspSt {
  id: string
  inspCode: string
  equName: string
  assetNo: string
  planTimeStr?: string
  status: string
  inspUser: number | string
  specialNote: string
}
const dataChange = ref(false)
@@ -148,10 +164,14 @@
// ç‚¹æ£€æ±‡æ€»æ•°æ®(上个页面传值)
const inspSt = reactive<InspSt>({
  id: '',
  inspCode: '',
  equName: '',
  assetNo: '',
  planTimeStr: '',
  status: '',
  inspUser: '',
  specialNote: '',
})
const paging = ref(null)
@@ -180,7 +200,7 @@
}
function inspResultClick(item: any) {
  // userStore?.userInfo?.realName
  // userStore?.userInfo?.userId
}
const goBack = () => {
@@ -191,7 +211,7 @@
}
const toggleCollapse = () => {
  isAllExpanded.value = !isAllExpanded.value
  isAllExpanded.value = !isAllExpanded.value
  collapseRef.value.toggleAll(isAllExpanded.value)
}
@@ -218,9 +238,22 @@
  const params = {
    inspRecordList: dataList.value,
  }
  // æ›´æ–°ç‚¹æ£€è®°å½•
  updateInspRecordBatch(params)
    .then((res: any) => {
      updateInspSt(resolve)
    })
    .catch((res) => {
      console.error(res)
    })
}
function updateInspSt(resolve: any) {
  // æ›´æ–°ç‚¹æ£€æ±‡æ€»
  inspSt.status = '1'
  updateInspectSt(inspSt)
    .then((res: any) => {
      paging.value.reload()
      uni.$emit('insp-st-refresh')
      resolve(true)
    })
    .catch((res) => {
@@ -244,10 +277,13 @@
  { deep: true },
)
onLoad((options) => {
  inspSt.id = options.id
  inspSt.inspCode = options.inspCode
  inspSt.equName = options.equName
  inspSt.assetNo = options.assetNo
  inspSt.planTimeStr = options.planTimeStr
  inspSt.specialNote = options?.specialNote
  inspSt.inspUser = userStore?.userInfo?.userId
})
const dataCount = computed(() => dataList.value.length)
eims-ui-mobile/src/pages/inspect/insp-st.vue
@@ -28,7 +28,11 @@
            </view>
            <view class="flex items-center">
              <text class="text-color-gray text-mini">{{ item.planTimeStr }}</text>
              <text class="text-color-gray text-mini">
                {{
                  viewMode === 'Day' ? item.planTimeStr : item?.planTimeStr?.substring(0, 7) || ''
                }}
              </text>
            </view>
          </view>
        </template>
@@ -69,6 +73,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import { getInspStList } from '@/service/inspect'
import { onShow } from '@dcloudio/uni-app'
const viewMode = ref<string>('Day')
const equName = ref<string>('所有设备')
@@ -79,7 +84,7 @@
])
const equList = ref<Record<string, any>[]>([{ label: '所有设备', value: '所有设备' }])
function handleViewMode({ value }) {
  console.log(value)
  reloadData()
}
function handleEquName({ value }) {
  console.log(value)
@@ -91,10 +96,9 @@
const queryList = (pageNum?: number, pageSize?: number) => {
  // è¿™é‡Œçš„pageNo和pageSize会自动计算好,直接传给服务器即可
  // è¿™é‡Œçš„请求只是演示,请替换成自己的项目的网络请求,并在网络请求回调中通过paging.value.complete(请求回来的数组)将请求结果传给z-paging
  getInspStList({ pageNum, pageSize })
  getInspStList({ pageNum, pageSize, viewMode: viewMode.value })
    .then((res: any) => {
      // è¯·å‹¿åœ¨ç½‘络请求回调中给dataList赋值!!只需要调用complete就可以了
      console.log(res)
      paging.value.complete(res.rows)
    })
    .catch((res) => {
@@ -108,12 +112,19 @@
function itemClick(item) {
  const inspCode = `${item.equId}_${item.planTime}_${viewMode.value}`
  uni.navigateTo({
    url: `/pages/inspect/insp-record?inspCode=${inspCode}&equName=${item.equName}&assetNo=${item.assetNo}&planTimeStr=${item.planTimeStr}`,
    url: `/pages/inspect/insp-record?id=${item.id}&inspCode=${inspCode}&specialNote=${item.specialNote ?? ''}&equName=${item.equName ?? ''}&assetNo=${item.assetNo ?? ''}&planTimeStr=${item.planTimeStr ?? ''}`,
  })
}
function reloadData() {
  paging.value.reload()
}
onLoad(() => {
  queryList()
  uni.$on('insp-st-refresh', reloadData)
})
onUnload(() => {
  uni.$off('insp-st-refres', reloadData)
})
</script>
eims-ui-mobile/src/pages/maint/maint-st.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,178 @@
<route lang="json5" type="page">
{
  layout: 'default',
  style: {
    navigationBarTitleText: '保养汇总',
  },
}
</route>
<template>
  <z-paging ref="paging" v-model="dataList" @query="queryList" show-refresher-update-time>
    <template #top>
      <wd-drop-menu>
        <wd-drop-menu-item v-model="equName" :options="equList" @change="handleEquName" />
        <wd-drop-menu-item v-model="status" :options="statusList" @change="handleStatus" />
      </wd-drop-menu>
      <wd-divider></wd-divider>
    </template>
    <view class="bg-base">
      <view class="w-full h-[24rpx]"></view>
      <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id">
        <template #title>
          <view class="flex justify-between">
            <view class="flex items-center menu-title-box">
              <view class="menu-indicator"></view>
              <view class="ml-1 text-sm align-center">{{ item.equName }}</view>
              <view class="text-color-gray ml-2 text-mini">{{ item.assetNo }}</view>
            </view>
            <view class="flex items-center">
              <text class="text-color-gray text-mini">
                {{ status === 'Day' ? item?.planTimeStr : item?.planTimeStr?.substring(0, 7) || '' }}
              </text>
            </view>
          </view>
        </template>
        <view class="flex h-[100rpx]" items-center>
          <image class="slot-img text-center" src="/static/images/camera.png" />
          <view class="flex-1">
            <view class="text-color-gray text-xs mt-1 flex">
              <text class="mr-3">点检总数: {{ item.recordCount }}</text>
              |
              <text class="mx-3">已点检: {{ item.checkCount }}</text>
              |
              <text class="ml-3">未点检: {{ item.unCheckCount }}</text>
            </view>
            <view class="text-color-gray text-xs mt-2 flex">
              <text class="mr-3">正常: {{ item.normalNum }}</text>
              |
              <text class="mx-3">异常: {{ item.abNormalNum }}</text>
            </view>
            <view class="text-color-gray text-xs mt-2 flex">
              <text>状态:</text>
              <template v-if="item.recordCount === item.checkCount">
                <wd-icon class="icon-color-success" name="check-outline" size="40rpx"></wd-icon>
                <text class="ml-1">已完成</text>
              </template>
              <template v-else>
                <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon>
                <text class="ml-1">进行中</text>
              </template>
            </view>
          </view>
          <wd-button size="small" icon="edit-outline" @click.stop="itemClick(item)">明细</wd-button>
        </view>
      </wd-card>
    </view>
  </z-paging>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { getMaintStList } from '@/service/maint'
interface QueryParams {
  pageNum: number
  pageSize: number
  equName?: string
  status?: string
}
const status = ref<string>('-1')
const equName = ref<string>('-1')
const statusList = ref<Record<string, any>[]>([
  { label: '全部', value: '-1' },
  { label: '待保养', value: '0' },
  { label: '保养中', value: '1' },
  { label: '待验证', value: '2' },
  { label: '已完成', value: '3' },
])
const equList = ref<Record<string, any>[]>([{ label: '所有设备', value: '-1' }])
function handleStatus({ value }) {}
function handleEquName({ value }) {
  console.log(value)
}
const paging = ref(null)
const dataList = ref([])
const queryList = (pageNum?: number, pageSize?: number) => {
  // è¿™é‡Œçš„pageNo和pageSize会自动计算好,直接传给服务器即可
  // è¿™é‡Œçš„请求只是演示,请替换成自己的项目的网络请求,并在网络请求回调中通过paging.value.complete(请求回来的数组)将请求结果传给z-paging
  const params: QueryParams = {
    pageNum,
    pageSize,
    equName: equName.value,
    status: status.value,
  }
  if (equName.value === '-1') {
    delete params.equName
  }
  if (status.value === '-1') {
    delete params.status
  }
  getMaintStList(params)
    .then((res: any) => {
      // è¯·å‹¿åœ¨ç½‘络请求回调中给dataList赋值!!只需要调用complete就可以了
      paging.value.complete(res.rows)
    })
    .catch((res) => {
      // å¦‚果请求失败写paging.value.complete(false),会自动展示错误页面
      // æ³¨æ„ï¼Œæ¯æ¬¡éƒ½éœ€è¦åœ¨catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理
      // åœ¨åº•层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可
      paging.value.complete(false)
    })
}
function itemClick(item) {
  const inspCode = `${item.equId}_${item.planTime}_${status.value}`
  uni.navigateTo({
    url: `/pages/inspect/insp-record?id=${item.id}&inspCode=${inspCode}&specialNote=${item.specialNote ?? ''}&equName=${item.equName ?? ''}&assetNo=${item.assetNo ?? ''}&planTimeStr=${item.planTimeStr ?? ''}`,
  })
}
function reloadData() {
  paging.value.reload()
}
onLoad(() => {
  queryList()
  uni.$on('maint-st-refresh', reloadData)
})
onUnload(() => {
  uni.$off('maint-st-refres', reloadData)
})
</script>
<style scoped lang="scss">
.menu-title-box {
}
.slot-img {
  width: 72rpx;
  height: 72rpx;
  margin-right: 24rpx;
}
.statu-img {
  width: 60rpx;
  height: 40rpx;
}
.text-mini {
  font-size: 22rpx;
}
.menu-indicator {
  width: 6rpx;
  height: 26rpx;
  border-radius: 10rpx;
  background-color: $uni-color-primary;
}
:deep(.wd-card__footer) {
  padding: 10rpx !important;
}
:deep(.wd-card__title-content) {
  padding: 24rpx 0 !important;
}
</style>
eims-ui-mobile/src/service/inspect.ts
@@ -5,7 +5,6 @@
 * ç‚¹æ£€æ±‡æ€»åˆ—表
 */
export const getInspStList = (params: any) => {
  params.viewMode = 'Day'
  return http.get<InspectStVO[]>('/eims/inspectSt/list', params)
}
@@ -21,9 +20,21 @@
 * @param data
 */
export const updateInspRecord = (data: any) => {
  return http.post<void>('/eims/inspRecord', data)
  return http.put<void>('/eims/inspRecord', data)
}
/**
 * æ‰¹é‡æ›´æ–°ç‚¹æ£€è®°å½•
 * @param data
 */
export const updateInspRecordBatch = (data: any) => {
  return http.put<void>('/eims/inspRecord/editBatch', data)
}
/**
 * æ›´æ–°ç‚¹æ£€æ±‡æ€»
 * @param data
 */
export const updateInspectSt = (data: any) => {
  return http.put<void>('/eims/inspectSt', data)
}
eims-ui-mobile/src/service/maint.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
export interface MaintStVO {
  /**
   *
   */
  id: number | string;
  /**
   *
   */
  title: string;
  /**
   *
   */
  equId: number | string;
  status: string;
  /**
   *
   */
  planTime: string;
  /**
   * ä¿å…»äºº
   */
  maintUser: number;
  /**
   * éªŒè¯äºº
   */
  verifyUser: number;
  verifyTime: string;
  /**
   * ç‰¹è®°äº‹é¡¹
   */
  specialNote: string;
  /**
   * å¤‡æ³¨
   */
  remark: string;
}
eims-ui-mobile/src/service/maint.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
import { http } from '@/utils/http'
import type { MaintStVO } from './maint.d'
/**
 * ä¿å…»æ±‡æ€»åˆ—表
 */
export const getMaintStList = (params: any) => {
  return http.get<MaintStVO[]>('/eims/maintSt/list', params)
}
eims-ui-mobile/src/types/uni-pages.d.ts
@@ -11,6 +11,7 @@
       "/pages/inspect/insp-record" |
       "/pages/inspect/insp-st" |
       "/pages/login/index" |
       "/pages/maint/maint-st" |
       "/pages/my/index" |
       "/pages/spare/index";
}
eims-ui-mobile/src/utils/http.ts
@@ -36,10 +36,12 @@
            uni.navigateTo({ url: redirectRoute })
            reject(res)
          } else {
            // å…¶ä»–错误 -> æ ¹æ®åŽç«¯é”™è¯¯ä¿¡æ¯è½»æç¤º
            uni.showToast({
              icon: 'none',
              title: (res.data as IResData<T>).msg || '请求错误',
            })
            reject(res)
          }
        } else if (res.statusCode === 401) {
          // 401错误  -> æ¸…理用户信息,跳转到登录页
eims-ui/apps/web-antd/src/views/eims/insp-st/data.tsx
@@ -46,7 +46,24 @@
  {
    title: '保养时间',
    field: 'planTimeStr',
    minWidth: 200
    minWidth: 200,
    slots: {
      default: ({ row }) => {
        // åˆ¤æ–­æ˜¯å¦éœ€è¦æ˜¾ç¤ºæ—¶é—´
        if (!row.type) return '';
        // èŽ·å–åŽŸå§‹æ—¶é—´å­—ç¬¦ä¸²
        const fullDate = row.planTimeStr;
        // æ ¹æ®æ¡ä»¶å†³å®šæ˜¾ç¤ºæ ¼å¼
        // ç¤ºä¾‹æ¡ä»¶ï¼šå¦‚æžœ status æ˜¯æŸä¸ªç‰¹å®šå€¼ï¼ˆä¾‹å¦‚ 'monthly'),则显示 YYYY-MM
        if (row.type === 'Month') {
          return fullDate.slice(0, 7); // æˆªå–前 7 ä¸ªå­—符,得到 YYYY-MM
        }
        // é»˜è®¤æ˜¾ç¤ºå®Œæ•´æ—¥æœŸ YYYY-MM-DD
        return fullDate;
      }
    }
  },
  {
    title: '状态',
eims-ui/apps/web-antd/src/views/eims/insp-st/index.vue
@@ -255,16 +255,17 @@
const monBtn = ref<any>('primary');
function queryData(type: ViewMode) {
  // TODO æ—¥è§†å›¾å’Œæœˆè§†å›¾åŽç«¯å·²ç»Ÿä¸€æ–¹æ³• å‰ç«¯å¯åˆ é™¤æ—¥è§†å›¾å¤šä½™é…ç½®
  if (type === ViewMode.Day) {
    dayBtn.value = 'primary';
    monBtn.value = 'default';
    curViewMode.value = ViewMode.Day;
    tableApi.setGridOptions(gridOptions2);
    // tableApi.setGridOptions(gridOptions2);
  } else if (type === ViewMode.Month) {
    dayBtn.value = 'default';
    monBtn.value = 'primary';
    curViewMode.value = ViewMode.Month;
    tableApi.setGridOptions(gridOptions);
    // tableApi.setGridOptions(gridOptions);
  }
  tableApi.query();
}
@@ -273,7 +274,7 @@
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px] flex-col">
      <BasicTable class="h-2/3" table-title="点检记录列表">
      <BasicTable class="h-2/3" table-title="点检汇总列表">
        <template #toolbar-tools>
          <Space>
            <Button :type="dayBtn" @click.stop="queryData(ViewMode.Day)">日视图</Button>
@@ -300,8 +301,7 @@
            <ghost-button v-access:code="['eims:inspectSt:edit']" @click.stop="handleEdit(row)">
              {{ $t('pages.common.edit') }}
            </ghost-button>
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?"
                        @confirm="handleDelete(row)">
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?" @confirm="handleDelete(row)">
              <ghost-button danger v-access:code="['eims:inspectSt:remove']" @click.stop="">
                {{ $t('pages.common.delete') }}
              </ghost-button>
@@ -309,8 +309,7 @@
          </Space>
        </template>
      </BasicTable>
      <BasisSubTable :columns="recordCol" :list-api="listInspStRecord" :req-value="recordId" class="h-1/3"
                     req-key="inspCode" title="点检记录" />
      <BasisSubTable :columns="recordCol" :list-api="listInspStRecord" :req-value="recordId" class="h-1/3" req-key="inspCode" title="点检记录" />
    </div>
    <InspStDrawer @reload="tableApi.query()" />
  </Page>
eims-ui/apps/web-antd/src/views/eims/spare-inoutdt/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInspectRecordController.java
@@ -15,6 +15,7 @@
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.eims.domain.bo.EimsMaintOrderBo;
import org.dromara.eims.domain.bo.InspectRecordBo;
import org.dromara.eims.domain.vo.EimsMaintOrderVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
@@ -80,6 +81,7 @@
            Map<String, Object> params = bo.getParams();
            params.put("beginPlanTime",startOfMonth);
            params.put("endPlanTime",endOfMonth);
            params.put("type","Month");
        }
        return eimsInspectRecordService.queryPageListCustom(bo, pageQuery);
    }
@@ -130,6 +132,14 @@
        return toAjax(eimsInspectRecordService.updateByBo(bo));
    }
    @SaCheckPermission("eims:inspectRecord:edit")
    @Log(title = "点检记录-批量修改", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping("editBatch")
    public R<Void> editBatch(@Validated(EditGroup.class) @RequestBody InspectRecordBo bo) {
        return toAjax(eimsInspectRecordService.updateBatchByBo(bo));
    }
    /**
     * åˆ é™¤ç‚¹æ£€è®°å½•
     *
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java
@@ -28,6 +28,10 @@
     */
    @TableId(value = "id")
    private Long id;
    /**
     * æ±‡æ€»ç±»åž‹ Day-日汇总  Month-月汇总
     */
    private String type;
    /**
     * æ ‡é¢˜
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java
@@ -28,17 +28,19 @@
     */
    @NotNull(message = "不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * æ±‡æ€»ç±»åž‹ Day-日汇总  Month-月汇总
     */
    private String type;
    /**
     * æ ‡é¢˜
     */
    @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class })
    private String title;
    /**
     * è®¾å¤‡id
     */
    @NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long equId;
    private String equName;
    private String assetNo;
@@ -46,7 +48,6 @@
    /**
     * è®¡åˆ’æ—¶é—´
     */
    @NotNull(message = "计划时间不能为空", groups = { AddGroup.class, EditGroup.class })
    private Date planTime;
    /**
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/InspectRecordBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.dromara.eims.domain.bo;
import lombok.Data;
import java.util.List;
@Data
public class InspectRecordBo {
    /**
     * ç§»åŠ¨ç«¯æ‰¹é‡æ›´æ–°
     */
    private List<EimsInspectRecordBo> inspRecordList;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java
@@ -41,7 +41,10 @@
     */
    @ExcelProperty(value = "标题")
    private String title;
    /**
     * æ±‡æ€»ç±»åž‹ Day-日汇总  Month-月汇总
     */
    private String type;
    /**
     * è®¾å¤‡id
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInspectRecordMapper.java
@@ -18,6 +18,7 @@
 */
public interface EimsInspectRecordMapper extends BaseMapperPlus<EimsInspectRecord, EimsInspectRecordVo> {
    Page<EimsInspectRecordVo> selectInspRecordList(@Param("page") Page<EimsInspectRecordVo> page, @Param(Constants.WRAPPER) Wrapper<EimsInspectRecord> queryWrapper);
    // TODO æ—¥è§†å›¾å’Œæœˆè§†å›¾ç»Ÿä¸€æŽ¥å£ï¼Œå¾…删除
    Page<EimsInspectStVo> selectInspRecordDayList(@Param("page") Page<EimsInspectStVo> page, @Param(Constants.WRAPPER) Wrapper<EimsInspectSt> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInspectRecordService.java
@@ -1,6 +1,7 @@
package org.dromara.eims.service;
import org.dromara.eims.domain.bo.EimsInspectStBo;
import org.dromara.eims.domain.bo.InspectRecordBo;
import org.dromara.eims.domain.vo.EimsInspectRecordVo;
import org.dromara.eims.domain.bo.EimsInspectRecordBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -58,6 +59,7 @@
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    Boolean updateByBo(EimsInspectRecordBo bo);
    Boolean updateBatchByBo(InspectRecordBo bo);
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ç‚¹æ£€è®°å½•信息
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectRecordServiceImpl.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -11,10 +13,12 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.eims.domain.EimsInspectPlan;
import org.dromara.eims.domain.EimsInspectSt;
import org.dromara.eims.domain.EimsMaintPlan;
import org.dromara.eims.domain.bo.EimsInspectStBo;
import org.dromara.eims.domain.bo.InspectRecordBo;
import org.dromara.eims.domain.vo.EimsInspectStVo;
import org.dromara.eims.domain.vo.EimsMaintOrderVo;
import org.dromara.eims.mapper.EimsInspectPlanMapper;
@@ -236,6 +240,19 @@
        return baseMapper.updateById(update) > 0;
    }
    @Override
    public Boolean updateBatchByBo(InspectRecordBo bo) {
        LoginUser loginUser = LoginHelper.getLoginUser();
        List<EimsInspectRecord> inspRecordList = MapstructUtils.convert(bo.getInspRecordList(), EimsInspectRecord.class);
        inspRecordList.forEach(item->{
            // æ›´æ–°ä¸ºå·²ç‚¹æ£€
            item.setStatus(DictConstants.EIMS_INSPECT_STATUS_DETAIL.Y);
            item.setInspTime(new Date());
            item.setInspUser(loginUser.getUserId());
        });
        return baseMapper.updateBatchById(inspRecordList);
    }
    /**
     * ä¿å­˜å‰çš„æ•°æ®æ ¡éªŒ
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java
@@ -21,6 +21,8 @@
import org.dromara.eims.service.IEimsInspectStService;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
@@ -59,23 +61,29 @@
     */
    @Override
    public TableDataInfo<EimsInspectStVo> queryPageList(EimsInspectStBo bo, PageQuery pageQuery) {
        bo.setType(bo.getViewMode());
        // æœˆè§†å›¾
        if(bo.getViewMode().equals("Month")){
//        if(bo.getViewMode().equals("Month")){
            QueryWrapper<EimsInspectSt> qw = buildWrapper(bo);
            Page<EimsInspectStVo> result = baseMapper.selectInspStList(pageQuery.build(), qw);
            // å¡«å……数据
            fillStData(result);
            fillStData(result,bo.getViewMode());
            return TableDataInfo.build(result);
            // æ—¥è§†å›¾
        }else if(bo.getViewMode().equals("Day")){
            Page<EimsInspectStVo> result = recordMapper.selectInspRecordDayList(pageQuery.build(), buildGroupWrapper(bo));
            return TableDataInfo.build(result);
        }
//        }else if(bo.getViewMode().equals("Day")){
//            Page<EimsInspectStVo> result = recordMapper.selectInspRecordDayList(pageQuery.build(), buildGroupWrapper(bo));
//            return TableDataInfo.build(result);
//        }
       return null;
//       return null;
    }
    private void fillStData(Page<EimsInspectStVo> result) {
    /**
     *
      * @param result
     * @param type Day-日视图 Month-月视图
     */
    private void fillStData(Page<EimsInspectStVo> result,String type) {
        List<EimsInspectStVo> records = result.getRecords();
        for (int i = 0; i < records.size(); i++) {
            EimsInspectStVo stVo = records.get(i);
@@ -84,9 +92,19 @@
            LambdaQueryWrapper<EimsInspectRecord> recordLqw = Wrappers.lambdaQuery();
            recordLqw.eq(EimsInspectRecord::getEquId, stVo.getEquId());
            LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            // æœˆè§†å›¾æŸ¥è¯¢èŒƒå›´
            LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth());
            LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth());
            recordLqw.between(EimsInspectRecord::getPlanTime, startOfMonth, endOfMonth);
            // æ—¥è§†å›¾æŸ¥è¯¢èŒƒå›´
            if(type.equals("Day")){
                recordLqw.between(EimsInspectRecord::getPlanTime, planTime, planTime);
            }else {
            //  æœˆè§†å›¾æŸ¥è¯¢èŒƒå›´
                recordLqw.between(EimsInspectRecord::getPlanTime, startOfMonth, endOfMonth);
            }
            // æ‰§è¡ŒæŸ¥è¯¢
            List<EimsInspectRecordVo> recordList = recordMapper.selectVoList(recordLqw);
            // TODO æ ¹æ®å­—å…¸eims_inspect_status
@@ -96,7 +114,7 @@
            // TODO æ ¹æ®å­—å…¸eims_inspect_result
            Map<String, Long> rMap = recordList.stream()
                .filter(order ->order.getInspResult()!=null && List.of("1", "2").contains(order.getInspResult()))
                .collect(Collectors.groupingBy(EimsInspectRecordVo::getStatus, Collectors.counting()));
                .collect(Collectors.groupingBy(EimsInspectRecordVo::getInspResult, Collectors.counting()));
            stVo.setRecordCount(recordList.size());
            stVo.setUnCheckCount(cMap.getOrDefault("0", 0L).intValue());
@@ -157,6 +175,7 @@
        qw.like(StringUtils.isNotBlank(bo.getTitle()), "st.title", bo.getTitle());
        qw.like(StringUtils.isNotBlank(bo.getEquName()), "equ.equ_name", bo.getEquName());
        qw.like(StringUtils.isNotBlank(bo.getAssetNo()), "equ.asset_no", bo.getAssetNo());
        qw.eq( "st.type", bo.getType());
        qw.between(params.get("beginPlanTime") != null && params.get("endPlanTime") != null,
            "st.plan_time", params.get("beginPlanTime"), params.get("endPlanTime"));
        qw.eq(bo.getInspUser() != null, "st.maint_user", bo.getInspUser());
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectRecordMapper.xml
@@ -21,7 +21,7 @@
            ${ew.getCustomSqlSegment}
    </select>
    <!--TODO æ—¥è§†å›¾å’Œæœˆè§†å›¾ç»Ÿä¸€æŽ¥å£ï¼Œå¾…删除-->
    <select id="selectInspRecordDayList" resultMap="EimsInspectStVoResult">
        SELECT
            MAX(ir.id) id,
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectStMapper.xml
@@ -6,7 +6,7 @@
    <resultMap type="org.dromara.eims.domain.vo.EimsInspectStVo" id="MaintInspStVoResult">
    </resultMap>
    <select id="selectInspStList" resultMap="MaintInspStVoResult">
        SELECT st.*,equ.equ_name equName,equ.asset_no assetNo,    DATE_FORMAT(st.plan_time, '%Y-%m') as planTimeStr FROM eims_inspect_st st
        SELECT st.*,equ.equ_name equName,equ.asset_no assetNo,    DATE_FORMAT(st.plan_time, '%Y-%m-%d') as planTimeStr FROM eims_inspect_st st
                                             LEFT JOIN eims_equ equ on st.equ_id = equ.equ_id
            ${ew.getCustomSqlSegment}
    </select>