车间能级提升-智能设备管理系统
朱桂飞
2025-02-20 f0bb114ba37709cbe1aa55047fbf0c57cc07ab9d
开发工具借用会还功能,以及借用记录功能
已添加4个文件
已删除8个文件
已修改11个文件
1996 ■■■■ 文件已修改
eims-ui/apps/backend-mock/.nitro/dev/index.mjs 1333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/dev/index.mjs.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/nitro.json 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/types/nitro-config.d.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/types/nitro-imports.d.ts 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/types/nitro-routes.d.ts 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/types/nitro.d.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/types/tsconfig.json 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/public/static/img/img-lower-limit.png 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/public/static/img/img-up-limit.png 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/fixture/model.d.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/system/dict/dict-data-model.d.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/system/dict/dict-data.ts 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/constants/dict/index.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/fixture/fixture-borrow-list-drawer.vue 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/fixture/index.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/backend-mock/.nitro/dev/index.mjs
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/dev/index.mjs.map
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/nitro.json
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/types/nitro-config.d.ts
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/types/nitro-imports.d.ts
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/types/nitro-routes.d.ts
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/types/nitro.d.ts
ÎļþÒÑɾ³ý
eims-ui/apps/backend-mock/.nitro/types/tsconfig.json
ÎļþÒÑɾ³ý
eims-ui/apps/web-antd/public/static/img/img-lower-limit.png
eims-ui/apps/web-antd/public/static/img/img-up-limit.png
eims-ui/apps/web-antd/src/api/eims/fixture/model.d.ts
@@ -41,6 +41,12 @@
   * å€Ÿç”¨äºº
   */
  borrowUserName: string;
  /**
   * å€Ÿç”¨çŠ¶æ€
   */
  borrowStatus: string;
  createTime: string;
  /**
   * çŠ¶æ€ï¼ˆå­—å…¸ï¼‰
eims-ui/apps/web-antd/src/api/system/dict/dict-data-model.d.ts
@@ -15,3 +15,8 @@
  updateBy?: any;
  updateTime?: any;
}
export interface DictDataItem {
  dictType: string;
  dictValue: string;
}
eims-ui/apps/web-antd/src/api/system/dict/dict-data.ts
@@ -1,4 +1,4 @@
import type { DictData } from './dict-data-model';
import type { DictData, DictDataItem } from './dict-data-model';
import type { ID, IDS, PageQuery } from '#/api/common';
@@ -7,8 +7,9 @@
enum Api {
  dictDataExport = '/system/dict/data/export',
  dictDataItem = '/system/dict/data/item',
  dictDataList = '/system/dict/data/list',
  root = '/system/dict/data',
  root = '/system/dict/data'
}
/**
@@ -73,3 +74,12 @@
export function dictDetailInfo(dictCode: ID) {
  return requestClient.get<DictData>(`${Api.root}/${dictCode}`);
}
/**
 * æŸ¥è¯¢å­—典数据详细
 * @param params
 * @returns å­—典数据
 */
export function dictDataItem(params: DictDataItem) {
  return requestClient.get<DictData>(Api.dictDataItem, { params });
}
eims-ui/apps/web-antd/src/constants/dict/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
/**
 * æ“ä½œç±»åž‹
 */
export enum SYS_OPER_TYPE {
  ADD = '1',
  EDIT = '2'
}
/**
 * å·¥å…·å€Ÿç”¨è®°å½•表中借用记录状态
 */
export enum FIXTURE_BORROW_RECORD_STATUS{
  BORROW = '0',
  RERURN = '1'
}
eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx
@@ -112,6 +112,68 @@
    width: 200
  }
];
export const customColumns: VxeGridProps['columns'] = [
  { type: 'checkbox', width: 60, fixed: 'left' },
  {
    title: '工具名称',
    field: 'fixtureName',
    minWidth: 100,
    fixed: 'left',
    slots: { default: 'fixtureName' }
  },
  {
    title: '借用状态',
    field: 'status',
    sortable: true,
    slots: {
      default: ({ row }) => {
        if (row.status === null || row.status === '') {
          return '';
        }
        return renderDict(row.status, DictEnum.FIXTURE_BORROW_RECORD_STATUS);
      }
    },
    minWidth: 100,
    fixed: 'left'
  },
  {
    title: '借用部门',
    field: 'borrowDeptName',
    minWidth: 120
  },
  {
    title: '借用人',
    field: 'borrowUserName',
    minWidth: 100
  },
  {
    title: '经办人',
    field: 'agentUserName',
    minWidth: 100
  },
  {
    title: '借用时间',
    field: 'borrowTime',
    minWidth: 120
  },
  {
    title: '借用原因',
    field: 'borrowReason',
    minWidth: 140
  },
  {
    title: '预计归还时间',
    field: 'planReturnTime',
    minWidth: 160
  },
  {
    title: '实际归还时间',
    field: 'returnTime',
    minWidth: 160
  }
];
export const drawerSchema: FormSchemaGetter = () => [
  {
eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue
@@ -1,14 +1,104 @@
<script setup lang="ts">
import { AnalysisOverview, Page, WorkbenchTrends } from '@vben/common-ui';
import { onMounted, ref } from 'vue';
import { overviewItems, trendItems } from './data';
import { AnalysisOverview, type AnalysisOverviewItem, Page, type WorkbenchTrendItem, WorkbenchTrends } from '@vben/common-ui';
import { DictEnum } from '@vben/constants';
import { listFixture } from '#/api/eims/fixture';
import { operLogList } from '#/api/monitor/operlog';
import { dictDataInfo } from '#/api/system/dict/dict-data';
import { SYS_OPER_TYPE } from '#/constants/dict';
const fixtureList = ref<AnalysisOverviewItem[]>([
  {
    icon: 'svg:card',
    title: '工具总数',
    totalTitle: '工具总数',
    totalValue: 0,
    value: 0
  },
  {
    icon: 'svg:cake',
    title: '可用工具数',
    totalTitle: '可用工具数',
    totalValue: 0,
    value: 0
  },
  {
    icon: 'svg:download',
    title: '借出总数',
    totalTitle: '借出总数',
    totalValue: 0,
    value: 0
  },
  {
    icon: 'svg:bell',
    title: '最近更新',
    totalTitle: '最近更新',
    totalValue: 0,
    value: 0
  }
]);
const logList = ref<WorkbenchTrendItem[]>([]);
async function initFixtrueList() {
  const data = await listFixture({
    pageNum: 1,
    pageSize: 100_000
  });
  if (!data) {
    console.error('Failed to fetch data.');
    return;
  }
  const rows = data.rows;
  const now = Date.now(); // èŽ·å–å½“å‰æ—¶é—´çš„æ—¶é—´æˆ³
  const sevenDaysAgo = now - 7 * 24 * 60 * 60 * 1000; // è®¡ç®—7天前的时间戳
  const kongxian = rows.filter((item) => item.borrowStatus === '0' || item.borrowStatus === null);
  const jiechu = rows.filter((item) => item.borrowStatus === '1');
  const zuijin = rows.filter((item) => new Date(item.createTime).getTime() >= sevenDaysAgo);
  fixtureList.value[0]!.value = fixtureList.value[0]!.totalValue = data.total || 0;
  fixtureList.value[1]!.value = fixtureList.value[1]!.totalValue = kongxian.length;
  fixtureList.value[2]!.value = fixtureList.value[2]!.totalValue = jiechu.length;
  fixtureList.value[3]!.value = fixtureList.value[3]!.totalValue = zuijin.length;
}
async function initLogList() {
  const params = { title: '借用记录', orderByColumn: 'operTime', isAsc: 'desc' };
  const res = await operLogList({
    pageNum: 1,
    pageSize: 20,
    ...params
  });
  let list = res?.rows;
  list = list.filter((i) => i.businessType.toString() === SYS_OPER_TYPE.ADD || i.businessType.toString() === SYS_OPER_TYPE.EDIT);
  list = list.filter((i) => i.jsonResult !== null && JSON.parse(i.jsonResult).code === 200);
  const recordStatusList = await dictDataInfo(DictEnum.FIXTURE_BORROW_RECORD_STATUS);
  list.forEach((row) => {
    const operParam = JSON.parse(row.operParam);
    const label = recordStatusList.find((item) => item.dictValue === operParam.status)?.dictLabel;
    logList.value.push({
      avatar: 'svg:avatar-1',
      content: `${row?.deptName}  ${row?.operName} <a>${label}</a> ${operParam?.fixtureName} `,
      date: row.operTime,
      title: row.title
    });
  });
}
onMounted(() => {
  initFixtrueList();
  initLogList();
});
</script>
<template>
  <Page :auto-content-height="true">
    <div class="h-full">
      <AnalysisOverview :items="overviewItems" />
      <WorkbenchTrends :items="trendItems" class="mt-5" title="最新动态" />
      <AnalysisOverview :items="fixtureList" />
      <WorkbenchTrends :items="logList" class="mt-5" title="最新动态" />
      <div class="h-5"></div>
    </div>
  </Page>
eims-ui/apps/web-antd/src/views/eims/fixture/fixture-borrow-list-drawer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
<script setup lang="ts">
import { useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
import { Space } from 'ant-design-vue';
import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
import { listFixBorrow } from '#/api/eims/fixture-borrow';
import { customColumns as columns, querySchema } from '#/views/eims/fixture-borrow/data';
const [BasicDrawer, drawerApi] = useVbenDrawer({
  onCancel: handleCancel,
  onConfirm: handleConfirm,
  async onOpenChange(isOpen) {
    if (!isOpen) {
      return null;
    }
  }
});
const formOptions: VbenFormProps = {
  commonConfig: {
    labelWidth: 80,
    componentProps: {
      allowClear: true
    }
  },
  collapsed: true,
  schema: querySchema(),
  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
  handleReset: async () => {
    // eslint-disable-next-line no-use-before-define
    const { formApi, reload } = tableApi;
    await formApi.resetForm();
    const formValues = formApi.form.values;
    formApi.setLatestSubmissionValues(formValues);
    await reload(formValues);
  },
  // æ—¥æœŸé€‰æ‹©æ ¼å¼åŒ–
  fieldMappingTime: []
};
const gridOptions: VxeGridProps = {
  checkboxConfig: {
    // é«˜äº®
    highlight: true,
    // ç¿»é¡µæ—¶ä¿ç•™é€‰ä¸­çŠ¶æ€
    reserve: true
    // ç‚¹å‡»è¡Œé€‰ä¸­
    // trigger: 'row'
  },
  columns,
  height: 'auto',
  keepSource: true,
  pagerConfig: {},
  toolbarConfig: {
    enabled: false
  },
  formConfig: {
    enabled: false
  },
  proxyConfig: {
    ajax: {
      query: async ({ page }, formValues = {}) => {
        const { fixtureId } = drawerApi.getData() as { fixtureId?: number | string };
        return await listFixBorrow({
          fixtureId,
          pageNum: page.currentPage,
          pageSize: page.pageSize,
          ...formValues
        });
      }
    }
  },
  rowConfig: {
    isHover: true,
    keyField: 'id'
  },
  sortConfig: {
    // è¿œç¨‹æŽ’序
    remote: true,
    // æ”¯æŒå¤šå­—段排序 é»˜è®¤å…³é—­
    multiple: true
  },
  id: 'fixture-borrow-list-index'
};
const [BasicTable, tableApi] = useVbenVxeGrid({
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
  }
});
async function handleCancel() {
  drawerApi.close();
}
async function handleConfirm() {
  try {
    drawerApi.drawerLoading(true);
    await handleCancel();
  } catch (error) {
    console.error(error);
  } finally {
    drawerApi.drawerLoading(false);
  }
}
</script>
<template>
  <BasicDrawer :close-on-click-modal="false" class="w-[800px]" title="借用记录">
    <BasicTable class="flex-1 overflow-hidden" table-title="借用记录">
      <template #fixtureName="{ row }">
        <Space>
          <span>{{ row.fixtureName }}</span>
        </Space>
      </template>
      <template #action="{ row }"> </template>
    </BasicTable>
  </BasicDrawer>
</template>
<style scoped></style>
eims-ui/apps/web-antd/src/views/eims/fixture/index.vue
@@ -19,6 +19,7 @@
import { columns, querySchema } from './data';
import fixtureDrawer from './fixture-drawer.vue';
import fixtureBorrowListDrawer from './fixture-borrow-list-drawer.vue';
import fixtureImportModal from './fixture-import-modal.vue';
import FixtureTypeTree from './fixture-type-tree.vue';
@@ -104,12 +105,21 @@
  formOptions,
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
    cellClick: (e: any) => {
      const { row } = e;
      console.error()
      handleBorroeList(row)
    }
  }
});
const [FixtureDrawer, fixtureDrawerApi] = useVbenDrawer({
  connectedComponent: fixtureDrawer
});
const [FixtureBorrowListDrawer, fixtureBorrowListDrawerApi] = useVbenDrawer({
  connectedComponent: fixtureBorrowListDrawer,
  placement: 'left'
});
const [FixtureBorrowDrawer, fixtureBorrowDrawerApi] = useVbenDrawer({
@@ -130,6 +140,11 @@
function handleAdd() {
  fixtureDrawerApi.setData({});
  fixtureDrawerApi.open();
}
async function handleBorroeList(record: Recordable<any>) {
  fixtureBorrowListDrawerApi.setData({ fixtureId: record.id });
  fixtureBorrowListDrawerApi.open();
}
async function handleEdit(record: Recordable<any>) {
@@ -312,11 +327,7 @@
            <ghost-button v-if="isBorrow(row)" class="btn-success" v-access:code="['eims:fixture:borrow']" @click="handleBorrow(row, '0')">
              å€Ÿç”¨
            </ghost-button>
            <ghost-button
              v-else-if="isReturn(row) && isBorrowUser(row)"
              v-access:code="['eims:fixture:borrow']"
              @click="handleBorrow(row, '1')"
            >
            <ghost-button v-else-if="isReturn(row) && isBorrowUser(row)" v-access:code="['eims:fixture:borrow']" @click="handleBorrow(row, '1')">
              å½’还
            </ghost-button>
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?" @confirm="handleDelete(row)">
@@ -329,7 +340,10 @@
      </BasicTable>
    </div>
    <FixtureDrawer @reload="tableApi.query()" />
    <!--工具借出归还操作-->
    <FixtureBorrowDrawer @reload="tableApi.query()" />
    <!--查看工具借出归还记录-->
    <FixtureBorrowListDrawer />
    <FixtureImportModal @reload="tableApi.query()" />
  </Page>
</template>
eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue
@@ -110,7 +110,6 @@
            });
            check.value = data1 !== null && data1.length > 0 ? `已盘(${data1.length})` : `已盘(0)`;
          }
        });
      }
    }
@@ -182,8 +181,7 @@
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px]">
      <EquTypeTree v-model:select-dept-id="selectTypeId" class="w-[260px]" @reload="() => tableApi.reload()"
                   @select="() => tableApi.reload()" />
      <EquTypeTree v-model:select-dept-id="selectTypeId" class="w-[260px]" @reload="() => tableApi.reload()" @select="() => tableApi.reload()" />
      <BasicTable class="flex-1 overflow-hidden" table-title="盘点明细列表">
        <template #toolbar-tools>
          <Space>
@@ -206,12 +204,10 @@
        <template #action="{ row }">
          <Space>
            <ghost-button :disabled="!isSuperAdmin" v-access:code="['eims:inventory:edit']"
                          @click.stop="handleEdit(row)">
            <ghost-button :disabled="!isSuperAdmin" v-access:code="['eims:inventory:edit']" @click.stop="handleEdit(row)">
              {{ $t('pages.common.edit') }}
            </ghost-button>
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?"
                        @confirm="handleDelete(row)">
            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="确认删除?" @confirm="handleDelete(row)">
              <ghost-button :disabled="!isSuperAdmin" danger v-access:code="['eims:inventory:remove']" @click.stop="">
                {{ $t('pages.common.delete') }}
              </ghost-button>
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java
@@ -2,6 +2,7 @@
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.eims.domain.EimsFixture;
@@ -27,7 +28,7 @@
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EimsFixture.class)
public class EimsFixtureVo implements Serializable {
public class EimsFixtureVo extends BaseEntity implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java
@@ -65,6 +65,16 @@
    public R<SysDictDataVo> getInfo(@PathVariable Long dictCode) {
        return R.ok(dictDataService.selectDictDataById(dictCode));
    }
    /**
     * æŸ¥è¯¢å­—典数据详细
     *
     * @param dictType å­—å…¸type
     */
    @SaCheckPermission("system:dict:query")
    @GetMapping(value = "/item")
    public R<SysDictDataVo> getDictItem(String dictType,String dictValue) {
        return R.ok(dictDataService.selectDictItem(dictType,dictValue));
    }
    /**
     * æ ¹æ®å­—典类型查询字典数据信息
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java
@@ -73,4 +73,5 @@
     */
    boolean checkDictDataUnique(SysDictDataBo dict);
    SysDictDataVo selectDictItem(String dictType, String dictValue);
}
eims/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java
@@ -153,4 +153,12 @@
        return true;
    }
    @Override
    public SysDictDataVo selectDictItem(String dictType, String dictValue) {
        LambdaQueryWrapper<SysDictData> QueryWrapper = new LambdaQueryWrapper<>();
        QueryWrapper.eq(SysDictData::getDictType, dictType);
        QueryWrapper.eq(SysDictData::getDictValue, dictValue);
        return baseMapper.selectVoOne(QueryWrapper, SysDictDataVo.class);
    }
}