车间能级提升-智能设备管理系统
zhuguifei
2025-03-12 66e943c91e133eec5a0822ea22fd92cbc04bc9f3
保养工单汇总
已添加14个文件
已修改16个文件
1767 ■■■■■ 文件已修改
eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue 6 ●●●● 补丁 | 查看 | 原始文档 | 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/DictConstants.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
import type { MaintOrderStVO } from './model';
import type { ID, IDS } from '#/api/common';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
enum Api {
  maintOrderrStExport = '/eims/maintOrderSt/export',
  maintOrderrStList = '/eims/maintOrderSt/list',
  root = '/eims/maintOrderSt'
}
/**
 * æŸ¥è¯¢ä¿å…»å·¥å•列表
 * @param query
 * @returns {*}
 */
export function listMaintOrderSt(params?: any) {
  return requestClient.get<MaintOrderStVO[]>(Api.maintOrderrStList, { params });
}
/**
 * æŸ¥è¯¢ä¿å…»å·¥å•详细
 * @param maintOrderrStId
 */
export function getMaintOrderSt(maintOrderrStId: ID) {
  return requestClient.get<MaintOrderStVO>(`${Api.root}/${maintOrderrStId}`);
}
/**
 * æ–°å¢žä¿å…»å·¥å•
 * @param data
 */
export function addMaintOrderSt(data: any) {
  return requestClient.postWithMsg<void>(Api.root, data);
}
/**
 * ä¿®æ”¹ä¿å…»å·¥å•
 * @param data
 */
export function updateMaintOrderSt(data: any) {
  return requestClient.putWithMsg<void>(Api.root, data);
}
/**
 * åˆ é™¤ä¿å…»å·¥å•
 * @param maintOrderrStId
 */
export function delMaintOrderSt(maintOrderrStId: IDS) {
  return requestClient.deleteWithMsg<void>(`${Api.root}/${maintOrderrStId}`);
}
/**
 * å¯¼å‡º
 * @param
 */
export function maintOrderrStExport(data: any) {
  return commonExport(Api.maintOrderrStExport, data);
}
eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
export interface MaintOrderStVO {
  /**
   *
   */
  id: number | string;
  /**
   *
   */
  title: string;
  /**
   *
   */
  equId: number | string;
  status: string;
  /**
   *
   */
  planTime: string;
  /**
   * ä¿å…»äºº
   */
  maintUser: number;
  /**
   * éªŒè¯äºº
   */
  verifyUser: number;
  verifyTime: string;
  /**
   * ç‰¹è®°äº‹é¡¹
   */
  specialNote: string;
  /**
   * å¤‡æ³¨
   */
  remark: string;
}
export interface MaintOrderStForm extends BaseEntity {
  /**
   *
   */
  id?: number | string;
  /**
   *
   */
  title?: string;
  /**
   *
   */
  equId?: number | string;
  /**
   *
   */
  planTime?: string;
  /**
   * ä¿å…»äºº
   */
  maintUser?: number;
  /**
   * éªŒè¯äºº
   */
  verifyUser?: number;
  /**
   * ç‰¹è®°äº‹é¡¹
   */
  specialNote?: string;
  /**
   * å¤‡æ³¨
   */
  remark?: string;
}
eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
@@ -1,4 +1,4 @@
import type { MaintOrderVO } from './model';
import type { MaintOrderGroupVO, MaintOrderVO } from './model';
import type { ID, IDS } from '#/api/common';
@@ -7,6 +7,8 @@
enum Api {
  maintOrderExport = '/eims/maintOrder/export',
  maintOrderGroupList = '/eims/maintOrder/groupList',
  maintOrderGroupDetailList = '/eims/maintOrder/detailList',
  maintOrderList = '/eims/maintOrder/list',
  root = '/eims/maintOrder'
}
@@ -21,6 +23,14 @@
  return requestClient.get<MaintOrderVO[]>(Api.maintOrderList, { params });
}
export function listMaintOrderGroup(params?: any) {
  return requestClient.get<MaintOrderGroupVO[]>(Api.maintOrderGroupList, { params });
}
export function listMaintOrderGroupDetail(params?: any) {
  return requestClient.get<MaintOrderVO[]>(Api.maintOrderGroupDetailList, { params });
}
/**
 * æŸ¥è¯¢ä¿å…»å·¥å•详细
 * @param maintOrderId
eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
@@ -87,3 +87,32 @@
  remark: string;
}
export interface MaintOrderGroupVO {
  /**
   *
   */
  id: number | string;
  /**
   *
   */
  equId: number | string;
  /**
   * è®¡åˆ’表冗余-保养人
   */
  maintUserNames: string;
  /**
   * éªŒè¯äºº
   */
  verifyUserNames: string;
  /**
   * ä¿å…»è®¡åˆ’æ—¶é—´
   */
  planTime: string;
}
eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,194 @@
import type { VxeGridProps } from '#/adapter/vxe-table';
import { DictEnum } from '@vben/constants';
import { getPopupContainer } from '@vben/utils';
import { Tag } from 'ant-design-vue';
import { type FormSchemaGetter } from '#/adapter/form';
import { getDictOptions } from '#/utils/dict';
import { renderDict } from '#/utils/render';
export const querySchema: FormSchemaGetter = () => [
  {
    component: 'Input',
    fieldName: 'equName',
    label: '设备名称'
  },
  {
    component: 'RangePicker',
    fieldName: 'planTime',
    label: '保养日期'
  },
  {
    component: 'Select',
    componentProps: {
      options: getDictOptions(DictEnum.MAINT_ORDER_ST_STATUS)
    },
    fieldName: 'status',
    label: '状态'
  }
];
export const columns: VxeGridProps['columns'] = [
  { type: 'checkbox', width: 60, fixed: 'left' },
  {
    title: '设备名称',
    field: 'equName',
    minWidth: 200,
    fixed: 'left'
  },
  {
    title: '计划保养日期',
    field: 'planTime',
    minWidth: 200
  },
  {
    title: '状态',
    field: 'status',
    minWidth: 80,
    slots: {
      default: ({ row }) => {
        return renderDict(row.status, DictEnum.MAINT_ORDER_ST_STATUS);
      }
    }
  },
  {
    title: '资产编号',
    field: 'assetNo',
    minWidth: 160
  },
  {
    title: '工单总数',
    field: 'orderCount',
    minWidth: 100
  },
  {
    title: '待保养',
    field: 'dbyCount',
    minWidth: 80,
    slots: {
      default: ({ row }) => {
        return <Tag color="orange">{row.dbyCount}</Tag>;
      }
    }
  },
  {
    title: '保养中',
    field: 'byCount',
    minWidth: 80,
    slots: {
      default: ({ row }) => {
        return <Tag color="blue">{row.byCount}</Tag>;
      }
    }
  },
  {
    title: '待验证',
    field: 'dyzCount',
    minWidth: 80,
    slots: {
      default: ({ row }) => {
        return <Tag color="purple">{row.dyzCount}</Tag>;
      }
    }
  },
  {
    title: '完成',
    field: 'wcCount',
    minWidth: 80,
    slots: {
      default: ({ row }) => {
        return <Tag color="success">{row.wcCount}</Tag>;
      }
    }
  },
  {
    title: '特记事项',
    field: 'specialNote',
    minWidth: 160
  },
  {
    title: '保养成员',
    field: 'maintUserNames',
    minWidth: 160
  },
  {
    title: '稽查时间',
    field: 'verifyTime',
    minWidth: 200
  },
  {
    field: 'action',
    fixed: 'right',
    slots: { default: 'action' },
    title: '操作',
    width: 200
  }
];
export const drawerSchema: FormSchemaGetter = () => [
  {
    component: 'Input',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    fieldName: 'id'
  },
  {
    component: 'Input',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    fieldName: 'equId'
  },
  {
    component: 'DatePicker',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    },
    componentProps: {
      format: 'YYYY-MM-DD',
      showTime: false,
      valueFormat: 'YYYY-MM-DD',
      getPopupContainer
    },
    fieldName: 'planTime',
    label: '计划保养日期'
  },
  {
    component: 'Input',
    componentProps: {
      readonly: true
    },
    fieldName: 'title',
    label: '标题'
  },
  {
    component: 'Textarea',
    fieldName: 'specialNote',
    label: '特记事项'
  },
  {
    component: 'Input',
    fieldName: 'verifyUser',
    label: '稽查人',
    dependencies: {
      show: () => false,
      triggerFields: ['']
    }
  },
  {
    component: 'Input',
    fieldName: 'verifyUserName',
    label: '稽查人'
  },
  {
    component: 'Textarea',
    fieldName: 'remark',
    label: '备注'
  }
];
eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,223 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
import { Popconfirm, Space } from 'ant-design-vue';
import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
import { listMaintOrderGroupDetail } from '#/api/eims/maint-order';
import { delMaintOrderSt, listMaintOrderSt } from '#/api/eims/maint-order-st';
import { getDeptTree, userList } from '#/api/system/user';
import BasisSubTable from '#/views/eims/components/basis-sub-table.vue';
import { columns as orderCol } from '#/views/eims/maint-order/data';
import { columns, querySchema } from './data';
import maintOrderStDrawer from './maint-order-st-drawer.vue';
import type { Recordable } from '@vben/types';
import { MAINT_ORDER_STATUS } from '#/constants/dict';
import { $t } from '@vben/locales';
defineExpose({
  tableSelect
});
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',
  // æ—¥æœŸé€‰æ‹©æ ¼å¼åŒ–
  fieldMappingTime: [['planTime', ['params[beginPlanTime]', 'params[endPlanTime]'], ['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 listMaintOrderSt({
          pageNum: page.currentPage,
          pageSize: page.pageSize,
          ...formValues
        });
      }
    }
  },
  rowConfig: {
    isHover: true,
    keyField: 'id'
  },
  sortConfig: {
    // è¿œç¨‹æŽ’序
    remote: true,
    // æ”¯æŒå¤šå­—段排序 é»˜è®¤å…³é—­
    multiple: true
  },
  id: 'maint-order-group-index'
};
const orderId = ref<string>();
const [BasicTable, tableApi] = useVbenVxeGrid({
  formOptions,
  gridOptions,
  gridEvents: {
    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
    cellClick: (e: any) => {
      const { row } = e;
      orderId.value = `${row.equId}_${row.planTime}`;
    }
  }
});
/**
 * åˆå§‹åŒ–部门选择
 */
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.maintUser = undefined;
        },
        placeholder: '请选择',
        showSearch: true,
        treeData: deptTree,
        treeDefaultExpandAll: true,
        treeLine: { showLeafIcon: false },
        // ç­›é€‰çš„字段
        treeNodeFilterProp: 'label',
        // é€‰ä¸­åŽæ˜¾ç¤ºåœ¨è¾“入框的值
        treeNodeLabelProp: 'fullName'
      }),
      fieldName: 'maintDept'
    }
  ]);
}
/**
 * ç”¨æˆ·çš„加载
 */
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: 'maintUser'
    }
  ]);
}
const [MaintOrderStDrawer, maintOrderStDrawerApi] = useVbenDrawer({
  connectedComponent: maintOrderStDrawer
});
function handleAdd() {
  maintOrderStDrawerApi.setData({});
  maintOrderStDrawerApi.open();
}
async function handleEdit(record: Recordable<any>) {
  maintOrderStDrawerApi.setData({ id: record.id });
  maintOrderStDrawerApi.open();
}
async function handleDelete(row: Recordable<any>) {
  await delMaintOrderSt(row.id);
  await tableApi.query();
}
onMounted(async () => {
  await setupDeptSelect();
});
// é€‰ä¸­æ•°æ®
function tableSelect() {
  return tableApi.grid.getCheckboxRecords();
}
</script>
<template>
  <Page :auto-content-height="true">
    <div class="flex h-full gap-[8px] flex-col">
      <BasicTable class="h-3/5" table-title="保养工单列表">
        <template #toolbar-tools>
          <Space />
        </template>
        <template #equName="{ row }">
          <Space>
            <span>{{ row.equName }}</span>
          </Space>
        </template>
        <template #action="{ row }">
          <Space>
            <ghost-button v-access:code="['eims:maintOrderSt: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:maintOrderSt:remove']" @click.stop="">
                {{ $t('pages.common.delete') }}
              </ghost-button>
            </Popconfirm>
          </Space>
        </template>
      </BasicTable>
      <BasisSubTable
        :columns="orderCol"
        :list-api="listMaintOrderGroupDetail"
        :req-value="orderId"
        class="h-2/5"
        req-key="maintCode"
        title="保养实施项目"
      />
    </div>
    <MaintOrderStDrawer @reload="tableApi.query()" />
  </Page>
</template>
eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { cloneDeep } from '@vben/utils';
import { InputSearch } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { getMaintOrderSt, updateMaintOrderSt } from '#/api/eims/maint-order-st';
import userModal from '#/views/eims/components/user-modal.vue';
import { drawerSchema } from './data';
const emit = defineEmits<{ reload: [] }>();
const isUpdate = ref(false);
const title = computed(() => {
  return isUpdate.value ? '保养工单汇总稽查' : '保养工单汇总';
});
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 };
    isUpdate.value = !!id;
    // æ›´æ–° && èµ‹å€¼
    if (isUpdate.value && id) {
      const record = await getMaintOrderSt(id);
      await formApi.setValues(record);
    }
    drawerApi.drawerLoading(false);
  }
});
async function handleConfirm() {
  try {
    drawerApi.drawerLoading(true);
    const { valid } = await formApi.validate();
    if (!valid) {
      return;
    }
    const data = cloneDeep(await formApi.getValues());
    // await (isUpdate.value ? updateMaintOrderSt(data) : addMaintOrderSt(data));
    await (isUpdate.value ? updateMaintOrderSt(data) : updateMaintOrderSt(data));
    emit('reload');
    await handleCancel();
  } catch (error) {
    console.error(error);
  } finally {
    drawerApi.drawerLoading(false);
  }
}
async function handleCancel() {
  drawerApi.close();
  await formApi.resetForm();
}
// user modal
const [UserModal, userModalApi] = useVbenModal({
  connectedComponent: userModal,
  draggable: true,
  title: '选择稽查人'
});
function handleUserModal() {
  userModalApi.setData({});
  userModalApi.open();
}
/**
 * æ›´æ–°é€‰æ‹©çš„用户
 * @param user
 */
async function updateUser(user: any) {
  await formApi.setValues({ 'verifyUserName': user.nickName, 'verifyUser': user.userId });
}
</script>
<template>
  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
    <BasicForm>
      <template #verifyUserName="slotProps">
        <InputSearch :enter-button="true" placeholder="请选择" @search="handleUserModal()" v-bind="slotProps" />
      </template>
    </BasicForm>
    <UserModal class="w-[1200px]" @select-user="updateUser" />
  </BasicDrawer>
</template>
eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
@@ -256,7 +256,7 @@
      getPopupContainer
    },
    fieldName: 'maintFirstTime',
    label: '首次执行时间'
    label: '首次保养时间'
  },
  {
    component: 'DatePicker',
@@ -267,7 +267,7 @@
      getPopupContainer
    },
    fieldName: 'maintLastTime',
    label: '上次执行时间'
    label: '上次保养时间'
  },
  {
    component: 'DatePicker',
@@ -278,7 +278,7 @@
      getPopupContainer
    },
    fieldName: 'maintNextTime',
    label: '下次执行时间',
    label: '下次保养时间',
  },
  {
    component: 'Textarea',
eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
@@ -54,14 +54,14 @@
          show: () => isUpdate.value,
          triggerFields: ['']
        },
        fieldName: 'maintLastTime'
        fieldName: 'maintFirstTime'
      },
      {
        dependencies: {
          show: () => isUpdate.value,
          triggerFields: ['']
        },
        fieldName: 'maintNextTime'
        fieldName: 'maintLastTime'
      }
    ]);
    // æ›´æ–° && èµ‹å€¼
@@ -126,7 +126,7 @@
 * @param equ
 */
async function updateEqu(equ: any) {
  await formApi.setValues(equ);
  await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
}
/**
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
@@ -10,6 +10,7 @@
  FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // å·¥å…·ï¼ˆæ²»å…·ï¼‰å€Ÿç”¨çŠ¶æ€
  MAINT_CYCLE_UNIT = 'maint_cycle_unit', // ä¿å…»å‘¨æœŸå•位
  MAINT_ORDER_STATUS = 'maint_order_status', // ä¿å…»å·¥å•状态
  MAINT_ORDER_ST_STATUS = 'maint_order_st_status', // ä¿å…»å·¥å•汇总稽查状态
  MAINT_TIME_RULE = 'maint_time_rule', // ä¿å…»è§„则
  REPAIR_FAULT_TYPE = 'repair_fault_type', // æŠ¥ä¿®çŠ¶æ€
  REPAIR_RECORD_HANDLE = 'repair_record_handle', // ç»´ä¿®è®°å½•操作
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
@@ -127,7 +127,7 @@
    String MAINT_ORDER_STATUS = "maint_order_status";
    interface MAINT_ORDER_STATUS_DETAIL {
        String BAOYANG = "1";// ä¿å…»ç»„
        String BAOYANG = "1";// ä¿å…»
        String DAIBAOYANG = "0"; // å¾…保养
        String DAIYANZHENG = "2"; // å¾…验证
        String WANCHENG = "3"; // å®Œæˆ
@@ -141,4 +141,13 @@
        String WEIWANCHENG = "0";// æœªå®Œæˆ
        String YIWANCHENG = "1"; // å·²å®Œæˆ
    }
    /**
     * ä¿å…»å·¥å•汇总稽查状态
     */
    String MAINT_ORDER_ST_STATUS = "maint_order_st_status";
    interface MAINT_ORDER_ST_STATUS_DETAIL {
        String N = "0";// æœªå®Œæˆ
        String Y = "1"; // å·²å®Œæˆ
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
@@ -2,10 +2,14 @@
import java.util.List;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -46,6 +50,30 @@
        return eimsMaintOrderService.queryPageListCustom(bo, pageQuery);
    }
    @SaCheckPermission("eims:maintOrder:list")
    @GetMapping("/groupList")
    public TableDataInfo<MaintOrdeGroupVo> group(EimsMaintOrderBo bo, PageQuery pageQuery) {
//        return eimsMaintOrderService.queryPageList(bo, pageQuery);
        return eimsMaintOrderService.queryPageGroupList(bo, pageQuery);
    }
    @SaCheckPermission("eims:maintOrder:list")
    @GetMapping("/detailList")
    public TableDataInfo<EimsMaintOrderVo> groupDetail(EimsMaintOrderBo bo, PageQuery pageQuery) {
        // è¿™é‡Œä½¿ç”¨mintCode传递了 equid + plantime
        String maintCode = bo.getMaintCode();
        if (StringUtils.isEmpty(maintCode) || !maintCode.contains("_")) {
            return TableDataInfo.build(new Page<>(0,0));
        }
        String[] split = maintCode.split("_");
        bo.setEquId(Long.valueOf(split[0]));
        bo.setPlanTime(DateUtils.parseDate(split[1]));
        bo.setMaintCode(null);
//        return eimsMaintOrderService.queryPageList(bo, pageQuery);
        return eimsMaintOrderService.queryPageListCustom(bo, pageQuery);
    }
    /**
     * å¯¼å‡ºä¿å…»å·¥å•列表
     */
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.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.EimsMaintOrderStVo;
import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
import org.dromara.eims.service.IEimsMaintOrderStService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
 * ä¿å…»å·¥å•汇总
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/eims/maintOrderSt")
public class EimsMaintOrderStController extends BaseController {
    private final IEimsMaintOrderStService eimsMaintOrderStService;
    /**
     * æŸ¥è¯¢ä¿å…»å·¥å•汇总列表
     */
    @SaCheckPermission("eims:maintOrderSt:list")
    @GetMapping("/list")
    public TableDataInfo<EimsMaintOrderStVo> list(EimsMaintOrderStBo bo, PageQuery pageQuery) {
        return eimsMaintOrderStService.queryPageList(bo, pageQuery);
    }
    /**
     * å¯¼å‡ºä¿å…»å·¥å•汇总列表
     */
    @SaCheckPermission("eims:maintOrderSt:export")
    @Log(title = "保养工单汇总", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(EimsMaintOrderStBo bo, HttpServletResponse response) {
        List<EimsMaintOrderStVo> list = eimsMaintOrderStService.queryList(bo);
        ExcelUtil.exportExcel(list, "保养工单汇总", EimsMaintOrderStVo.class, response);
    }
    /**
     * èŽ·å–ä¿å…»å·¥å•æ±‡æ€»è¯¦ç»†ä¿¡æ¯
     *
     * @param id ä¸»é”®
     */
    @SaCheckPermission("eims:maintOrderSt:query")
    @GetMapping("/{id}")
    public R<EimsMaintOrderStVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable Long id) {
        return R.ok(eimsMaintOrderStService.queryById(id));
    }
    /**
     * æ–°å¢žä¿å…»å·¥å•汇总
     */
    @SaCheckPermission("eims:maintOrderSt:add")
    @Log(title = "保养工单汇总", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintOrderStBo bo) {
        return toAjax(eimsMaintOrderStService.insertByBo(bo));
    }
    /**
     * ä¿®æ”¹ä¿å…»å·¥å•汇总
     */
    @SaCheckPermission("eims:maintOrderSt:edit")
    @Log(title = "保养工单汇总", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintOrderStBo bo) {
        return toAjax(eimsMaintOrderStService.updateByBo(bo));
    }
    /**
     * åˆ é™¤ä¿å…»å·¥å•汇总
     *
     * @param ids ä¸»é”®ä¸²
     */
    @SaCheckPermission("eims:maintOrderSt:remove")
    @Log(title = "保养工单汇总", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return eimsMaintOrderStService.deleteWithValidByIds(List.of(ids), true);
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
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_maint_order_st
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("eims_maint_order_st")
public class EimsMaintOrderSt extends BaseEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(value = "id")
    private Long id;
    /**
     *
     */
    private String title;
    /**
     *
     */
    private String equId;
    /**
     *
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date verifyTime;
    private String status;
    /**
     * ä¿å…»äºº
     */
    private Long maintUser;
    /**
     * éªŒè¯äºº
     */
    private Long verifyUser;
    /**
     * ç‰¹è®°äº‹é¡¹
     */
    private String specialNote;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
@@ -1,8 +1,5 @@
package org.dromara.eims.domain;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@@ -115,7 +112,7 @@
     * ä¸Šæ¬¡ç”Ÿæˆå·¥å•æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date lastGenerateDate;
    private Date lastOrderDate;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package org.dromara.eims.domain.bo;
import org.dromara.eims.domain.EimsMaintOrderSt;
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_maint_order_st
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = EimsMaintOrderSt.class, reverseConvertGenerate = false)
public class EimsMaintOrderStBo extends BaseEntity {
    /**
     *
     */
    @NotNull(message = "不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     *
     */
    @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
    private String title;
    /**
     *
     */
    @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
    private String equId;
    /**
     *
     */
    @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date verifyTime;
    /**
     * ä¿å…»äºº
     */
    private Long maintUser;
    private String status;
    /**
     * éªŒè¯äºº
     */
    private Long verifyUser;
    /**
     * ç‰¹è®°äº‹é¡¹
     */
    private String specialNote;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
@@ -97,19 +97,21 @@
    /**
     * é¦–次执行时间
     */
    @NotNull(message = "保养计划首次执行时间不能为空", groups = { AddGroup.class, EditGroup.class })
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date maintFirstTime;
    /**
     * ä¸Šæ¬¡æ‰§è¡Œæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date maintLastTime;
    /**
     * ä¸‹æ¬¡æ‰§è¡Œæ—¶é—´
     */
    @NotNull(message = "下次保养时间不能为空", groups = { AddGroup.class, EditGroup.class })
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date maintNextTime;
@@ -122,7 +124,7 @@
     * ä¸Šæ¬¡ç”Ÿæˆå·¥å•æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date lastGenerateDate;
    private Date lastOrderDate;
    // å…³è”表字段
    private String equName;
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
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.EimsMaintOrderSt;
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_maint_order_st
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EimsMaintOrderSt.class)
public class EimsMaintOrderStVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long id;
    /**
     *
     */
    @ExcelProperty(value = "")
    private String title;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long equId;
    /**
     * è®¾å¤‡åç§°
     */
    @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
    private String equName;
    private String assetNo;
    /**
     *
     */
    @ExcelProperty(value = "")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planTime;
    /**
     *稽查日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date verifyTime;
    private String status;
    /**
     * ä¿å…»äºº
     */
    @ExcelProperty(value = "保养人")
    private Long maintUser;
    /**
     * éªŒè¯äºº
     */
    @ExcelProperty(value = "验证人")
    private Long verifyUser;
    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "verifyUser")
    private String verifyUserName;
    /**
     * ç‰¹è®°äº‹é¡¹
     */
    @ExcelProperty(value = "特记事项")
    private String specialNote;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
    private Integer orderCount;
    private Integer dbyCount;
    private Integer byCount;
    private Integer dyzCount;
    private Integer wcCount;
    private String maintUserNames;
    private String verifyUserNames;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
@@ -2,9 +2,6 @@
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.eims.domain.EimsMaintPlan;
@@ -17,8 +14,6 @@
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
@@ -160,7 +155,7 @@
     * ä¸Šæ¬¡ç”Ÿæˆå·¥å•æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date lastGenerateDate;
    private Date lastOrderDate;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package org.dromara.eims.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
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.EimsMaintOrder;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
 * ä¿å…»å·¥å•分组查询
 *
 * @author zhuguifei
 * @date 2025-03-011
 */
@Data
@ExcelIgnoreUnannotated
public class MaintOrdeGroupVo extends BaseEntity implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long id;
    /**
     *
     */
    @ExcelProperty(value = "")
    private Long equId;
    private String equName;
    /**
     * è®¾å¤‡èµ„产编号
     */
    private String assetNo;
   private Integer orderCount;
   private Integer dbyCount;
   private Integer byCount;
   private Integer dyzCount;
   private Integer wcCount;
    private String maintUserNames;
    private String verifyUserNames;
    /**
     * ä¿å…»è®¡åˆ’æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planTime;
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
@@ -3,10 +3,7 @@
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
@@ -14,15 +11,11 @@
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.eims.domain.*;
import org.dromara.eims.domain.bo.EimsMaintPlanBo;
import org.dromara.eims.domain.vo.EimsMaintPlanVo;
import org.dromara.eims.mapper.EimsMaintOrderMapper;
import org.dromara.eims.mapper.EimsMaintPlanMapper;
import org.dromara.eims.service.IEimsMaintOrderService;
import org.dromara.eims.service.IEimsMaintPlanService;
import org.dromara.eims.service.IGenerateCodeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +27,6 @@
@JobExecutor(name = "maintPlanToOrderJob")
public class MaintPlanToOrderJob {
    private final EimsMaintOrderMapper orderMapper;
    private final EimsMaintPlanMapper planMapper;
@@ -51,8 +43,6 @@
        LambdaQueryWrapper<EimsMaintPlan> planBoQueryWrapper = Wrappers.lambdaQuery();
        // æŸ¥è¯¢å¯ç”¨çš„保养计划
        planBoQueryWrapper.eq(EimsMaintPlan::getStatus, DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
        // è¿‡æ»¤æ²¡æœ‰é¦–次运行时间
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintFirstTime);
        // è¿‡æ»¤æ²¡æœ‰ä¸‹æ¬¡è¿è¡Œæ—¶é—´
        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintNextTime);
        // è¿‡æ»¤æ²¡æœ‰ä¿å…»å‘¨æœŸçš„æ•°æ®
@@ -64,8 +54,8 @@
        for (int i = 0; i < planVoList.size(); i++) {
            EimsMaintPlanVo planVo = planVoList.get(i);
            // ä¿å…»è®¡åˆ’add的时候会自动生成下次运行时间
            Date createOrderTime = planVo.getMaintNextTime();
            int day = DateUtils.differentDays(today,createOrderTime );
            Date oldNext = planVo.getMaintNextTime();
            int day = DateUtils.differentDays(today, oldNext);
            // å¦‚果计划生成工单日期大于今天则不生成工单
            if (day >= 1) {
                continue;
@@ -76,48 +66,50 @@
            String maintRule = planVo.getMaintRule();
            Date firstTime = planVo.getMaintFirstTime();
            Date lastTime = planVo.getMaintLastTime();
            Date nextTime = null;
            Date newNext = null;
            String maintCycleUnit = planVo.getMaintCycleUnit();
            switch (maintCycleUnit) {
                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.DAY:
                    newNext = DateUtils.addDays(oldNext, maintCycle.intValue());
                    break;
                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.WEEK:
                    maintCycle *= 7;
                    newNext = DateUtils.addWeeks(oldNext, maintCycle.intValue());
                    break;
                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.MONTH:
                    maintCycle *= 30;
                    newNext = DateUtils.addMonths(oldNext, maintCycle.intValue());
                    break;
                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.SEASON:
                    maintCycle *= 90;
                    newNext = DateUtils.addMonths(oldNext, maintCycle.intValue() * 3);
                    break;
                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.YEAR:
                    maintCycle *= 365;
                    newNext = DateUtils.addYears(oldNext, maintCycle.intValue());
                    break;
            }
            // é¦–次
            if (lastTime == null ) {
                nextTime = DateUtils.addDays(createOrderTime, maintCycle.intValue());
            } else {
                nextTime = DateUtils.addDays(lastTime, maintCycle.intValue());
            }
            EimsMaintOrder order = new EimsMaintOrder();
            BeanUtils.copyProperties(planVo, order);
            order.setId(null);
            order.setStatus(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIBAOYANG);
            order.setPlanTime(createOrderTime);
            order.setPlanTime(oldNext);
            order.setPlanId(planVo.getId());
            order.setMaintCode(codeService.generateCode("BYZD"));
            EimsMaintPlan plan = MapstructUtils.convert(planVo, EimsMaintPlan.class);
            assert plan != null;
            plan.setLastGenerateDate(new Date());
            plan.setMaintLastTime(createOrderTime);
            plan.setMaintNextTime(nextTime);
            plan.setLastOrderDate(new Date());
            plan.setMaintLastTime(oldNext);
            plan.setMaintNextTime(newNext);
            if(plan.getMaintFirstTime()==null)plan.setMaintFirstTime(oldNext);
            boolean flag  = orderMapper.insert(order) > 0;
            //TODO ç”Ÿæˆå¤±è´¥ï¼Œæ·»åŠ å¼‚å¸¸è®°å½•
            if (!flag) continue;
            planMapper.updateById(plan);
        }
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
@@ -9,6 +9,7 @@
import org.dromara.eims.domain.vo.EimsMaintOrderVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.eims.domain.vo.EimsMaintPlanVo;
import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
/**
 * ä¿å…»å·¥å•Mapper接口
@@ -18,5 +19,6 @@
 */
public interface EimsMaintOrderMapper extends BaseMapperPlus<EimsMaintOrder, EimsMaintOrderVo> {
    Page<EimsMaintOrderVo> selectMaintOrderList(@Param("page") Page<EimsMaintOrderVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintOrder> queryWrapper);
    Page<MaintOrdeGroupVo> selectMaintOrderGroupList(@Param("page") Page<EimsMaintOrderVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintOrder> queryWrapper);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.eims.mapper;
import org.dromara.eims.domain.EimsMaintOrderSt;
import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * ä¿å…»å·¥å•汇总Mapper接口
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
public interface EimsMaintOrderStMapper extends BaseMapperPlus<EimsMaintOrderSt, EimsMaintOrderStVo> {
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
@@ -4,6 +4,7 @@
import org.dromara.eims.domain.bo.EimsMaintOrderBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
import java.util.Collection;
import java.util.List;
@@ -74,4 +75,12 @@
     * @return ä¿å…»å·¥å•分页列表
     */
    TableDataInfo<EimsMaintOrderVo> queryPageListCustom(EimsMaintOrderBo bo, PageQuery pageQuery);
    /**
     * æ•°æ®æ ¹æ® è®¾å¤‡+日期  åˆ†ç»„
     * @param bo
     * @param pageQuery
     * @return
     */
    TableDataInfo<MaintOrdeGroupVo> queryPageGroupList(EimsMaintOrderBo bo, PageQuery pageQuery);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package org.dromara.eims.service;
import org.dromara.common.core.domain.R;
import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
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-03-12
 */
public interface IEimsMaintOrderStService {
    /**
     * æŸ¥è¯¢ä¿å…»å·¥å•汇总
     *
     * @param id ä¸»é”®
     * @return ä¿å…»å·¥å•汇总
     */
    EimsMaintOrderStVo queryById(Long id);
    /**
     * åˆ†é¡µæŸ¥è¯¢ä¿å…»å·¥å•汇总列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ä¿å…»å·¥å•汇总分页列表
     */
    TableDataInfo<EimsMaintOrderStVo> queryPageList(EimsMaintOrderStBo bo, PageQuery pageQuery);
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„保养工单汇总列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ä¿å…»å·¥å•汇总列表
     */
    List<EimsMaintOrderStVo> queryList(EimsMaintOrderStBo bo);
    /**
     * æ–°å¢žä¿å…»å·¥å•汇总
     *
     * @param bo ä¿å…»å·¥å•汇总
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    Boolean insertByBo(EimsMaintOrderStBo bo);
    /**
     * ä¿®æ”¹ä¿å…»å·¥å•汇总
     *
     * @param bo ä¿å…»å·¥å•汇总
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    Boolean updateByBo(EimsMaintOrderStBo bo);
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ä¿å…»å·¥å•汇总信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    R<Void> deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
@@ -5,7 +5,9 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.service.MaintOrderService;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -16,6 +18,11 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.eims.domain.EimsMaintPlan;
import org.dromara.eims.domain.bo.EimsMaintPlanBo;
import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
import org.dromara.eims.mapper.EimsMaintPlanMapper;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.mapper.SysDeptMapper;
@@ -27,10 +34,7 @@
import org.dromara.eims.service.IEimsMaintOrderService;
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业务层处理
@@ -43,6 +47,7 @@
public class EimsMaintOrderServiceImpl implements IEimsMaintOrderService, MaintOrderService {
    private final EimsMaintOrderMapper baseMapper;
    private final EimsMaintPlanMapper planMapper;
    private final SysDeptMapper sysDeptMapper;
    /**
@@ -76,6 +81,12 @@
        return TableDataInfo.build(page);
    }
    @Override
    public TableDataInfo<MaintOrdeGroupVo> queryPageGroupList(EimsMaintOrderBo bo, PageQuery pageQuery) {
        Page<MaintOrdeGroupVo> page = baseMapper.selectMaintOrderGroupList(pageQuery.build(), buildGroupWrapper(bo));
        return TableDataInfo.build(page);
    }
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„保养工单列表
     *
@@ -92,13 +103,33 @@
        QueryWrapper<EimsMaintOrder> qw =  Wrappers.query();
        qw.like(StringUtils.isNotBlank(bo.getMaintCode()),"mo.maint_code", bo.getMaintCode());
        qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
        qw.like(bo.getEquId() != null, "equ.equ_id", bo.getEquId());
        qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mo.maint_type", bo.getMaintType());
        qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mo.maint_cycle_unit", bo.getMaintCycleUnit());
        qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mo.maint_rule", bo.getMaintRule());
        qw.eq(bo.getMaintUser() != null, "mo.maint_user", bo.getMaintUser());
        qw.in(bo.getMaintDept() != null, "mo.maint_dept", getAllDescendantIds(bo.getMaintDept()));
        qw.eq(bo.getStatus() != null, "mo.status", bo.getStatus());
        qw.eq(bo.getPlanTime()!=null,
            "mo.plan_time", bo.getPlanTime());
        qw.orderByDesc("mo.create_time");
        return qw;
    }
    private QueryWrapper<EimsMaintOrder> buildGroupWrapper(EimsMaintOrderBo bo) {
        Map<String, Object> params = bo.getParams();
        QueryWrapper<EimsMaintOrder> qw =  Wrappers.query();
        qw.like(StringUtils.isNotBlank(bo.getMaintCode()),"mo.maint_code", bo.getMaintCode());
        qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
        qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mo.maint_type", bo.getMaintType());
        qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mo.maint_cycle_unit", bo.getMaintCycleUnit());
        qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mo.maint_rule", bo.getMaintRule());
        qw.eq(bo.getMaintUser() != null, "mo.maint_user", bo.getMaintUser());
        qw.in(bo.getMaintDept() != null, "mo.maint_dept", getAllDescendantIds(bo.getMaintDept()));
        qw.eq(bo.getStatus() != null, "mo.status", bo.getStatus());
        qw.between(params.get("beginPlanTime") != null && params.get("endPlanTime") != null,
            "mo.plan_time", params.get("beginPlanTime"), params.get("endPlanTime"));
        qw.groupBy(Arrays.asList("mo.equ_id","mo.plan_time"));
        qw.orderByDesc("mo.plan_time");
        return qw;
    }
@@ -152,9 +183,20 @@
     * @param bo ä¿å…»å·¥å•
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertByBo(EimsMaintOrderBo bo) {
        EimsMaintOrder add = MapstructUtils.convert(bo, EimsMaintOrder.class);
        //通过保养计划生成的数据需要更新保养计划
        Long planId = bo.getPlanId();
        if(planId!=null){
            EimsMaintPlan eimsMaintPlan = planMapper.selectById(planId);
            setMaintNextTime(eimsMaintPlan);
            planMapper.updateById(eimsMaintPlan);
        }
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
@@ -162,6 +204,50 @@
        }
        return flag;
    }
    /**
     * è®¡ç®—保养计划下次执行时间
     */
    @SneakyThrows
    private void setMaintNextTime(EimsMaintPlan bo) {
        Date oldNext = bo.getMaintNextTime();
        //TODO ä¸‹æ¬¡ä¿å…»æ—¶é—´è®¡ç®—规则 0-按固定周期  1-按上次保养时间
        Date newNext = null;
        //下次次执行时间为空抛出异常
        if (oldNext == null) {
            throw new Exception("下次保养时间不能为空!");
        }
        //周期
        Long maintCycle = bo.getMaintCycle();
        //单位 1-天 2-周 3-月 4-å­£ 5-å¹´
        String maintCycleUnit = bo.getMaintCycleUnit();
        switch (maintCycleUnit) {
            case "1":
                newNext = DateUtils.addDays(oldNext, maintCycle.intValue());
                break;
            case "2":
                newNext = DateUtils.addWeeks(oldNext, maintCycle.intValue());
                break;
            case "3":
                newNext = DateUtils.addMonths(oldNext, maintCycle.intValue());
                break;
            case "4":
                newNext = DateUtils.addMonths(oldNext, maintCycle.intValue() * 3);
                break;
            case "5":
                newNext = DateUtils.addYears(oldNext, maintCycle.intValue());
                break;
        }
        bo.setMaintNextTime(newNext);
        if(bo.getMaintFirstTime()==null){
            bo.setMaintFirstTime(oldNext);
        }
        bo.setMaintLastTime(oldNext);
    }
    /**
@@ -175,8 +261,19 @@
    @Override
    public Boolean updateByBo(EimsMaintOrderBo bo) {
        EimsMaintOrder update = MapstructUtils.convert(bo, EimsMaintOrder.class);
        if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.BAOYANG) && bo.getStartTime() == null){
            update.setStartTime(new Date());
        }
        EimsMaintOrder old = baseMapper.selectById(bo.getId());
        if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIYANZHENG) && bo.getEndTime() == null){
            update.setEndTime(new Date());
        }
        if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.WANCHENG) && bo.getVerifyUser() == null){
            LoginUser loginUser = LoginHelper.getLoginUser();
            update.setVerifyUser(loginUser.getUserId());
        }
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,220 @@
package org.dromara.eims.service.impl;
import lombok.SneakyThrows;
import org.dromara.common.core.constant.DictConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
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.dromara.common.satoken.utils.LoginHelper;
import org.dromara.eims.domain.EimsEqu;
import org.dromara.eims.domain.EimsMaintOrder;
import org.dromara.eims.domain.vo.EimsMaintOrderVo;
import org.dromara.eims.mapper.EimsEquMapper;
import org.dromara.eims.mapper.EimsMaintOrderMapper;
import org.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
import org.dromara.eims.domain.EimsMaintOrderSt;
import org.dromara.eims.mapper.EimsMaintOrderStMapper;
import org.dromara.eims.service.IEimsMaintOrderStService;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
 * ä¿å…»å·¥å•汇总Service业务层处理
 *
 * @author zhuguifei
 * @date 2025-03-12
 */
@RequiredArgsConstructor
@Service
public class EimsMaintOrderStServiceImpl implements IEimsMaintOrderStService {
    private final EimsMaintOrderStMapper baseMapper;
    private final EimsEquMapper equMapper;
    private final EimsMaintOrderMapper orderMapper;
    /**
     * æŸ¥è¯¢ä¿å…»å·¥å•汇总
     *
     * @param id ä¸»é”®
     * @return ä¿å…»å·¥å•汇总
     */
    @Override
    public EimsMaintOrderStVo queryById(Long id) {
        return baseMapper.selectVoById(id);
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢ä¿å…»å·¥å•汇总列表
     *
     * @param bo        æŸ¥è¯¢æ¡ä»¶
     * @param pageQuery åˆ†é¡µå‚æ•°
     * @return ä¿å…»å·¥å•汇总分页列表
     */
    @Override
    public TableDataInfo<EimsMaintOrderStVo> queryPageList(EimsMaintOrderStBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<EimsMaintOrderSt> lqw = buildQueryWrapper(bo);
        Page<EimsMaintOrderStVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        // å¡«å……数据
        fillStData(result);
        return TableDataInfo.build(result);
    }
    private void fillStData(Page<EimsMaintOrderStVo> result) {
        List<EimsMaintOrderStVo> records = result.getRecords();
        for (int i = 0; i < records.size(); i++) {
            EimsMaintOrderStVo stVo = records.get(i);
            //1.填充设备
            EimsEqu eimsEqu = equMapper.selectById(stVo.getEquId());
            stVo.setAssetNo(eimsEqu.getAssetNo());
            //2.统计数据
            LambdaQueryWrapper<EimsMaintOrder> orderLqw = Wrappers.lambdaQuery();
            orderLqw.eq(EimsMaintOrder::getEquId, stVo.getEquId());
            LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            ;
            LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth());
            LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth());
            orderLqw.between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth);
            // æ‰§è¡ŒæŸ¥è¯¢
            List<EimsMaintOrderVo> orderList = orderMapper.selectVoList(orderLqw);
            // TODO æ ¹æ®å­—å…¸maint_order_status
            Map<String, Long> cMap = orderList.stream()
                .filter(order -> List.of("0", "1", "2", "3").contains(order.getStatus()))
                .collect(Collectors.groupingBy(EimsMaintOrderVo::getStatus, Collectors.counting()));
            stVo.setOrderCount(orderList.size());
            stVo.setDbyCount(cMap.getOrDefault("0", 0L).intValue());
            stVo.setByCount(cMap.getOrDefault("1", 0L).intValue());
            stVo.setDyzCount(cMap.getOrDefault("2", 0L).intValue());
            stVo.setWcCount(cMap.getOrDefault("3", 0L).intValue());
        }
    }
    /**
     * æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„保养工单汇总列表
     *
     * @param bo æŸ¥è¯¢æ¡ä»¶
     * @return ä¿å…»å·¥å•汇总列表
     */
    @Override
    public List<EimsMaintOrderStVo> queryList(EimsMaintOrderStBo bo) {
        LambdaQueryWrapper<EimsMaintOrderSt> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }
    private LambdaQueryWrapper<EimsMaintOrderSt> buildQueryWrapper(EimsMaintOrderStBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<EimsMaintOrderSt> lqw = Wrappers.lambdaQuery();
        lqw.eq(StringUtils.isNotBlank(bo.getTitle()), EimsMaintOrderSt::getTitle, bo.getTitle());
        lqw.eq(StringUtils.isNotBlank(bo.getEquId()), EimsMaintOrderSt::getEquId, bo.getEquId());
        lqw.eq(bo.getPlanTime() != null, EimsMaintOrderSt::getPlanTime, bo.getPlanTime());
        lqw.eq(bo.getMaintUser() != null, EimsMaintOrderSt::getMaintUser, bo.getMaintUser());
        lqw.eq(bo.getVerifyUser() != null, EimsMaintOrderSt::getVerifyUser, bo.getVerifyUser());
        return lqw;
    }
    /**
     * æ–°å¢žä¿å…»å·¥å•汇总
     *
     * @param bo ä¿å…»å·¥å•汇总
     * @return æ˜¯å¦æ–°å¢žæˆåŠŸ
     */
    @Override
    public Boolean insertByBo(EimsMaintOrderStBo bo) {
        EimsMaintOrderSt add = MapstructUtils.convert(bo, EimsMaintOrderSt.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }
    /**
     * ä¿®æ”¹ä¿å…»å·¥å•汇总
     *
     * @param bo ä¿å…»å·¥å•汇总
     * @return æ˜¯å¦ä¿®æ”¹æˆåŠŸ
     */
    @Override
    public Boolean updateByBo(EimsMaintOrderStBo bo) {
        EimsMaintOrderSt update = MapstructUtils.convert(bo, EimsMaintOrderSt.class);
        if(bo.getVerifyUser()!=null){
            EimsMaintOrderSt eimsMaintOrderSt = baseMapper.selectById(bo.getId());
            String status = eimsMaintOrderSt.getStatus();
            if(status==null  || status.equals(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.N)){
                if(update.getVerifyTime()==null) update.setStatus(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.Y);
                if(update.getVerifyTime()==null) update.setVerifyTime(new Date());
            }
        }
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }
    /**
     * ä¿å­˜å‰çš„æ•°æ®æ ¡éªŒ
     */
    private void validEntityBeforeSave(EimsMaintOrderSt entity) {
        //TODO åšä¸€äº›æ•°æ®æ ¡éªŒ,如唯一约束
    }
    /**
     * æ ¡éªŒå¹¶æ‰¹é‡åˆ é™¤ä¿å…»å·¥å•汇总信息
     *
     * @param ids     å¾…删除的主键集合
     * @param isValid æ˜¯å¦è¿›è¡Œæœ‰æ•ˆæ€§æ ¡éªŒ
     * @return æ˜¯å¦åˆ é™¤æˆåŠŸ
     */
    @Transactional(rollbackFor = Exception.class)
    @SneakyThrows
    @Override
    public R<Void> deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if (isValid) {
            //TODO åšä¸€äº›ä¸šåŠ¡ä¸Šçš„æ ¡éªŒ,判断是否需要校验
        }
        AtomicBoolean flag = new AtomicBoolean(false);
        ids.stream().anyMatch(id -> {
            EimsMaintOrderStVo stVo = baseMapper.selectVoById(id);
            LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth());
            LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth());
            LambdaQueryWrapper<EimsMaintOrder> orderLqw = Wrappers.lambdaQuery(EimsMaintOrder.class)
                .eq(EimsMaintOrder::getEquId, stVo.getEquId())
                .between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth);
            List<EimsMaintOrderVo> orderList = orderMapper.selectVoList(orderLqw);
            if (!orderList.isEmpty()) {
                flag.set(true);
                return true; // æœ‰åŒ¹é…ç»“果,停止遍历
            }
            return false;
        });
        if (flag.get()) {
            return R.fail("存在子项,不能删除!");
        }
        boolean result = baseMapper.deleteByIds(ids) > 0;
        return result ? R.ok("操作成功!") : R.fail("操作失败!");
    }
}
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
@@ -106,6 +106,7 @@
        qw.eq(bo.getMaintUser() != null, "mp.maint_user", bo.getMaintUser());
        qw.in(bo.getMaintDept() != null, "mp.maint_dept", getAllDescendantIds(bo.getMaintDept()));
        qw.eq(bo.getStatus() != null, "mp.status", bo.getStatus());
        qw.orderByDesc("mp.create_time");
        return qw;
    }
@@ -144,7 +145,7 @@
     */
    @Override
    public Boolean insertByBo(EimsMaintPlanBo bo) {
        setMaintNextTime(bo);
        //setMaintNextTime(bo);
        EimsMaintPlan add = MapstructUtils.convert(bo, EimsMaintPlan.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
@@ -154,46 +155,7 @@
        return flag;
    }
    /**
     * è®¡ç®—保养计划下次执行时间
     */
    @SneakyThrows
    private void setMaintNextTime(EimsMaintPlanBo bo) {
        Date maintFirstTime = bo.getMaintFirstTime();
        Date maintLastTime = bo.getMaintLastTime();
        //下次保养时间计算规则 0-按固定周期  1-按上次保养时间
        Date nextDate = (maintLastTime != null && bo.getMaintRule().equals(DictConstants.MAINT_TIME_RULE_DETAIL.LAST)) ? maintLastTime :maintFirstTime;
        //首次执行时间为空抛出异常
        if (maintFirstTime == null) {
            throw new Exception("首次执行时间不能为空!");
        }
        //周期
        Long maintCycle = bo.getMaintCycle();
        //单位 1-天 2-周 3-月 4-å­£ 5-å¹´
        String maintCycleUnit = bo.getMaintCycleUnit();
        switch (maintCycleUnit) {
            case "1":
                nextDate = DateUtils.addDays(nextDate, maintCycle.intValue());
                break;
            case "2":
                nextDate = DateUtils.addWeeks(nextDate, maintCycle.intValue());
                break;
            case "3":
                nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue());
                break;
            case "4":
                nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue() * 3);
                break;
            case "5":
                nextDate = DateUtils.addYears(nextDate, maintCycle.intValue());
                break;
        }
        bo.setMaintNextTime(nextDate);
    }
    /**
     * ä¿®æ”¹ä¿å…»è®¡åˆ’
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
@@ -5,6 +5,9 @@
<mapper namespace="org.dromara.eims.mapper.EimsMaintOrderMapper">
    <resultMap type="org.dromara.eims.domain.vo.EimsMaintOrderVo" id="EimsMaintOrderResult">
    </resultMap>
    <resultMap type="org.dromara.eims.domain.vo.MaintOrdeGroupVo" id="MaintOrdeGroupVoResult">
    </resultMap>
    <select id="selectMaintOrderList" resultMap="EimsMaintOrderResult">
        SELECT mo.*,equ.equ_name equName,equ.equ_code equCode,equ.asset_no assetNo,equ.model_no modelNo,mo.create_time createTime,
               pl.maint_name maintName,
@@ -19,4 +22,27 @@
                 LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = mo.maint_cycle_unit
            ${ew.getCustomSqlSegment}
    </select>
    <select id="selectMaintOrderGroupList" resultMap="MaintOrdeGroupVoResult">
        SELECT
            mo.equ_id,
            mo.plan_time,
            MAX(equ.equ_name) AS equName,
            MAX(equ.equ_code) AS equCode,
            MAX(equ.asset_no) AS assetNo,
            MAX(equ.model_no) AS modelNo,
            GROUP_CONCAT(us.nick_name SEPARATOR ', ') AS maintUserNames,
            GROUP_CONCAT(ue.nick_name SEPARATOR ', ') AS verifyUserNames,
            COUNT(mo.id) AS orderCount, -- ç»´æŠ¤è®¢å•的总数
            SUM(CASE WHEN mo.status = 0 THEN 1 ELSE 0 END) AS dbyCount,
            SUM(CASE WHEN mo.status = 1 THEN 1 ELSE 0 END) AS byCount,
            SUM(CASE WHEN mo.status = 2 THEN 1 ELSE 0 END) AS dyzCount,
            SUM(CASE WHEN mo.status = 3 THEN 1 ELSE 0 END) AS wcCount
        FROM eims_maint_order mo
                 LEFT JOIN eims_equ equ ON mo.equ_id = equ.equ_id
                 LEFT JOIN sys_user us ON mo.maint_user = us.user_id
                 LEFT JOIN sys_user ue ON mo.verify_user = ue.user_id
                 LEFT JOIN sys_dept dp ON mo.maint_dept = dp.dept_id
                 LEFT JOIN eims_maint_plan pl ON pl.id = mo.plan_id
            ${ew.getCustomSqlSegment}
    </select>
</mapper>
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.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.EimsMaintOrderStMapper">
</mapper>