treeList.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. <template>
  2. <div class="app-container">
  3. <span><i class="el-icon-share"></i> 家族树 - {{ familyName }}</span>
  4. <el-divider></el-divider>
  5. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  6. <el-form-item label="模糊条件" prop="searchValue">
  7. <el-input
  8. v-model="queryParams.searchValue"
  9. placeholder="请输入姓名/手机号"
  10. clearable
  11. size="small"
  12. @keyup.enter.native="handleQuery"
  13. />
  14. </el-form-item>
  15. <el-form-item label="性别" prop="gender">
  16. <el-select v-model="queryParams.gender" placeholder="请选择">
  17. <el-option v-for="dict in genderOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" @keyup.enter.native="handleQuery"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item>
  21. <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  22. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  23. </el-form-item>
  24. </el-form>
  25. <el-row :gutter="10" class="mb8">
  26. <el-col :span="1.5">
  27. <el-button
  28. type="primary"
  29. icon="el-icon-plus"
  30. size="mini"
  31. :disabled="singleAdd"
  32. @click="handleAdd"
  33. v-hasPermi="['system:member:add']"
  34. >添加</el-button>
  35. </el-col>
  36. <el-col :span="1.5">
  37. <el-button
  38. type="success"
  39. icon="el-icon-edit"
  40. size="mini"
  41. :disabled="single"
  42. @click="handleUpdate"
  43. v-hasPermi="['system:member:edit']"
  44. >修改</el-button>
  45. </el-col>
  46. <el-col :span="1.5">
  47. <el-button
  48. type="danger"
  49. icon="el-icon-delete"
  50. size="mini"
  51. :disabled="multiple"
  52. @click="handleDelete"
  53. v-hasPermi="['system:member:remove']"
  54. >删除</el-button>
  55. </el-col>
  56. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  57. </el-row>
  58. <el-table v-loading="loading" :data="memberList" @selection-change="handleSelectionChange">
  59. <el-table-column type="selection" width="55" align="center" />
  60. <el-table-column label="主键ID" align="center" prop="memberId" v-if="false"/>
  61. <el-table-column label="ID" align="center" prop="qrcode" width="150" />
  62. <el-table-column label="姓名" align="center" prop="name" width="100" />
  63. <el-table-column label="性别" align="center" prop="gender" :formatter="genderFormat" width="50" />
  64. <el-table-column label="父辈" align="center" prop="father" width="100" />
  65. <el-table-column label="代数" align="center" prop="generation" width="100" >
  66. <template slot-scope="scope">
  67. <span>第{{ scope.row.generation }}代</span>
  68. </template>
  69. </el-table-column>
  70. <el-table-column label="手机号" align="center" prop="mobile" width="200" />
  71. <el-table-column label="配偶" align="center" prop="spouse" width="100" />
  72. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  73. <template slot-scope="scope">
  74. <el-button
  75. size="mini"
  76. type="text"
  77. icon="el-icon-edit"
  78. @click="handleUpdate(scope.row)"
  79. v-hasPermi="['system:member:edit']"
  80. >修改</el-button>
  81. <el-button
  82. size="mini"
  83. type="text"
  84. icon="el-icon-delete"
  85. @click="handleDelete(scope.row)"
  86. v-hasPermi="['system:member:remove']"
  87. >移除</el-button>
  88. </template>
  89. </el-table-column>
  90. </el-table>
  91. <pagination
  92. v-show="total>0"
  93. :total="total"
  94. :page.sync="queryParams.pageNum"
  95. :limit.sync="queryParams.pageSize"
  96. @pagination="getList"
  97. />
  98. <!-- 添加或修改家族成员对话框 -->
  99. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal=false>
  100. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  101. <el-form-item label="父辈" prop="parentId">
  102. <!-- <el-input v-model="form.father" placeholder="" readonly /> -->
  103. <el-select v-model="form.parentId" placeholder="请选择" :disabled="enableFather">
  104. <el-option v-for="member in treeMemberOptions" :key="member.memberId" :label="member.name" :value="member.memberId"></el-option>
  105. </el-select>
  106. </el-form-item>
  107. <el-form-item label="姓名" prop="memberId">
  108. <el-select v-model="form.memberId" placeholder="请选择" :disabled="enableMember">
  109. <el-option v-for="member in memberOptions" :key="member.memberId" :label="member.name" :value="member.memberId"></el-option>
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item label="备注" prop="remark">
  113. <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
  114. </el-form-item>
  115. </el-form>
  116. <div slot="footer" class="dialog-footer">
  117. <el-button type="primary" @click="submitForm">确 定</el-button>
  118. <el-button @click="cancel">取 消</el-button>
  119. </div>
  120. </el-dialog>
  121. </div>
  122. </template>
  123. <script>
  124. import { getFamily } from "@/api/system/family";
  125. import { listMember,listTree,listInTree,listNotTree,getMember, delMember, addMember, updateMember,saveToTree,delToTree } from "@/api/system/member";
  126. export default {
  127. name: "Tree",
  128. data() {
  129. return {
  130. familyName: null,
  131. // 遮罩层
  132. loading: true,
  133. loadings: false,
  134. // 选中数组
  135. ids: [],
  136. enableFather: true,
  137. enableMember: true,
  138. // 非单个禁用
  139. single: true,
  140. singleAdd: true,
  141. // 非多个禁用
  142. multiple: true,
  143. // 显示搜索条件
  144. showSearch: true,
  145. // 总条数
  146. total: 0,
  147. // 家族成员表格数据
  148. memberList: [],
  149. // 弹出层标题
  150. title: "",
  151. // 是否显示弹出层
  152. open: false,
  153. readonly: false,
  154. // 成员
  155. memberOptions:[],
  156. treeMemberOptions:[],
  157. genderOptions:[],
  158. // 默认第一代
  159. parentId: 0,
  160. father: null,
  161. // 查询参数
  162. memberParams: {
  163. enable: 0,
  164. familyId: null,
  165. searchValue: null,
  166. },
  167. // 查询参数
  168. queryParams: {
  169. pageNum: 1,
  170. pageSize: 10,
  171. familyId: null,
  172. name: null,
  173. gender: null,
  174. },
  175. // 表单参数
  176. form: {},
  177. // 表单校验
  178. rules: {
  179. remark: [
  180. { max: 500, message: "备注输入过长", trigger: "blur" }
  181. ],
  182. }
  183. }
  184. },
  185. activated() {
  186. const fid = this.$route.query.fid;
  187. this.queryParams.familyId = fid;
  188. this.getFamily(fid);
  189. this.getList();
  190. this.getDicts("sys_user_sex").then((response) => {
  191. this.genderOptions = response.data;
  192. });
  193. this.getDicts("app_member_state").then((response) => {
  194. this.stateOptions = response.data;
  195. });
  196. },
  197. methods: {
  198. getFamily(id){
  199. getFamily(id).then(response => {
  200. this.familyName = response.data.fullName;
  201. });
  202. },
  203. /** 查询家族成员列表 */
  204. getMemberList() {
  205. const params = {
  206. familyId: this.queryParams.familyId
  207. }
  208. listMember(params).then(response => {
  209. this.memberOptions = response.rows;
  210. });
  211. },
  212. getNotTree() {
  213. this.memberParams.familyId = this.queryParams.familyId;
  214. listNotTree(this.memberParams).then(response => {
  215. this.memberOptions = response.data;
  216. });
  217. },
  218. getInTree() {
  219. this.memberParams.familyId = this.queryParams.familyId;
  220. listInTree(this.memberParams).then(response => {
  221. this.treeMemberOptions = response.data;
  222. });
  223. },
  224. /** 查询家族成员列表 */
  225. getList() {
  226. this.loading = true;
  227. listTree(this.queryParams).then(response => {
  228. this.memberList = response.rows;
  229. this.total = response.total;
  230. this.loading = false;
  231. if(this.memberList.length <= 0) {
  232. // 家族树没有人时,允许添加第一个人
  233. this.singleAdd = false;
  234. }
  235. });
  236. },
  237. // 性别 字典翻译
  238. genderFormat(row, column) {
  239. return this.selectDictLabel(this.genderOptions, row.gender);
  240. },
  241. // 状态 字典翻译
  242. stateFormat(row, column) {
  243. return this.selectDictLabel(this.stateOptions, row.state);
  244. },
  245. // 取消按钮
  246. cancel() {
  247. this.open = false;
  248. this.reset();
  249. },
  250. // 表单重置
  251. reset() {
  252. this.form = {
  253. parentId: null,
  254. father: null,
  255. memberId: null,
  256. userId: null,
  257. spouseUserId: null,
  258. name: null,
  259. birthday: null,
  260. gender: null,
  261. education: null,
  262. state: null,
  263. createBy: null,
  264. createTime: null,
  265. updateBy: null,
  266. updateTime: null,
  267. remark: null
  268. };
  269. this.resetForm("form");
  270. },
  271. /** 搜索按钮操作 */
  272. handleQuery() {
  273. this.queryParams.pageNum = 1;
  274. this.getList();
  275. },
  276. /** 重置按钮操作 */
  277. resetQuery() {
  278. this.resetForm("queryForm");
  279. this.handleQuery();
  280. },
  281. // 多选框选中数据
  282. handleSelectionChange(selection) {
  283. this.ids = selection.map(item => item.memberId)
  284. this.single = selection.length!==1
  285. this.singleAdd = selection.length!==1
  286. this.multiple = !selection.length
  287. if(selection.length===1){
  288. this.parentId = selection.map(item => item.memberId)[0]
  289. this.father = selection.map(item => item.name)[0]
  290. }
  291. },
  292. /** 新增按钮操作 */
  293. handleAdd(row) {
  294. this.reset();
  295. this.form.parentId = this.parentId;
  296. this.form.father = this.father;
  297. this.open = true;
  298. this.title = "添加成员至家族树";
  299. this.enableFather = true;
  300. this.enableMember = false;
  301. this.getNotTree();
  302. this.getInTree();
  303. },
  304. /** 修改按钮操作 */
  305. handleUpdate(row) {
  306. this.reset();
  307. this.enableFather = false;
  308. this.enableMember = true;
  309. const id = row.memberId || this.ids
  310. const familyId = this.queryParams.familyId;
  311. getMember(familyId,id).then(response => {
  312. this.form = response.data;
  313. this.open = true;
  314. this.title = "修改家族树成员";
  315. this.getMemberList();
  316. this.getInTree();
  317. });
  318. },
  319. addForm(){
  320. this.$refs["form"].validate(valid => {
  321. if (valid) {
  322. this.form.familyId = this.queryParams.familyId;
  323. saveToTree(this.form).then(response => {
  324. if (response.code === 200) {
  325. this.msgSuccess("新增成功");
  326. this.open = false;
  327. this.getList();
  328. }
  329. });
  330. }
  331. });
  332. },
  333. updateForm(){
  334. this.$refs["form"].validate(valid => {
  335. if (valid) {
  336. this.form.familyId = this.queryParams.familyId;
  337. updateMember(this.form).then(response => {
  338. if (response.code === 200) {
  339. this.msgSuccess("修改成功");
  340. this.open = false;
  341. this.getList();
  342. }
  343. });
  344. }
  345. });
  346. },
  347. /** 提交按钮 */
  348. submitForm() {
  349. this.$refs["form"].validate(valid => {
  350. if (valid) {
  351. this.form.familyId = this.queryParams.familyId;
  352. saveToTree(this.form).then(response => {
  353. if (response.code === 200) {
  354. this.msgSuccess("保存成功");
  355. this.open = false;
  356. this.getList();
  357. }
  358. });
  359. }
  360. });
  361. },
  362. /** 删除按钮操作 */
  363. handleDelete(row) {
  364. const ids = row.memberId || this.ids;
  365. var familyId = this.queryParams.familyId;
  366. this.$confirm('是否确认移除?', "警告", {
  367. confirmButtonText: "确定",
  368. cancelButtonText: "取消",
  369. type: "warning"
  370. }).then(function() {
  371. return delToTree(familyId,ids);
  372. }).then(() => {
  373. this.getList();
  374. this.msgSuccess("移除成功");
  375. }).catch(function() {});
  376. },
  377. }
  378. }
  379. </script>