Kaynağa Gözat

系统模块

qinhb 1 yıl önce
ebeveyn
işleme
1153696df8

+ 1 - 1
.env.production

@@ -2,5 +2,5 @@
 NODE_ENV='production'
 
 # 代理前缀
-VITE_APP_BASE_API = '/prod-api'
+VITE_APP_BASE_API = '/apm-server'
 

+ 0 - 89
src/api/dept/index.ts

@@ -1,89 +0,0 @@
-import request from "@/utils/request";
-import { AxiosPromise } from "axios";
-import { DeptForm, DeptQuery, DeptVO } from "./types";
-
-
-/**
- * 部门树形列表
- * @param queryParams
- */
-export function treeList(): AxiosPromise<any[]> {
-  return request({
-    url: "/api/v1/sys/dept/orgTree",
-    method: "get"
-  });
-}
-
-/**
- * 部门树形表格
- *
- * @param queryParams
- */
-export function listDepts(queryParams?: DeptQuery): AxiosPromise<DeptVO[]> {
-  return request({
-    url: "/api/v1/dept",
-    method: "get",
-    params: queryParams,
-  });
-}
-
-/**
- * 部门下拉列表
- */
-export function getDeptOptions(): AxiosPromise<OptionType[]> {
-  return request({
-    url: "/api/v1/dept/options",
-    method: "get",
-  });
-}
-
-/**
- * 获取部门详情
- *
- * @param id
- */
-export function getDeptForm(id: number): AxiosPromise<DeptForm> {
-  return request({
-    url: "/api/v1/dept/" + id + "/form",
-    method: "get",
-  });
-}
-
-/**
- * 新增部门
- *
- * @param data
- */
-export function addDept(data: DeptForm) {
-  return request({
-    url: "/api/v1/dept",
-    method: "post",
-    data: data,
-  });
-}
-
-/**
- *  修改部门
- *
- * @param id
- * @param data
- */
-export function updateDept(id: number, data: DeptForm) {
-  return request({
-    url: "/api/v1/dept/" + id,
-    method: "put",
-    data: data,
-  });
-}
-
-/**
- * 删除部门
- *
- * @param ids
- */
-export function deleteDept(ids: string) {
-  return request({
-    url: "/api/v1/dept/" + ids,
-    method: "delete",
-  });
-}

+ 0 - 71
src/api/dept/types.ts

@@ -1,71 +0,0 @@
-/**
- * 部门查询参数
- */
-export interface DeptQuery {
-  keywords?: string;
-  status?: number;
-}
-
-/**
- * 部门类型
- */
-export interface DeptVO {
-  /**
-   * 子部门
-   */
-  children?: DeptVO[];
-  /**
-   * 创建时间
-   */
-  createTime?: Date;
-  /**
-   * 部门ID
-   */
-  id?: number;
-  /**
-   * 部门名称
-   */
-  name?: string;
-  /**
-   * 父部门ID
-   */
-  parentId?: number;
-  /**
-   * 排序
-   */
-  sort?: number;
-  /**
-   * 状态(1:启用;0:禁用)
-   */
-  status?: number;
-  /**
-   * 修改时间
-   */
-  updateTime?: Date;
-}
-
-/**
- * 部门表单类型
- */
-export interface DeptForm {
-  /**
-   * 部门ID(新增不填)
-   */
-  id?: number;
-  /**
-   * 部门名称
-   */
-  name?: string;
-  /**
-   * 父部门ID
-   */
-  parentId: number;
-  /**
-   * 排序
-   */
-  sort?: number;
-  /**
-   * 状态(1:启用;0:禁用)
-   */
-  status?: number;
-}

+ 7 - 0
src/api/device/index.ts

@@ -48,3 +48,10 @@ export function allocateExport(deviceNo: String) {
     responseType: "arraybuffer",
   });
 }
+
+export function queryTypeDataList() {
+  return request({
+    url: "/api/v1/device/fieldAlias/deviceTypeList",
+    method: "get",
+  });
+}

+ 68 - 0
src/api/system/dept/index.ts

@@ -0,0 +1,68 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+
+
+/**
+ * 部门树形列表
+ * @param queryParams
+ */
+export function treeList(): AxiosPromise<any[]> {
+  return request({
+    url: "/api/v1/sys/dept/orgTree",
+    method: "get"
+  });
+}
+
+/**
+ * 部门树形表格
+ *
+ * @param queryParams
+ */
+export function queryTreeList(queryParams?: any): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/sys/dept/queryOrgTree",
+    method: "post",
+    data: queryParams,
+  });
+}
+
+
+/**
+ * 新增部门
+ *
+ * @param data
+ */
+export function addDept(data: any) {
+  return request({
+    url: "/api/v1/sys/dept/add",
+    method: "post",
+    data: data,
+  });
+}
+
+/**
+ *  修改部门
+ *
+ * @param id
+ * @param data
+ */
+export function updateDept(data: any) {
+  return request({
+    url: "/api/v1/sys/dept/update",
+    method: "post",
+    data: data,
+  });
+}
+
+/**
+ * 删除部门
+ *
+ * @param ids
+ */
+export function deleteDept(ids: any) {
+  return request({
+    url: "/api/v1/sys/dept/batch-del",
+    method: "post",
+    data: ids
+  });
+}

src/api/dict/index.ts → src/api/system/dict/index.ts


src/api/dict/types.ts → src/api/system/dict/types.ts


src/api/menu/index.ts → src/api/system/menu/index.ts


src/api/menu/types.ts → src/api/system/menu/types.ts


src/api/role/index.ts → src/api/system/role/index.ts


src/api/role/types.ts → src/api/system/role/types.ts


src/api/user/index.ts → src/api/system/user/index.ts


src/api/user/types.ts → src/api/system/user/types.ts


+ 22 - 0
src/common/configs/buttonPermission.ts

@@ -54,6 +54,28 @@ const ButtonPermKeys = {
       order_export: "plan:order:export",
     },
   },
+  //设备管理
+  DEVICE:{
+    MENUS: {
+      maintenance: "device:maintenance",
+    },
+    BTNS: {
+      maintenance_add: "device:maintenance:add",
+      maintenance_handle: "device:maintenance:handle",
+      maintenance_edit: "device:maintenance:edit",
+      maintenance_del: "device:maintenance:del",
+      repair_repair: "device:repair:repair",
+      repair_add: "device:repair:add",
+      repair_edit: "device:repair:edit",
+      repair_del: "device:repair:del",
+      repair_audit: "device:repair:audit",
+      allocate_add: "device:allocate:add",
+      allocate_edit: "device:allocate:edit",
+      allocate_del: "device:allocate:del",
+      allocate_audit: "device:allocate:audit",
+      allocate_export: "device:allocate:export",
+    }
+  }
 };
 
 export default ButtonPermKeys;

+ 6 - 0
src/common/configs/dictDataUtil.ts

@@ -21,8 +21,14 @@ const DictDataUtil = {
     device_maintenance_cycle: "device_maintenance_cycle",
     //封装方法
     packaging_method:"packaging_method",
+    //岗位组
+    post_group: "post_group",
+    //岗位类别
+    post_type: "post_type"
   },
   EXPAND_FIELD_TABLE: {
+    //字段类型
+    expand_field_type: "expand_field_type",
     //映射表列表
     expand_table_list: "expand_field_table",
     //订单计划表

+ 1 - 1
src/components/Dictionary/index.vue

@@ -16,7 +16,7 @@
 </template>
 
 <script setup lang="ts">
-import { getDictOptions } from "@/api/dict";
+import { getDictOptions } from "@/api/system/dict";
 
 const props = defineProps({
   /**

+ 1 - 1
src/store/modules/permission.ts

@@ -1,7 +1,7 @@
 import { RouteRecordRaw } from "vue-router";
 import { constantRoutes } from "@/router";
 import { store } from "@/store";
-import { listRoutes } from "@/api/menu";
+import { listRoutes } from "@/api/system/menu";
 
 const modules = import.meta.glob("../../views/**/**.vue");
 const Layout = () => import("@/layout/index.vue");

+ 2 - 2
src/store/modules/user.ts

@@ -1,10 +1,10 @@
 import { loginApi, logoutApi } from "@/api/auth";
-import { getUserInfoApi } from "@/api/user";
+import { getUserInfoApi } from "@/api/system/user";
 import { resetRouter } from "@/router";
 import { store } from "@/store";
 
 import { LoginData } from "@/api/auth/types";
-import { UserInfo } from "@/api/user/types";
+import { UserInfo } from "@/api/system/user/types";
 
 export const useUserStore = defineStore("user", () => {
   const user = ref<UserInfo>({

+ 157 - 0
src/views/device/alias/index.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
+        >
+      </template>
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import  {queryTypeDataList} from "@/api/device"
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/fieldAlias",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+// const permission = reactive({
+//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+//   menu: true,
+// });
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const typeDataList = ref([])
+const typeDataValues = ref({})
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: true,
+  column: [
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      editDisplay: false,
+      search: true,
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      change:({value,index})=>{
+        if(value){
+          form.value.originalField = ''
+          typeDataList.value = typeDataValues.value[value]
+          if(typeDataList.value === undefined){
+            typeDataList.value = []
+          }
+        }
+      },
+      rules: [
+        {
+          required: true,
+          message: "设备类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "原始字段",
+      prop: "originalField",
+      editDisplay: false,
+      type: "select",
+      dicData: typeDataList,
+      rules: [
+        {
+          required: true,
+          message: "原始字段不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "字段类型",
+      prop: "fieldType",
+      type: "select",
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.EXPAND_FIELD_TABLE.expand_field_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "字段类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "页面显示",
+      prop: "filedLabel",
+      rules: [
+        {
+          required: true,
+          message: "页面显示不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "字段解释",
+      prop: "filedExplain"
+    }
+  ],
+});
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  dataList();
+  queryTypeDataList().then((data)=>{
+    typeDataValues.value = data.data
+  });
+});
+</script>

+ 11 - 2
src/views/device/allocate/index.vue

@@ -22,6 +22,7 @@
           type="danger"
           icon="el-icon-delete"
           :size="size"
+          v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.allocate_del]"
           @click="multipleDelete"
           >删除</el-button
         >
@@ -30,6 +31,7 @@
         <el-button @click="maintenance(row,0)"
                    icon="el-icon-check"
                    text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.allocate_audit]"
                    type="primary"
                    :size="size">流程</el-button>
         <el-button @click="maintenance(row,1)"
@@ -40,6 +42,7 @@
         <el-button @click="handleExport(row)"
                    icon="el-icon-download"
                    text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.allocate_export]"
                    type="primary"
                    :size="size">导出履历</el-button>
       </template>
@@ -105,7 +108,8 @@
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import {getUserList} from "@/api/user"
+import { checkPerm } from "@/directive/permission";
+import {getUserList} from "@/api/system/user"
 import {allocateAudit,allocateExport} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
@@ -114,7 +118,12 @@ const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
-
+const permission = reactive({
+  delBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.allocate_del),
+  addBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.allocate_add),
+  editBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.allocate_edit),
+  menu: true,
+});
 const viewPage = ref(true)
 
 const dialog = reactive({

+ 12 - 3
src/views/device/maintenance/index.vue

@@ -6,6 +6,7 @@
         v-model="form"
         :data="data"
         :option="option"
+        :permission="permission"
         v-model:page="page"
         @row-save="createRow"
         @row-update="updateRow"
@@ -20,6 +21,7 @@
         <el-button
           :disabled="toDeleteIds.length < 1"
           type="danger"
+          v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_del]"
           icon="el-icon-delete"
           :size="size"
           @click="multipleDelete"
@@ -30,12 +32,14 @@
         <el-button @click="maintenance(row)"
                    icon="el-icon-setting"
                    text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_handle]"
                    v-if="row.state === 0"
                    type="primary"
                    :size="size">维护</el-button>
         <el-button disabled
                    icon="el-icon-setting"
                    text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_handle]"
                    v-if="row.state === 1"
                    type="primary"
                    :size="size">维护</el-button>
@@ -128,18 +132,23 @@
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import {getUserList} from "@/api/user"
+import {getUserList} from "@/api/system/user"
 import {maintenanceUpdate} from "@/api/device/index";
-import {treeList} from "@/api/dept/index"
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
 import RecordPage from "./components/record-page.vue";
+import { checkPerm } from "@/directive/permission";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
-
+const permission = reactive({
+  delBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_del),
+  addBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_add),
+  editBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_edit),
+  menu: true,
+});
 const dialog = reactive({
   title: "设备选择",
   visible: false,

+ 140 - 0
src/views/device/metering/components/record-page.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup lang="ts">
+import { ref,defineProps } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/maintenanceRecord",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const props = defineProps({
+  maintenanceId: {
+    type: Number,
+    default: () => {
+      return 0;
+    }
+  }
+})
+
+watch?.(
+    () => props.maintenanceId,
+    (newVal: string) => {
+      alert(newVal)
+      search.value.maintenanceId = newVal
+      dataList()
+    }
+);
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "设备编号",
+      prop: "deviceNo",
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备名称",
+      prop: "deviceName",
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备名称不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      width: '100',
+      dicUrl:
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "设备位置",
+      width: '150',
+      prop: "devicePosition",
+    },
+    {
+      label: "维护类型",
+      prop: "type",
+      type: "select",
+      editDisplay: false,
+      dicData: [{label: '点检',value:0},{label: '保养',value:1}]
+    },
+    {
+      label: "维护人",
+      prop: "maintenanceUser",
+    },
+    {
+      label: "维护结果",
+      prop: "result",
+      search: true,
+      type: "select",
+      editDisplay: false,
+      dicData: [{label: '正常',value:0},{label: '报故',value:1}]
+    },
+    {
+      label: "维护时间",
+      width: '180',
+      prop: "maintenanceTime",
+    },
+  ],
+});
+
+onMounted?.(() => {
+  search.value.maintenanceId = props.maintenanceId
+  dataList();
+});
+</script>

+ 174 - 112
src/views/device/metering/index.vue

@@ -27,12 +27,19 @@
         >
       </template>
       <template #menu="{size,row,index}">
-        <el-button @click="maintenance(row,0)"
-                   icon="el-icon-check"
+        <el-button @click="maintenance(row)"
+                   icon="el-icon-setting"
                    text
+                   v-if="row.state === 0"
                    type="primary"
                    :size="size">流程</el-button>
-        <el-button @click="maintenance(row,1)"
+        <el-button disabled
+                   icon="el-icon-setting"
+                   text
+                   v-if="row.state === 1"
+                   type="primary"
+                   :size="size">流程</el-button>
+        <el-button @click="maintenanceList(row)"
                    icon="el-icon-fold"
                    text
                    type="primary"
@@ -55,101 +62,100 @@
         height="80%"
         @close="dialog1.visible = false">
       <el-timeline style="max-width: 500px;margin-left: 100px">
-        <el-timeline-item center type="success" placement="top">
+        <el-timeline-item center color="#0bbd87" type="success" placement="top">
           <el-card>
-            <h4>设备报故</h4>
+            <h4>维护计划</h4>
             <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
-            <p>设备名称: {{maintenanceInfo.deviceName}}</p>
-            <p>报故人员: {{maintenanceInfo.creator}}</p>
-            <p>故障描述: {{maintenanceInfo.bugRemark}}</p>
-            <p>报故时间: {{maintenanceInfo.created}}</p>
+            <p>设备名称:{{maintenanceInfo.deviceName}}</p>
+            <p>维护内容:{{maintenanceInfo.remark}}</p>
+            <p>计划时间:{{maintenanceInfo.nextTime}}</p>
           </el-card>
         </el-timeline-item>
-        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
-          <el-card v-if="viewPage">
-            <h4>设备维修</h4>
-            <p>维修人员: {{maintenanceInfo.handleUser}}</p>
-            <p>维修内容: {{maintenanceInfo.handleContent}}</p>
-            <p>处理结果: {{maintenanceInfo.handleUser ? (maintenanceInfo.handleResult === 0 ? '可正常运行' : '报废') : ''}}</p>
-          </el-card>
-          <el-card v-if="!viewPage">
-            <h4>设备维修</h4>
-            <el-form ref="maintenanceInfoForm1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules1">
-              <el-form-item label="维修人员" prop="handleUser">
-                <el-input :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleUser" />
-              </el-form-item>
-              <el-form-item label="维修内容" prop="handleContent">
-                <el-input :disabled="maintenanceInfo.state !== 0" type="textarea" :rows="2" v-model="maintenanceInfo.handleContent" />
+        <el-timeline-item center placement="top" :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
+          <el-card>
+            <h4>设备维护</h4>
+            <el-form ref="maintenanceInfoForm" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
+              <el-form-item label="维护人员" prop="userName">
+                <el-select
+                    v-model="maintenanceInfo.userName"
+                    placeholder="维护人员"
+                    size="large"
+                    style="width: 240px">
+                  <el-option
+                      v-for="item in userList"
+                      :key="item.userName"
+                      :label="item.userName"
+                      :value="item.userName"
+                  />
+                </el-select>
               </el-form-item>
-              <el-form-item label="处理结果">
-                <el-radio-group :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleResult" class="ml-4">
-                  <el-radio :value="0">正常运行</el-radio>
-                  <el-radio :value="1">报</el-radio>
+              <el-form-item label="维护结果">
+                <el-radio-group v-model="maintenanceInfo.result" class="ml-4">
+                  <el-radio :value="0">正常</el-radio>
+                  <el-radio :value="1">报</el-radio>
                 </el-radio-group>
               </el-form-item>
-              <el-form-item style="margin-left: 45%">
-                <el-button type="primary" v-if="maintenanceInfo.state === 0" :disabled="maintenanceInfo.state !== 0" @click="maintenanceSubmit1">保存</el-button>
+              <el-form-item v-if="maintenanceInfo.result === 1" label="报故内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
               </el-form-item>
-            </el-form>
-          </el-card>
-        </el-timeline-item>
-        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 1 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
-          <el-card v-if="viewPage">
-            <h4>设备审批</h4>
-            <p>审批人员: {{maintenanceInfo.auditUser}}</p>
-            <p>审批结果: {{maintenanceInfo.auditUser ? (maintenanceInfo.auditResult === 0 ? '通过' : '不通过') : ''}}</p>
-          </el-card>
-          <el-card v-if="!viewPage">
-            <h4>设备审批</h4>
-            <el-form ref="maintenanceInfoForm2" v-if="maintenanceInfo.state >= 1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules2">
-              <el-form-item label="审批人员" prop="auditUser">
-                <el-input :disabled="maintenanceInfo.state !== 1 && readonly"  v-model="maintenanceInfo.auditUser" />
+              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护日期">
+                <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
               </el-form-item>
-              <el-form-item label="审批结果">
-                <el-radio-group :disabled="maintenanceInfo.state !== 1 && readonly" v-model="maintenanceInfo.auditResult" class="ml-4">
-                  <el-radio :value="0">通过</el-radio>
-                  <el-radio :value="1">不通过</el-radio>
-                </el-radio-group>
+              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
               </el-form-item>
               <el-form-item style="margin-left: 45%">
-                <el-button type="primary" v-if="maintenanceInfo.state ===1" :disabled="maintenanceInfo.state !== 1" @click="maintenanceSubmit2">保存</el-button>
+                <el-button type="primary" @click="maintenanceSubmit">保存</el-button>
               </el-form-item>
             </el-form>
           </el-card>
         </el-timeline-item>
       </el-timeline>
     </el-dialog>
+
+    <el-dialog
+        v-model="dialog2.visible"
+        :title="dialog2.title"
+        width="60%"
+        height="80%"
+        @close="dialog2.visible = false"
+    >
+      <record-page :maintenanceId="maintenanceInfo.id"></record-page>
+    </el-dialog>
   </div>
 </template>
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import {getUserList} from "@/api/user"
-import {repair,audit} from "@/api/device/index";
+import {getUserList} from "@/api/system/user"
+import {maintenanceUpdate} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
+import RecordPage from "./components/record-page.vue";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
 
-const viewPage = ref(true)
-
 const dialog = reactive({
   title: "设备选择",
   visible: false,
 });
 const dialog1 = reactive({
-  title: "设备维修",
+  title: "设备计量",
+  visible: false,
+});
+const dialog2 = reactive({
+  title: "设备计量记录",
   visible: false,
 });
 const userList = ref([])
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
-    src: "/api/v1/device/repair",
+    src: "/api/v1/device/metering",
   });
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
@@ -157,66 +163,48 @@ const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 const deviceInfo = (value) => {
   form.value.deviceNo = value.deviceNo
-  form.value.deviceName =value.deviceName
-  form.value.deviceType = value.deviceType
-  form.value.devicePosition = value.devicePosition
   dialog.visible = false
 }
 const maintenanceInfo = ref(null)
-const maintenance = (row,type)=>{
-  viewPage.value = type === 0 ? false : true
+const maintenance = (row)=>{
   maintenanceInfo.value = row
-  maintenanceInfo.value.handResult = 0
+  maintenanceInfo.value.maintenanceContent = row.remark
+  maintenanceInfo.value.result = 0
   dialog1.visible = true
 }
+const maintenanceList = (row)=>{
+  maintenanceInfo.value = row
+  dialog2.visible = true
+}
 const queryUserList = ()=>{
   getUserList({}).then((data)=>{
     userList.value = data.data
   })
 }
-const maintenanceInfoForm1 = ref('maintenanceInfoForm1')
-const maintenanceInfoForm2 = ref('maintenanceInfoForm2')
-const maintenanceSubmit1 =()=>{
+const maintenanceInfoForm = ref('maintenanceInfoForm')
+const maintenanceSubmit =()=>{
   //alert(JSON.stringify(maintenanceInfo.value))
-  maintenanceInfoForm1.value.validate((isValid, invalidFields) => {
+  maintenanceInfoForm.value.validate((isValid, invalidFields) => {
     if (isValid) {
-      repair(maintenanceInfo.value).then((data)=>{
+      maintenanceUpdate(maintenanceInfo.value).then((data)=>{
         ElMessage({
           message: data.msg,
           type: "success",
         });
+        maintenanceInfo.value = null
         dialog1.visible = false
         dataList()
       })
     }
   })
 }
-const maintenanceSubmit2 =()=>{
-  //alert(JSON.stringify(maintenanceInfo.value))
-  maintenanceInfoForm2.value.validate((isValid, invalidFields) => {
-    if (isValid) {
-      audit(maintenanceInfo.value).then((data)=>{
-        ElMessage({
-          message: data.msg,
-          type: "success",
-        });
-        dialog1.visible = false
-        dataList()
-      })
-    }
-  })
-}
-const rules1 = reactive({
-  handleUser: [
-    { required: true, message: '维修人员不能为空', trigger: 'blur' }
-  ],
-  handleContent: [
-    { required: true, message: '维修内容不能为空', trigger: 'blur' }
-  ]
-})
-const rules2 = reactive({
-  auditUser: [
-    { required: true, message: '审批人员不能为空', trigger: 'blur' }
+const rules = reactive({
+  userName: [
+    // required是否必填,message不符合此规则时的提示信息,
+    // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+    // min此字段的最小长度,max此字段的最大长度
+    // pattern 正则表达式
+    { required: true, message: '维护人员不能为空', trigger: 'blur' }
   ]
 })
 // 设置表格列或者其他自定义的option
@@ -225,7 +213,6 @@ option.value = Object.assign(option.value, {
   selection: true,
   labelWidth: 150,
   viewBtn: false,
-  editBtn: false,
   column: [
     {
       label: "设备编号",
@@ -247,15 +234,15 @@ option.value = Object.assign(option.value, {
     {
       label: "设备名称",
       prop: "deviceName",
-      addDisabled: true,
+      display: false,
       search: true,
     },
     {
       label: "设备类型",
       prop: "deviceType",
       type: "select",
-      addDisabled: true,
       search: true,
+      display: false,
       dicUrl:
         dictDataUtil.request_url +
         dictDataUtil.TYPE_CODE.device_type,
@@ -273,33 +260,108 @@ option.value = Object.assign(option.value, {
     },
     {
       label: "设备位置",
-      addDisabled: true,
       prop: "devicePosition",
+      display: false,
     },
     {
-      label: "故障描述",
-      prop: "bugRemark",
-      minRows: 2, //最小行/最小值
-      type: "textarea", //类型为多行文本域框
-      maxlength: 512, //最大输入长度
+      label: "运行状态",
+      prop: "runState",
+      type: "select",
+      display: false,
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.device_run_status,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "运行状态不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "计量负责人",
+      prop: "meteringUser",
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "计量负责人不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "计量单位",
+      prop: "meteringUnit",
+      rules: [
+        {
+          required: true,
+          message: "计量单位不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "计量周期",
+      prop: "cycle",
+      type: "select",
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.device_maintenance_cycle,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "计量周期不能为空",
+          trigger: "trigger",
+        },
+      ],
     },
     {
-      label: "维修状态",
+      label: "计量状态",
       prop: "state",
       type: "select",
-      display: false,
-      dicData:[{label: '待维修',value: 0},{label: '待审批 ',value: 1},{label: '已完成',value: 2}],
+      addDisplay: false,
+      dicData: [{label: '待审批',value:0},{label: '带计量',value:1},{label: '已计量',value:2}],
+      rules: [
+        {
+          required: true,
+          message: "计量状态不能为空",
+          trigger: "trigger",
+        },
+      ],
     },
     {
-      label: "报故人",
-      prop: "creator",
-      display: false,
+      label: "计量日期",
+      prop: "nextTime",
+      type: "date",
+      addDisplay: false,
+      width: "120",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      rules: [
+        {
+          required: true,
+          message: "计量日期不能为空",
+          trigger: "trigger",
+        },
+      ],
     },
     {
-      label: "报故日期",
-      prop: "created",
-      width: "180",
-      display: false,
+      label: "备注",
+      prop: "remark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+      overHidden: true
     },
   ],
 });

+ 13 - 6
src/views/device/repair/index.vue

@@ -22,6 +22,7 @@
           type="danger"
           icon="el-icon-delete"
           :size="size"
+          v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.repair_del]"
           @click="multipleDelete"
           >删除</el-button
         >
@@ -32,11 +33,11 @@
                    text
                    type="primary"
                    :size="size">流程</el-button>
-        <el-button @click="maintenance(row,1)"
+<!--        <el-button @click="maintenance(row,1)"
                    icon="el-icon-fold"
                    text
                    type="primary"
-                   :size="size">记录</el-button>
+                   :size="size">记录</el-button>-->
       </template>
     </avue-crud>
     <el-dialog
@@ -88,7 +89,7 @@
                 </el-radio-group>
               </el-form-item>
               <el-form-item style="margin-left: 45%">
-                <el-button type="primary" v-if="maintenanceInfo.state === 0" :disabled="maintenanceInfo.state !== 0" @click="maintenanceSubmit1">保存</el-button>
+                <el-button type="primary" v-if="maintenanceInfo.state === 0" v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.repair_repair]" :disabled="maintenanceInfo.state !== 0" @click="maintenanceSubmit1">维修</el-button>
               </el-form-item>
             </el-form>
           </el-card>
@@ -112,7 +113,7 @@
                 </el-radio-group>
               </el-form-item>
               <el-form-item style="margin-left: 45%">
-                <el-button type="primary" v-if="maintenanceInfo.state ===1" :disabled="maintenanceInfo.state !== 1" @click="maintenanceSubmit2">保存</el-button>
+                <el-button type="primary" v-if="maintenanceInfo.state ===1" v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.repair_audit]" :disabled="maintenanceInfo.state !== 1" @click="maintenanceSubmit2">审批</el-button>
               </el-form-item>
             </el-form>
           </el-card>
@@ -125,7 +126,8 @@
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import {getUserList} from "@/api/user"
+import { checkPerm } from "@/directive/permission";
+import {getUserList} from "@/api/system/user"
 import {repair,audit} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
@@ -134,7 +136,12 @@ const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
-
+const permission = reactive({
+  delBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.repair_del),
+  addBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.repair_add),
+  editBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.repair_edit),
+  menu: true,
+});
 const viewPage = ref(true)
 
 const dialog = reactive({

+ 76 - 83
src/views/system/dept/index.vue

@@ -5,20 +5,20 @@
         <el-form-item label="关键字" prop="keywords">
           <el-input
             v-model="queryParams.keywords"
-            placeholder="部门名称"
+            placeholder="名称/编码"
             @keyup.enter="handleQuery"
           />
         </el-form-item>
 
-        <el-form-item label="部门状态" prop="status">
+        <el-form-item label="组织状态" prop="state">
           <el-select
-            v-model="queryParams.status"
+            v-model="queryParams.state"
             placeholder="全部"
             clearable
             class="!w-[100px]"
           >
-            <el-option :value="1" label="正常" />
-            <el-option :value="0" label="禁用" />
+            <el-option :value=0 label="正常" />
+            <el-option :value=1 label="禁用" />
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -36,16 +36,9 @@
         <el-button
           v-hasPerm="['sys:dept:add']"
           type="success"
-          @click="openDialog(0, undefined)"
+          @click="openDialog(undefined, undefined)"
           ><i-ep-plus />新增</el-button
         >
-        <el-button
-          v-hasPerm="['sys:dept:delete']"
-          type="danger"
-          :disabled="ids.length === 0"
-          @click="handleDelete()"
-          ><i-ep-delete />删除
-        </el-button>
       </template>
 
       <el-table
@@ -54,20 +47,24 @@
         row-key="id"
         default-expand-all
         :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        @selection-change="handleSelectionChange"
       >
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column prop="name" label="部门名称" min-width="200" />
-        <el-table-column prop="status" label="状态" width="100">
+        <el-table-column prop="deptName" align="center" label="组织名称" />
+        <el-table-column prop="deptCode" align="center" label="组织编码" />
+        <el-table-column prop="orgType" label="组织类型">
+          <template #default="scope">
+            <el-tag v-if="scope.row.orgType == 0" type="success">公司</el-tag>
+            <el-tag v-else type="edit">部门</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="state" label="状态">
           <template #default="scope">
-            <el-tag v-if="scope.row.status == 1" type="success">正常</el-tag>
+            <el-tag v-if="scope.row.state == 0" type="success">正常</el-tag>
             <el-tag v-else type="info">禁用</el-tag>
           </template>
         </el-table-column>
-
-        <el-table-column prop="sort" label="排序" width="100" />
-
-        <el-table-column label="操作" fixed="right" align="left" width="200">
+        <el-table-column prop="created" align="center" label="创建时间" />
+        <el-table-column prop="creator" align="center" label="创建人员" />
+        <el-table-column label="操作" fixed="right" align="left">
           <template #default="scope">
             <el-button
               v-hasPerm="['sys:dept:add']"
@@ -82,11 +79,11 @@
               type="primary"
               link
               size="small"
-              @click.stop="openDialog(scope.row.parentId, scope.row.id)"
+              @click.stop="openDialog(scope.row.parentId, scope.row)"
               ><i-ep-edit />编辑
             </el-button>
             <el-button
-              v-hasPerm="['sys:dept:delete']"
+              v-hasPerm="['sys:dept:del']"
               type="primary"
               link
               size="small"
@@ -111,31 +108,33 @@
         :rules="rules"
         label-width="80px"
       >
-        <el-form-item label="上级部门" prop="parentId">
+        <el-form-item label="上级组织" prop="parentId" >
           <el-tree-select
             v-model="formData.parentId"
-            placeholder="选择上级部门"
+            placeholder="选择上级组织"
             :data="deptOptions"
+            :props="{ value: 'id', label: 'deptName'}"
             filterable
             check-strictly
             :render-after-expand="false"
           />
         </el-form-item>
-        <el-form-item label="部门名称" prop="name">
-          <el-input v-model="formData.name" placeholder="请输入部门名称" />
+        <el-form-item label="组织编码" prop="deptCode">
+          <el-input v-model="formData.deptCode" placeholder="请输入组织编码" />
         </el-form-item>
-        <el-form-item label="显示排序" prop="sort">
-          <el-input-number
-            v-model="formData.sort"
-            controls-position="right"
-            style="width: 100px"
-            :min="0"
-          />
+        <el-form-item label="组织名称" prop="deptName">
+          <el-input v-model="formData.deptName" placeholder="请输入组织名称" />
         </el-form-item>
-        <el-form-item label="部门状态">
-          <el-radio-group v-model="formData.status">
-            <el-radio :value="1">正常</el-radio>
-            <el-radio :value="0">禁用</el-radio>
+        <el-form-item label="组织类别">
+          <el-radio-group v-model="formData.orgType">
+            <el-radio :value=0>公司</el-radio>
+            <el-radio :value=1>部门</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="组织状态">
+          <el-radio-group v-model="formData.state">
+            <el-radio :value=0>正常</el-radio>
+            <el-radio :value=1>禁用</el-radio>
           </el-radio-group>
         </el-form-item>
       </el-form>
@@ -152,15 +151,11 @@
 
 <script setup lang="ts">
 import {
-  getDeptForm,
   deleteDept,
   updateDept,
-  addDept,
-  getDeptOptions,
-  listDepts,
-} from "@/api/dept";
-
-import { DeptVO, DeptForm, DeptQuery } from "@/api/dept/types";
+  addDept
+  , queryTreeList, treeList,
+} from "@/api/system/dept";
 
 defineOptions({
   name: "Dept",
@@ -169,7 +164,6 @@ defineOptions({
 
 const queryFormRef = ref(ElForm);
 const deptFormRef = ref(ElForm);
-
 const loading = ref(false);
 const ids = ref<number[]>([]);
 const dialog = reactive({
@@ -177,28 +171,28 @@ const dialog = reactive({
   visible: false,
 });
 
-const queryParams = reactive<DeptQuery>({});
-const deptList = ref<DeptVO[]>();
+const queryParams = reactive({});
+const deptList = ref([]);
 
-const deptOptions = ref<OptionType[]>();
+const deptOptions = ref([]);
 
-const formData = reactive<DeptForm>({
+const formData = reactive({
   status: 1,
   parentId: 0,
   sort: 1,
 });
 
 const rules = reactive({
-  parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }],
-  name: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
-  sort: [{ required: true, message: "显示排序不能为空", trigger: "blur" }],
+  parentId: [{ required: true, message: "顶级组织不能为空", trigger: "blur" }],
+  deptName: [{ required: true, message: "组织名称不能为空", trigger: "blur" }],
+  deptCode: [{ required: true, message: "组织编码不能为空", trigger: "blur" }],
 });
 
 /** 查询 */
 function handleQuery() {
   loading.value = true;
-  listDepts(queryParams).then(({ data }) => {
-    deptList.value = data;
+  queryTreeList(queryParams).then((data) => {
+    deptList.value = data.data;
     loading.value = false;
   });
 }
@@ -214,36 +208,36 @@ function handleSelectionChange(selection: any) {
   ids.value = selection.map((item: any) => item.id);
 }
 
-/** 获取部门下拉数据  */
+/** 获取组织下拉数据  */
 async function loadDeptOptions() {
-  getDeptOptions().then((response) => {
-    deptOptions.value = [
-      {
-        value: 0,
-        label: "顶级部门",
-        children: response.data,
-      },
-    ];
+  treeList().then((response) => {
+    deptOptions.value = [{
+      id: "0",
+      deptName: "顶级组织",
+      children: response.data,
+    }]
   });
 }
 
 /**
  * 打开弹窗
  *
- * @param parentId 父部门ID
- * @param deptId 部门ID
+ * @param parentId 父组织ID
+ * @param dept 组织
  */
-async function openDialog(parentId?: number, deptId?: number) {
+async function openDialog(parentId?: number, dept?: any) {
   await loadDeptOptions();
   dialog.visible = true;
-  if (deptId) {
-    dialog.title = "修改部门";
-    getDeptForm(deptId).then(({ data }) => {
-      Object.assign(formData, data);
-    });
+  if (dept !== undefined) {
+    dialog.title = "修改组织";
+    Object.assign(formData, dept);
   } else {
-    dialog.title = "新增部门";
-    formData.parentId = parentId ?? 0;
+    dialog.title = "新增组织";
+    formData.deptCode = "";
+    formData.deptName = "";
+    formData.orgType = 0;
+    formData.state = 0;
+    formData.parentId = parentId ?? "0";
   }
 }
 
@@ -254,7 +248,7 @@ function handleSubmit() {
       const deptId = formData.id;
       loading.value = true;
       if (deptId) {
-        updateDept(deptId, formData)
+        updateDept(formData)
           .then(() => {
             ElMessage.success("修改成功");
             closeDialog();
@@ -274,21 +268,21 @@ function handleSubmit() {
   });
 }
 
-/** 删除部门 */
+/** 删除组织 */
 function handleDelete(deptId?: number) {
-  const deptIds = [deptId || ids.value].join(",");
+  const deptIds = [deptId || ids.value];
 
   if (!deptIds) {
     ElMessage.warning("请勾选删除项");
     return;
   }
-
+  const params = {ids: deptIds}
   ElMessageBox.confirm(`确认删除已选中的数据项?`, "警告", {
     confirmButtonText: "确定",
     cancelButtonText: "取消",
     type: "warning",
   }).then(() => {
-    deleteDept(deptIds).then(() => {
+    deleteDept(params).then(() => {
       ElMessage.success("删除成功");
       resetQuery();
     });
@@ -307,12 +301,11 @@ function resetForm() {
   deptFormRef.value.clearValidate();
 
   formData.id = undefined;
-  formData.parentId = 0;
+  formData.parentId = "0";
   formData.status = 1;
-  formData.sort = 1;
 }
 
-onMounted(() => {
+onMounted?.(() => {
   handleQuery();
 });
 </script>

+ 2 - 2
src/views/system/dict/components/dict-item.vue

@@ -6,8 +6,8 @@ import {
   addDict,
   updateDict,
   deleteDict,
-} from "@/api/dict";
-import { DictPageVO, DictForm, DictQuery } from "@/api/dict/types";
+} from "@/api/system/dict";
+import { DictPageVO, DictForm, DictQuery } from "@/api/system/dict/types";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
 
 defineOptions({

+ 2 - 2
src/views/system/dict/index.vue

@@ -6,9 +6,9 @@ import {
   addDictType,
   updateDictType,
   deleteDictTypes,
-} from "@/api/dict";
+} from "@/api/system/dict";
 
-import { DictTypePageVO, DictTypeQuery, DictTypeForm } from "@/api/dict/types";
+import { DictTypePageVO, DictTypeQuery, DictTypeForm } from "@/api/system/dict/types";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
 
 defineOptions({

+ 3 - 0
src/views/system/expand/index.vue

@@ -64,6 +64,9 @@ const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: true,
+  //searchMenuPosition: "right",
+  //searchIcon: false,
+  searchIndex: 1,
   column: [
     {
       label: "所属模块",

+ 9 - 2
src/views/system/logs/index.vue

@@ -107,8 +107,10 @@ option.value = {
   refreshBtn: false,
   column: [
     {
-      label: "操作编号",
+      label: "编号",
       prop: "id",
+      width: 80,
+
     },
     {
       label: "系统模块",
@@ -119,6 +121,7 @@ option.value = {
       prop: "operatorType",
       search: true,
       html: true,
+      width: 100,
       type: "select",
       formatter: (val) => {
         if (val.operatorType === "1") {
@@ -156,6 +159,8 @@ option.value = {
     {
       label: "操作地址",
       prop: "requestUrl",
+      width: 200,
+      overHidden: true
     },
     {
       label: "操作人员",
@@ -176,6 +181,7 @@ option.value = {
       label: "操作状态",
       prop: "state",
       html: true,
+      width: 100,
       type: "select",
       formatter: (val) => {
         if (val.state === 0) {
@@ -208,8 +214,9 @@ optionLogin.value = {
   refreshBtn: false,
   column: [
     {
-      label: "登录编号",
+      label: "编号",
       prop: "id",
+      width: 80
     },
     {
       label: "用户名称",

+ 2 - 2
src/views/system/menu/index.vue

@@ -356,7 +356,7 @@ defineOptions({
   inheritAttrs: false,
 });
 
-import { MenuQuery, MenuForm, MenuVO } from "@/api/menu/types";
+import { MenuQuery, MenuForm, MenuVO } from "@/api/system/menu/types";
 import {
   listMenus,
   getMenuForm,
@@ -364,7 +364,7 @@ import {
   addMenu,
   deleteMenu,
   updateMenu,
-} from "@/api/menu";
+} from "@/api/system/menu";
 
 import { MenuTypeEnum } from "@/enums/MenuTypeEnum";
 import ButtonPermKeys from "@/common/configs/buttonPermission";

+ 3 - 3
src/views/system/role/index.vue

@@ -7,10 +7,10 @@ import {
   deleteRoles,
   getRoleMenuIds,
   updateRoleMenus,
-} from "@/api/role";
-import { getMenuOptions } from "@/api/menu";
+} from "@/api/system/role";
+import { getMenuOptions } from "@/api/system/menu";
 
-import { RolePageVO, RoleForm, RoleQuery } from "@/api/role/types";
+import { RolePageVO, RoleForm, RoleQuery } from "@/api/system/role/types";
 
 defineOptions({
   name: "Role",

+ 3 - 3
src/views/system/user/components/dept-tree.vue

@@ -21,7 +21,7 @@
 </template>
 
 <script setup lang="ts">
-import { getDeptOptions } from "@/api/dept";
+import { treeList } from "@/api/system/dept";
 
 const props = defineProps({
   modelValue: {
@@ -61,8 +61,8 @@ function handleNodeClick(data: { [key: string]: any }) {
   emits("node-click");
 }
 
-onBeforeMount(() => {
-  getDeptOptions().then((response) => {
+onBeforeMount?.(() => {
+  treeList().then((response) => {
     deptList.value = response.data;
   });
 });

+ 7 - 7
src/views/system/user/index.vue

@@ -342,11 +342,11 @@ import {
   downloadTemplateApi,
   exportUser,
   importUser,
-} from "@/api/user";
-import { getDeptOptions } from "@/api/dept";
-import { getRoleOptions } from "@/api/role";
+} from "@/api/system/user";
+import { treeList } from "@/api/system/dept";
+import { getRoleOptions } from "@/api/system/role";
 
-import { UserForm, UserQuery, UserPageVO } from "@/api/user/types";
+import { UserForm, UserQuery, UserPageVO } from "@/api/system/user/types";
 import type { UploadInstance } from "element-plus";
 import { genFileId } from "element-plus";
 
@@ -366,7 +366,7 @@ const pageData = ref<UserPageVO[]>(); // 用户分页数据
 const deptList = ref<OptionType[]>(); // 部门下拉数据源
 const roleList = ref<OptionType[]>(); // 角色下拉数据源
 
-watch(dateTimeRange, (newVal) => {
+watch?.(dateTimeRange, (newVal) => {
   if (newVal) {
     queryParams.startTime = newVal[0];
     queryParams.endTime = newVal[1];
@@ -473,7 +473,7 @@ async function loadRoleOptions() {
 
 /** 加载部门下拉数据源 */
 async function loadDeptOptions() {
-  getDeptOptions().then((response) => {
+  treeList().then((response) => {
     deptList.value = response.data;
   });
 }
@@ -654,7 +654,7 @@ function handleExport() {
   });
 }
 
-onMounted(() => {
+onMounted?.(() => {
   handleQuery();
 });
 </script>