Browse Source

feat: 分类管理功能开发接口联调

yongCode 9 months ago
parent
commit
4899952749

+ 96 - 0
src/api/bussiness/index.js

@@ -0,0 +1,96 @@
+import request from "@/utils/request";
+import { it } from "element-plus/es/locales.mjs";
+
+// 查询参数列表
+export function listTools(query) {
+  return request({
+    url: "/tool/basis/list",
+    method: "get",
+    params: query,
+  });
+}
+// 查询大类,二类树状信息
+export function listToolTypes(query) {
+  return request({
+    url: "/tool/basis/basisTree",
+    method: "get",
+    params: query,
+  });
+}
+
+// 获取工具类型字典
+export function queryToolDict(level,parentId) {
+  return new Promise((resolve, reject) => {
+    request({
+      url: "/tool/basis/list",
+      method: "get",
+      params: {
+        level,
+        parentId,
+      },
+    })
+      .then((res) => {
+        const result = res.rows.map((item) => ({
+          id: item.id,
+          label: item.toolName,
+        }));
+        resolve(result);
+      })
+      .catch((err) => reject(err));
+  });
+}
+// 添加工具、分类基本信息
+export function toolAdd(data) {
+  return request({
+    url: "/tool/basis/add",
+    method: "post",
+    data,
+  });
+}
+
+// 修改工具、分类基本信息
+export function toolUpdate(data) {
+  return request({
+    url: "/tool/basis/updateBasis",
+    method: "post",
+    data,
+  });
+}
+// 删除工具、分类基本信息
+export function toolDelete(id) {
+  return request({
+    url: `/tool/basis/delete/${id}`,
+    method: "delete",
+  });
+}
+
+
+// 根据基础信息id查询附件信息
+export function listFileByBasisId(query) {
+  return request({
+    url: "/basis/detail/list",
+    method: "get",
+    params:query,
+  });
+}
+
+// 给对应基础信息添加附件
+export function addFileByBasisId(data) {
+  return request({
+    url: "/basis/detail/add",
+    method: "post",
+    data,
+  });
+}
+
+// 对应基础信息附件进行更新
+export function updateFileByBasisId(data) {
+  return request({
+    url: "/basis/detail/update",
+    method: "post",
+    data,
+  });
+}
+
+
+

+ 8 - 6
src/components/FileUpload/index.vue

@@ -40,6 +40,7 @@
 
 <script setup>
 import { getToken } from "@/utils/auth";
+import { deepClone } from "@/utils"
 
 const props = defineProps({
   modelValue: [String, Object, Array],
@@ -56,7 +57,7 @@ const props = defineProps({
   // 文件类型, 例如['png', 'jpg', 'jpeg']
   fileType: {
     type: Array,
-    default: () => ["doc", "xls", "ppt", "txt", "pdf"],
+    default: () => ["doc","docx","xls","xlsx", "ppt", "txt", "pdf"],
   },
   // 是否显示提示
   isShowTip: {
@@ -70,7 +71,7 @@ const emit = defineEmits();
 const number = ref(0);
 const uploadList = ref([]);
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传文件服务器地址
+const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/basis/detail/multipartUpload"); // 上传文件服务器地址
 const headers = ref({ Authorization: "Bearer " + getToken() });
 const fileList = ref([]);
 const showTip = computed(
@@ -134,7 +135,7 @@ function handleUploadError(err) {
 // 上传成功回调
 function handleUploadSuccess(res, file) {
   if (res.code === 200) {
-    uploadList.value.push({ name: res.fileName, url: res.fileName });
+    uploadList.value.push({ name: file.name, url: res.data });
     uploadedSuccessfully();
   } else {
     number.value--;
@@ -147,8 +148,8 @@ function handleUploadSuccess(res, file) {
 
 // 删除文件
 function handleDelete(index) {
-  fileList.value.splice(index, 1);
-  emit("update:modelValue", listToString(fileList.value));
+  const delItem = fileList.value.splice(index, 1)[0];
+  emit("update:modelValue", deepClone(fileList.value));
 }
 
 // 上传结束处理
@@ -157,7 +158,7 @@ function uploadedSuccessfully() {
     fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
     uploadList.value = [];
     number.value = 0;
-    emit("update:modelValue", listToString(fileList.value));
+    emit("update:modelValue", deepClone(fileList.value));
     proxy.$modal.closeLoading();
   }
 }
@@ -200,6 +201,7 @@ function listToString(list, separator) {
   justify-content: space-between;
   align-items: center;
   color: inherit;
+  padding: 0 14px;
 }
 .ele-upload-list__item-content-action .el-link {
   margin-right: 10px;

+ 5 - 3
src/router/index.js

@@ -87,25 +87,27 @@ export const constantRoutes = [
   {
     path: '/',
     component: Layout,
+    meta: { title: '', icon: ''},
     children: [
       {
         path: 'material',
         component: () => import('@/views/material/index'),
         name: 'Material',
-        meta: { title: '物料管理', icon: 'component' }
-      }
+        meta: { title: '工具管理', icon: 'component' },
+      },
     ]
   },
   {
     path: '/',
     component: Layout,
+    meta: { title: '', icon: ''},
     children: [
       {
         path: 'classification',
         component: () => import('@/views/classification/index'),
         name: 'Classification',
         meta: { title: '分类管理', icon: 'tree-table'}
-      }
+      },
     ]
   }
 ]

+ 1 - 1
src/settings.js

@@ -15,7 +15,7 @@ export default {
   /**
    * 是否显示顶部导航
    */
-  topNav: true,
+  topNav: false,
 
   /**
    * 是否显示 tagsView

+ 19 - 1
src/utils/index.js

@@ -387,4 +387,22 @@ export function camelCase(str) {
 export function isNumberStr(str) {
   return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
 }
- 
+/**
+ * 数组根据字段分类
+ * @param {Array} list 
+ * @param {String} propKey 
+ * @returns 
+ */
+export function groupByKey(list,propKey) {
+  const _map = {}
+  for(let i = 0; i < list.length; i++){
+    const item = list[i];
+    const key = item[propKey];
+    if(!_map[key]) {
+      _map[key] = [item];
+    }else {
+      _map[key].push(item)
+    }
+  }
+  return _map
+}

+ 131 - 0
src/views/classification/hooks/useSubmitForm.js

@@ -0,0 +1,131 @@
+import { toolAdd, toolUpdate, addFileByBasisId, updateFileByBasisId } from "@/api/bussiness";
+
+const useSubmitForm = (getList) => {
+  const { proxy } = getCurrentInstance();
+  const open = ref(false);
+  const title = ref("");
+  const formLoading = ref(false)
+  const data = reactive({
+    form: {
+      parentId: undefined,
+      toolName: undefined,
+      describe: undefined,
+      // 手册附件
+      manualFileList: [],
+      // 资料附件
+      resourceFileList: [],
+    },
+    rules: {
+      toolName: [
+        { required: true, message: "分类名称不能为空", trigger: "blur" },
+      ],
+      describe: [
+        { required: true, message: "分类描述不能为空", trigger: "blur" },
+      ],
+    },
+  });
+
+  const { form, rules } = toRefs(data);
+
+  // 表单分类选项改变
+  const handleFormTypeChange = (val) => {
+    if (!val){
+      form.value.manualFileList = [];
+      form.value.resourceFileList = [];
+    }
+  };
+  /** 表单重置 */
+  const reset = () => {
+    form.value = {
+      parentId: undefined,
+      toolName: undefined,
+      describe: undefined,
+      manualFileList: [],
+      resourceFileList: [],
+    };
+    proxy.resetForm("toolTypesRef");
+  };
+
+  // 更新关联的文件
+  const fileUpdate = (basisId,type) => {
+    const manualFileList = form.value.manualFileList.map(item => ({
+      id: item.id,
+      basisId: basisId,
+      fileName: item.name,
+      filePath: item.url,
+      informationType: 'sc'
+    }))
+    const resourceFileList = form.value.resourceFileList.map(item => ({
+      id: item.id,
+      basisId: basisId,
+      fileName: item.name,
+      filePath: item.url,
+      informationType: 'zl'
+    }))
+    if(type === 'update') return updateFileByBasisId(manualFileList.concat(resourceFileList))
+    else return addFileByBasisId(manualFileList.concat(resourceFileList))
+  }
+
+  // 更新工具分类
+  const updateToolType = () => {
+    const baseParams = {
+      ...form.value,
+      parentId: form.value.parentId || "0",
+      level: form.value.parentId ? "2" : "1",
+    }
+    // const allFiles = form.value.manualFileList.concat(form.value.resourceFileList)
+    const promiseApis = [toolUpdate(baseParams),fileUpdate(form.value.id,'update')]
+    Promise.all(promiseApis).then((res) => {
+      proxy.$modal.msgSuccess("修改成功");
+      open.value = false;
+      getList();
+    });
+  }
+
+  // 添加工具分类
+  const addToolType = () => {
+    const params = {
+      ...form.value,
+      parentId: form.value.parentId || "0",
+      level: form.value.parentId ? "2" : "1",
+    };
+    toolAdd(params).then((res) => {
+      fileUpdate(res.data,'add').then(()=>{
+        proxy.$modal.msgSuccess("新增成功");
+        open.value = false;
+        getList();
+      })
+    });
+  }
+
+  /** 提交按钮 */
+  const submitForm = () => {
+    proxy.$refs["toolTypesRef"].validate((valid) => {
+      if (valid) {
+        if (form.value.id != undefined) {
+          updateToolType()
+        } else {
+          addToolType()
+        }
+      }
+    });
+  };
+  /** 取消按钮 */
+  const cancel = () => {
+    open.value = false;
+    reset();
+  };
+  return {
+    title,
+    open,
+    form,
+    rules,
+    formLoading,
+    handleFormTypeChange,
+    reset,
+    submitForm,
+    cancel,
+  };
+};
+
+export default useSubmitForm;

+ 87 - 0
src/views/classification/hooks/useTable.js

@@ -0,0 +1,87 @@
+import { listFileByBasisId, toolDelete } from "@/api/bussiness";
+import { groupByKey } from "@/utils"
+
+const useTable = (getList, updateTypeOneDict, reset, open, title,form,formLoading) => {
+  const { proxy } = getCurrentInstance();
+
+  const toolList = ref([]);
+  const loading = ref(true);
+  const ids = ref([]);
+  const single = ref(true);
+  const multiple = ref(true);
+
+  /** 多选框选中数据 */
+  const handleSelectionChange = (selection) => {
+    ids.value = selection.map((item) => item.postId);
+    single.value = selection.length != 1;
+    multiple.value = !selection.length;
+  };
+
+  /** 新增按钮操作 */
+  const handleAdd = () => {
+    reset();
+    updateTypeOneDict();
+    open.value = true;
+    title.value = "添加分类";
+  };
+
+  /** 修改按钮操作 */
+  const handleUpdate = (row) => {
+    reset();
+    updateTypeOneDict();
+    open.value = true;
+    formLoading.value = true;
+    listFileByBasisId({
+      basisId: row.id,
+      delFlag: '0'
+    }).then(res=>{
+      const allFiles = (res.rows || []).map(item => ({
+        id: item.id,
+        name: item.fileName,
+        url: item.filePath,
+        informationType: item.informationType
+      }))
+      const fileMap = groupByKey(allFiles,'informationType')
+      form.value = {
+        id: row.id,
+        parentId: row.parentId,
+        toolName: row.toolName,
+        describe: row.describe,
+        // 手册附件
+        manualFileList: fileMap['sc'] || [],
+        // 资料附件
+        resourceFileList: fileMap['zl'] || [],
+      };
+      title.value = "修改分类";
+    }).finally(()=>{
+      formLoading.value = false
+    })
+  };
+  /** 删除按钮操作 */
+  const handleDelete = (row) => {
+    const toolIds = row.id || ids.value;
+    proxy.$modal
+      .confirm('是否确认删除该分类?')
+      .then(function () {
+        return toolDelete(toolIds);
+      })
+      .then(() => {
+        getList();
+        proxy.$modal.msgSuccess("删除成功");
+      })
+      .catch(() => {});
+  };
+
+  return {
+    toolList,
+    loading,
+    single,
+    multiple,
+    handleAdd,
+    handleUpdate,
+    handleDelete,
+    handleSelectionChange
+  };
+};
+
+export default useTable;

+ 182 - 4
src/views/classification/index.vue

@@ -1,11 +1,189 @@
 <template>
   <div class="app-container">
-   分类管理
-   <icon-select ref="iconSelectRef"  />
-   
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['system:post:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:post:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:post:remove']"
+          >删除</el-button
+        >
+      </el-col>
+    </el-row>
+    <el-table
+      v-loading="loading"
+      :data="toolList"
+      row-key="id"
+      default-expand-all
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="分类编号" prop="id" />
+      <el-table-column label="分类名称" prop="toolName" />
+      <el-table-column label="描述" prop="describe" />
+      <el-table-column
+        label="操作"
+        width="180"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            icon="Edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:post:edit']"
+            >修改</el-button
+          >
+          <el-button
+            link
+            type="primary"
+            icon="Delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:post:remove']"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 添加或修改岗位对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form
+        ref="toolTypesRef"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+        v-loading="formLoading"
+      >
+        <el-form-item label="分类名称" prop="toolName">
+          <el-input v-model="form.toolName" placeholder="请输入分类名称" />
+        </el-form-item>
+        <el-form-item label="所属分类" prop="parentId">
+          <el-select
+            v-model="form.parentId"
+            placeholder="请选择"
+            clearable
+            style="width: 200px"
+            @change="handleFormTypeChange"
+          >
+            <el-option
+              v-for="dict in levelOneDict"
+              :key="dict.id"
+              :label="dict.label"
+              :value="dict.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="分类描述" prop="describe">
+          <el-input
+            v-model="form.describe"
+            type="textarea"
+            placeholder="请输入内容"
+          />
+        </el-form-item>
+        <el-form-item
+          label="使用手册"
+          prop="manualFileList"
+          v-show="form.parentId"
+        >
+          <FileUpload
+            v-model="form.manualFileList"
+            :fileSize="10"
+            :limit="10"
+          />
+        </el-form-item>
+        <el-form-item
+          label="附件资料"
+          prop="resourceFileList"
+          v-show="form.parentId"
+        >
+          <FileUpload
+            v-model="form.resourceFileList"
+            :fileSize="10"
+            :limit="10"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup name="Classification">
-import IconSelect from "@/components/IconSelect";
+import useSubmitForm from "./hooks/useSubmitForm.js";
+import useTable from "./hooks/useTable.js";
+import { listToolTypes, queryToolDict } from "@/api/bussiness";
+
+/** 查询岗位列表 */
+const getList = (params) => {
+  loading.value = true;
+  listToolTypes({
+    ...params,
+    delFlag: "0",
+  }).then((res) => {
+    toolList.value = res.data;
+    loading.value = false;
+  });
+};
+
+const levelOneDict = ref([]);
+/** 获取一级分类字典 */
+const updateTypeOneDict = () => {
+  queryToolDict("1").then((data) => {
+    levelOneDict.value = data;
+  });
+};
+const {
+  title,
+  open,
+  form,
+  rules,
+  formLoading,
+  handleFormTypeChange,
+  reset,
+  submitForm,
+  cancel,
+} = useSubmitForm(getList);
+const {
+  toolList,
+  loading,
+  single,
+  multiple,
+  handleAdd,
+  handleUpdate,
+  handleDelete,
+  handleSelectionChange,
+} = useTable(getList, updateTypeOneDict, reset, open, title, form, formLoading);
+
+getList();
 </script>

+ 323 - 239
src/views/material/index.vue

@@ -1,156 +1,199 @@
 <template>
   <div class="app-container">
-     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+    <el-form
+      :model="queryParams"
+      ref="queryRef"
+      :inline="true"
+      v-show="showSearch"
+    >
+      <el-form-item label="物料名称" prop="toolName">
+        <el-input
+          v-model="queryParams.toolName"
+          placeholder="请输入物料名称"
+          clearable
+          style="width: 200px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="一级类型" prop="levelOneTypeId">
+        <el-select
+          v-model="queryParams.levelOneTypeId"
+          placeholder="请选择"
+          clearable
+          style="width: 200px"
+          @change="handleChangeLevelOneType"
+        >
+          <el-option
+            v-for="dict in levelOneDict"
+            :key="dict.id"
+            :label="dict.label"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="二级类型" prop="levelTwoTypeId">
+        <el-select
+          v-model="queryParams.levelTwoTypeId"
+          placeholder="请选择"
+          clearable
+          style="width: 200px"
+        >
+          <el-option
+            v-for="dict in levelTwoDict"
+            :key="dict.id"
+            :label="dict.label"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['system:post:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:post:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:post:remove']"
+          >删除</el-button
+        >
+      </el-col>
+      <right-toolbar
+        v-model:showSearch="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+    <el-table
+      v-loading="loading"
+      :data="toolList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="工具编号" align="center" prop="id" />
+      <el-table-column label="工具名称" align="center" prop="toolName" />
+      <el-table-column label="工具规格" align="center" prop="specifications" />
+      <el-table-column label="描述" align="center" prop="describe" />
+      <el-table-column label="数量" align="center" prop="toolNum" />
+      <el-table-column
+        label="操作"
+        width="180"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            icon="Edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:post:edit']"
+            >修改</el-button
+          >
+          <el-button
+            link
+            type="primary"
+            icon="Delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:post:remove']"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="pager.pageNum"
+      v-model:limit="pager.pageSize"
+      @pagination="getList"
+    />
+    <!-- 添加或修改岗位对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="物料名称" prop="postName">
+          <el-input v-model="form.postName" placeholder="请输入岗位名称" />
+        </el-form-item>
         <el-form-item label="岗位编码" prop="postCode">
-           <el-input
-              v-model="queryParams.postCode"
-              placeholder="请输入岗位编码"
-              clearable
-              style="width: 200px"
-              @keyup.enter="handleQuery"
-           />
+          <el-input v-model="form.postCode" placeholder="请输入编码名称" />
         </el-form-item>
-        <el-form-item label="岗位名称" prop="postName">
-           <el-input
-              v-model="queryParams.postName"
-              placeholder="请输入岗位名称"
-              clearable
-              style="width: 200px"
-              @keyup.enter="handleQuery"
-           />
+        <el-form-item label="岗位顺序" prop="postSort">
+          <el-input-number
+            v-model="form.postSort"
+            controls-position="right"
+            :min="0"
+          />
         </el-form-item>
-        <el-form-item label="状态" prop="status">
-           <el-select v-model="queryParams.status" placeholder="岗位状态" clearable style="width: 200px">
-              <el-option
-                 v-for="dict in sys_normal_disable"
-                 :key="dict.value"
-                 :label="dict.label"
-                 :value="dict.value"
-              />
-           </el-select>
+        <el-form-item label="岗位状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in sys_normal_disable"
+              :key="dict.value"
+              :label="dict.value"
+              >{{ dict.label }}</el-radio
+            >
+          </el-radio-group>
         </el-form-item>
-        <el-form-item>
-           <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-           <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+        <el-form-item label="备注" prop="remark">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            placeholder="请输入内容"
+          />
         </el-form-item>
-     </el-form>
-
-     <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
-           <el-button
-              type="primary"
-              plain
-              icon="Plus"
-              @click="handleAdd"
-              v-hasPermi="['system:post:add']"
-           >新增</el-button>
-        </el-col>
-        <el-col :span="1.5">
-           <el-button
-              type="success"
-              plain
-              icon="Edit"
-              :disabled="single"
-              @click="handleUpdate"
-              v-hasPermi="['system:post:edit']"
-           >修改</el-button>
-        </el-col>
-        <el-col :span="1.5">
-           <el-button
-              type="danger"
-              plain
-              icon="Delete"
-              :disabled="multiple"
-              @click="handleDelete"
-              v-hasPermi="['system:post:remove']"
-           >删除</el-button>
-        </el-col>
-        <el-col :span="1.5">
-           <el-button
-              type="warning"
-              plain
-              icon="Download"
-              @click="handleExport"
-              v-hasPermi="['system:post:export']"
-           >导出</el-button>
-        </el-col>
-        <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-     </el-row>
-
-     <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="岗位编号" align="center" prop="postId" />
-        <el-table-column label="岗位编码" align="center" prop="postCode" />
-        <el-table-column label="岗位名称" align="center" prop="postName" />
-        <el-table-column label="岗位排序" align="center" prop="postSort" />
-        <el-table-column label="状态" align="center" prop="status">
-           <template #default="scope">
-              <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
-           </template>
-        </el-table-column>
-        <el-table-column label="创建时间" align="center" prop="createTime" width="180">
-           <template #default="scope">
-              <span>{{ parseTime(scope.row.createTime) }}</span>
-           </template>
-        </el-table-column>
-        <el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
-           <template #default="scope">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">修改</el-button>
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">删除</el-button>
-           </template>
-        </el-table-column>
-     </el-table>
-
-     <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-     />
-
-     <!-- 添加或修改岗位对话框 -->
-     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-        <el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
-           <el-form-item label="岗位名称" prop="postName">
-              <el-input v-model="form.postName" placeholder="请输入岗位名称" />
-           </el-form-item>
-           <el-form-item label="岗位编码" prop="postCode">
-              <el-input v-model="form.postCode" placeholder="请输入编码名称" />
-           </el-form-item>
-           <el-form-item label="岗位顺序" prop="postSort">
-              <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
-           </el-form-item>
-           <el-form-item label="岗位状态" prop="status">
-              <el-radio-group v-model="form.status">
-                 <el-radio
-                    v-for="dict in sys_normal_disable"
-                    :key="dict.value"
-                    :label="dict.value"
-                 >{{ dict.label }}</el-radio>
-              </el-radio-group>
-           </el-form-item>
-           <el-form-item label="备注" prop="remark">
-              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
-           </el-form-item>
-        </el-form>
-        <template #footer>
-           <div class="dialog-footer">
-              <el-button type="primary" @click="submitForm">确 定</el-button>
-              <el-button @click="cancel">取 消</el-button>
-           </div>
-        </template>
-     </el-dialog>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup name="Material">
-import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post";
+import {
+  listPost,
+  addPost,
+  delPost,
+  getPost,
+  updatePost,
+} from "@/api/system/post";
+import { listTools, queryToolDict } from "@/api/bussiness";
 
 const { proxy } = getCurrentInstance();
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
 
-const postList = ref([]);
+const toolList = ref([]);
 const open = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
@@ -159,119 +202,160 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 const title = ref("");
+const levelOneDict = ref([]);
+const levelTwoDict = ref([]);
 
 const data = reactive({
- form: {},
- queryParams: {
-   pageNum: 1,
-   pageSize: 10,
-   postCode: undefined,
-   postName: undefined,
-   status: undefined
- },
- rules: {
-   postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
-   postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }],
-   postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
- }
+  form: {},
+  queryParams: {
+    toolName: "",
+    levelOneTypeId: "",
+    levelTwoTypeId: "",
+  },
+  pager: {
+    pageNum: 1,
+    pageSize: 10,
+  },
+  rules: {
+    // postName: [
+    //   { required: true, message: "岗位名称不能为空", trigger: "blur" },
+    // ],
+    // postCode: [
+    //   { required: true, message: "岗位编码不能为空", trigger: "blur" },
+    // ],
+    // postSort: [
+    //   { required: true, message: "岗位顺序不能为空", trigger: "blur" },
+    // ],
+  },
 });
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams, pager, form, rules } = toRefs(data);
 
 /** 查询岗位列表 */
-function getList() {
- loading.value = true;
- listPost(queryParams.value).then(response => {
-   postList.value = response.rows;
-   total.value = response.total;
-   loading.value = false;
- });
-}
+const getList = (params = {}) => {
+  loading.value = true;
+  listTools({
+    ...params,
+    pageNum: pager.pageNum,
+    pageSize: pager.pageSize,
+    level: "3",
+    delFlag: "0",
+  }).then((res) => {
+    console.log(res);
+    toolList.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+  });
+};
+
+/** 获取一级分类字典 */
+const updateTypeOneDict = () => {
+  queryToolDict("1").then((data) => {
+    levelOneDict.value = data || [];
+  });
+};
+
+const handleChangeLevelOneType = (val) => {
+  queryParams.value.levelTwoTypeId = ""
+  if (val) {
+    queryToolDict("2", val).then((data) => {
+      levelTwoDict.value = data || [];
+    });
+  } else {
+    levelTwoDict.value = [];
+  }
+};
+
 /** 取消按钮 */
-function cancel() {
- open.value = false;
- reset();
-}
+const cancel = () => {
+  open.value = false;
+  reset();
+};
 /** 表单重置 */
-function reset() {
- form.value = {
-   postId: undefined,
-   postCode: undefined,
-   postName: undefined,
-   postSort: 0,
-   status: "0",
-   remark: undefined
- };
- proxy.resetForm("postRef");
-}
+const reset = () => {
+  form.value = {
+    postId: undefined,
+    postCode: undefined,
+    postName: undefined,
+    postSort: 0,
+    status: "0",
+    remark: undefined,
+  };
+  proxy.resetForm("postRef");
+};
+
 /** 搜索按钮操作 */
-function handleQuery() {
- queryParams.value.pageNum = 1;
- getList();
-}
+const handleQuery = () => {
+  const params = {
+    toolName: queryParams.value.toolName || "",
+    parentId:
+      queryParams.value.levelTwoTypeId ||
+      queryParams.value.levelOneTypeId ||
+      undefined,
+  };
+  getList(params);
+};
 /** 重置按钮操作 */
-function resetQuery() {
- proxy.resetForm("queryRef");
- handleQuery();
-}
+const resetQuery = () => {
+  proxy.resetForm("queryRef");
+  handleQuery();
+};
 /** 多选框选中数据 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.postId);
- single.value = selection.length != 1;
- multiple.value = !selection.length;
-}
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.postId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
 /** 新增按钮操作 */
-function handleAdd() {
- reset();
- open.value = true;
- title.value = "添加岗位";
-}
+const handleAdd = () => {
+  reset();
+  open.value = true;
+  title.value = "添加岗位";
+};
 /** 修改按钮操作 */
-function handleUpdate(row) {
- reset();
- const postId = row.postId || ids.value;
- getPost(postId).then(response => {
-   form.value = response.data;
-   open.value = true;
-   title.value = "修改岗位";
- });
-}
+const handleUpdate = (row) => {
+  reset();
+  const postId = row.postId || ids.value;
+  getPost(postId).then((response) => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改岗位";
+  });
+};
 /** 提交按钮 */
-function submitForm() {
- proxy.$refs["postRef"].validate(valid => {
-   if (valid) {
-     if (form.value.postId != undefined) {
-       updatePost(form.value).then(response => {
-         proxy.$modal.msgSuccess("修改成功");
-         open.value = false;
-         getList();
-       });
-     } else {
-       addPost(form.value).then(response => {
-         proxy.$modal.msgSuccess("新增成功");
-         open.value = false;
-         getList();
-       });
-     }
-   }
- });
-}
+const submitForm = () => {
+  proxy.$refs["postRef"].validate((valid) => {
+    if (valid) {
+      if (form.value.postId != undefined) {
+        updatePost(form.value).then((response) => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList(queryParams.value);
+        });
+      } else {
+        addPost(form.value).then((response) => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList(queryParams.value);
+        });
+      }
+    }
+  });
+};
 /** 删除按钮操作 */
-function handleDelete(row) {
- const postIds = row.postId || ids.value;
- proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() {
-   return delPost(postIds);
- }).then(() => {
-   getList();
-   proxy.$modal.msgSuccess("删除成功");
- }).catch(() => {});
-}
-/** 导出按钮操作 */
-function handleExport() {
- proxy.download("system/post/export", {
-   ...queryParams.value
- }, `post_${new Date().getTime()}.xlsx`);
-}
-
-getList();
+const handleDelete = (row) => {
+  const postIds = row.postId || ids.value;
+  proxy.$modal
+    .confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?')
+    .then(function () {
+      return delPost(postIds);
+    })
+    .then(() => {
+      getList(queryParams.value);
+      proxy.$modal.msgSuccess("删除成功");
+    })
+    .catch(() => {});
+};
+updateTypeOneDict();
+getList(queryParams.value);
 </script>

+ 2 - 2
vite.config.js

@@ -31,8 +31,8 @@ export default defineConfig(({ mode, command }) => {
       proxy: {
         // https://cn.vitejs.dev/config/#server-proxy
         '/dev-api': {
-          // target: 'http://localhost:8080',
-          target: 'https://vue.ruoyi.vip/prod-api',
+          target: 'http://172.16.10.65:8080',
+          // target: 'https://vue.ruoyi.vip/prod-api',
           changeOrigin: true,
           rewrite: (p) => p.replace(/^\/dev-api/, '')
         }