车间能级提升-智能设备管理系统
zhuguifei
2025-02-26 d85cb9da90d1dd24f6ecfa187aa8c4198394c29a
开发维修工单
已添加19个文件
已修改11个文件
2120 ■■■■■ 文件已修改
eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/repair-res/model.d.ts 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/components/repair-req-modal.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/repair-res-drawer.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RepairReqService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RepairResService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/RepairReqCodeTranslationImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/RepairResCodeTranslationImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairResController.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairReqVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsEquImportListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairReqMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairResMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairResService.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsRepairResMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
import type { RepairResVO } from './model';
import type { ID, IDS } from '#/api/common';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
enum Api {
  repairResExport = '/eims/repairRes/export',
  repairResList = '/eims/repairRes/list',
  root = '/eims/repairRes'
}
/**
 * æŸ¥è¯¢ç»´ä¿®å·¥å•列表
 * @param query
 * @returns {*}
 */
export function listRepairRes(params?: any) {
  return requestClient.get<RepairResVO[]>(Api.repairResList, { params });
}
/**
 * æŸ¥è¯¢ç»´ä¿®å·¥å•详细
 * @param repairResId
 */
export function getRepairRes(repairResId: ID) {
  return requestClient.get<RepairResVO>(`${Api.root}/${repairResId}`);
}
/**
 * æ–°å¢žç»´ä¿®å·¥å•
 * @param data
 */
export function addRepairRes(data: any) {
  return requestClient.postWithMsg<void>(Api.root, data);
}
/**
 * ä¿®æ”¹ç»´ä¿®å·¥å•
 * @param data
 */
export function updateRepairRes(data: any) {
  return requestClient.putWithMsg<void>(Api.root, data);
}
/**
 * åˆ é™¤ç»´ä¿®å·¥å•
 * @param repairResId
 */
export function delRepairRes(repairResId: IDS) {
  return requestClient.deleteWithMsg<void>(`${Api.root}/${repairResId}`);
}
/**
 * å¯¼å‡º
 * @param
 */
export function repairResExport(data: any) {
  return commonExport(Api.repairResExport, data);
}
eims-ui/apps/web-antd/src/api/eims/repair-res/model.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
export interface RepairResVO {
  /**
   *
   */
  id: number | string;
  /**
   * æŠ¥ä¿®å•id
   */
  reqId: number | string;
  /**
   * ç»´ä¿®å•号
   */
  resCode: string;
  /**
   * ç»´ä¿®äºº
   */
  resUser: number;
  /**
   * ç»´ä¿®äººéƒ¨é—¨
   */
  resDept: number;
  /**
   * åŽŸå› åˆ†æž
   */
  resReason: string;
  /**
   * å¤„理措施
   */
  resHandle: string;
  /**
   * é¢„防措施
   */
  resPrevent: string;
  /**
   * ç»´ä¿®çŠ¶æ€(字典)
   */
  status: string;
  /**
   * å¼€å§‹æ—¶é—´
   */
  startTime: string;
  /**
   * ç»“束时间
   */
  endTime: string;
  /**
   * ä½¿ç”¨å·¥å…·
   */
  useFixture: string;
  /**
   * ä½¿ç”¨å¤‡ä»¶
   */
  useParts: string;
  /**
   * å¤‡æ³¨
   */
  remark: string;
}
export interface RepairResForm extends BaseEntity {
  /**
   *
   */
  id?: number | string;
  /**
   * æŠ¥ä¿®å•id
   */
  reqId?: number | string;
  /**
   * ç»´ä¿®äºº
   */
  resUser?: number;
  /**
   * ç»´ä¿®äººéƒ¨é—¨
   */
  resDept?: number;
  /**
   * åŽŸå› åˆ†æž
   */
  resReason?: string;
  /**
   * å¤„理措施
   */
  resHandle?: string;
  /**
   * é¢„防措施
   */
  resPrevent?: string;
  /**
   * ç»´ä¿®çŠ¶æ€(字典)
   */
  status?: string;
  /**
   * å¼€å§‹æ—¶é—´
   */
  startTime?: string;
  /**
   * ç»“束时间
   */
  endTime?: string;
  /**
   * ä½¿ç”¨å·¥å…·
   */
  useFixture?: string;
  /**
   * ä½¿ç”¨å¤‡ä»¶
   */
  useParts?: string;
  /**
   * å¤‡æ³¨
   */
  remark?: string;
}
export interface RepairResQuery extends PageQuery {
  /**
   * ç»´ä¿®äºº
   */
  resUser?: number;
  /**
   * ç»´ä¿®äººéƒ¨é—¨
   */
  resDept?: number;
  /**
   * ç»´ä¿®çŠ¶æ€(字典)
   */
  status?: string;
  /**
   * å¼€å§‹æ—¶é—´
   */
  startTime?: string;
  /**
   * ç»“束时间
   */
  endTime?: string;
  /**
   * æ—¥æœŸèŒƒå›´å‚æ•°
   */
  params?: any;
}
eims-ui/apps/web-antd/src/views/eims/components/repair-req-modal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
<script setup lang="ts">
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import InnerView from '#/views/eims/repair-req/index.vue';
const emit = defineEmits<{ updateSelect: [any] }>();
const [BasicModal, modalApi] = useVbenModal({
  fullscreenButton: false,
  draggable: true,
  onCancel: handleCancel,
  onConfirm: handleConfirm
});
const innerView = ref();
async function handleConfirm() {
  try {
    modalApi.modalLoading(true);
    const tableSelect = innerView.value.tableSelect();
    if (tableSelect.length > 1) {
      message.error('最多只能选择一条数据!');
      modalApi.modalLoading(false);
      return false;
    }
    emit('updateSelect', tableSelect[0]);
    await handleCancel();
  } catch (error) {
    console.error(error);
  } finally {
    modalApi.modalLoading(false);
  }
}
async function handleCancel() {
  modalApi.close();
}
</script>
<template>
  <BasicModal :fullscreen-button="true" class="w-[800px]">
    <InnerView ref="innerView" :filter-flag="true" status="0" />
  </BasicModal>
</template>
<style scoped></style>
eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx
@@ -96,6 +96,11 @@
    }
  },
  {
    title: '维修单号',
    field: 'resCode',
    minWidth: 200
  },
  {
    title: '报修类型',
    field: 'reqType',
    sortable: true,
eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue
@@ -5,6 +5,7 @@
import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useUserStore } from '@vben/stores';
import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
import { Modal, Popconfirm, Space } from 'ant-design-vue';
@@ -16,11 +17,23 @@
import { columns, querySchema } from './data';
import repairReqDrawer from './repair-req-drawer.vue';
import { useUserStore } from '@vben/stores';
interface Props {
  filterFlag?: boolean;
  status?: string;
}
const props = withDefaults(defineProps<Props>(), { filterFlag: false, status: undefined });
const userStore = useUserStore();
const userId = userStore.userInfo?.userId;
const deptId = userStore.userInfo?.deptId;
defineExpose({
  tableSelect
});
const formOptions: VbenFormProps = {
  commonConfig: {
@@ -45,13 +58,21 @@
    // ç‚¹å‡»è¡Œé€‰ä¸­
    // trigger: 'row'
  },
  columns,
  columns: columns?.filter((item) => (props.filterFlag ? item.field !== 'action' : item.field !== '-1')),
  height: 'auto',
  keepSource: true,
  pagerConfig: {},
  toolbarConfig: {
    enabled: !props.filterFlag
  },
  proxyConfig: {
    ajax: {
      query: async ({ page }, formValues = {}) => {
        // å¦‚果传入了equId则只查询当前id数据
        if (props.filterFlag && props.status) {
          const params = { status: props.status };
          Object.assign(formValues, params);
        }
        return await listRepairReq({
          pageNum: page.currentPage,
          pageSize: page.pageSize,
@@ -191,12 +212,16 @@
    }
  ]);
}
// é€‰ä¸­æ•°æ®
function tableSelect() {
  return tableApi.grid.getCheckboxRecords();
}
</script>
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px]">
      <BasicTable class="flex-1 overflow-hidden" table-title="设备盘点列表">
      <BasicTable class="flex-1 overflow-hidden" table-title="故障报修列表">
        <template #toolbar-tools>
          <Space>
            <a-button v-access:code="['eims:repairReq:export']" @click="handleDownloadExcel">
eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,296 @@
import type { VxeGridProps } from '#/adapter/vxe-table';
import { DictEnum } from '@vben/constants';
import { getPopupContainer } from '@vben/utils';
import dayjs from 'dayjs';
import { type FormSchemaGetter } from '#/adapter/form';
import { REPAIR_REQ_TYPE } from '#/constants/dict';
import { getDictOptions } from '#/utils/dict';
import { renderDict } from '#/utils/render';
const curDateTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
export const querySchema: FormSchemaGetter = () => [
  {
    component: 'Input',
    fieldName: 'resCode',
    label: '维修单号'
  },
  {
    component: 'Input',
    fieldName: 'reqCode',
    label: '报修单号'
  },
  {
    component: 'Select',
    componentProps: {
      options: getDictOptions(DictEnum.REPAIR_RES_STATUS)
    },
    fieldName: 'status',
    label: '状态'
  },
  {
    component: 'TreeSelect',
    // åœ¨drawer里更新 è¿™é‡Œä¸éœ€è¦é»˜è®¤çš„componentProps
    defaultValue: undefined,
    fieldName: 'resDept',
    label: '维修部门'
    // rules: 'selectRequired',
  },
  {
    component: 'Select',
    componentProps: {
      showSearch: true,
      allowClear: true,
      getPopupContainer
    },
    fieldName: 'resUser',
    label: '维修人'
  }
];
export const columns: VxeGridProps['columns'] = [
  { type: 'checkbox', width: 60, fixed: 'left' },
  {
    title: '维修单号',
    field: 'resCode',
    minWidth: 160,
    fixed: 'left'
  },
  {
    title: '维修状态',
    field: 'status',
    minWidth: 100,
    fixed: 'left',
    slots: {
      default: ({ row }) => {
        if (row.status === null || row.status === '') {
          return '';
        }
        return renderDict(row.status, DictEnum.REPAIR_RES_STATUS);
      }
    }
  },
  {
    title: '报修单号',
    field: 'reqCode',
    minWidth: 160,
  },
  {
    title: '维修部门',
    field: 'resDeptName',
    minWidth: 100
  },
  {
    title: '维修人',
    field: 'resUserName',
    minWidth: 100
  },
  {
    title: '报修类型',
    field: 'reqType',
    sortable: true,
    minWidth: 100,
    slots: {
      default: ({ row }) => {
        if (row.reqType === null || row.reqType === '') {
          return '';
        }
        return renderDict(row.reqType, DictEnum.REPAIR_REQ_TYPE);
      }
    }
  },
  {
    title: '报修时间',
    field: 'reqTime',
    sortable: true,
    minWidth: 200
  },
  {
    title: '设备(工具)名称',
    sortable: true,
    minWidth: 150,
    slots: {
      default: ({ row }) => {
        if (!row.reqType) {
          return '';
        }
        // æ ¹æ®ä¸åŒçš„请求类型返回相应的名称
        switch (row.reqType) {
          case REPAIR_REQ_TYPE.EQU: {
            return row.equName;
          }
          case REPAIR_REQ_TYPE.FIXTURE: {
            return row.fixtureName;
          }
          default: {
            // å¦‚果请求类型既不是 EQU ä¹Ÿä¸æ˜¯ FIXTURE,则返回空字符串
            return '';
          }
        }
      }
    }
  },
  {
    title: '故障类别',
    field: 'faultType',
    minWidth: 100,
    slots: {
      default: ({ row }) => {
        if (row.faultType === null || row.faultType === '') {
          return '';
        }
        return renderDict(row.faultType, DictEnum.REPAIR_FAULT_TYPE);
      }
    }
  },
  {
    title: '报修部门',
    field: 'reqDeptName',
    minWidth: 100
  },
  {
    title: '报修人',
    field: 'reqUserName',
    minWidth: 100
  },
  {
    title: '故障描述',
    field: 'reqDesc',
    minWidth: 120
  },
  {
    field: 'action',
    fixed: 'right',
    slots: { default: 'action' },
    title: '操作',
    width: 130
  }
];
export const drawerSchema: FormSchemaGetter = () => [
  {
    component: 'Input',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    fieldName: 'id'
  },
  {
    component: 'Input',
    fieldName: 'reqId',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    label: '报修id'
  },
  {
    component: 'Input',
    fieldName: 'reqCode',
    label: '报修单号'
  },
  {
    component: 'Input',
    fieldName: 'resCode',
    label: '维修单号'
  },
  {
    component: 'Textarea',
    formItemClass: 'items-baseline',
    fieldName: 'resReason',
    label: '原因分析'
  },
  {
    component: 'Textarea',
    formItemClass: 'items-baseline',
    fieldName: 'resHandle',
    label: '处理措施'
  },
  {
    component: 'Textarea',
    formItemClass: 'items-baseline',
    fieldName: 'resPrevent',
    label: '预防措施'
  },
  {
    component: 'Input',
    fieldName: 'fixtureName',
    label: '工具名称',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    }
  },
  {
    component: 'Input',
    fieldName: 'fixtureId',
    label: '工具id',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    }
  },
  {
    component: 'Select',
    componentProps: {
      getPopupContainer,
      options: getDictOptions(DictEnum.REPAIR_RES_STATUS)
    },
    fieldName: 'status',
    defaultValue: '0',
    label: '维修状态'
  },
  {
    component: 'DatePicker',
    componentProps: {
      format: 'YYYY-MM-DD HH:mm:ss',
      showTime: true,
      valueFormat: 'YYYY-MM-DD HH:mm:ss',
      getPopupContainer
    },
    defaultValue: curDateTime,
    fieldName: 'startTime',
    label: '开始时间'
  },
  {
    component: 'DatePicker',
    componentProps: {
      format: 'YYYY-MM-DD HH:mm:ss',
      showTime: true,
      valueFormat: 'YYYY-MM-DD HH:mm:ss',
      getPopupContainer
    },
    fieldName: 'endTime',
    label: '结束时间'
  },
  {
    component: 'TreeSelect',
    // åœ¨drawer里更新 è¿™é‡Œä¸éœ€è¦é»˜è®¤çš„componentProps
    defaultValue: undefined,
    fieldName: 'resDept',
    label: '维修部门',
    help: `报修人员所属部门`
    // rules: 'selectRequired',
  },
  {
    component: 'Select',
    componentProps: {
      showSearch: true,
      allowClear: true,
      getPopupContainer
    },
    fieldName: 'resUser',
    label: '维修人'
  },
  {
    component: 'Textarea',
    formItemClass: 'items-baseline',
    fieldName: 'remark',
    label: '备注'
  },
];
eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
<script setup lang="ts">
import type { Recordable } from '@vben/types';
import { onMounted } from 'vue';
import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
import { Modal, Popconfirm, Space } from 'ant-design-vue';
import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
import { delRepairRes, listRepairRes, repairResExport } from '#/api/eims/repair-res';
import { getDeptTree, userList } from '#/api/system/user';
import { commonDownloadExcel } from '#/utils/file/download';
import { columns, querySchema } from './data';
import repairResDrawer from './repair-res-drawer.vue';
import { useUserStore } from '@vben/stores';
const userStore = useUserStore();
const userId = userStore.userInfo?.userId;
const deptId = userStore.userInfo?.deptId;
const formOptions: VbenFormProps = {
  commonConfig: {
    labelWidth: 80,
    componentProps: {
      allowClear: true
    }
  },
  schema: querySchema(),
  collapsed: true,
  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
  // æ—¥æœŸé€‰æ‹©æ ¼å¼åŒ–
  fieldMappingTime: [['startTime', ['params[beginStartTime]', 'params[endStartTime]'], ['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59']]]
};
const gridOptions: VxeGridProps = {
  checkboxConfig: {
    // é«˜äº®
    highlight: true,
    // ç¿»é¡µæ—¶ä¿ç•™é€‰ä¸­çŠ¶æ€
    reserve: true
    // ç‚¹å‡»è¡Œé€‰ä¸­
    // trigger: 'row'
  },
  columns,
  height: 'auto',
  keepSource: true,
  pagerConfig: {},
  proxyConfig: {
    ajax: {
      query: async ({ page }, formValues = {}) => {
        return await listRepairRes({
          pageNum: page.currentPage,
          pageSize: page.pageSize,
          ...formValues
          // ...useRoleBaseFilters()
        });
      }
    }
  },
  rowConfig: {
    isHover: true,
    keyField: 'id'
  },
  sortConfig: {
    // è¿œç¨‹æŽ’序
    remote: true,
    // æ”¯æŒå¤šå­—段排序 é»˜è®¤å…³é—­
    multiple: true
  },
  id: 'eims-repair-res-index'
};
const [BasicTable, tableApi] = useVbenVxeGrid({
  formOptions,
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
  }
});
const [RepairResDrawer, repairResDrawerApi] = useVbenDrawer({
  connectedComponent: repairResDrawer
});
function handleAdd() {
  repairResDrawerApi.setData({ resUser: userId, resDept: deptId });
  repairResDrawerApi.open();
}
async function handleEdit(record: Recordable<any>) {
  repairResDrawerApi.setData({ id: record.id });
  repairResDrawerApi.open();
}
async function handleDelete(row: Recordable<any>) {
  await delRepairRes(row.id);
  await tableApi.query();
}
function handleMultiDelete() {
  const rows = tableApi.grid.getCheckboxRecords();
  const ids = rows.map((row: any) => row.id);
  Modal.confirm({
    title: '提示',
    okType: 'danger',
    content: `确认删除选中的${ids.length}条记录吗?`,
    onOk: async () => {
      await delRepairRes(ids);
      await tableApi.query();
    }
  });
}
function handleDownloadExcel() {
  commonDownloadExcel(repairResExport, '维修工单记录', tableApi.formApi.form.values, {
    fieldMappingTime: formOptions.fieldMappingTime
  });
}
onMounted(async () => {
  await setupDeptSelect();
});
/**
 * ç”¨æˆ·çš„加载
 */
async function setupUserOptions(deptId: any) {
  const params = { deptId };
  const userPageResult = await userList({
    pageNum: 1,
    pageSize: 500,
    ...params
  });
  const options = userPageResult.rows.map((item) => ({
    label: item.nickName || item.userName,
    value: item.userId
  }));
  // ç­›é€‰
  const filterOption = (input: string, option: any) => {
    return option.label.toLowerCase().includes(input.toLowerCase());
  };
  const placeholder = options.length > 0 ? '请选择' : '该部门下暂无用户';
  tableApi.formApi.updateSchema([
    {
      componentProps: { options, placeholder, filterOption },
      fieldName: 'resUser'
    }
  ]);
}
/**
 * åˆå§‹åŒ–部门选择
 */
async function setupDeptSelect() {
  // updateSchema
  const deptTree = await getDeptTree();
  // é€‰ä¸­åŽæ˜¾ç¤ºåœ¨è¾“入框的值 å³çˆ¶èŠ‚ç‚¹ / å­èŠ‚ç‚¹
  addFullName(deptTree, 'label', ' / ');
  tableApi.formApi.updateSchema([
    {
      componentProps: (formModel) => ({
        class: 'w-full',
        fieldNames: {
          key: 'id',
          value: 'id',
          children: 'children'
        },
        getPopupContainer,
        async onSelect(deptId: number | string) {
          /** æ ¹æ®éƒ¨é—¨ID加载用户 */
          await setupUserOptions(deptId);
          /** å˜åŒ–后需要重新选择用户 */
          formModel.reqUser = undefined;
        },
        placeholder: '请选择',
        showSearch: true,
        treeData: deptTree,
        treeDefaultExpandAll: true,
        treeLine: { showLeafIcon: false },
        // ç­›é€‰çš„字段
        treeNodeFilterProp: 'label',
        // é€‰ä¸­åŽæ˜¾ç¤ºåœ¨è¾“入框的值
        treeNodeLabelProp: 'fullName'
      }),
      fieldName: 'resDept'
    }
  ]);
}
</script>
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px]">
      <BasicTable class="flex-1 overflow-hidden" table-title="维修工单列表">
        <template #toolbar-tools>
          <Space>
            <a-button v-access:code="['eims:repairRes:export']" @click="handleDownloadExcel">
              {{ $t('pages.common.export') }}
            </a-button>
            <a-button
              :disabled="!vxeCheckboxChecked(tableApi)"
              danger
              type="primary"
              v-access:code="['eims:repairRes:remove']"
              @click="handleMultiDelete"
            >
              {{ $t('pages.common.delete') }}
            </a-button>
            <a-button type="primary" v-access:code="['eims:repairRes:add']" @click="handleAdd">
              {{ $t('pages.common.add') }}
            </a-button>
          </Space>
        </template>
        <template #action="{ row }">
          <Space>
            <ghost-button v-access:code="['eims:repairRes:edit']" @click.stop="handleEdit(row)">
              {{ $t('pages.common.edit') }}
            </ghost-button>
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?" @confirm="handleDelete(row)">
              <ghost-button danger v-access:code="['eims:repairRes:remove']" @click.stop="">
                {{ $t('pages.common.delete') }}
              </ghost-button>
            </Popconfirm>
          </Space>
        </template>
      </BasicTable>
    </div>
    <RepairResDrawer @reload="tableApi.query()" />
  </Page>
</template>
eims-ui/apps/web-antd/src/views/eims/repair-res/repair-res-drawer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
import { InputSearch, Modal } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { addRepairRes, getRepairRes, updateRepairRes } from '#/api/eims/repair-res';
import { getDeptTree, userList } from '#/api/system/user';
import reqModal from '#/views/eims/components/repair-req-modal.vue';
import { drawerSchema } from './data';
const emit = defineEmits<{ reload: [] }>();
const isUpdate = ref(false);
const title = computed(() => {
  return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
});
const [BasicForm, formApi] = useVbenForm({
  commonConfig: {
    formItemClass: 'col-span-2',
    componentProps: {
      class: 'w-full'
    },
    labelWidth: 120
  },
  schema: drawerSchema(),
  showDefaultActions: false,
  wrapperClass: 'grid-cols-2'
});
const [BasicDrawer, drawerApi] = useVbenDrawer({
  onCancel: handleCancel,
  onConfirm: handleConfirm,
  async onOpenChange(isOpen) {
    if (!isOpen) {
      return null;
    }
    drawerApi.drawerLoading(true);
    const { id } = drawerApi.getData() as { id?: number | string };
    const { resUser } = drawerApi.getData() as { resUser?: number | string };
    const { resDept } = drawerApi.getData() as { resDept?: number | string };
    isUpdate.value = !!id;
    // åˆå§‹åŒ–
    await setupDeptSelect();
    // æ–°å¢žæ—¶é»˜è®¤å¡«å……登录人为报修人
    if (!isUpdate.value && resUser !== null && resDept !== null) {
      await formApi.setValues({ 'resUser': resUser, 'resDept': resDept });
      await setupUserOptions(resDept);
    }
    formApi.updateSchema([
      {
        componentProps: {
          disabled: isUpdate.value
        },
        fieldName: 'resCode'
      }
    ]);
    // æ›´æ–° && èµ‹å€¼
    if (isUpdate.value && id) {
      const record = await getRepairRes(id);
      await formApi.setValues(record);
      if (isUpdate.value && record.resDept) {
        await setupUserOptions(record.resDept);
      }
    }
    drawerApi.drawerLoading(false);
  }
});
const [ReqModal, reqModalApi] = useVbenModal({
  connectedComponent: reqModal,
  draggable: true,
  title: '选择报修单'
});
function handleReqModal() {
  reqModalApi.setData({});
  reqModalApi.open();
}
/**
 * ç”¨æˆ·çš„加载
 */
async function setupUserOptions(deptId: any) {
  const params = { deptId };
  const userPageResult = await userList({
    pageNum: 1,
    pageSize: 500,
    ...params
  });
  const options = userPageResult.rows.map((item) => ({
    label: item.nickName || item.userName,
    value: item.userId
  }));
  // ç­›é€‰
  const filterOption = (input: string, option: any) => {
    return option.label.toLowerCase().includes(input.toLowerCase());
  };
  const placeholder = options.length > 0 ? '请选择' : '该部门下暂无用户';
  formApi.updateSchema([
    {
      componentProps: { options, placeholder, filterOption },
      fieldName: 'resUser'
    }
  ]);
}
/**
 * åˆå§‹åŒ–部门选择
 */
async function setupDeptSelect() {
  // updateSchema
  const deptTree = await getDeptTree();
  // é€‰ä¸­åŽæ˜¾ç¤ºåœ¨è¾“入框的值 å³çˆ¶èŠ‚ç‚¹ / å­èŠ‚ç‚¹
  addFullName(deptTree, 'label', ' / ');
  formApi.updateSchema([
    {
      componentProps: (formModel) => ({
        class: 'w-full',
        fieldNames: {
          key: 'id',
          value: 'id',
          children: 'children'
        },
        getPopupContainer,
        async onSelect(deptId: number | string) {
          /** æ ¹æ®éƒ¨é—¨ID加载用户 */
          await setupUserOptions(deptId);
          /** å˜åŒ–后需要重新选择用户 */
          formModel.resUser = undefined;
        },
        placeholder: '请选择',
        showSearch: true,
        treeData: deptTree,
        treeDefaultExpandAll: true,
        treeLine: { showLeafIcon: false },
        // ç­›é€‰çš„字段
        treeNodeFilterProp: 'label',
        // é€‰ä¸­åŽæ˜¾ç¤ºåœ¨è¾“入框的值
        treeNodeLabelProp: 'fullName'
      }),
      fieldName: 'resDept'
    }
  ]);
}
async function handleConfirm() {
  try {
    drawerApi.drawerLoading(true);
    const { valid } = await formApi.validate();
    if (!valid) {
      return;
    }
    const data = cloneDeep(await formApi.getValues());
    await (isUpdate.value ? updateRepairRes(data) : addRepairRes(data));
    emit('reload');
    await handleCancel();
  } catch (error) {
    console.error(error);
  } finally {
    drawerApi.drawerLoading(false);
  }
}
async function handleCancel() {
  drawerApi.close();
  await formApi.resetForm();
}
/**
 * æ‰“开查询报修单
 */
function onSearchReq() {
  handleReqModal();
}
/**
 * æ›´æ–°é€‰æ‹©çš„æŠ¥ä¿®å•
 * @param req
 */
async function updateSelect(req: any) {
  // é€‰æ‹©æŠ¥ä¿®å•后生成维修单号
  if (!req.code || !req.id) {
    Modal.error({
      content: '获取保修单失败,请重新登录后重试!',
      title: '提示'
    });
  }
  const resCode = `WXD${req.code.slice(3)}`;
  await formApi.setValues({ 'reqId': req.id, 'reqCode': req.code, 'resCode': resCode });
}
</script>
<template>
  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
    <BasicForm>
      <template #reqCode="slotProps">
        <InputSearch :enter-button="true" placeholder="请选择" @search="onSearchReq" v-bind="slotProps" :disabled="isUpdate" />
      </template>
    </BasicForm>
    <ReqModal class="w-[1200px]" @update-select="updateSelect" />
  </BasicDrawer>
</template>
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
@@ -8,6 +8,7 @@
  FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // å·¥å…·ï¼ˆæ²»å…·ï¼‰å€Ÿç”¨çŠ¶æ€
  REPAIR_FAULT_TYPE = 'repair_fault_type', // æŠ¥ä¿®çŠ¶æ€
  REPAIR_REQ_STATUS = 'repair_req_status', // æŠ¥ä¿®çŠ¶æ€
  REPAIR_RES_STATUS = 'repair_res_status', // ç»´ä¿®çŠ¶æ€
  REPAIR_REQ_TYPE = 'repair_req_type', // æŠ¥ä¿®ç±»åž‹
  REPAIR_URGENCY_LEVEL = 'repair_urgency_level', // æŠ¥ä¿®ç´§æ€¥ç¨‹åº¦
  SYS_COMMON_STATUS = 'sys_common_status',
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
@@ -33,19 +33,4 @@
     */
    String EIMS_GENERATE_CODE = "eims_generate_code:";
    /**
     * ***********************字典***********************
     */
    /**
     * è®¾å¤‡å•位unit
     */
    String EIMS_EQU_UNIT = "eims_equ_unit";
    /**
     * è®¾å¤‡å¯¼å…¥çŠ¶æ€
     */
    String EIMS_IMPORT_STATUS = "equ_import_status";
}
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package org.dromara.common.core.constant;
/**
 * å­—å…¸
 */
public interface DictConstants {
    /**
     * è®¾å¤‡å•位unit
     */
    String EIMS_EQU_UNIT = "eims_equ_unit";
    /**
     * è®¾å¤‡å¯¼å…¥çŠ¶æ€
     */
    String EIMS_IMPORT_STATUS = "equ_import_status";
    /**
     * æŠ¥ä¿®çŠ¶æ€
     */
    String REPAIR_REQ_STATUS = "repair_req_status";
    interface REPAIR_REQ_STATUS_DETAIL {
        /**
         * æŽ¥å•
         */
        String JIEDAN = "0";
        /**
         * ç»´ä¿®
         */
        String WEIXIU = "1";
        /**
         * å®Œæˆ
         */
        String WANCHENG = "2";
    }
    /**
     * ç»´ä¿®å·¥å•状态
     */
    String REPAIR_RES_STATUS = "repair_res_status";
    interface REPAIR_RES_STATUS_DETAIL {
        /**
         * ç»´ä¿®
         */
        String WEIXIU = "0";
        /**
         * å®Œæˆ
         */
        String WANCHENG = "1";
    }
}
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RepairReqService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package org.dromara.common.core.service;
public interface RepairReqService {
    /**
     * é€šè¿‡æŠ¥ä¿®å•ID查询保修单code
     *
     * @param reqIds æŠ¥ä¿®å•ID串逗号分隔
     * @return æŠ¥ä¿®å•名称串逗号分隔
     */
    String selectRepairReqCodeByIds(String reqIds);
}
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RepairResService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package org.dromara.common.core.service;
public interface RepairResService {
    /**
     * é€šè¿‡ç»´ä¿®å·¥å•ID查询维修工单code
     *
     * @param resIds ç»´ä¿®å·¥å•ID串逗号分隔
     * @return ç»´ä¿®å·¥å•名称串逗号分隔
     */
    String selectRepairResCodeByIds(String resIds);
}
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
@@ -50,4 +50,14 @@
     */
    String FIXTURE_ID_TO_NAME = "fixture_id_to_name";
    /**
     * æŠ¥ä¿®å•id转code
     */
    String REPAIR_REQ_ID_TO_CODE = "repair_req_id_to_code";
    /**
     * ç»´ä¿®å·¥å•id转code
     */
    String REPAIR_RES_ID_TO_CODE = "repair_res_id_to_code";
}
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/RepairReqCodeTranslationImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.FixtureService;
import org.dromara.common.core.service.RepairReqService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
/**
 * æŠ¥ä¿®å•id转code
 *
 * @author zhuguifei
 */
@AllArgsConstructor
@TranslationType(type = TransConstant.REPAIR_REQ_ID_TO_CODE)
public class RepairReqCodeTranslationImpl implements TranslationInterface<String> {
    private final RepairReqService repairReqService;
    @Override
    public String translation(Object key, String other) {
        if (key instanceof String ids) {
            return repairReqService.selectRepairReqCodeByIds(ids);
        } else if (key instanceof Long id) {
            return repairReqService.selectRepairReqCodeByIds(id.toString());
        }
        return null;
    }
}
eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/RepairResCodeTranslationImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.RepairReqService;
import org.dromara.common.core.service.RepairResService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
/**
 * ç»´ä¿®å·¥å•id转code
 *
 * @author zhuguifei
 */
@AllArgsConstructor
@TranslationType(type = TransConstant.REPAIR_RES_ID_TO_CODE)
public class RepairResCodeTranslationImpl implements TranslationInterface<String> {
    private final RepairResService repairResService;
    @Override
    public String translation(Object key, String other) {
        if (key instanceof String ids) {
            return repairResService.selectRepairResCodeByIds(ids);
        } else if (key instanceof Long id) {
            return repairResService.selectRepairResCodeByIds(id.toString());
        }
        return null;
    }
}
eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -8,3 +8,5 @@
org.dromara.common.translation.core.impl.EquNameTranslationImpl
org.dromara.common.translation.core.impl.FixtureTypeNameTranslationImpl
org.dromara.common.translation.core.impl.FixtureNameTranslationImpl
org.dromara.common.translation.core.impl.RepairReqCodeTranslationImpl
org.dromara.common.translation.core.impl.RepairResCodeTranslationImpl
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairResController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package org.dromara.eims.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.eims.domain.vo.EimsRepairResVo;
import org.dromara.eims.domain.bo.EimsRepairResBo;
import org.dromara.eims.service.IEimsRepairResService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
 * ç»´ä¿®å·¥å•
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/eims/repairRes")
public class EimsRepairResController extends BaseController {
    private final IEimsRepairResService eimsRepairResService;
    /**
     * æŸ¥è¯¢ç»´ä¿®å·¥å•列表
     */
    @SaCheckPermission("eims:repairRes:list")
    @GetMapping("/list")
    public TableDataInfo<EimsRepairResVo> list(EimsRepairResBo bo, PageQuery pageQuery) {
        //return eimsRepairResService.queryPageList(bo, pageQuery);
        return eimsRepairResService.queryPageListCustom(bo, pageQuery);
    }
    /**
     * å¯¼å‡ºç»´ä¿®å·¥å•列表
     */
    @SaCheckPermission("eims:repairRes:export")
    @Log(title = "维修工单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(EimsRepairResBo bo, HttpServletResponse response) {
        List<EimsRepairResVo> list = eimsRepairResService.queryList(bo);
        ExcelUtil.exportExcel(list, "维修工单", EimsRepairResVo.class, response);
    }
    /**
     * èŽ·å–ç»´ä¿®å·¥å•è¯¦ç»†ä¿¡æ¯
     *
     * @param id ä¸»é”®
     */
    @SaCheckPermission("eims:repairRes:query")
    @GetMapping("/{id}")
    public R<EimsRepairResVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable Long id) {
        return R.ok(eimsRepairResService.queryById(id));
    }
    /**
     * æ–°å¢žç»´ä¿®å·¥å•
     */
    @SaCheckPermission("eims:repairRes:add")
    @Log(title = "维修工单", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsRepairResBo bo) {
        return toAjax(eimsRepairResService.insertByBo(bo));
    }
    /**
     * ä¿®æ”¹ç»´ä¿®å·¥å•
     */
    @SaCheckPermission("eims:repairRes:edit")
    @Log(title = "维修工单", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsRepairResBo bo) {
        return toAjax(eimsRepairResService.updateByBo(bo));
    }
    /**
     * åˆ é™¤ç»´ä¿®å·¥å•
     *
     * @param ids ä¸»é”®ä¸²
     */
    @SaCheckPermission("eims:repairRes:remove")
    @Log(title = "维修工单", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return toAjax(eimsRepairResService.deleteWithValidByIds(List.of(ids), true));
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package org.dromara.eims.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
 * ç»´ä¿®å·¥å•对象 eims_repair_res
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("eims_repair_res")
public class EimsRepairRes extends BaseEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(value = "id")
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    private Long reqId;
    /**
     * ç»´ä¿®å•号
     */
    private String resCode;
    /**
     * ç»´ä¿®äºº
     */
    private Long resUser;
    /**
     * ç»´ä¿®äººéƒ¨é—¨
     */
    private Long resDept;
    /**
     * åŽŸå› åˆ†æž
     */
    private String resReason;
    /**
     * å¤„理措施
     */
    private String resHandle;
    /**
     * é¢„防措施
     */
    private String resPrevent;
    /**
     * ç»´ä¿®çŠ¶æ€(字典)
     */
    private String status;
    /**
     * å¼€å§‹æ—¶é—´
     */
    private Date startTime;
    /**
     * ç»“束时间
     */
    private Date endTime;
    /**
     * ä½¿ç”¨å·¥å…·
     */
    private String useFixture;
    /**
     * ä½¿ç”¨å¤‡ä»¶
     */
    private String useParts;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package org.dromara.eims.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.eims.domain.EimsRepairRes;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
 * ç»´ä¿®å·¥å•业务对象 eims_repair_res
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = EimsRepairRes.class, reverseConvertGenerate = false)
public class EimsRepairResBo extends BaseEntity {
    /**
     *
     */
    @NotNull(message = "不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    @NotNull(message = "报修单不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long reqId;
    /**
     * ç»´ä¿®å•号
     */
    @NotNull(message = "报修单编号不能为空", groups = { AddGroup.class, EditGroup.class })
    private String resCode;
    /**
     * ç»´ä¿®äºº
     */
    @NotNull(message = "维修人不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long resUser;
    /**
     * ç»´ä¿®äººéƒ¨é—¨
     */
    @NotNull(message = "维修人部门不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long resDept;
    /**
     * åŽŸå› åˆ†æž
     */
    private String resReason;
    /**
     * å¤„理措施
     */
    private String resHandle;
    /**
     * é¢„防措施
     */
    private String resPrevent;
    /**
     * ç»´ä¿®çŠ¶æ€(字典)
     */
    @NotBlank(message = "维修状态(字典)不能为空", groups = { AddGroup.class, EditGroup.class })
    private String status;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
    private Date startTime;
    /**
     * ç»“束时间
     */
    private Date endTime;
    /**
     * ä½¿ç”¨å·¥å…·
     */
    private String useFixture;
    /**
     * ä½¿ç”¨å¤‡ä»¶
     */
    private String useParts;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    // å…³è”表字段
    private  String reqCode;//报修单编码
    private  String reqUser;//报修人
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairReqVo.java
@@ -130,6 +130,12 @@
    private Long repairId;
    /**
     * ç»´ä¿®å·¥å•code
     */
    @Translation(type = TransConstant.REPAIR_RES_ID_TO_CODE, mapper = "repairId")
    private String resCode;
    /**
     * ç»´ä¿®äººéƒ¨é—¨
     */
    @ExcelProperty(value = "维修人部门")
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
package org.dromara.eims.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.eims.domain.EimsRepairRes;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
 * ç»´ä¿®å·¥å•视图对象 eims_repair_res
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EimsRepairRes.class)
public class EimsRepairResVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    @ExcelProperty(value = "报修单id")
    private Long reqId;
    /**
     * ç»´ä¿®å•号
     */
    @ExcelProperty(value = "维修单号")
    private String resCode;
    /**
     * ç»´ä¿®äºº
     */
    private Long resUser;
    @ExcelProperty(value = "维修人")
    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "resUser")
    private String resUserName;
    /**
     * ç»´ä¿®äººéƒ¨é—¨
     */
    private Long resDept;
    @ExcelProperty(value = "维修人部门")
    @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "resDept")
    private String resDeptName;
    /**
     * åŽŸå› åˆ†æž
     */
    @ExcelProperty(value = "原因分析")
    private String resReason;
    /**
     * å¤„理措施
     */
    @ExcelProperty(value = "处理措施")
    private String resHandle;
    /**
     * é¢„防措施
     */
    @ExcelProperty(value = "预防措施")
    private String resPrevent;
    /**
     * ç»´ä¿®çŠ¶æ€(字典)
     */
    @ExcelProperty(value = "维修状态(字典)", converter = ExcelDictConvert.class)
    @ExcelDictFormat(dictType = "repair_res_status")
    private String status;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @ExcelProperty(value = "开始时间")
    private Date startTime;
    /**
     * ç»“束时间
     */
    @ExcelProperty(value = "结束时间")
    private Date endTime;
    /**
     * ä½¿ç”¨å·¥å…·
     */
    @ExcelProperty(value = "使用工具")
    private String useFixture;
    /**
     * ä½¿ç”¨å¤‡ä»¶
     */
    @ExcelProperty(value = "使用备件")
    private String useParts;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
    // å…³è”表字段
    private  String reqType;//报修类型
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date reqTime;//报修时间
    private String equName;//设备名称
    private String fixtureName;//工具名称
    private String faultType;//故障类别
    private String reqDeptName;//报修部门
    private String reqUserName;//报修人
    private String reqDesc;//故障描述
    @Translation(type = TransConstant.REPAIR_REQ_ID_TO_CODE, mapper = "reqId")
    private String reqCode;//报修编码
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsEquImportListener.java
@@ -7,6 +7,7 @@
import com.alibaba.excel.exception.ExcelDataConvertException;
import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DictService;
import org.dromara.common.core.utils.DateUtils;
@@ -60,7 +61,7 @@
        this.dictService = SpringUtils.getBean(DictService.class);
        this.isUpdateSupport = isUpdateSupport;
        this.operUserId = LoginHelper.getUserId();
        this.unitDictMap = dictService.getAllDictByDictType(CacheConstants.EIMS_EQU_UNIT);
        this.unitDictMap = dictService.getAllDictByDictType(DictConstants.EIMS_EQU_UNIT);
    }
    @Override
@@ -94,7 +95,7 @@
                //ValidatorUtils.validate(equ);
                //添加字段默认属性
                equ.setImportStatus(dictService.getDictValue(CacheConstants.EIMS_IMPORT_STATUS,"新导入"));
                equ.setImportStatus(dictService.getDictValue(DictConstants.EIMS_IMPORT_STATUS,"新导入"));
                equ.setCreateBy(operUserId);
                equService.insertByBo(equ);
                successNum++;
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairReqMapper.java
@@ -4,6 +4,8 @@
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.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.eims.domain.EimsRepairReq;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
@@ -14,7 +16,12 @@
 * @author zhuguifei
 * @date 2025-02-11
 */
@DataPermission({
    @DataColumn(key = "deptName", value = "a.create_dept"),
    @DataColumn(key = "userName", value = "a.create_by")
})
public interface EimsRepairReqMapper extends BaseMapperPlus<EimsRepairReq, EimsRepairReqVo> {
    Page<EimsRepairReqVo> selectRepairReqList(@Param("page") Page<EimsRepairReqVo> page, @Param(Constants.WRAPPER) Wrapper<EimsRepairReq> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairResMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.dromara.eims.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
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.EimsRepairRes;
import org.dromara.eims.domain.vo.EimsRepairResVo;
/**
 * ç»´ä¿®å·¥å•Mapper接口
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
public interface EimsRepairResMapper extends BaseMapperPlus<EimsRepairRes, EimsRepairResVo> {
    Page<EimsRepairResVo> selectRepairResList(@Param("page") Page<EimsRepairResVo> page, @Param(Constants.WRAPPER) Wrapper<EimsRepairRes> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairResService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package org.dromara.eims.service;
import org.dromara.eims.domain.bo.EimsRepairReqBo;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
import org.dromara.eims.domain.vo.EimsRepairResVo;
import org.dromara.eims.domain.bo.EimsRepairResBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
 * ç»´ä¿®å·¥å•Service接口
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
public interface IEimsRepairResService {
    /**
     * æŸ¥è¯¢ç»´ä¿®å·¥å•
     *
     * @param id ä¸»é”®
     * @return ç»´ä¿®å·¥å•
     */
    EimsRepairResVo queryById(Long id);
    /**
     * åˆ†é¡µæŸ¥è¯¢ç»´ä¿®å·¥å•列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ç»´ä¿®å·¥å•分页列表
     */
    TableDataInfo<EimsRepairResVo> queryPageList(EimsRepairResBo bo, PageQuery pageQuery);
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„维修工单列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ç»´ä¿®å·¥å•列表
     */
    List<EimsRepairResVo> queryList(EimsRepairResBo bo);
    /**
     * æ–°å¢žç»´ä¿®å·¥å•
     *
     * @param bo ç»´ä¿®å·¥å•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    Boolean insertByBo(EimsRepairResBo bo);
    /**
     * ä¿®æ”¹ç»´ä¿®å·¥å•
     *
     * @param bo ç»´ä¿®å·¥å•
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    Boolean updateByBo(EimsRepairResBo bo);
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ç»´ä¿®å·¥å•信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
    /**
     * åˆ†é¡µæŸ¥è¯¢ç»´ä¿®å·¥å•列表-多表查询
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ç»´ä¿®å·¥å•分页列表
     */
    TableDataInfo<EimsRepairResVo> queryPageListCustom(EimsRepairResBo bo, PageQuery pageQuery);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
@@ -1,7 +1,11 @@
package org.dromara.eims.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.service.RepairReqService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
@@ -11,6 +15,7 @@
import lombok.RequiredArgsConstructor;
import org.dromara.eims.domain.EimsEqu;
import org.dromara.eims.domain.EimsFixtureBorrow;
import org.dromara.eims.domain.vo.EimsFixtureVo;
import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
import org.dromara.eims.utils.DataFilterUtil;
import org.dromara.system.domain.SysDept;
@@ -36,7 +41,7 @@
 */
@RequiredArgsConstructor
@Service
public class EimsRepairReqServiceImpl implements IEimsRepairReqService {
public class EimsRepairReqServiceImpl implements IEimsRepairReqService, RepairReqService {
    private final EimsRepairReqMapper baseMapper;
    private final SysDeptMapper sysDeptMapper;
@@ -68,7 +73,7 @@
    @Override
    public TableDataInfo<EimsRepairReqVo> queryPageListCustom(EimsRepairReqBo bo, PageQuery pageQuery) {
        DataFilterUtil.getInstance().filterRepairReq(bo);
        //DataFilterUtil.getInstance().filterRepairReq(bo);
        Page<EimsRepairReqVo> page = baseMapper.selectRepairReqList(pageQuery.build(), buildWrapper(bo));
        return TableDataInfo.build(page);
    }
@@ -86,7 +91,7 @@
        qw.eq(bo.getRepairDept() != null, "a.repair_dept", bo.getRepairDept());
        qw.eq(bo.getRepairUser() != null, "a.repair_user", bo.getRepairUser());
        qw.eq(StringUtils.isNotBlank(bo.getFaultType()), "a,fault_type", bo.getFaultType());
        qw.eq(params.containsKey("createBy"), "a.create_by", params.get("createBy"));
        qw.in(params.containsKey("createBy"), "a.create_by",  (List<Long>) params.get("createBy"));
        qw.eq(params.containsKey("status"), "a.status", params.get("status"));
        qw.between(params.get("beginReqTime") != null && params.get("endReqTime") != null,
            "a.req_time", params.get("beginReqTime"), params.get("endReqTime"));
@@ -216,4 +221,16 @@
    }
    @Override
    public String selectRepairReqCodeByIds(String reqIds) {
        List<String> list = new ArrayList<>();
        for (Long id : StringUtils.splitTo(reqIds, Convert::toLong)) {
            EimsRepairReqVo vo = SpringUtils.getAopProxy(this).queryById(id);
            if (ObjectUtil.isNotNull(vo)) {
                list.add(vo.getCode());
            }
        }
        return String.join(StringUtils.SEPARATOR, list);
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
package org.dromara.eims.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.service.RepairResService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.eims.domain.EimsEqu;
import org.dromara.eims.domain.EimsFixture;
import org.dromara.eims.domain.EimsRepairReq;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
import org.dromara.eims.mapper.EimsRepairReqMapper;
import org.dromara.eims.utils.DataFilterUtil;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.mapper.SysDeptMapper;
import org.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsRepairResBo;
import org.dromara.eims.domain.vo.EimsRepairResVo;
import org.dromara.eims.domain.EimsRepairRes;
import org.dromara.eims.mapper.EimsRepairResMapper;
import org.dromara.eims.service.IEimsRepairResService;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
 * ç»´ä¿®å·¥å•Service业务层处理
 *
 * @author zhuguifei
 * @date 2025-02-25
 */
@RequiredArgsConstructor
@Service
public class EimsRepairResServiceImpl implements IEimsRepairResService, RepairResService {
    private final EimsRepairResMapper baseMapper;
    private final EimsRepairReqMapper reqMapper;
    private final SysDeptMapper deptMapper;
    /**
     * æŸ¥è¯¢ç»´ä¿®å·¥å•
     *
     * @param id ä¸»é”®
     * @return ç»´ä¿®å·¥å•
     */
    @Override
    public EimsRepairResVo queryById(Long id) {
        return baseMapper.selectVoById(id);
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢ç»´ä¿®å·¥å•列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ç»´ä¿®å·¥å•分页列表
     */
    @Override
    public TableDataInfo<EimsRepairResVo> queryPageList(EimsRepairResBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<EimsRepairRes> lqw = buildQueryWrapper(bo);
        Page<EimsRepairResVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„维修工单列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ç»´ä¿®å·¥å•列表
     */
    @Override
    public List<EimsRepairResVo> queryList(EimsRepairResBo bo) {
        LambdaQueryWrapper<EimsRepairRes> lqw = buildQueryWrapper(bo);
        List<EimsRepairResVo> eimsRepairResVos = baseMapper.selectVoList(lqw);
        return eimsRepairResVos;
    }
    private LambdaQueryWrapper<EimsRepairRes> buildQueryWrapper(EimsRepairResBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<EimsRepairRes> lqw = Wrappers.lambdaQuery();
        lqw.eq(bo.getResUser() != null, EimsRepairRes::getResUser, bo.getResUser());
        lqw.eq(bo.getResDept() != null, EimsRepairRes::getResDept, bo.getResDept());
        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsRepairRes::getStatus, bo.getStatus());
        lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
            EimsRepairRes::getStartTime, params.get("beginStartTime"), params.get("endStartTime"));
        lqw.between(params.get("beginEndTime") != null && params.get("endEndTime") != null,
            EimsRepairRes::getEndTime, params.get("beginEndTime"), params.get("endEndTime"));
        return lqw;
    }
    /**
     * æ–°å¢žç»´ä¿®å·¥å•
     *
     * @param bo ç»´ä¿®å·¥å•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertByBo(EimsRepairResBo bo) {
        EimsRepairRes add = MapstructUtils.convert(bo, EimsRepairRes.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
            // æ–°å¢žç»´ä¿®å·¥å•的时候更新报修单数据
            EimsRepairReqVo reqVo = reqMapper.selectVoById(bo.getReqId());
            reqVo.setRepairId(add.getId());
            reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WEIXIU);
            EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class);
            reqMapper.updateById(req);
        }
        return flag;
    }
    /**
     * ä¿®æ”¹ç»´ä¿®å·¥å•
     *
     * @param bo ç»´ä¿®å·¥å•
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean updateByBo(EimsRepairResBo bo) {
        EimsRepairRes update = MapstructUtils.convert(bo, EimsRepairRes.class);
        EimsRepairResVo resVo = baseMapper.selectVoById(bo.getId());
        String status = resVo.getStatus();
        //首次更新需要同步更新报修单状态
        if (bo.getStatus().equals(DictConstants.REPAIR_RES_STATUS_DETAIL.WANCHENG) &&
            status.equals(DictConstants.REPAIR_RES_STATUS_DETAIL.WEIXIU)) {
            EimsRepairReqVo reqVo = reqMapper.selectVoById(bo.getReqId());
            reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WANCHENG);
            EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class);
            reqMapper.updateById(req);
        }
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }
    /**
     * ä¿å­˜å‰çš„æ•°æ®æ ¡éªŒ
     */
    private void validEntityBeforeSave(EimsRepairRes entity) {
        //TODO åšä¸€äº›æ•°æ®æ ¡éªŒ,如唯一约束
    }
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ç»´ä¿®å·¥å•信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if (isValid) {
            //TODO åšä¸€äº›ä¸šåŠ¡ä¸Šçš„æ ¡éªŒ,判断是否需要校验
        }
        return baseMapper.deleteByIds(ids) > 0;
    }
    @Override
    public TableDataInfo<EimsRepairResVo> queryPageListCustom(EimsRepairResBo bo, PageQuery pageQuery) {
        Page<EimsRepairResVo> page = baseMapper.selectRepairResList(pageQuery.build(), buildWrapper(bo));
        return TableDataInfo.build(page);
    }
    private QueryWrapper<EimsRepairRes> buildWrapper(EimsRepairResBo bo) {
        Map<String, Object> params = bo.getParams();
        QueryWrapper<EimsRepairRes> qw = Wrappers.query();
        qw.like(StringUtils.isNotBlank(bo.getResCode()), "res.res_code", bo.getResCode());
        qw.like(StringUtils.isNotBlank(bo.getReqCode()), "req.code", bo.getReqCode());
        qw.eq(bo.getResUser() != null, "res.res_user", bo.getResUser());
        List<Long> allDescendantIds = getAllDescendantIds(bo.getResDept());
        qw.in(bo.getResDept() != null, "res.res_dept", allDescendantIds);
        qw.eq(StringUtils.isNotBlank(bo.getStatus()), "res.status", bo.getStatus());
        qw.orderByDesc("res.create_time");
        return qw;
    }
    /**
     * æ ¹æ®id,获取所有后代id
     *
     * @param rootId
     * @return
     */
    public List<Long> getAllDescendantIds(Long rootId) {
        List<Long> result = new ArrayList<>();
        result.add(rootId);
        collectDescendants(rootId, result);
        return result;
    }
    private void collectDescendants(Long currentId, List<Long> collector) {
        QueryWrapper<SysDept> sysDeptWrapper = new QueryWrapper<>();
        sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId);
        List<SysDeptVo> children = deptMapper.selectVoList(sysDeptWrapper);
        if (children != null && !children.isEmpty()) {
            for (SysDeptVo child : children) {
                Long childId = child.getDeptId();
                collector.add(childId);
                collectDescendants(childId, collector);
            }
        }
    }
    @Override
    public String selectRepairResCodeByIds(String resIds) {
        List<String> list = new ArrayList<>();
        for (Long id : StringUtils.splitTo(resIds, Convert::toLong)) {
            EimsRepairResVo vo = SpringUtils.getAopProxy(this).queryById(id);
            if (ObjectUtil.isNotNull(vo)) {
                list.add(vo.getResCode());
            }
        }
        return String.join(StringUtils.SEPARATOR, list);
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java
@@ -1,10 +1,12 @@
package org.dromara.eims.utils;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.eims.domain.bo.EimsRepairReqBo;
import org.dromara.eims.domain.bo.EimsRepairResBo;
import java.util.Set;
import java.util.*;
/**
 * è‡ªå®šä¹‰æ•°æ®éš”离
@@ -26,17 +28,41 @@
    //报修单
    public void filterRepairReq(EimsRepairReqBo bo){
        LoginUser loginUser = LoginHelper.getLoginUser();
        if (loginUser == null)  return;
        Set<String> rolePermission = loginUser.getRolePermission();
        if (rolePermission == null)  return;
        if (rolePermission.contains(Role.operator.name())) {
            //维修工只能查询自己的数据
            bo.setCreateBy(loginUser.getUserId());
        Map<String, Object> params = bo.getParams();
        List<Long> userList = new ArrayList<>();
        if (rolePermission == null) {
            //没有权限不允许查询数据
            userList.add(-1L);
        }else if (rolePermission.contains(Role.operator.name())) {
            //操作工只能查询自己的数据
            userList.add(loginUser.getUserId());
        }else if (rolePermission.contains(Role.repair.name())) {
            //TODO ç»´ä¿®å·¥åªèƒ½æŸ¥è¯¢æœªæŽ¥å•状态的报修单(具体状态参考字典repair_req_status)
            bo.setStatus("0");
            bo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.JIEDAN);
        }
        System.err.println(loginUser);
        params.put("createBy", userList);
    }
    //维修工单
    public void filterRepairRes(EimsRepairResBo bo){
        LoginUser loginUser = LoginHelper.getLoginUser();
        Set<String> rolePermission = loginUser.getRolePermission();
        Map<String, Object> params = bo.getParams();
        List<Long> userList = new ArrayList<>();
        if (rolePermission == null) {
            //没有权限不允许查询数据
            userList.add(-1L);
        }else if (rolePermission.contains(Role.operator.name())) {
            //操作工只能查询自己的数据
            userList.add(loginUser.getUserId());
        }else if (rolePermission.contains(Role.repair.name())) {
            //TODO ç»´ä¿®å·¥åªèƒ½æŸ¥è¯¢æœªæŽ¥å•状态的报修单(具体状态参考字典repair_req_status)
            bo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.JIEDAN);
        }
        params.put("createBy", userList);
    }
}
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsRepairResMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.eims.mapper.EimsRepairResMapper">
    <resultMap type="org.dromara.eims.domain.vo.EimsRepairResVo" id="EimsRepairResResult">
    </resultMap>
    <select id="selectRepairResList" resultMap="EimsRepairResResult">
        SELECT res.*,req.req_type reqType,req.req_time reqTime,equ.equ_name equName,req.fault_type faultType,
               fix.fixture_name fixtureName,dep.dept_name reqDeptName,usr.nick_name reqUserName,req.req_desc reqDesc,
               req.code reqCode
        FROM eims_repair_res res
                 LEFT JOIN eims_repair_req req on res.req_id = req.id
                 LEFT JOIN eims_equ equ ON req.equ_id = equ.equ_id
                 LEFT JOIN eims_fixture fix ON req.fixture_id = fix.id
                 LEFT JOIN sys_dept dep ON req.req_dept = dep.dept_id
                 LEFT JOIN sys_user usr ON req.req_user = usr.user_id
            ${ew.getCustomSqlSegment}
    </select>
</mapper>