Browse Source

资产列表

ysc 1 year ago
parent
commit
44a8150aff

+ 52 - 0
src/api/material/asset.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+//获取部门资产编号
+export function getDeptAssetNumber() {
+  return request({
+    url: '/material/asset/deptAssetNumber',
+    method: 'get'
+  })
+}
+
+// 资产入库
+export function addAsset(data) {
+  return request({
+    url: '/material/asset',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询资产列表
+export function listAsset(data) {
+  return request({
+    url: '/material/asset/list',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询资产详情
+export function getAsset(assetId) {
+  return request({
+    url: '/material/asset/' + assetId,
+    method: 'get'
+  })
+}
+
+// 修改资产
+export function updateAsset(data) {
+  return request({
+    url: '/material/asset',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除分类
+export function delAsset(assetId) {
+  return request({
+    url: '/material/asset/' + assetId,
+    method: 'delete'
+  })
+}

+ 61 - 0
src/api/material/category.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询分类树结构数据
+export function categoryTree() {
+  return request({
+    url: '/material/category/tree',
+    method: 'get'
+  })
+}
+
+// 查询分类详细
+export function getCategory(CategoryId) {
+  return request({
+    url: '/material/category/' + CategoryId,
+    method: 'get'
+  })
+}
+
+// 新增分类
+export function addCategory(data) {
+  return request({
+    url: '/material/category',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改分类
+export function updateCategory(data) {
+  return request({
+    url: '/material/category',
+    method: 'put',
+    data: data
+  })
+}
+
+
+// 删除分类
+export function delCategory(CategoryId) {
+  return request({
+    url: '/material/category/' + CategoryId,
+    method: 'delete'
+  })
+}
+
+// 查询分类列表(无条件)
+export function listCategory() {
+  return request({
+    url: '/material/category/list',
+    method: 'get'
+  })
+}
+
+// 查询分类列表(排除节点)
+export function listCategoryExcludeChild(categoryId) {
+  return request({
+    url: '/material/category/list/exclude/' + categoryId,
+    method: 'get'
+  })
+}
+

+ 531 - 0
src/views/material/asset.vue

@@ -0,0 +1,531 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <el-col :span="5" :xs="24">
+        <category @selectCategory="selectCategory"></category>
+      </el-col>
+      <el-col :span="19" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true">
+          <el-form-item label="物品名称" prop="assetName">
+            <el-input v-model="queryParams.assetName"></el-input>
+          </el-form-item>
+          <el-form-item label="资产编号" prop="assetNumber">
+            <el-input v-model="queryParams.assetName"></el-input>
+          </el-form-item>
+          <el-form-item label="资产类型" prop="assetType">
+            <el-select
+              v-model="queryParams.assetType"
+              placeholder="资产类型"
+              style="width: 200px">
+              <el-option label="固定资产" value="0"/>
+              <el-option label="耗材" value="1"/>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="资产状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="资产状态"
+              style="width: 200px">
+              <el-option label="在库" value="0"/>
+              <el-option label="出库" value="1"/>
+              <el-option label="报失" value="1"/>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" style="margin-bottom:8px">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['material:asset:add']"
+            >新增入库
+            </el-button>
+          </el-col>
+        </el-row>
+
+        <el-table :data="assetList"
+                  @row-click="rowClick"
+                  size="mini">
+          <el-table-column label="资产编号" prop="assetNumber"/>
+          <el-table-column label="物品名称" prop="assetName" min-width="100" :show-overflow-tooltip="true"/>
+          <el-table-column label="部门编号" prop="deptAssetNumber"/>
+          <el-table-column label="资产类型" width="80">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.assetType===1" size="mini" type="warning">耗材</el-tag>
+              <el-tag v-else size="mini" type="success">固定资产</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="设备型号" prop="equipmentType"/>
+          <el-table-column label="设备编号" prop="equipmentNumber"/>
+          <el-table-column label="原厂编号" prop="factoryNumber"/>
+          <el-table-column label="生产厂家" prop="factoryName"/>
+          <el-table-column label="购入日期" prop="buyDate"/>
+          <el-table-column label="状态" width="80">
+            <template slot-scope="scope">
+              <!--              <el-tag size="mini" :type="statusMap[scope.row.status].type">{{-->
+              <!--                  statusMap[scope.row.status].name-->
+              <!--                }}-->
+              <!--              </el-tag>-->
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="160">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleTransfer(scope.row)"
+                v-hasPermi="['material:asset:query']"
+              >流转
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['material:asset:edit']"
+              >修改
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['material:asset:delete']"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <div style="margin-top: 10px;text-align: center">
+          <el-pagination
+            background
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :current-page="queryParams.pageNum"
+            :page-sizes="[10, 20, 50]"
+            :page-size="queryParams.pageSize"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="total">
+          </el-pagination>
+        </div>
+      </el-col>
+    </el-row>
+
+    <!-- 添加或修改对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body :close-on-click-modal="false">
+      <el-row :gutter="20">
+        <el-col :span="10">
+          <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px">
+            <el-form-item label="所属分类" prop="categoryId">
+              <el-cascader
+                v-model="form.categoryId"
+                :options="categoryOptions"
+                :props="{ expandTrigger: 'hover',value:'id',label:'name',checkStrictly: true }"
+                clearable></el-cascader>
+            </el-form-item>
+            <el-form-item label="物品名称" prop="assetName">
+              <el-input v-model="form.assetName" placeholder="请输入资产名称" maxlength="30"/>
+            </el-form-item>
+            <el-form-item label="资产编号" prop="assetNumber">
+              <el-input v-model="form.assetNumber" placeholder="请输入资产编号" maxlength="30"/>
+            </el-form-item>
+            <el-form-item label="部门编号" prop="deptAssetNumber">
+              <el-input v-model="form.deptAssetNumber" placeholder="请输入资产编号" disabled/>
+            </el-form-item>
+            <el-form-item label="资产类型" prop="assetType">
+              <el-radio-group v-model="form.assetType">
+                <el-radio label="0">固定资产</el-radio>
+                <el-radio label="1">耗材</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="设备设施名称" prop="equipmentName">
+              <el-input v-model="form.equipmentName" placeholder="请输入设备设施名称" maxlength="30"/>
+            </el-form-item>
+            <el-form-item label="设备型号" prop="equipmentType">
+              <el-input v-model="form.equipmentType" placeholder="请输入设备型号" maxlength="30"/>
+            </el-form-item>
+            <el-form-item label="设备编号" prop="equipmentNumber">
+              <el-input v-model="form.equipmentNumber" placeholder="请输入设备编号" maxlength="30"/>
+            </el-form-item>
+            <el-form-item label="原厂编号" prop="factoryNumber">
+              <el-input v-model="form.factoryNumber" placeholder="请输入原厂编号"></el-input>
+            </el-form-item>
+            <el-form-item label="生产厂家" prop="factoryName">
+              <el-input v-model="form.factoryName" placeholder="请输入生产厂家"></el-input>
+            </el-form-item>
+            <el-form-item label="入库来源" prop="source">
+              <el-radio-group v-model="form.source">
+                <el-radio label="1">采购</el-radio>
+                <el-radio label="2">租赁</el-radio>
+                <el-radio label="3">借用</el-radio>
+                <el-radio label="4">赠送</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="购入日期" prop="buyDate">
+              <el-date-picker
+                v-model="form.buyDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+                style="width: 205px">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="定位位置" prop="location">
+              <el-input v-model="form.location" placeholder="请输入定位位置"></el-input>
+            </el-form-item>
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea"></el-input>
+            </el-form-item>
+          </el-form>
+        </el-col>
+        <el-col :span="14">
+          <div class="accessory-header">
+            <div class="a-h-title">
+              配件信息
+            </div>
+            <el-button type="primary"
+                       plain
+                       icon="el-icon-plus"
+                       size="mini"
+                       @click="accessoryAdd"
+            >添加配件
+            </el-button>
+          </div>
+
+          <el-table :data="accessoryList" size="mini">
+            <el-table-column label="配件名称">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.accessoryName" size="mini"></el-input>
+              </template>
+            </el-table-column>
+            <el-table-column label="配件编号">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.accessoryNumber" size="mini" disabled></el-input>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="80">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="accessoryDelete(scope.row)">删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="dialog-btn">
+            <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
+            <el-button size="mini" @click="cancel">取 消</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </el-dialog>
+
+    <el-dialog title="物品流转" :visible.sync="transferOpen" width="800px" append-to-body :close-on-click-modal="false">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form ref="form" :model="transferForm" :rules="transferRules" size="mini" label-width="100px">
+            <el-form-item label="物品名称" prop="assetName">
+              <div>{{ transferForm.assetName }}</div>
+            </el-form-item>
+            <el-form-item label="资产编号" prop="assetNumber">
+              <div>{{ transferForm.assetNumber }}</div>
+            </el-form-item>
+            <el-form-item label="部门编号" prop="deptAssetNumber">
+              <div>{{ transferForm.deptAssetNumber }}</div>
+            </el-form-item>
+            <el-form-item label="设备型号" prop="equipmentType">
+              <div>{{ transferForm.equipmentType }}</div>
+            </el-form-item>
+            <el-form-item label="物品说明" prop="remark">
+              <div>{{ transferForm.remark }}</div>
+            </el-form-item>
+
+            <el-form-item label="选择配件" prop="source">
+              <el-select v-model="transferForm.projectId" multiple>
+                <el-option v-for="(item,index) in accessoryList" :label="item.accessoryName" :key="index"
+                           :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="接收人" prop="receiveUserId">
+              <el-cascader
+                v-model="transferForm.receiveUserId"
+                :options="userList"
+                @change="(val)=>selectExecutor(val,'form')"
+                :props="{ expandTrigger: 'hover',value:'id',label:'name' }"
+                :show-all-levels="false"></el-cascader>
+            </el-form-item>
+            <el-form-item label="流转类型" prop="location">
+
+            </el-form-item>
+            <el-form-item label="流转备注" prop="remark">
+              <el-input v-model="transferForm.transferRemark" type="textarea"></el-input>
+            </el-form-item>
+          </el-form>
+        </el-col>
+        <el-col :span="12">
+          <div style="font-size: 18px;margin-top: -15px">
+            流转记录
+          </div>
+          <div style="height: 300px;">
+            <el-timeline>
+              <el-timeline-item
+                v-for="(transfer, index) in assetTransferList"
+                :key="index"
+                :timestamp="transfer.transferDate">
+                <div>
+                  {{ transfer.content }}
+                </div>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </el-col>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
+        <el-button size="mini" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script>
+import Category from "@/views/material/components/category";
+import DeptUserTree from "@/components/DeptUserTree"
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import {getDeptAssetNumber, addAsset, listAsset, getAsset, updateAsset, delAsset} from "@/api/material/asset";
+import {categoryTree} from "@/api/material/category";
+import {getDeptUserTree} from "@/api/system/user";
+
+
+export default {
+  name: "asset",
+  components: {Category, DeptUserTree, Treeselect},
+  data() {
+    return {
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      total: 0,
+      assetList: [],
+      form: {},
+      accessoryList: [],
+      title: '',
+      open: false,
+      categoryOptions: [],
+      rules: {
+        categoryId: [
+          {required: true, message: "所属分类不能为空", trigger: "change"}
+        ],
+        assetName: [
+          {required: true, message: "物品名称不能为空", trigger: "blur"}
+        ],
+        assetType: [
+          {required: true, message: "资产类型不能为空", trigger: "change"}
+        ],
+        location: [
+          {required: true, message: "定位位置不能为空", trigger: "blur"}
+        ]
+      },
+
+      transferOpen: false,
+      transferForm: {},
+      userList: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    selectCategory(data) {
+      this.queryParams.categoryId = data;
+      this.handleQuery();
+    },
+    getList() {
+      listAsset(this.queryParams).then(res => {
+        this.assetList = res.data.records;
+        this.total = res.data.total;
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    handleSizeChange(val) {
+      this.queryParams.pageSize = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.queryParams.pageNum = val;
+      this.getList();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        categoryId: undefined,
+        assetName: undefined,
+        assetNumber: undefined,
+        deptAssetNumber: undefined,
+        assetType: undefined,
+        equipmentName: undefined,
+        equipmentType: undefined,
+        equipmentNumber: undefined,
+        factoryNumber: undefined,
+        factoryName: undefined,
+        source: undefined,
+        buyDate: undefined,
+        location: undefined,
+        remark: undefined
+      };
+      this.accessoryList = []
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.handleQuery();
+    },
+
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.getCategoryTree()
+      getDeptAssetNumber().then(res => {
+        this.form.deptAssetNumber = res.data
+        this.open = true;
+        this.title = "新增入库";
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.getCategoryTree()
+      const id = row.id;
+      getAsset(id).then(res => {
+        this.form = res.data
+        this.accessoryList = res.data.accessoryList || []
+        console.log(this.form);
+        this.open = true;
+        this.title = "修改资产";
+      })
+    },
+    getCategoryTree() {
+      categoryTree().then(response => {
+        this.categoryOptions = response.data;
+      });
+    },
+    rowClick() {
+    },
+
+    accessoryAdd() {
+      let index = this.accessoryList.length + 1
+      this.accessoryList.push(
+        {accessoryName: '', accessoryNumber: this.form.deptAssetNumber + '-' + index}
+      )
+    },
+    accessoryDelete(row) {
+      this.accessoryList = this.accessoryList.filter(item => item.accessoryNumber != row.accessoryNumber)
+      this.accessoryList.forEach((item, index) => {
+        item.accessoryNumber = this.form.deptAssetNumber + '-' + (index + 1)
+      })
+    },
+
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.form['accessoryList'] = this.accessoryList
+          if (this.form.id != undefined) {
+            updateAsset(this.form).then(response => {
+              this.$message.success("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            this.form.categoryId = this.form.categoryId[this.form.categoryId.length - 1]
+            addAsset(this.form).then(response => {
+              this.$message.success("入库成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      this.$confirm('是否确认删除"' + row.assetName + '"?').then(function () {
+        return delAsset(row.id);
+      }).then(() => {
+        this.getList();
+        this.$message.success("删除成功");
+      }).catch(() => {
+      });
+    },
+
+    /**  流转按钮操作 */
+    handleTransfer(row) {
+      getDeptUserTree('').then(res => {
+        this.userList = res.data
+      })
+      getAsset(row.id).then(res => {
+        this.transferForm = res.data
+        this.accessoryList = res.data.accessoryList
+        this.transferOpen = true
+      })
+    }
+
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+  margin-bottom: 10px;
+}
+
+::v-deep.el-dialog__body {
+  padding: 10px 20px 30px 20px;
+}
+
+.accessory-header {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10px;
+
+  .a-h-title {
+    font-size: 18px;
+    margin-top: 7px;
+  }
+}
+
+.dialog-btn {
+  position: absolute;
+  bottom: 0px;
+  right: 20px;
+}
+</style>

+ 249 - 0
src/views/material/components/category.vue

@@ -0,0 +1,249 @@
+<template>
+  <div>
+    <div class="head-container">
+      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd"
+                 v-hasPermi="['material:category:add']">新增分类
+      </el-button>
+
+      <el-input
+        v-model="categoryName"
+        placeholder="请输入分类名称"
+        clearable
+        size="mini"
+        prefix-icon="el-icon-search"
+        style="margin-left: 20px"/>
+    </div>
+    <div class="head-container">
+      <el-tree
+        :data="categoryData"
+        :props="defaultProps"
+        :expand-on-click-node="false"
+        :filter-node-method="filterNode"
+        ref="categoryTree"
+        node-key="id"
+        default-expand-all
+        highlight-current
+        @node-click="handleNodeClick">
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+              <span>{{ node.label }}</span>
+              <el-popover
+                placement="right"
+                trigger="hover">
+                <el-button size="mini" type="primary" @click="handleAdd(data)"
+                           v-hasPermi="['material:category:add']">新增</el-button>
+                <el-button size="mini" @click="handleUpdate(data)"
+                           v-hasPermi="['material:category:edit']">修改</el-button>
+                <el-button size="mini" type="danger" @click="handleDelete(data)"
+                           v-hasPermi="['material:category:delete']">删除</el-button>
+                <i class="el-icon-share" slot="reference"></i>
+               </el-popover>
+            </span>
+      </el-tree>
+    </div>
+
+    <!-- 添加或修改分类对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="80px">
+        <el-row>
+          <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="上级分类" prop="parentId">
+              <treeselect v-model="form.parentId" :options="categoryOptions" :normalizer="normalizer"
+                          placeholder="选择上级分类"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="分类名称" prop="categoryName">
+              <el-input v-model="form.categoryName" placeholder="请输入分类名称"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
+        <el-button size="mini" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listCategory,
+  getCategory,
+  delCategory,
+  addCategory,
+  updateCategory,
+  categoryTree,
+  listCategoryExcludeChild
+} from "@/api/material/category";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "category",
+  components: {Treeselect},
+
+  data() {
+    return {
+      categoryName: '',
+      categoryData: [],
+      // 分类树选项
+      categoryOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      defaultProps: {
+        children: "children",
+        label: "name"
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        categoryName: [
+          {required: true, message: "分类名称不能为空", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  watch: {
+    categoryName(val) {
+      this.$refs.categoryTree.filter(val);
+    }
+  },
+  created() {
+    this.getCategoryTree();
+  },
+  methods: {
+    /** 查询分类树结构 */
+    getCategoryTree() {
+      categoryTree().then(response => {
+        this.categoryData = response.data;
+      });
+    },
+    /** 筛选节点 */
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+    /** 节点单击事件 */
+    handleNodeClick(data) {
+      this.$emit('selectcategory', data.id)
+    },
+
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        parentId: undefined,
+        categoryName: undefined,
+        orderNum: undefined,
+        leader: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "0"
+      };
+      this.resetForm("form");
+    },
+
+    /** 转换分类数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.categoryName,
+        children: node.children
+      };
+    },
+
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row != undefined) {
+        this.form.parentId = row.id;
+      }
+      this.open = true;
+      this.title = "添加分类";
+      listCategory().then(response => {
+        this.categoryOptions = this.handleTree(response.data, "id");
+      });
+    },
+
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      getCategory(row.id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改分类";
+        listCategoryExcludeChild(row.id).then(response => {
+          this.categoryOptions = this.handleTree(response.data, "id");
+          if (this.categoryOptions.length == 0) {
+            const noResultsOptions = {id: this.form.parentId, categoryName: this.form.parentName, children: []};
+            this.categoryOptions.push(noResultsOptions);
+          }
+        });
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateCategory(this.form).then(response => {
+              this.open = false;
+              this.getCategoryTree();
+            });
+          } else {
+            addCategory(this.form).then(response => {
+              this.open = false;
+              this.getCategoryTree();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      console.log(row);
+      this.$confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function () {
+        return delCategory(row.id);
+      }).then(() => {
+        this.getCategoryTree();
+      }).catch(() => {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+  margin-bottom: 10px;
+}
+
+.head-container {
+  display: flex;
+  margin-bottom: 20px;
+  justify-content: space-between;
+}
+
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  padding-right: 8px;
+}
+
+</style>
+

+ 7 - 4
src/views/system/components/dept.vue

@@ -1,7 +1,9 @@
 <template>
   <div>
     <div class="head-container">
-      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd">新增部门</el-button>
+      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd"
+                 v-hasPermi="['system:dept:add']">新增部门
+      </el-button>
 
       <el-input
         v-model="deptName"
@@ -27,9 +29,10 @@
               <el-popover
                 placement="right"
                 trigger="hover">
-                <el-button size="mini" type="primary" @click="handleAdd(data)">新增</el-button>
-                <el-button size="mini" @click="handleUpdate(data)">修改</el-button>
-                <el-button size="mini" type="danger">删除</el-button>
+                <el-button size="mini" type="primary" @click="handleAdd(data)"
+                           v-hasPermi="['system:dept:add']">新增</el-button>
+                <el-button size="mini" @click="handleUpdate(data)" v-hasPermi="['system:dept:edit']">修改</el-button>
+                <el-button size="mini" type="danger" v-hasPermi="['system:dept:delete']">删除</el-button>
                 <i class="el-icon-share" slot="reference"></i>
                </el-popover>
             </span>

+ 2 - 2
src/views/system/permission.vue

@@ -267,13 +267,13 @@ export default {
             updateRole(this.form).then(response => {
               this.$message.success("修改成功");
               this.open = false;
-              this.getList();
+              this.getRoleList();
             });
           } else {
             addRole(this.form).then(response => {
               this.$message.success("新增成功");
               this.open = false;
-              this.getList();
+              this.getRoleList();
             });
           }
         }

+ 9 - 5
src/views/task/components/project.vue

@@ -1,7 +1,9 @@
 <template>
   <div>
     <div class="head-container">
-      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd">新增结构</el-button>
+      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd"
+                 v-hasPermi="['task:project:add']">新增结构
+      </el-button>
 
       <el-input
         v-model="projectName"
@@ -27,9 +29,11 @@
               <el-popover
                 placement="right"
                 trigger="hover">
-                <el-button size="mini" type="primary" @click="handleAdd(data)">新增</el-button>
-                <el-button size="mini" @click="handleUpdate(data)">修改</el-button>
-                <el-button size="mini" type="danger">删除</el-button>
+                <el-button size="mini" type="primary" @click="handleAdd(data)"
+                           v-hasPermi="['task:project:add']">新增</el-button>
+                <el-button size="mini" @click="handleUpdate(data)" v-hasPermi="['task:project:edit']">修改</el-button>
+                <el-button size="mini" type="danger" @click="handleDelete(data)"
+                           v-hasPermi="['task:project:delete']">删除</el-button>
                 <i class="el-icon-share" slot="reference"></i>
                </el-popover>
             </span>
@@ -228,7 +232,7 @@ export default {
 
     /** 删除按钮操作 */
     handleDelete(row) {
-      this.$confirm('是否确认删除项目编号为"' + row.id + '"的数据项?').then(() => {
+      this.$confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(() => {
         return delProject(row.id);
       }).then(() => {
         this.getProjectTree();