index.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true">
  4. <el-form-item label="科室名称" prop="deptName">
  5. <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable @keyup.enter.native="handleQuery" class="se" />
  6. </el-form-item>
  7. <el-form-item label="科室状态" prop="status">
  8. <el-select v-model="queryParams.status" placeholder="科室状态" clearable class="se">
  9. <el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item>
  13. <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
  14. <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
  15. <el-button type="info" icon="el-icon-sort" @click="toggleExpandAll">展开/折叠</el-button>
  16. </el-form-item>
  17. </el-form>
  18. <el-table v-if="refreshTable" :data="deptList" row-key="deptId" :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
  19. <el-table-column prop="deptName" label="科室名称"/>
  20. <el-table-column prop="orderNum" label="科室排序" align="center" width="200"/>
  21. <el-table-column prop="status" label="科室状态" align="center" width="100">
  22. <template slot-scope="scope">
  23. <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status" />
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="操作" align="center" width="220">
  27. <template slot-scope="scope">
  28. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">修改</el-button>
  29. <el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']" v-if="scope.row.ancestors.length < 3">新增</el-button>
  30. <el-button v-if="scope.row.parentId != 0" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">删除</el-button>
  31. </template>
  32. </el-table-column>
  33. <template slot="empty">
  34. <el-empty></el-empty>
  35. </template>
  36. </el-table>
  37. <!-- 添加或修改部门对话框 -->
  38. <el-dialog :title="title" :visible.sync="open" v-if="open" :close-on-click-modal="false" width="60%" append-to-body>
  39. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  40. <el-form-item label="上级科室" prop="parentId" v-if="form.parentId !== 0">
  41. <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级科室" />
  42. </el-form-item>
  43. <el-form-item label="科室名称" prop="deptName"><el-input v-model="form.deptName" placeholder="请输入科室名称" /></el-form-item>
  44. <el-form-item label="科室介绍" prop="brief" v-if="open && form.parentId != 0 && form.ancestors.length == 3">
  45. <editor v-model="form.brief" placeholder="请输入"></editor>
  46. </el-form-item>
  47. <el-form-item label="显示排序" prop="orderNum"><el-input-number v-model="form.orderNum" controls-position="right" :min="0" /></el-form-item>
  48. <el-form-item label="科室状态">
  49. <el-radio-group v-model="form.status">
  50. <el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
  51. </el-radio-group>
  52. </el-form-item>
  53. </el-form>
  54. <div slot="footer" class="dialog-footer">
  55. <el-button type="primary" @click="submitForm">确 定</el-button>
  56. <el-button @click="cancel">取 消</el-button>
  57. </div>
  58. </el-dialog>
  59. </div>
  60. </template>
  61. <script>
  62. import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from '@/api/system/dept';
  63. import Treeselect from '@riophae/vue-treeselect';
  64. import '@riophae/vue-treeselect/dist/vue-treeselect.css';
  65. import edit from './edit';
  66. export default {
  67. name: 'Dept',
  68. dicts: ['sys_normal_disable'],
  69. components: { Treeselect },
  70. data() {
  71. return {
  72. // 显示搜索条件
  73. showSearch: true,
  74. // 表格树数据
  75. deptList: [],
  76. // 部门树选项
  77. deptOptions: [],
  78. // 弹出层标题
  79. title: '',
  80. // 是否显示弹出层
  81. open: false,
  82. // 是否展开,默认全部展开
  83. isExpandAll: true,
  84. // 重新渲染表格状态
  85. refreshTable: true,
  86. // 查询参数
  87. queryParams: {
  88. deptName: undefined,
  89. status: undefined
  90. },
  91. // 表单参数
  92. form: {},
  93. // 表单校验
  94. rules: {
  95. parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
  96. deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
  97. brief: [{ required: true, message: '科室介绍不能为空', trigger: 'blur' }],
  98. orderNum: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }]
  99. }
  100. };
  101. },
  102. created() {
  103. this.getList();
  104. },
  105. methods: {
  106. /** 查询部门列表 */
  107. getList() {
  108. listDept(this.queryParams).then((response) => {
  109. response.data.forEach((item) => {
  110. if (item.ancestors) {
  111. item.ancestors = item.ancestors.split(',');
  112. } else {
  113. item.ancestors = [];
  114. }
  115. });
  116. this.deptList = this.handleTree(response.data, 'deptId');
  117. });
  118. },
  119. /** 转换部门数据结构 */
  120. normalizer(node) {
  121. if (node.children && !node.children.length) {
  122. delete node.children;
  123. }
  124. return {
  125. id: node.deptId,
  126. label: node.deptName,
  127. children: node.children
  128. };
  129. },
  130. // 取消按钮
  131. cancel() {
  132. this.open = false;
  133. this.reset();
  134. },
  135. // 表单重置
  136. reset() {
  137. this.form = {
  138. deptId: undefined,
  139. parentId: undefined,
  140. deptName: undefined,
  141. orderNum: undefined,
  142. leader: undefined,
  143. phone: undefined,
  144. email: undefined,
  145. status: '0'
  146. };
  147. this.resetForm('form');
  148. },
  149. /** 搜索按钮操作 */
  150. handleQuery() {
  151. this.getList();
  152. },
  153. /** 重置按钮操作 */
  154. resetQuery() {
  155. this.resetForm('queryForm');
  156. this.handleQuery();
  157. },
  158. /** 新增按钮操作 */
  159. handleAdd(row) {
  160. this.iframe({ obj: edit, param: { parentId: row.deptId, ancestors: row.ancestors }, title: '新增科室', width: '55%', height: '75%' });
  161. },
  162. /** 展开/折叠操作 */
  163. toggleExpandAll() {
  164. this.refreshTable = false;
  165. this.isExpandAll = !this.isExpandAll;
  166. this.$nextTick(() => {
  167. this.refreshTable = true;
  168. });
  169. },
  170. /** 修改按钮操作 */
  171. handleUpdate(row) {
  172. this.iframe({ obj: edit, param: { id: row.deptId }, title: '编辑科室', width: '55%', height: '75%' });
  173. /* this.reset();
  174. this.open = true;
  175. this.title = '修改科室';
  176. getDept(row.deptId).then((response) => {
  177. this.form = response.data;
  178. this.form.ancestors = this.form.ancestors.split(',') || [];
  179. listDeptExcludeChild(row.deptId).then((response) => {
  180. this.deptOptions = this.handleTree(response.data, 'deptId');
  181. if (this.deptOptions.length == 0) {
  182. const noResultsOptions = { deptId: this.form.parentId, deptName: this.form.parentName, children: [] };
  183. this.deptOptions.push(noResultsOptions);
  184. }
  185. });
  186. }); */
  187. },
  188. /** 提交按钮 */
  189. submitForm: function () {
  190. this.$refs['form'].validate((valid) => {
  191. if (valid) {
  192. if (this.form.deptId != undefined) {
  193. let data = JSON.parse(JSON.stringify(this.form));
  194. data.ancestors = data.ancestors.toString();
  195. updateDept(data).then((response) => {
  196. this.$modal.msgSuccess('修改成功');
  197. this.open = false;
  198. this.getList();
  199. });
  200. } else {
  201. addDept(this.form).then((response) => {
  202. this.$modal.msgSuccess('新增成功');
  203. this.open = false;
  204. this.getList();
  205. });
  206. }
  207. }
  208. });
  209. },
  210. /** 删除按钮操作 */
  211. handleDelete(row) {
  212. this.$modal
  213. .confirm('是否确认删除名称为"' + row.deptName + '"的数据项?')
  214. .then(function () {
  215. return delDept(row.deptId);
  216. })
  217. .then(() => {
  218. this.getList();
  219. this.$modal.msgSuccess('删除成功');
  220. })
  221. .catch(() => {});
  222. }
  223. }
  224. };
  225. </script>