车间能级提升-智能设备管理系统
5eca16c096db71a3a419c655cdcf1326a32f01ea..b7b10f78abc7ba462e5c602ba7e70d4739e316b8
2025-06-24 baoshiwei
Merge remote-tracking branch 'origin/main'
b7b10f 对比 | 目录
2025-06-24 baoshiwei
feat(eims): 设备状态变更记录功能
f571cf 对比 | 目录
已添加3个文件
已修改22个文件
713 ■■■■■ 文件已修改
eims-ui-mobile/src/pages.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/equ-status/list.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/home/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/inspect/insp-st.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/maint/maint-st.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/repair/res-detail.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages/scan/index.vue 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/equ.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/equ_status.d.ts 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/service/equ_status.ts 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/types/uni-pages.d.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsEquStatu.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsEquStatuBo.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsEquStatuVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/InspectPlanToRecordJob.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsEquStatuMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInspectPlanMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsEquStatuServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsEquStatuMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectPlanMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui-mobile/src/pages.json
@@ -83,6 +83,10 @@
      }
    },
    {
      "path": "pages/equ-status/list",
      "type": "page"
    },
    {
      "path": "pages/fixture/fixture-list",
      "type": "page",
      "layout": "default",
eims-ui-mobile/src/pages/equ-status/list.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
<template>
  <view class="bg-base">
    <z-paging ref="paging" v-model="dataList" @query="queryList" class="bg-base">
      <template #top>
        <wd-search v-model="searchValue" placeholder="设备名称/资产编号" @search="reloadData" />
        <wd-tabs v-model="activeTab" @change="handleTabChange">
          <wd-tab title="待确认"></wd-tab>
          <wd-tab title="已同意"></wd-tab>
          <wd-tab title="已驳回"></wd-tab>
        </wd-tabs>
      </template>
      <view v-for="item in dataList" :key="item.equStatuId" class="mb-2" >
        <wd-card type="rectangle">
          <template #title>
            <view class="flex justify-between items-center menu-title-box">
              <view class="flex items-center">
                <view class="menu-indicator"></view>
                <text class="ml-1 text-sm">{{ item.equName || '-' }}</text>
                <text class="ml-2 text-color-gray text-mini">{{ item.assetNo || '-' }}</text>
              </view>
              <wd-tag v-if="item.orderStatus === '0'" type="warning">待确认</wd-tag>
              <wd-tag v-else-if="item.orderStatus === '1'" type="success">已同意</wd-tag>
              <wd-tag v-else type="error">已驳回</wd-tag>
            </view>
          </template>
          <view class="flex h-[200rpx] items-center">
            <image class="slot-img text-center" src="/static/images/camera.png" />
            <view class="flex-1">
              <view class="text-color-base mt-1">变更前:{{ statusText(item.beforeChange) }} â†’ å˜æ›´åŽï¼š{{ statusText(item.afterChange) }}</view>
              <view class="text-color-gray text-sm mt-1">变更原因:{{ item.changeDesc }}</view>
              <view class="text-color-gray text-sm mt-1">变更时间:{{ item.changeDate || '-' }}</view>
              <view class="text-color-gray text-sm mt-1">变更人:{{ item.changeUserName || '-' }}</view>
              <view v-if="item.orderStatus === '2' && item.remark" class="text-color-error text-sm mt-1">驳回理由:{{ item.remark }}</view>
            </view>
            <view v-if="item.orderStatus === '0' && isEquAdmin()" class="flex flex-col gap-2 ml-2">
              <wd-button size="small" type="success" @click="handleAgree(item)">同意</wd-button>
              <wd-button size="small" type="error" @click="openReject(item)">驳回</wd-button>
            </view>
          </view>
        </wd-card>
      </view>
    </z-paging>
    <wd-popup v-model="showReject" position="center" round :close-on-click-modal="false">
      <view class="popup-container">
        <view class="popup-title">填写驳回理由</view>
        <wd-textarea v-model="rejectReason" placeholder="请输入驳回理由" :maxlength="100" show-word-limit required />
        <view class="popup-actions">
          <wd-button block @click="showReject = false">取消</wd-button>
          <wd-button type="error" block class="ml-2" @click="handleRejectConfirm">确定</wd-button>
        </view>
      </view>
    </wd-popup>
  </view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { getEquStatuList, updateEquStatu } from '@/service/equ_status'
import { useToast } from 'wot-design-uni'
import { isEquAdmin } from "@/utils/RoleUtils";
const toast = useToast()
const searchValue = ref('')
const activeTab = ref(0)
const dataList = ref<any[]>([])
const paging = ref()
const showReject = ref(false)
const rejectReason = ref('')
const rejectItem = ref<any>(null)
const statusMap = [
  { label: '试用', value: '0' },
  { label: '使用', value: '1' },
  { label: '停用', value: '2' },
  { label: '报废', value: '3' },
  { label: '闲置', value: '4' },
  { label: '新增', value: '5' },
]
function statusText(val: string) {
  return statusMap.find((s) => s.value === val)?.label || '-'
}
function handleTabChange({ index }) {
  activeTab.value = index
  reloadData()
}
function reloadData() {
  paging.value.reload()
}
function queryList(pageNum?: number, pageSize?: number) {
  const params: any = {
    pageNum,
    pageSize,
    params: {
      searchValue: searchValue.value,
    },
    orderStatus: String(activeTab.value),
  }
  getEquStatuList(params).then((res: any) => {
    paging.value.completeByTotal(res.rows, res.total)
  }).catch(() => {
    paging.value.complete(false)
  })
}
function handleAgree(item: any) {
  updateEquStatu({
    equStatuId: item.equStatuId,
    orderStatus: '1',
    remark: '',
  }).then(() => {
    toast.success('操作成功')
    reloadData()
  })
}
function openReject(item: any) {
  rejectItem.value = item
  rejectReason.value = ''
  showReject.value = true
}
function handleRejectConfirm() {
  if (!rejectReason.value.trim()) {
    toast.info('请填写驳回理由')
    return
  }
  updateEquStatu({
    equStatuId: rejectItem.value.equStatuId,
    orderStatus: '2',
    remark: rejectReason.value,
  }).then(() => {
    toast.success('已驳回')
    showReject.value = false
    reloadData()
  })
}
</script>
<style scoped lang="scss">
.menu-title-box {
}
.slot-img {
  width: 72rpx;
  height: 72rpx;
  margin-right: 24rpx;
}
.text-mini {
  font-size: 24rpx;
}
.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;
}
.popup-container {
  width: 600rpx;
  background: #fff;
  border-radius: 16rpx;
  padding: 32rpx 24rpx 24rpx 24rpx;
}
.popup-title {
  font-size: 32rpx;
  font-weight: bold;
  text-align: center;
  margin-bottom: 24rpx;
}
.popup-actions {
  display: flex;
  margin-top: 24rpx;
  gap: 16rpx;
}
</style>
eims-ui-mobile/src/pages/home/index.vue
@@ -108,7 +108,7 @@
          <template #title>
            <view class="flex items-center menu-title-box">
              <view class="menu-indicator"></view>
              <view class="ml-1 text-sm">设备管理</view>
              <view class="ml-1 text-sm">点检保养</view>
            </view>
          </template>
          <wd-grid :column="4">
@@ -130,7 +130,7 @@
          <template #title>
            <view class="flex items-center menu-title-box">
              <view class="menu-indicator"></view>
              <view class="ml-1 text-sm">台账相关</view>
              <view class="ml-1 text-sm">设备台帐</view>
            </view>
          </template>
          <wd-grid :column="4">
@@ -257,10 +257,16 @@
  },
  {
    id: 2,
    name: '工具列表',
    icon: '/static/ico/ico16.png',
    path: 'pages/fixture/fixture-list',
    name: '状态变更记录',
    icon: '/static/ico/ico15.png',
    path: 'pages/equ-status/list',
  },
  // {
  //   id: 2,
  //   name: '工具列表',
  //   icon: '/static/ico/ico16.png',
  //   path: 'pages/fixture/fixture-list',
  // },
])
const inspectMenu = reactive([
eims-ui-mobile/src/pages/inspect/insp-st.vue
@@ -57,12 +57,12 @@
            <view class="text-color-gray text-sm mt-2 flex">
              <text>状态:</text>
              <template v-if="item.status === '1'">
                <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已完成</text>
                <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">待确认</text>
              </template>
              <template v-else-if="item.status === '2'">
                <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已确认</text>
                <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已完成</text>
              </template>
              <template v-else>
                <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon>
eims-ui-mobile/src/pages/maint/maint-st.vue
@@ -67,12 +67,12 @@
            <view class="text-color-gray text-sm mt-2 flex">
              <text>状态:</text>
              <template v-if="item.status === '1'">
                <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已完成</text>
                <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">待确认</text>
              </template>
              <template v-else-if="item.status === '2'">
                <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已确认</text>
                <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon>
                <text class="ml-1">已完成</text>
              </template>
              <template v-else>
                <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon>
eims-ui-mobile/src/pages/repair/res-detail.vue
@@ -150,15 +150,18 @@
      </view>
      <!-- ç»´ä¿®è¯´æ˜ŽåŒºåŸŸ -->
      <view class="mt-2 flex justify-end">
        <wd-button type="success" style="margin: 20px" @click.stop="addSparePart()">
        <wd-button type="info" style="margin: 20px" @click.stop="addSparePart()">
          æ·»åР备件
        </wd-button>
      </view>
      <view class="h-[2px] w-full bg-base"></view>
      </wd-cell-group>
    </wd-form>
<!--    <wd-button style="margin: 20px" block @click="handleClickRight">提交</wd-button>-->
    <view class="h-[20px] w-full bg-base"></view>
    <view class="h-[5px] w-full bg-base"></view>
    <view class=" flex justify-around py-4">
      <wd-button block @click="saveOrder">保存</wd-button>
      <wd-button type="success" block @click="submitOrder">提交</wd-button>
    </view>
  </view>
  <!-- å¤‡ä»¶é€‰æ‹©å¼¹å‡ºå±‚ -->
@@ -323,7 +326,7 @@
function handleClickRight(data: any) {
  message
    .confirm({
      msg: '确定提交?',
      msg: '确定' + (data.status === '3' ? '提交' : '保存') + '?',
      title: '提示',
      beforeConfirm: ({ resolve }) => {
        hanldeUpdateRepairRes(data, resolve)
@@ -335,6 +338,24 @@
    })
}
function submitOrder() {
  const data = Object.assign({}, repairRes)
  // æäº¤ä¿®æ”¹çŠ¶æ€ä¸ºå®Œæˆ
  data.status = '3'
  // è®¾ç½®ç»´ä¿®å®Œæˆæ—¶é—´
  data.endTime = formatDate(new Date())
  handleClickRight(data)
}
function saveOrder() {
  const data = Object.assign({}, repairRes)
  // ä»…保存不修改状态为完成
  data.status = '2'
  // ä»…保存不设置完成时间
  data.endTime = ''
  handleClickRight(data)
}
onNavigationBarButtonTap((e) => {
  if (e.index === 0) {
    // ç®¡ç†å‘˜è§’色
eims-ui-mobile/src/pages/scan/index.vue
@@ -25,11 +25,11 @@
              <wd-tag v-else-if="model.status === '2'" class="ml-2" type="danger">停用</wd-tag>
              <wd-tag v-else-if="model.status === '3'" class="ml-2" bg-color="pink">报废</wd-tag>
              <wd-tag v-else-if="model.status === '4'" class="ml-2" type="warning">闲置</wd-tag>
              <wd-tag v-else-if="model.status === '5'" class="ml-2">新增</wd-tag>
              <wd-tag v-else class="ml-2">新增</wd-tag>
            </view>
            <view @click="handleInfo">
              <text class="icon-color-base">详情</text>
              <text class="icon-color-base">状态变更</text>
              <wd-icon name="arrow-right" custom-class="icon-color-base"></wd-icon>
            </view>
          </view>
@@ -103,6 +103,33 @@
        @select="select"
        cancel-text="取消"
      />
      <wd-popup v-model="showStatusDialog" position="center" round :close-on-click-modal="false">
        <view class="popup-container">
          <view class="popup-title">设备状态变更</view>
          <view class="flex flex-wrap justify-between mb-4">
            <view
              v-for="item in statusOptions"
              :key="item.value"
              :class="['status-option', selectedStatus === item.value ? 'active' : '']"
              @click="selectStatus(item.value)"
            >
              {{ item.label }}
            </view>
          </view>
          <wd-textarea
            v-model="changeReason"
            placeholder="请输入变更原因"
            :maxlength="100"
            show-word-limit
            required
          />
          <view class="popup-actions">
            <wd-button block @click="handleStatusChangeCancel">取消</wd-button>
            <wd-button type="primary" block class="ml-2" @click="handleStatusChangeConfirm">确定</wd-button>
          </view>
        </view>
      </wd-popup>
    </view>
    <view v-else>
      <wd-status-tip image="search" tip="当前搜索无结果" />
@@ -122,6 +149,8 @@
import ReqCard from '@/components/repair/req-card.vue'
import ResCard from '@/components/repair/res-card.vue'
import { useUserStore } from '@/store'
import { addEquStatu } from '@/service/equ_status'
import type { EimsEquStatuBo } from '@/service/equ_status.d'
const tab = ref<number>(0)
const message = useMessage()
const toast = useToast()
@@ -140,6 +169,17 @@
    name: '去维修',
  },
])
const showStatusDialog = ref(false)
const selectedStatus = ref<string>('')
const changeReason = ref<string>('')
const statusOptions = [
  { label: '试用', value: '0' },
  { label: '使用', value: '1' },
  { label: '停用', value: '2' },
  { label: '报废', value: '3' },
  { label: '闲置', value: '4' },
  { label: '新增', value: '5' },
]
function initData(assetNo: any) {
  getEquByAssetNo(assetNo)
@@ -192,10 +232,14 @@
}
function handleInfo() {
  uni.showToast({
    title: '功能开发中',
    icon: 'none',
  })
  if (!model?.equId) {
    uni.showToast({ title: '未查询到设备,请联系管理员!', icon: 'none' })
    return
  }
  console.log("model::",model)
  selectedStatus.value = model.status || '5'
  changeReason.value = ''
  showStatusDialog.value = true
}
function handleInsp() {
@@ -273,20 +317,50 @@
      break
  }
}
;`/pages/repair/req-list`,
  // å¤„理维修请求点击事件
  function handleReqClick(item) {
    uni.navigateTo({
      url: `/pages/repair/req-detail?id=${item.id}`,
    })
  }
// // å¤„理维修单点击事件
// function handleResClick(item) {
//   uni.navigateTo({
//     url: `/pages/repair/res-detail?id=${item.id}`,
//   })
// }
// å¤„理维修请求点击事件
function handleReqClick(item) {
  uni.navigateTo({
    url: `/pages/repair/req-detail?id=${item.id}`,
  })
}
defineExpose({ handleReqClick })
function selectStatus(val: string) {
  selectedStatus.value = val
}
function handleStatusChangeCancel() {
  showStatusDialog.value = false
}
async function handleStatusChangeConfirm() {
  if (!selectedStatus.value) {
    uni.showToast({ title: '请选择设备状态', icon: 'none' })
    return
  }
  if (!changeReason.value.trim()) {
    uni.showToast({ title: '请填写变更原因', icon: 'none' })
    return
  }
  const params: EimsEquStatuBo = {
    equId: model.equId,
    beforeChange: model.status,
    afterChange: selectedStatus.value,
    changeDesc: changeReason.value,
    orderStatus: '0',
  }
  try {
    await addEquStatu(params)
    uni.showToast({ title: '提交成功,待管理员确认', icon: 'success' })
    showStatusDialog.value = false
    // å¯é€‰ï¼šåˆ·æ–°è®¾å¤‡ä¿¡æ¯
    initData(model.assetNo)
  } catch (e) {
    uni.showToast({ title: '提交失败', icon: 'none' })
  }
}
onLoad((options) => {
  uni.$on('list-refresh', loadRepairData)
@@ -324,4 +398,37 @@
:deep(.wd-card__title-content) {
  padding: 16rpx 0 !important;
}
.status-option {
  display: inline-block;
  padding: 10rpx 24rpx;
  margin: 8rpx 8rpx 8rpx 0;
  border-radius: 8rpx;
  border: 1px solid #eee;
  background: #f7f7f7;
  color: #666;
  cursor: pointer;
}
.status-option.active {
  background: $uni-color-primary;
  color: #fff;
  border-color: $uni-color-primary;
}
.popup-container {
  width: 600rpx;
  background: #fff;
  border-radius: 16rpx;
  padding: 32rpx 24rpx 24rpx 24rpx;
}
.popup-title {
  font-size: 32rpx;
  font-weight: bold;
  text-align: center;
  margin-bottom: 24rpx;
}
.popup-actions {
  display: flex;
  margin-top: 24rpx;
  gap: 16rpx;
  justify-content: space-around;
}
</style>
eims-ui-mobile/src/service/equ.ts
@@ -15,3 +15,5 @@
export const getEquByAssetNo = (assetNo: string) => {
  return http.get<EquVO>(`/eims/equ/info/${assetNo}`)
}
eims-ui-mobile/src/service/equ_status.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
export interface EimsEquStatuVO {
  /**
   * è®¾å¤‡çŠ¶æ€è®°å½•id
   */
  equStatuId?: number | string;
  /**
   * è®¾å¤‡id
   */
  equId?: number | string;
  /**
   * å˜æ›´å‰çŠ¶æ€
   */
  beforeChange?: string;
  /**
   * å˜æ›´åŽçŠ¶æ€
   */
  afterChange?: string;
  /**
   * å˜æ›´æ—¥æœŸ
   */
  changeDate?: string;
  /**
   * å˜æ›´äºº
   */
  changeUser?: number | string;
  /**
   * å˜æ›´äººéƒ¨é—¨
   */
  userDept?: number | string;
  /**
   * å˜æ›´æè¿°
   */
  changeDesc?: string;
  /**
   * æè¿°
   */
  remark?: string;
  /**
   * ç¡®è®¤äºº
   */
  confirmor?: number | string;
  /**
   * å˜æ›´å•状态(0-申请,1-同意,2-驳回)
   */
  orderStatus?: string;
}
export interface EimsEquStatuBo {
  /**
   * è®¾å¤‡çŠ¶æ€è®°å½•id
   */
  equStatuId?: number | string;
  /**
   * è®¾å¤‡id
   */
  equId?: number | string;
  /**
   * å˜æ›´å‰çŠ¶æ€
   */
  beforeChange?: string;
  /**
   * å˜æ›´åŽçŠ¶æ€
   */
  afterChange?: string;
  /**
   * å˜æ›´æ—¥æœŸ
   */
  changeDate?: string;
  /**
   * å˜æ›´æè¿°
   */
  changeDesc?: string;
  /**
   * æè¿°
   */
  remark?: string;
  /**
   * å˜æ›´å•状态(0-申请,1-同意,2-驳回)
   */
  orderStatus?: string;
}
eims-ui-mobile/src/service/equ_status.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
import { http } from '@/utils/http'
import type { EimsEquStatuVO, EimsEquStatuBo } from './equ_status.d'
/**
 * æŸ¥è¯¢è®¾å¤‡çŠ¶æ€è®°å½•åˆ—è¡¨
 */
export const getEquStatuList = (params: EimsEquStatuBo & { pageNum?: number; pageSize?: number }) => {
  return http.get<{ rows: EimsEquStatuVO[], total: number }>('/eims/equStatu/list', params)
}
/**
 * èŽ·å–è®¾å¤‡çŠ¶æ€è®°å½•è¯¦ç»†ä¿¡æ¯
 * @param equStatuId ä¸»é”®
 */
export const getEquStatuInfo = (equStatuId: number | string) => {
  return http.get<EimsEquStatuVO>(`/eims/equStatu/${equStatuId}`)
}
/**
 * æ–°å¢žè®¾å¤‡çŠ¶æ€è®°å½•
 */
export const addEquStatu = (data: EimsEquStatuBo) => {
  return http.post('/eims/equStatu', data)
}
/**
 * ä¿®æ”¹è®¾å¤‡çŠ¶æ€è®°å½•
 */
export const updateEquStatu = (data: EimsEquStatuBo) => {
  return http.put('/eims/equStatu', data)
}
/**
 * åˆ é™¤è®¾å¤‡çŠ¶æ€è®°å½•
 * @param equStatuIds ä¸»é”®ä¸²
 */
export const deleteEquStatu = (equStatuIds: (number | string)[]) => {
  return http.delete(`/eims/equStatu/${equStatuIds.join(',')}`)
}
/**
 * å¯¼å‡ºè®¾å¤‡çŠ¶æ€è®°å½•åˆ—è¡¨
 */
export const exportEquStatu = (params: EimsEquStatuBo) => {
  return http.post('/eims/equStatu/export', params, {
    responseType: 'blob'
  })
}
eims-ui-mobile/src/types/uni-pages.d.ts
@@ -7,6 +7,7 @@
  url: "/pages/home/index" |
       "/pages/equ/equ-list" |
       "/pages/equ/index" |
       "/pages/equ-status/list" |
       "/pages/fixture/fixture-list" |
       "/pages/inspect/insp-add" |
       "/pages/inspect/insp-record" |
@@ -16,6 +17,7 @@
       "/pages/maint/maint-st" |
       "/pages/maint/order-detail" |
       "/pages/my/index" |
       "/pages/my/password" |
       "/pages/repair/repair-add" |
       "/pages/repair/repair-fb" |
       "/pages/repair/req-detail" |
eims/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
@@ -10,7 +10,7 @@
 * @author Lion Li
 */
@SpringBootApplication(scanBasePackages={"org.dromara", "cn.shlanbao"})
@SpringBootApplication(scanBasePackages={"org.dromara"})
public class DromaraApplication {
    public static void main(String[] args) {
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsEquStatu.java
@@ -69,5 +69,15 @@
     */
    private String remark;
    /**
     * ç¡®è®¤äºº
     */
    private Long confirmor;
    /**
     * å˜æ›´å•状态(0-申请,1-同意,2-驳回)
     */
    private String orderStatus;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsEquStatuBo.java
@@ -60,7 +60,6 @@
    /**
     * å˜æ›´æè¿°
     */
    @NotBlank(message = "变更描述不能为空", groups = { AddGroup.class, EditGroup.class })
    private String changeDesc;
    /**
@@ -68,5 +67,13 @@
     */
    private String remark;
    /**
     * ç¡®è®¤äºº
     */
    private Long confirmor;
    /**
     * å˜æ›´å•状态(0-申请,1-同意,2-驳回)
     */
    private String orderStatus;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsEquStatuVo.java
@@ -47,8 +47,10 @@
    /**
     * è®¾å¤‡åç§°
     */
    @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
    private String equName;
    private String assetNo;
    /**
     * å˜æ›´å‰çŠ¶æ€
@@ -96,4 +98,19 @@
    private String remark;
    /**
     * ç¡®è®¤äºº
     */
    private Long confirmor;
    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "confirmor")
    private String confirmorName;
    /**
     * å˜æ›´å•状态(0-申请,1-同意,2-驳回)
     */
    private String orderStatus;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/InspectPlanToRecordJob.java
@@ -4,6 +4,7 @@
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
@@ -43,19 +44,20 @@
    @SneakyThrows
    @Transactional(rollbackFor = Exception.class)
    public ExecuteResult jobExecute(JobArgs jobArgs) {
        // èŽ·å–ä»Šå¤©æ—¥æœŸ
        Date today = new Date();
        LambdaQueryWrapper<EimsInspectPlan> planBoQueryWrapper = Wrappers.lambdaQuery();
        QueryWrapper<EimsInspectPlan> planBoQueryWrapper = Wrappers.query();
        // æŸ¥è¯¢å¯ç”¨çš„点检计划
        planBoQueryWrapper.eq(EimsInspectPlan::getStatus, DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
        planBoQueryWrapper.eq("ip.status", DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL)
            .eq("equ.status", DictConstants.EIMS_EQU_STATUS_DETAIL.SHIYONG);
        // å¢žåŠ è¿‡æ»¤æ¡ä»¶ ä¸Šæ¬¡ç”Ÿæˆæ—¥æœŸå°äºŽå½“前日期
        planBoQueryWrapper.and(wrapper -> wrapper.eq("ip.insp_next_time", DateUtils.getDate()).or().isNull("ip.insp_next_time"));
//        // è¿‡æ»¤æ²¡æœ‰ä¸‹æ¬¡è¿è¡Œæ—¶é—´
//        planBoQueryWrapper.isNotNull(EimsInspectPlan::getInspNextTime);
//        // è¿‡æ»¤æ²¡æœ‰ç‚¹æ£€å‘¨æœŸçš„æ•°æ®
//        planBoQueryWrapper.isNotNull(EimsInspectPlan::getInspCycle);
//        planBoQueryWrapper.isNotNull(EimsInspectPlan::getInspCycleUnit);
        List<EimsInspectPlanVo> planVoList = planMapper.selectVoList(planBoQueryWrapper);
        List<EimsInspectPlanVo> planVoList = planMapper.selectVoListJoinEqu(planBoQueryWrapper);
        for (int i = 0; i < planVoList.size(); i++) {
            EimsInspectPlanVo planVo = planVoList.get(i);
//            // ç‚¹æ£€è®¡åˆ’add的时候会自动生成下次运行时间
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
@@ -4,6 +4,7 @@
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
@@ -40,17 +41,19 @@
        // èŽ·å–ä»Šå¤©æ—¥æœŸ
        Date today = new Date();
        LambdaQueryWrapper<EimsMaintPlan> planBoQueryWrapper = Wrappers.lambdaQuery();
        QueryWrapper<EimsMaintPlan> planBoQueryWrapper = Wrappers.query();
        // æŸ¥è¯¢å¯ç”¨çš„保养计划
        planBoQueryWrapper.eq(EimsMaintPlan::getStatus, DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
        // è¿‡æ»¤æ²¡æœ‰ä¸‹æ¬¡è¿è¡Œæ—¶é—´
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintNextTime);
        // è¿‡æ»¤æ²¡æœ‰ä¿å…»å‘¨æœŸçš„æ•°æ®
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintCycle);
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintCycleUnit);
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintRule);
        List<EimsMaintPlanVo> planVoList = planMapper.selectVoList(planBoQueryWrapper);
        planBoQueryWrapper.eq("mp.status", DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
        planBoQueryWrapper .eq("equ.status", DictConstants.EIMS_EQU_STATUS_DETAIL.SHIYONG);
        // è¿‡æ»¤ä¸‹æ¬¡è¿è¡Œæ—¶é—´ç­‰äºŽå½“天时间的
        planBoQueryWrapper.eq("mp.maint_next_time", DateUtils.getDate());
        // è¿‡æ»¤æ²¡æœ‰ä¿å…»å‘¨æœŸçš„æ•°æ®
        planBoQueryWrapper.isNotNull("mp.maint_cycle");
        planBoQueryWrapper.isNotNull("mp.maint_cycle_unit");
        planBoQueryWrapper.isNotNull("mp.maint_rule");
        List<EimsMaintPlanVo> planVoList = planMapper.selectVoListJoinEqu(planBoQueryWrapper);
        for (int i = 0; i < planVoList.size(); i++) {
            EimsMaintPlanVo planVo = planVoList.get(i);
            // ä¿å…»è®¡åˆ’add的时候会自动生成下次运行时间
@@ -63,9 +66,6 @@
            // è®¡ç®—生成工单时间
            Long maintCycle = planVo.getMaintCycle();
            String maintRule = planVo.getMaintRule();
            Date firstTime = planVo.getMaintFirstTime();
            Date lastTime = planVo.getMaintLastTime();
            Date newNext = null;
            String maintCycleUnit = planVo.getMaintCycleUnit();
            switch (maintCycleUnit) {
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsEquStatuMapper.java
@@ -1,8 +1,12 @@
package org.dromara.eims.mapper;
import org.dromara.eims.domain.EimsEquStatu;
import org.dromara.eims.domain.bo.EimsEquStatuBo;
import org.dromara.eims.domain.vo.EimsEquStatuVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.List;
/**
 * è®¾å¤‡çŠ¶æ€è®°å½•Mapper接口
@@ -12,4 +16,6 @@
 */
public interface EimsEquStatuMapper extends BaseMapperPlus<EimsEquStatu, EimsEquStatuVo> {
    List<EimsEquStatuVo> selectEquStatuPage(@Param("bo") EimsEquStatuBo bo, @Param("pageQuery") PageQuery pageQuery);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInspectPlanMapper.java
@@ -1,12 +1,15 @@
package org.dromara.eims.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.eims.domain.EimsInspectPlan;
import org.dromara.eims.domain.vo.EimsInspectPlanVo;
import java.util.List;
/**
 * ç‚¹æ£€è®¡åˆ’Mapper接口
@@ -16,4 +19,6 @@
 */
public interface EimsInspectPlanMapper extends BaseMapperPlus<EimsInspectPlan, EimsInspectPlanVo> {
    Page<EimsInspectPlanVo> selectInspPlanList(@Param("page") Page<EimsInspectPlanVo> page, @Param(Constants.WRAPPER) Wrapper<EimsInspectPlan> queryWrapper);
    List<EimsInspectPlanVo> selectVoListJoinEqu(@Param(Constants.WRAPPER) Wrapper<EimsInspectPlan> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java
@@ -1,14 +1,18 @@
package org.dromara.eims.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.eims.domain.EimsInspectPlan;
import org.dromara.eims.domain.EimsMaintPlan;
import org.dromara.eims.domain.EimsRepairReq;
import org.dromara.eims.domain.vo.EimsMaintPlanVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
import java.util.List;
/**
 * ä¿å…»è®¡åˆ’Mapper接口
@@ -19,4 +23,5 @@
public interface EimsMaintPlanMapper extends BaseMapperPlus<EimsMaintPlan, EimsMaintPlanVo> {
    Page<EimsMaintPlanVo> selectMaintPlanList(@Param("page") Page<EimsMaintPlanVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintPlan> queryWrapper);
    List<EimsMaintPlanVo> selectVoListJoinEqu(@Param(Constants.WRAPPER) Wrapper<EimsMaintPlan> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsEquStatuServiceImpl.java
@@ -1,5 +1,7 @@
package org.dromara.eims.service.impl;
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;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -8,6 +10,7 @@
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.EimsEqu;
import org.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsEquStatuBo;
@@ -15,6 +18,9 @@
import org.dromara.eims.domain.EimsEquStatu;
import org.dromara.eims.mapper.EimsEquStatuMapper;
import org.dromara.eims.service.IEimsEquStatuService;
import org.dromara.eims.service.IEimsEquService;
import org.dromara.eims.domain.bo.EimsEquBo;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
@@ -31,6 +37,7 @@
public class EimsEquStatuServiceImpl implements IEimsEquStatuService {
    private final EimsEquStatuMapper baseMapper;
    private final IEimsEquService equService;
    /**
     * æŸ¥è¯¢è®¾å¤‡çŠ¶æ€è®°å½•
@@ -52,9 +59,11 @@
     */
    @Override
    public TableDataInfo<EimsEquStatuVo> queryPageList(EimsEquStatuBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<EimsEquStatu> lqw = buildQueryWrapper(bo);
        Page<EimsEquStatuVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
        // ä½¿ç”¨è‡ªå®šä¹‰SQL实现设备状态与设备表的模糊关联分页查询
        Page<EimsEquStatuVo> page = pageQuery.build();
        List<EimsEquStatuVo> list = baseMapper.selectEquStatuPage(bo, pageQuery);
        page.setRecords(list);
        return TableDataInfo.build(page);
    }
    /**
@@ -89,7 +98,11 @@
     */
    @Override
    public Boolean insertByBo(EimsEquStatuBo bo) {
        // èŽ·å–ç™»å½•ç”¨æˆ·
        LoginUser loginUser = LoginHelper.getLoginUser();
        EimsEquStatu add = MapstructUtils.convert(bo, EimsEquStatu.class);
        add.setChangeUser(loginUser.getUserId());
        add.setChangeDate(DateUtils.getNowDate());
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
@@ -105,10 +118,20 @@
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateByBo(EimsEquStatuBo bo) {
        EimsEquStatu update = MapstructUtils.convert(bo, EimsEquStatu.class);
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
        boolean result = baseMapper.updateById(update) > 0;
        // åŒæ„æ—¶åŒæ­¥è®¾å¤‡çŠ¶æ€
        if ("1".equals(String.valueOf(bo.getOrderStatus()))) {
            EimsEquStatuVo vo = baseMapper.selectVoById(bo.getEquStatuId());
            EimsEquBo equBo = new EimsEquBo();
            equBo.setEquId(vo.getEquId());
            equBo.setStatus(vo.getAfterChange());
            equService.updateByBo(equBo);
        }
        return result;
    }
    /**
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java
@@ -132,20 +132,12 @@
    @Override
    public TableDataInfo<EimsInspectStVo> queryPageList(EimsInspectStBo bo, PageQuery pageQuery) {
        bo.setType(bo.getViewMode());
        // æœˆè§†å›¾
//        if(bo.getViewMode().equals("Month")){
            QueryWrapper<EimsInspectSt> qw = buildWrapper(bo);
            Page<EimsInspectStVo> result = baseMapper.selectInspStList(pageQuery.build(), qw);
            // å¡«å……数据
            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);
//        }
//       return null;
    }
    /**
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsEquStatuMapper.xml
@@ -4,4 +4,40 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.eims.mapper.EimsEquStatuMapper">
    <resultMap type="org.dromara.eims.domain.vo.EimsEquStatuVo" id="EquStatuVoResult">
    </resultMap>
    <select id="selectEquStatuPage" resultMap="EquStatuVoResult">
        SELECT s.*, e.equ_name AS equName, e.asset_no AS assetNo
        FROM eims_equ_statu s
        LEFT JOIN eims_equ e ON s.equ_id = e.equ_id
        <where>
            <if test="bo.equId != null">
                AND s.equ_id = #{bo.equId}
            </if>
            <if test="bo.beforeChange != null and bo.beforeChange != ''">
                AND s.before_change = #{bo.beforeChange}
            </if>
            <if test="bo.afterChange != null and bo.afterChange != ''">
                AND s.after_change = #{bo.afterChange}
            </if>
            <if test="bo.changeUser != null">
                AND s.change_user = #{bo.changeUser}
            </if>
            <if test="bo.orderStatus != null and bo.orderStatus != ''">
                AND s.order_status = #{bo.orderStatus}
            </if>
            <if test="bo.params != null and bo.params.beginTime != null and bo.params.endTime != null">
                AND s.change_date BETWEEN #{bo.params.beginTime} AND #{bo.params.endTime}
            </if>
            <if test="bo.params != null and bo.params.searchValue != null and bo.params.searchValue != ''">
                AND (
                    e.equ_name LIKE CONCAT('%', #{bo.params.searchValue}, '%')
                    OR e.asset_no LIKE CONCAT('%', #{bo.params.searchValue}, '%')
                )
            </if>
        </where>
        ORDER BY s.change_date DESC
    </select>
</mapper>
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInspectPlanMapper.xml
@@ -16,4 +16,10 @@
                 LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = ip.insp_cycle_unit
            ${ew.getCustomSqlSegment}
    </select>
    <select id="selectVoListJoinEqu" resultType="org.dromara.eims.domain.vo.EimsInspectPlanVo">
        SELECT ip.*
        FROM eims_inspect_plan ip
                 LEFT JOIN eims_equ equ ON ip.equ_id = equ.equ_id
        ${ew.getCustomSqlSegment}
    </select>
</mapper>
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml
@@ -16,4 +16,10 @@
                 LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = mp.maint_cycle_unit
            ${ew.getCustomSqlSegment}
    </select>
    <select id="selectVoListJoinEqu" resultType="org.dromara.eims.domain.vo.EimsMaintPlanVo">
        SELECT mp.*
        FROM eims_maint_plan mp
                 LEFT JOIN eims_equ equ ON mp.equ_id = equ.equ_id
            ${ew.getCustomSqlSegment}
    </select>
</mapper>