车间能级提升-智能设备管理系统
zhuguifei
2025-02-27 ec4d16c8a630960a4671a60f4d1957fd3de9def3
完成维修工单查看维修记录子表
已添加13个文件
已修改23个文件
1309 ■■■■■ 文件已修改
eims-ui/apps/web-antd/src/api/eims/repair-record/index.ts 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/repair-record/model.d.ts 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/system/user/index.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/constants/dict/index.ts 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/fixture/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-record/data.tsx 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-record/index.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/repair-req-drawer.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-req/send-work-drawer.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/repair-res/repair-res-drawer.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairRecordController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairResController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRecord.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairRecordBo.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairRecordVo.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairRecordMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairRecordService.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairResService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairRecordServiceImpl.java 133 ●●●●● 补丁 | 查看 | 原始文档 | 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 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsRepairRecordMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/repair-record/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import type { RepairRecordVO } from './model';
import type { ID, IDS } from '#/api/common';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
enum Api {
  repairRecordExport = '/eims/repairRecord/export',
  repairRecordList = '/eims/repairRecord/list',
  root = '/eims/repairRecord'
}
/**
 * æŸ¥è¯¢ç»´ä¿®è®°å½•列表
 * @param query
 * @returns {*}
 */
export function listRepairRecord(params?: any) {
  return requestClient.get<RepairRecordVO[]>(Api.repairRecordList, { params });
}
/**
 * æŸ¥è¯¢ç»´ä¿®è®°å½•详细
 * @param RepairRecordId
 */
export function getRepairRecord(RepairRecordId: ID) {
  return requestClient.get<RepairRecordVO>(`${Api.root}/${RepairRecordId}`);
}
/**
 * æ–°å¢žç»´ä¿®è®°å½•
 * @param data
 */
export function addRepairRecord(data: any) {
  return requestClient.postWithMsg<void>(`${Api.root}`, data);
}
/**
 * ä¿®æ”¹ç»´ä¿®è®°å½•
 * @param data
 */
export function updateRepairRecord(data: any) {
  return requestClient.putWithMsg<void>(Api.root, data);
}
/**
 * åˆ é™¤ç»´ä¿®è®°å½•
 * @param RepairRecordId
 */
export function delRepairRecord(RepairRecordId: IDS) {
  return requestClient.deleteWithMsg<void>(`${Api.root}/${RepairRecordId}`);
}
/**
 * å¯¼å‡º
 * @param
 */
export function RepairRecordExport(data: any) {
  return commonExport(Api.repairRecordExport, data);
}
eims-ui/apps/web-antd/src/api/eims/repair-record/model.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
export interface RepairRecordVO {
  /**
   *
   */
  id: number | string;
  /**
   * æŠ¥ä¿®å•id
   */
  reqId: number | string;
  /**
   * ç»´ä¿®å•id
   */
  resId: number | string;
  /**
   * å¤„理时间
   */
  handleTime: string;
  /**
   * æ“ä½œç”¨æˆ·
   */
  operaUser: number;
  /**
   * æ“ä½œ(字典)
   */
  opera: string;
  /**
   * æ“ä½œç»“æžœ
   */
  operaResult: string;
  /**
   * å¤‡æ³¨
   */
  remark: string;
}
eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts
@@ -34,7 +34,15 @@
 * @param data
 */
export function addRepairRes(data: any) {
  return requestClient.postWithMsg<void>(Api.root, data);
  return requestClient.postWithMsg<void>(`${Api.root}/add`, data);
}
/**
 * æ–°å¢žç»´ä¿®å·¥å•-批量
 * @param data
 */
export function addBatchRepairRes(data: any) {
  return requestClient.postWithMsg<void>(`${Api.root}/addBatch`, data);
}
/**
eims-ui/apps/web-antd/src/api/system/user/index.ts
@@ -1,10 +1,4 @@
import type {
  DeptTree,
  ResetPwdParam,
  User,
  UserImportParam,
  UserInfoResponse,
} from './model';
import type { DeptTree, ResetPwdParam, User, UserImportParam, UserInfoResponse } from './model';
import type { ID, IDS, PageQuery, PageResult } from '#/api/common';
@@ -12,6 +6,7 @@
import { requestClient } from '#/api/request';
enum Api {
  deptRoleUserList = '/system/user/deptRoleUser',
  deptTree = '/system/user/deptTree',
  listDeptUsers = '/system/user/list/dept',
  root = '/system/user',
@@ -21,7 +16,7 @@
  userImportTemplate = '/system/user/importTemplate',
  userList = '/system/user/list',
  userResetPassword = '/system/user/resetPwd',
  userStatusChange = '/system/user/changeStatus',
  userStatusChange = '/system/user/changeStatus'
}
/**
@@ -31,6 +26,10 @@
 */
export function userList(params?: PageQuery) {
  return requestClient.get<PageResult<User>>(Api.userList, { params });
}
export function deptRoleUserList(params?: any) {
  return requestClient.get<User[]>(Api.deptRoleUserList, { params });
}
/**
@@ -48,16 +47,12 @@
 * @returns void
 */
export function userImportData(data: UserImportParam) {
  return requestClient.post<{ code: number; msg: string }>(
    Api.userImport,
    data,
    {
  return requestClient.post<{ code: number; msg: string }>(Api.userImport, data, {
      headers: {
        'Content-Type': ContentTypeEnum.FORM_DATA,
      'Content-Type': ContentTypeEnum.FORM_DATA
      },
      isTransformResponse: false,
    },
  );
    isTransformResponse: false
  });
}
/**
@@ -70,8 +65,8 @@
    {},
    {
      isTransformResponse: false,
      responseType: 'blob',
    },
      responseType: 'blob'
    }
  );
}
@@ -129,7 +124,7 @@
 */
export function userResetPassword(data: ResetPwdParam) {
  return requestClient.putWithMsg<void>(Api.userResetPassword, data, {
    encrypt: true,
    encrypt: true
  });
}
eims-ui/apps/web-antd/src/constants/dict/index.ts
@@ -20,5 +20,12 @@
  EQU = '1', // è®¾å¤‡æ•…éšœ
  FIXTURE = '2', // å·¥å…·æ•…éšœ
  OTHER = '3' // å…¶ä»–æ•…éšœ
}
/**
 * æŠ¥ä¿®çŠ¶æ€
 */
export enum REPAIR_REQ_STATUS {
  JIEDAN = '0', // å¾…接单
  WEIXIU = '1', // ç»´ä¿®ä¸­
  WANCHENG = '2' // å·²å®Œæˆ
}
eims-ui/apps/web-antd/src/views/eims/fixture/index.vue
@@ -108,7 +108,6 @@
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
    cellClick: (e: any) => {
      const { row } = e;
      console.error()
      handleBorroeList(row)
    }
  }
eims-ui/apps/web-antd/src/views/eims/repair-record/data.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
import type { VxeGridProps } from '#/adapter/vxe-table';
export const columns: VxeGridProps['columns'] = [
  { type: 'checkbox', width: 60, fixed: 'left' },
  {
    title: '操作用户',
    field: 'operaUser',
    width: 160,
  },
  {
    title: '操作',
    field: 'opera',
    width: 100,
  },
  {
    title: '操作结果',
    field: 'operaResult',
    width: 160,
  },
  {
    title: '',
    field: 'blank',
    minWidth: 100,
  }
];
eims-ui/apps/web-antd/src/views/eims/repair-record/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
<script setup lang="ts">
import { watch } from 'vue';
import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
import { listRepairRecord } from '#/api/eims/repair-record';
import { columns } from '../repair-record/data';
interface Props {
  reqId?: string;
  resId?: string;
}
const props = defineProps<Props>();
const gridOptions: VxeGridProps = {
  checkboxConfig: {
    // é«˜äº®
    highlight: true,
    // ç¿»é¡µæ—¶ä¿ç•™é€‰ä¸­çŠ¶æ€
    reserve: true
    // ç‚¹å‡»è¡Œé€‰ä¸­
    // trigger: 'row'
  },
  columns,
  height: 'auto',
  keepSource: true,
  pagerConfig: {},
  proxyConfig: {
    ajax: {
      query: async ({ page }, formValues = {}) => {
        if (props.reqId) {
          const params = { reqId: props.reqId };
          Object.assign(formValues, params);
        } else if (props.resId) {
          const params = { resId: props.resId };
          Object.assign(formValues, params);
        } else {
          const params = { resId: -1 };
          Object.assign(formValues, params);
        }
        return await listRepairRecord({
          pageNum: page.currentPage,
          pageSize: page.pageSize,
          ...formValues
          // ...useRoleBaseFilters()
        });
      }
    }
  },
  rowConfig: {
    isHover: true,
    keyField: 'id'
  },
  sortConfig: {
    // è¿œç¨‹æŽ’序
    remote: true,
    // æ”¯æŒå¤šå­—段排序 é»˜è®¤å…³é—­
    multiple: true
  },
  id: 'eims-repair-record-index'
};
const [BasicTable, tableApi] = useVbenVxeGrid({
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
  }
});
// ä½¿ç”¨ watch ç›‘听 resId çš„变化
watch(
  () => props.resId,
  (newVal, oldVal) => {
    if (newVal !== oldVal && newVal) {
      tableApi.query();
    }
  },
  { immediate: false }
);
</script>
<template>
  <div class="w-full">
    <BasicTable table-title="操作记录" />
  </div>
</template>
eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx
@@ -303,3 +303,41 @@
    label: '报修人'
  }
];
export const modalSchema: FormSchemaGetter = () => [
  {
    component: 'Input',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    fieldName: 'id'
  },
  {
    component: 'Input',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    fieldName: 'batchReqIds'
  },
  {
    component: 'TreeSelect',
    // åœ¨drawer里更新 è¿™é‡Œä¸éœ€è¦é»˜è®¤çš„componentProps
    defaultValue: undefined,
    fieldName: 'resDept',
    label: '维修部门',
    help: `报修人员所属部门`
    // rules: 'selectRequired',
  },
  {
    component: 'Select',
    componentProps: {
      showSearch: true,
      allowClear: true,
      getPopupContainer
    },
    fieldName: 'resUser',
    label: '维修人'
  }
];
eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue
@@ -8,23 +8,23 @@
import { useUserStore } from '@vben/stores';
import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
import { Modal, Popconfirm, Space } from 'ant-design-vue';
import { message, Modal, Popconfirm, Space } from 'ant-design-vue';
import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
import { delRepairReq, listRepairReq, repairReqExport } from '#/api/eims/repair-req';
import { getDeptTree, userList } from '#/api/system/user';
import { REPAIR_REQ_STATUS } from '#/constants/dict';
import { commonDownloadExcel } from '#/utils/file/download';
import { columns, querySchema } from './data';
import repairReqDrawer from './repair-req-drawer.vue';
import sendWorkDrawer from './send-work-drawer.vue';
interface Props {
  filterFlag?: boolean;
  status?: string;
}
const props = withDefaults(defineProps<Props>(), { filterFlag: false, status: undefined });
const userStore = useUserStore();
const userId = userStore.userInfo?.userId;
@@ -33,7 +33,6 @@
defineExpose({
  tableSelect
});
const formOptions: VbenFormProps = {
  commonConfig: {
@@ -107,6 +106,26 @@
  connectedComponent: repairReqDrawer
});
const [SendWorkDrawer, drawerApi] = useVbenDrawer({
  connectedComponent: sendWorkDrawer,
  title: '派工'
});
function openSendWork() {
  const rows = tableApi.grid.getCheckboxRecords();
  const ids = rows.map((row: any) => row.id).join(',');
  const filterData = rows.filter((item) => item.status === REPAIR_REQ_STATUS.WEIXIU || item.status === REPAIR_REQ_STATUS.WANCHENG);
  if (rows.length === 0) {
    message.warn('请选择报修单后派工!');
    return;
  } else if (filterData.length > 0) {
    message.warn('请选择未接单报修单后派工!');
    return;
  }
  drawerApi.setData({ batchReqIds: ids });
  drawerApi.open();
}
function handleAdd() {
  repairReqDrawerApi.setData({ reqUser: userId, reqDept: deptId });
  repairReqDrawerApi.open();
@@ -141,6 +160,11 @@
    fieldMappingTime: formOptions.fieldMappingTime
  });
}
/**
 * æ´¾å·¥
 */
function handleSendWork() {}
onMounted(async () => {
  await setupDeptSelect();
@@ -224,6 +248,7 @@
      <BasicTable class="flex-1 overflow-hidden" table-title="故障报修列表">
        <template #toolbar-tools>
          <Space>
            <a-button v-access:code="['eims:repairReq:send']" @click="openSendWork"> æ´¾å·¥ </a-button>
            <a-button v-access:code="['eims:repairReq:export']" @click="handleDownloadExcel">
              {{ $t('pages.common.export') }}
            </a-button>
@@ -257,5 +282,6 @@
      </BasicTable>
    </div>
    <RepairReqDrawer @reload="tableApi.query()" />
    <SendWorkDrawer @reload="tableApi.query()" />
  </Page>
</template>
eims-ui/apps/web-antd/src/views/eims/repair-req/repair-req-drawer.vue
@@ -98,7 +98,7 @@
    await setupDeptSelect();
    await setupEquTypeSelect();
    // æ–°å¢žæ—¶é»˜è®¤å¡«å……登录人为报修人
    if (!isUpdate.value && reqUser !== null && reqDept !== null) {
    if (!isUpdate.value && reqUser && reqDept ) {
      await formApi.setValues({ 'reqUser': reqUser, 'reqDept': reqDept });
      await setupUserOptions(reqDept);
    }
@@ -291,6 +291,7 @@
async function updateEqu(equ: any) {
  await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
}
/**
 * æ›´æ–°é€‰æ‹©çš„工具
 * @param fixture
@@ -307,10 +308,12 @@
        <CodeInput v-bind="slotProps" :disabled="isUpdate" prefix="BXD" />
      </template>
      <template #equName="slotProps">
        <InputSearch :enter-button="true" placeholder="请选择设备" @search="onSearchEqu" v-bind="slotProps" :disabled="isUpdate" />
        <InputSearch :enter-button="true" placeholder="请选择设备" @search="onSearchEqu" v-bind="slotProps"
                     :disabled="isUpdate" />
      </template>
      <template #fixtureName="slotProps">
        <InputSearch :enter-button="true" placeholder="请选择工具" @search="onSearchFixture" v-bind="slotProps" :disabled="isUpdate" />
        <InputSearch :enter-button="true" placeholder="请选择工具" @search="onSearchFixture" v-bind="slotProps"
                     :disabled="isUpdate" />
      </template>
    </BasicForm>
    <EquModal class="w-[1200px]" @update-equ="updateEqu" />
eims-ui/apps/web-antd/src/views/eims/repair-req/send-work-drawer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
<script setup lang="ts">
import { ref } from 'vue';
import { useVbenDrawer } from '@vben/common-ui';
import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
import { useVbenForm } from '#/adapter/form';
import { addBatchRepairRes, getRepairRes, updateRepairRes } from '#/api/eims/repair-res';
import { deptRoleUserList, getDeptTree } from '#/api/system/user';
import { modalSchema } from './data';
const emit = defineEmits<{ reload: [] }>();
const isUpdate = ref(false);
const [BasicForm, formApi] = useVbenForm({
  commonConfig: {
    formItemClass: 'col-span-2',
    componentProps: {
      class: 'w-full'
    },
    labelWidth: 120
  },
  schema: modalSchema(),
  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 { batchReqIds } = drawerApi.getData() as { batchReqIds?: string };
    await formApi.setValues({ batchReqIds });
    isUpdate.value = !!id;
    // åˆå§‹åŒ–
    await setupDeptSelect();
    // æ›´æ–° && èµ‹å€¼
    if (isUpdate.value && id) {
      const record = await getRepairRes(id);
      await formApi.setValues(record);
    }
    drawerApi.drawerLoading(false);
  }
});
/**
 * ç”¨æˆ·çš„加载
 */
async function setupUserOptions(deptId: any) {
  const params = { deptId, roleKey: 'repair' };
  const userList = await deptRoleUserList(params);
  const options = userList.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) : addBatchRepairRes(data));
    emit('reload');
    await handleCancel();
  } catch (error) {
    console.error(error);
  } finally {
    drawerApi.drawerLoading(false);
  }
}
async function handleCancel() {
  drawerApi.close();
  await formApi.resetForm();
}
</script>
<template>
  <BasicDrawer :close-on-click-modal="false" class="w-[600px]">
    <BasicForm />
  </BasicDrawer>
</template>
eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx
@@ -191,6 +191,24 @@
  },
  {
    component: 'Input',
    fieldName: 'reqUser',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    label: '报修人'
  },
  {
    component: 'Input',
    fieldName: 'reqDept',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    label: '报修部门'
  },
  {
    component: 'Input',
    fieldName: 'reqCode',
    label: '报修单号'
  },
@@ -294,3 +312,5 @@
    label: '备注'
  },
];
eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue
@@ -1,10 +1,11 @@
<script setup lang="ts">
import type { Recordable } from '@vben/types';
import { onMounted } from 'vue';
import { onMounted, ref } from 'vue';
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';
@@ -14,9 +15,9 @@
import { getDeptTree, userList } from '#/api/system/user';
import { commonDownloadExcel } from '#/utils/file/download';
import RepairRecord from '../repair-record/index.vue';
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;
@@ -74,11 +75,16 @@
  id: 'eims-repair-res-index'
};
const resId = ref<string>();
const [BasicTable, tableApi] = useVbenVxeGrid({
  formOptions,
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
    cellClick: (e: any) => {
      const { row } = e;
      resId.value = row.id;
    }
  }
});
@@ -195,8 +201,8 @@
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px]">
      <BasicTable class="flex-1 overflow-hidden" table-title="维修工单列表">
    <div class="flex h-full gap-[8px] flex-col">
      <BasicTable class="h-2/3" table-title="维修工单列表">
        <template #toolbar-tools>
          <Space>
            <a-button v-access:code="['eims:repairRes:export']" @click="handleDownloadExcel">
@@ -230,6 +236,7 @@
          </Space>
        </template>
      </BasicTable>
      <RepairRecord :res-id="resId" class="h-1/3" table-title="维修记录" />
    </div>
    <RepairResDrawer @reload="tableApi.query()" />
  </Page>
eims-ui/apps/web-antd/src/views/eims/repair-res/repair-res-drawer.vue
@@ -194,7 +194,7 @@
    });
  }
  const resCode = `WXD${req.code.slice(3)}`;
  await formApi.setValues({ 'reqId': req.id, 'reqCode': req.code, 'resCode': resCode });
  await formApi.setValues({ 'reqId': req.id, 'reqUser': req.reqUser, 'reqDept': req.reqDept, 'reqCode': req.code, 'resCode': resCode });
}
</script>
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
@@ -49,4 +49,24 @@
        String WANCHENG = "1";
    }
    /**
     * ç»´ä¿®å·¥å•状态
     */
    String REPAIR_RECORD_HANDLE = "repair_record_handle";
    interface REPAIR_RECORD_HANDLE_DETAIL {
        /**
         * æ–°å¢ž
         */
        String XINZENG = "1";
        /**
         * æŽ¥å•
         */
        String JIEDAN = "2";
        /**
         * å®Œæˆ
         */
        String WANCHENG = "3";
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
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.EimsRepairRecordVo;
import org.dromara.eims.domain.bo.EimsRepairRecordBo;
import org.dromara.eims.service.IEimsRepairRecordService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
 * ç»´ä¿®è®°å½•
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/eims/repairRecord")
public class EimsRepairRecordController extends BaseController {
    private final IEimsRepairRecordService eimsRepairRecordService;
    /**
     * æŸ¥è¯¢ç»´ä¿®è®°å½•列表
     */
    @SaCheckPermission("eims:repairRecord:list")
    @GetMapping("/list")
    public TableDataInfo<EimsRepairRecordVo> list(EimsRepairRecordBo bo, PageQuery pageQuery) {
        return eimsRepairRecordService.queryPageList(bo, pageQuery);
    }
    /**
     * å¯¼å‡ºç»´ä¿®è®°å½•列表
     */
    @SaCheckPermission("eims:repairRecord:export")
    @Log(title = "维修记录", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(EimsRepairRecordBo bo, HttpServletResponse response) {
        List<EimsRepairRecordVo> list = eimsRepairRecordService.queryList(bo);
        ExcelUtil.exportExcel(list, "维修记录", EimsRepairRecordVo.class, response);
    }
    /**
     * èŽ·å–ç»´ä¿®è®°å½•è¯¦ç»†ä¿¡æ¯
     *
     * @param id ä¸»é”®
     */
    @SaCheckPermission("eims:repairRecord:query")
    @GetMapping("/{id}")
    public R<EimsRepairRecordVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable Long id) {
        return R.ok(eimsRepairRecordService.queryById(id));
    }
    /**
     * æ–°å¢žç»´ä¿®è®°å½•
     */
    @SaCheckPermission("eims:repairRecord:add")
    @Log(title = "维修记录", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsRepairRecordBo bo) {
        return toAjax(eimsRepairRecordService.insertByBo(bo));
    }
    /**
     * ä¿®æ”¹ç»´ä¿®è®°å½•
     */
    @SaCheckPermission("eims:repairRecord:edit")
    @Log(title = "维修记录", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsRepairRecordBo bo) {
        return toAjax(eimsRepairRecordService.updateByBo(bo));
    }
    /**
     * åˆ é™¤ç»´ä¿®è®°å½•
     *
     * @param ids ä¸»é”®ä¸²
     */
    @SaCheckPermission("eims:repairRecord:remove")
    @Log(title = "维修记录", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return toAjax(eimsRepairRecordService.deleteWithValidByIds(List.of(ids), true));
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsRepairResController.java
@@ -75,11 +75,19 @@
    @SaCheckPermission("eims:repairRes:add")
    @Log(title = "维修工单", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    @PostMapping("add")
    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsRepairResBo bo) {
        return toAjax(eimsRepairResService.insertByBo(bo));
    }
    @SaCheckPermission("eims:repairRes:add")
    @Log(title = "维修工单-批量", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping("addBatch")
    public R<Void> addBatch(@RequestBody EimsRepairResBo bo) {
        return toAjax(eimsRepairResService.insertBatchByBo(bo));
    }
    /**
     * ä¿®æ”¹ç»´ä¿®å·¥å•
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package org.dromara.eims.domain;
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_record
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("eims_repair_record")
public class EimsRepairRecord extends BaseEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(value = "id")
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    private Long reqId;
    /**
     * ç»´ä¿®å•id
     */
    private Long resId;
    /**
     * å¤„理时间
     */
    private Date handleTime;
    /**
     * æ“ä½œç”¨æˆ·
     */
    private Long operaUser;
    /**
     * æ“ä½œ(字典)
     */
    private String opera;
    /**
     * æ“ä½œç»“æžœ
     */
    private String operaResult;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java
@@ -35,6 +35,10 @@
     */
    private Long reqId;
    private  Long reqUser;//报修人
    private  Long reqDept;//报修人部门
    /**
     * ç»´ä¿®å•号
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairRecordBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package org.dromara.eims.domain.bo;
import org.dromara.eims.domain.EimsRepairRecord;
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_record
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = EimsRepairRecord.class, reverseConvertGenerate = false)
public class EimsRepairRecordBo extends BaseEntity {
    /**
     *
     */
    @NotNull(message = "不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    @NotNull(message = "报修单id不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long reqId;
    /**
     * ç»´ä¿®å•id
     */
    @NotNull(message = "维修单id不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long resId;
    /**
     * å¤„理时间
     */
    @NotNull(message = "处理时间不能为空", groups = { AddGroup.class, EditGroup.class })
    private Date handleTime;
    /**
     * æ“ä½œç”¨æˆ·
     */
    @NotNull(message = "操作用户不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long operaUser;
    /**
     * æ“ä½œ(字典)
     */
    @NotBlank(message = "操作(字典)不能为空", groups = { AddGroup.class, EditGroup.class })
    private String opera;
    /**
     * æ“ä½œç»“æžœ
     */
    @NotBlank(message = "操作结果不能为空", groups = { AddGroup.class, EditGroup.class })
    private String operaResult;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java
@@ -35,6 +35,10 @@
    @NotNull(message = "报修单不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long reqId;
    private  Long reqUser;//报修人
    private  Long reqDept;//报修人部门
    /**
     * ç»´ä¿®å•号
     */
@@ -102,9 +106,19 @@
    private String remark;
    //辅助字段
    /**
     * éœ€è¦æ‰¹é‡æ·»åŠ çš„æŠ¥ä¿®å•å·
     */
    private String batchReqIds;
    // å…³è”表字段
    private  String reqCode;//报修单编码
    private  String reqUser;//报修人
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairRecordVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package org.dromara.eims.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.eims.domain.EimsRepairRecord;
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_record
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EimsRepairRecord.class)
public class EimsRepairRecordVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long id;
    /**
     * æŠ¥ä¿®å•id
     */
    @ExcelProperty(value = "报修单id")
    private Long reqId;
    /**
     * ç»´ä¿®å•id
     */
    @ExcelProperty(value = "维修单id")
    private Long resId;
    /**
     * å¤„理时间
     */
    @ExcelProperty(value = "处理时间")
    private Date handleTime;
    /**
     * æ“ä½œç”¨æˆ·
     */
    @ExcelProperty(value = "操作用户")
    private Long operaUser;
    /**
     * æ“ä½œ(字典)
     */
    @ExcelProperty(value = "操作(字典)")
    private String opera;
    /**
     * æ“ä½œç»“æžœ
     */
    @ExcelProperty(value = "操作结果")
    private String operaResult;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
@@ -44,6 +44,10 @@
    @ExcelProperty(value = "报修单id")
    private Long reqId;
    private  Long reqUser;//报修人
    private  Long reqDept;//报修人部门
    /**
     * ç»´ä¿®å•号
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsRepairRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.eims.mapper;
import org.dromara.eims.domain.EimsRepairRecord;
import org.dromara.eims.domain.vo.EimsRepairRecordVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * ç»´ä¿®è®°å½•Mapper接口
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
public interface EimsRepairRecordMapper extends BaseMapperPlus<EimsRepairRecord, EimsRepairRecordVo> {
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package org.dromara.eims.service;
import org.dromara.eims.domain.vo.EimsRepairRecordVo;
import org.dromara.eims.domain.bo.EimsRepairRecordBo;
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-26
 */
public interface IEimsRepairRecordService {
    /**
     * æŸ¥è¯¢ç»´ä¿®è®°å½•
     *
     * @param id ä¸»é”®
     * @return ç»´ä¿®è®°å½•
     */
    EimsRepairRecordVo queryById(Long id);
    /**
     * åˆ†é¡µæŸ¥è¯¢ç»´ä¿®è®°å½•列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ç»´ä¿®è®°å½•分页列表
     */
    TableDataInfo<EimsRepairRecordVo> queryPageList(EimsRepairRecordBo bo, PageQuery pageQuery);
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„维修记录列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ç»´ä¿®è®°å½•列表
     */
    List<EimsRepairRecordVo> queryList(EimsRepairRecordBo bo);
    /**
     * æ–°å¢žç»´ä¿®è®°å½•
     *
     * @param bo ç»´ä¿®è®°å½•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    Boolean insertByBo(EimsRepairRecordBo bo);
    /**
     * ä¿®æ”¹ç»´ä¿®è®°å½•
     *
     * @param bo ç»´ä¿®è®°å½•
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    Boolean updateByBo(EimsRepairRecordBo bo);
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ç»´ä¿®è®°å½•信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsRepairResService.java
@@ -52,6 +52,14 @@
    Boolean insertByBo(EimsRepairResBo bo);
    /**
     * æ–°å¢žç»´ä¿®å·¥å•-批量
     *
     * @param bo ç»´ä¿®å·¥å•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    Boolean insertBatchByBo(EimsRepairResBo bo);
    /**
     * ä¿®æ”¹ç»´ä¿®å·¥å•
     *
     * @param bo ç»´ä¿®å·¥å•
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package org.dromara.eims.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
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.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsRepairRecordBo;
import org.dromara.eims.domain.vo.EimsRepairRecordVo;
import org.dromara.eims.domain.EimsRepairRecord;
import org.dromara.eims.mapper.EimsRepairRecordMapper;
import org.dromara.eims.service.IEimsRepairRecordService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
 * ç»´ä¿®è®°å½•Service业务层处理
 *
 * @author zhuguifei
 * @date 2025-02-26
 */
@RequiredArgsConstructor
@Service
public class EimsRepairRecordServiceImpl implements IEimsRepairRecordService {
    private final EimsRepairRecordMapper baseMapper;
    /**
     * æŸ¥è¯¢ç»´ä¿®è®°å½•
     *
     * @param id ä¸»é”®
     * @return ç»´ä¿®è®°å½•
     */
    @Override
    public EimsRepairRecordVo queryById(Long id){
        return baseMapper.selectVoById(id);
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢ç»´ä¿®è®°å½•列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ç»´ä¿®è®°å½•分页列表
     */
    @Override
    public TableDataInfo<EimsRepairRecordVo> queryPageList(EimsRepairRecordBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<EimsRepairRecord> lqw = buildQueryWrapper(bo);
        Page<EimsRepairRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„维修记录列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ç»´ä¿®è®°å½•列表
     */
    @Override
    public List<EimsRepairRecordVo> queryList(EimsRepairRecordBo bo) {
        LambdaQueryWrapper<EimsRepairRecord> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }
    private LambdaQueryWrapper<EimsRepairRecord> buildQueryWrapper(EimsRepairRecordBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<EimsRepairRecord> lqw = Wrappers.lambdaQuery();
        lqw.eq(bo.getReqId() != null, EimsRepairRecord::getReqId, bo.getReqId());
        lqw.eq(bo.getResId() != null, EimsRepairRecord::getResId, bo.getResId());
        lqw.eq(bo.getHandleTime() != null, EimsRepairRecord::getHandleTime, bo.getHandleTime());
        lqw.eq(bo.getOperaUser() != null, EimsRepairRecord::getOperaUser, bo.getOperaUser());
        lqw.eq(StringUtils.isNotBlank(bo.getOpera()), EimsRepairRecord::getOpera, bo.getOpera());
        return lqw;
    }
    /**
     * æ–°å¢žç»´ä¿®è®°å½•
     *
     * @param bo ç»´ä¿®è®°å½•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    @Override
    public Boolean insertByBo(EimsRepairRecordBo bo) {
        EimsRepairRecord add = MapstructUtils.convert(bo, EimsRepairRecord.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }
    /**
     * ä¿®æ”¹ç»´ä¿®è®°å½•
     *
     * @param bo ç»´ä¿®è®°å½•
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    @Override
    public Boolean updateByBo(EimsRepairRecordBo bo) {
        EimsRepairRecord update = MapstructUtils.convert(bo, EimsRepairRecord.class);
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }
    /**
     * ä¿å­˜å‰çš„æ•°æ®æ ¡éªŒ
     */
    private void validEntityBeforeSave(EimsRepairRecord entity){
        //TODO åšä¸€äº›æ•°æ®æ ¡éªŒ,如唯一约束
    }
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ç»´ä¿®è®°å½•信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if(isValid){
            //TODO åšä¸€äº›ä¸šåŠ¡ä¸Šçš„æ ¡éªŒ,判断是否需要校验
        }
        return baseMapper.deleteByIds(ids) > 0;
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
@@ -3,6 +3,7 @@
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.RepairReqService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
@@ -15,8 +16,10 @@
import lombok.RequiredArgsConstructor;
import org.dromara.eims.domain.EimsEqu;
import org.dromara.eims.domain.EimsFixtureBorrow;
import org.dromara.eims.domain.EimsRepairRecord;
import org.dromara.eims.domain.vo.EimsFixtureVo;
import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
import org.dromara.eims.mapper.EimsRepairRecordMapper;
import org.dromara.eims.utils.DataFilterUtil;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.vo.SysDeptVo;
@@ -27,11 +30,9 @@
import org.dromara.eims.domain.EimsRepairReq;
import org.dromara.eims.mapper.EimsRepairReqMapper;
import org.dromara.eims.service.IEimsRepairReqService;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
/**
 * æ•…障报修Service业务层处理
@@ -44,6 +45,7 @@
public class EimsRepairReqServiceImpl implements IEimsRepairReqService, RepairReqService {
    private final EimsRepairReqMapper baseMapper;
    private final EimsRepairRecordMapper recordMapper;
    private final SysDeptMapper sysDeptMapper;
    /**
@@ -73,7 +75,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);
    }
@@ -174,6 +176,7 @@
     * @param bo æ•…障报修
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertByBo(EimsRepairReqBo bo) {
        EimsRepairReq add = MapstructUtils.convert(bo, EimsRepairReq.class);
@@ -181,6 +184,16 @@
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
            //新增报修单时生成维修记录
            EimsRepairRecord record = new EimsRepairRecord();
            record.setReqId(add.getId());
            record.setHandleTime(new Date());
            //新增状态
            record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.XINZENG);
            record.setOperaUser(add.getCreateBy());
            record.setOperaResult("新增,生成报修单");
            //新增时生成记录
            recordMapper.insert(record);
        }
        return flag;
    }
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.service.RepairResService;
import org.dromara.common.core.utils.MapstructUtils;
@@ -14,10 +15,9 @@
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.*;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
import org.dromara.eims.mapper.EimsRepairRecordMapper;
import org.dromara.eims.mapper.EimsRepairReqMapper;
import org.dromara.eims.utils.DataFilterUtil;
import org.dromara.system.domain.SysDept;
@@ -26,15 +26,11 @@
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;
import java.util.*;
/**
 * ç»´ä¿®å·¥å•Service业务层处理
@@ -49,6 +45,7 @@
    private final EimsRepairResMapper baseMapper;
    private final EimsRepairReqMapper reqMapper;
    private final SysDeptMapper deptMapper;
    private final EimsRepairRecordMapper recordMapper;
    /**
     * æŸ¥è¯¢ç»´ä¿®å·¥å•
@@ -121,8 +118,55 @@
            reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WEIXIU);
            EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class);
            reqMapper.updateById(req);
            //将新增报修单时维修记录的维修工单id更新
            LambdaQueryWrapper<EimsRepairRecord> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(EimsRepairRecord::getReqId, add.getReqId());
            EimsRepairRecord one = recordMapper.selectOne(queryWrapper);
            if(one!=null){
                one.setResId(add.getId());
                recordMapper.updateById(one);
            }
            //生成维修记录
            EimsRepairRecord record = new EimsRepairRecord();
            record.setReqId(add.getReqId());
            record.setResId(add.getId());
            record.setHandleTime(new Date());
            //接单状态
            record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.JIEDAN);
            record.setOperaUser(add.getCreateBy());
            record.setOperaResult("接单,生成维修工单");
            //新增时生成记录
            recordMapper.insert(record);
        }
        return flag;
    }
    @SneakyThrows
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertBatchByBo(EimsRepairResBo bo){
        String batchReqIds = bo.getBatchReqIds();
        boolean result = StringUtils.isNotEmpty(batchReqIds);
        for (String reqId : batchReqIds.split(",")) {
            EimsRepairReqVo reqVo = reqMapper.selectVoById(reqId);
            EimsRepairResBo insert = new EimsRepairResBo();
            insert.setReqId(reqVo.getId());
            insert.setReqUser(reqVo.getReqUser());
            insert.setReqDept(reqVo.getReqDept());
            insert.setResCode(reqVo.getCode().replace("BXD","WXD"));
            insert.setResUser(bo.getResUser());
            insert.setResDept(bo.getResDept());
            insert.setStatus(DictConstants.REPAIR_RES_STATUS_DETAIL.WEIXIU);
            insert.setStartTime(new Date());
            Boolean b = insertByBo(insert);
            if(!b)throw new Exception("");
        }
        return result;
    }
    /**
@@ -145,6 +189,18 @@
            reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WANCHENG);
            EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class);
            reqMapper.updateById(req);
            //生成维修记录
            EimsRepairRecord record = new EimsRepairRecord();
            record.setResId(bo.getId());
            record.setReqId(bo.getReqId());
            record.setHandleTime(new Date());
            //完成状态
            record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.WANCHENG);
            record.setOperaUser(bo.getUpdateBy());
            record.setOperaResult("完成维修工单");
            recordMapper.insert(record);
        }
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
@@ -174,6 +230,7 @@
    @Override
    public TableDataInfo<EimsRepairResVo> queryPageListCustom(EimsRepairResBo bo, PageQuery pageQuery) {
        DataFilterUtil.getInstance().filterRepairRes(bo);
        Page<EimsRepairResVo> page = baseMapper.selectRepairResList(pageQuery.build(), buildWrapper(bo));
        return TableDataInfo.build(page);
    }
@@ -184,9 +241,14 @@
        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());
        qw.eq(bo.getReqUser() != null, "res.req_user", bo.getReqUser());
        List<Long> allDescendantIds = getAllDescendantIds(bo.getResDept());
        qw.in(bo.getResDept() != null, "res.res_dept", allDescendantIds);
        List<Long> resDeptIds = getAllDescendantIds(bo.getResDept());
        qw.in(bo.getResDept() != null, "res.res_dept", resDeptIds);
        List<Long> reqDeptIds = getAllDescendantIds(bo.getReqDept());
        qw.in(bo.getReqDept() != null, "res.req_dept", reqDeptIds);
        qw.eq(StringUtils.isNotBlank(bo.getStatus()), "res.status", bo.getStatus());
        qw.orderByDesc("res.create_time");
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java
@@ -42,7 +42,10 @@
            //TODO ç»´ä¿®å·¥åªèƒ½æŸ¥è¯¢æœªæŽ¥å•状态的报修单(具体状态参考字典repair_req_status)
            bo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.JIEDAN);
        }
        if(userList.size()>0){
        params.put("createBy", userList);
        }
    }
    //维修工单
@@ -50,19 +53,18 @@
        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);
            bo.setReqUser(-1L);
            bo.setResUser(-1L);
        }else if (rolePermission.contains(Role.operator.name())) {
            //操作工只能查询自己的数据
            userList.add(loginUser.getUserId());
            bo.setReqUser(loginUser.getUserId());
        }else if (rolePermission.contains(Role.repair.name())) {
            //TODO ç»´ä¿®å·¥åªèƒ½æŸ¥è¯¢æœªæŽ¥å•状态的报修单(具体状态参考字典repair_req_status)
            bo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.JIEDAN);
            bo.setResUser(loginUser.getUserId());
        }
        params.put("createBy", userList);
    }
}
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsRepairRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
<?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.EimsRepairRecordMapper">
</mapper>
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
@@ -64,6 +64,16 @@
        return userService.selectPageUserList(user, pageQuery);
    }
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨
     */
    @SaCheckPermission("system:user:list")
    @GetMapping("/deptRoleUser")
    public  R<List<SysUserVo>>  deptRoleUser(SysUserBo user) {
        return R.ok(userService.selectDeptRoleUserList(user));
    }
    /**
     * å¯¼å‡ºç”¨æˆ·åˆ—表
     */
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
@@ -103,6 +103,9 @@
     */
    private Long roleId;
    private String roleKey;
    /**
     * æŽ’除不查询的用户(工作流用)
     */
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
@@ -219,4 +219,11 @@
     * @return ç»“æžœ
     */
    List<SysUserVo> selectUserListByDept(Long deptId);
    /**
     * é€šè¿‡éƒ¨é—¨å’Œè§’色查询用户
     * @param user
     * @return
     */
    List<SysUserVo> selectDeptRoleUserList(SysUserBo user);
}
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
@@ -42,6 +42,8 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * ç”¨æˆ· ä¸šåŠ¡å±‚å¤„ç†
@@ -556,6 +558,33 @@
        return baseMapper.selectVoList(lqw);
    }
    @Override
    public List<SysUserVo> selectDeptRoleUserList(SysUserBo user) {
        List<SysUserVo> result = new ArrayList<>();
        if (user.getDeptId() == null) return result;
        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(SysUser::getDeptId, user.getDeptId());
        List<SysUserVo> deptUserList = baseMapper.selectVoList(queryWrapper);
        if (user.getRoleKey() != null) {
            LambdaQueryWrapper<SysRole> roleWrapper = Wrappers.lambdaQuery();
            roleWrapper.eq(SysRole::getRoleKey, user.getRoleKey());
            SysRole sysRole = roleMapper.selectOne(roleWrapper);
            if (sysRole != null) {
                LambdaQueryWrapper<SysUserRole> userRoleWrapper = Wrappers.lambdaQuery();
                userRoleWrapper.eq(SysUserRole::getRoleId, sysRole.getRoleId());
                List<SysUserRole> sysUserRoles = userRoleMapper.selectList(userRoleWrapper);
                Set<Long> roleUserIds = sysUserRoles.stream()
                    .map(SysUserRole::getUserId)
                    .collect(Collectors.toSet());
                deptUserList = deptUserList.stream()
                    .filter(u -> roleUserIds.contains(u.getUserId()))
                    .toList();
                result.addAll(deptUserList);
            }
        }
       return result;
    }
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户账户
     *