DepartList.vue 19.7 KB
Newer Older
1 2 3 4
<template xmlns:background-color="http://www.w3.org/1999/xhtml">
  <a-row :gutter="10">
    <a-col :md="12" :sm="24">
      <a-card :bordered="false">
5

6
        <!-- 按钮操作区域 -->
7
        <a-row style="margin-left: 14px">
8
          <a-button @click="handleAdd(2)" type="primary">添加子部门</a-button>
9 10 11 12 13
          <a-button @click="handleAdd(1)" type="primary">添加一级部门</a-button>
          <a-button type="primary" icon="download" @click="handleExportXls('部门信息')">导出</a-button>
          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
            <a-button type="primary" icon="import">导入</a-button>
          </a-upload>
14
          <a-button title="删除多条数据" @click="batchDel" type="default">批量删除</a-button>
15
          <!--<a-button @click="refresh" type="default" icon="reload" :loading="loading">刷新</a-button>-->
16 17 18
        </a-row>
        <div style="background: #fff;padding-left:16px;height: 100%; margin-top: 5px">
          <a-alert type="info" :showIcon="true">
19 20 21 22 23 24
            <div slot="message">
              当前选择:
              <a v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</a>
              <a v-if="this.currSelected.title" style="margin-left: 10px" @click="onClearSelected">取消选择</a>
            </div>
          </a-alert>
25
          <a-input-search @search="onSearch" style="width:100%;margin-top: 10px" placeholder="请输入部门名称"/>
26
          <!-- 树-->
27 28 29 30 31 32 33 34 35 36 37 38 39
          <a-col :md="10" :sm="24">
            <template>
              <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus">
               <span style="user-select: none">
            <a-tree
              checkable
              multiple
              @select="onSelect"
              @check="onCheck"
              @rightClick="rightHandle"
              :selectedKeys="selectedKeys"
              :checkedKeys="checkedKeys"
              :treeData="departTree"
40
              :checkStrictly="checkStrictly"
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
              :expandedKeys="iExpandedKeys"
              :autoExpandParent="autoExpandParent"
              @expand="onExpand"/>
                </span>
                <!--新增右键点击事件,和增加添加和删除功能-->
                <a-menu slot="overlay">
                  <a-menu-item @click="handleAdd(3)" key="1">添加</a-menu-item>
                  <a-menu-item @click="handleDelete" key="2">删除</a-menu-item>
                  <a-menu-item @click="closeDrop" key="3">取消</a-menu-item>
                </a-menu>
              </a-dropdown>
            </template>
          </a-col>
        </div>
      </a-card>
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
      <div class="drawer-bootom-button">
        <a-dropdown :trigger="['click']" placement="topCenter">
          <a-menu slot="overlay">
            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
            <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
            <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
            <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
            <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
          </a-menu>
          <a-button>
            树操作 <a-icon type="up" />
          </a-button>
        </a-dropdown>
      </div>
      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    </a-col>
    <a-col :md="12" :sm="24">
      <a-card :bordered="false">
        <a-form :form="form">
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="机构名称">
            <a-input placeholder="请输入机构/部门名称" v-decorator="['departName', validatorRules.departName ]"/>
          </a-form-item>
          <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门">
            <a-tree-select
              style="width:100%"
              :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
              :treeData="treeData"
              :disabled="disable"
              v-model="model.parentId"
              placeholder="无">
            </a-tree-select>
          </a-form-item>
93 94 95 96 97 98
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="机构编码">
            <a-input disabled placeholder="请输入机构编码" v-decorator="['orgCode', validatorRules.orgCode ]"/>
          </a-form-item>
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="机构类型">
            <template v-if="orgCategoryDisabled">
              <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
                <a-radio value="1">
                  公司
                </a-radio>
              </a-radio-group>
            </template>
            <template v-else>
              <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
                <a-radio value="2">
                  部门
                </a-radio>
                <a-radio value="3">
                  岗位
                </a-radio>
              </a-radio-group>
            </template>
          </a-form-item>
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="排序">
            <a-input-number v-decorator="[ 'departOrder',{'initialValue':0}]"/>
          </a-form-item>
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="手机号">
            <a-input placeholder="请输入手机号" v-decorator="['mobile', {'initialValue':''}]"/>
          </a-form-item>
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="地址">
            <a-input placeholder="请输入地址" v-decorator="['address', {'initialValue':''}]"/>
          </a-form-item>
          <a-form-item
            :labelCol="labelCol"
            :wrapperCol="wrapperCol"
            label="备注">
            <a-textarea placeholder="请输入备注" v-decorator="['memo', {'initialValue':''}]"/>
          </a-form-item>
        </a-form>
        <div class="anty-form-btn">
          <a-button @click="emptyCurrForm" type="default" htmlType="button" icon="sync">重置</a-button>
          <a-button @click="submitCurrForm" type="primary" htmlType="button" icon="form">修改并保存</a-button>
        </div>
      </a-card>
    </a-col>
    <depart-modal ref="departModal" @ok="loadTree"></depart-modal>
  </a-row>
154 155 156 157
</template>
<script>
  import DepartModal from './modules/DepartModal'
  import pick from 'lodash.pick'
158 159 160
  import {queryDepartTreeList, searchByKeywords, deleteByDepartId} from '@/api/api'
  import {httpAction, deleteAction} from '@/api/manage'
  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
161 162 163 164
  // 表头
  const columns = [
    {
      title: '机构名称',
165
      dataIndex: 'departName'
166 167 168
    },
    {
      title: '机构类型',
169
      align: 'center',
170 171 172 173
      dataIndex: 'orgType'
    },
    {
      title: '机构编码',
174
      dataIndex: 'orgCode',
175 176 177 178 179 180 181 182 183 184 185 186 187 188
    },
    {
      title: '手机号',
      dataIndex: 'mobile'
    },
    {
      title: '传真',
      dataIndex: 'fax'
    },
    {
      title: '地址',
      dataIndex: 'address'
    },
    {
189 190 191
      title: '排序',
      align: 'center',
      dataIndex: 'departOrder'
192 193 194
    },
    {
      title: '操作',
195
      align: 'center',
196
      dataIndex: 'action',
197
      scopedSlots: {customRender: 'action'}
198
    }
199
  ]
200
  export default {
201
    name: 'DepartList',
202
    mixins: [JeecgListMixin],
203 204 205
    components: {
      DepartModal
    },
206
    data() {
207
      return {
208 209 210 211 212 213
        iExpandedKeys: [],
        loading: false,
        autoExpandParent: true,
        currFlowId: '',
        currFlowName: '',
        disable: true,
214
        treeData: [],
215 216 217 218 219 220 221 222 223 224 225 226 227
        visible: false,
        departTree: [],
        rightClickSelectedKey: '',
        hiding: true,
        model: {},
        dropTrigger: '',
        depart: {},
        columns: columns,
        disableSubmit: false,
        checkedKeys: [],
        selectedKeys: [],
        autoIncr: 1,
        currSelected: {},
228 229 230 231

        allTreeKeys:[],
        checkStrictly: true,

232 233
        form: this.$form.createForm(this),
        labelCol: {
234 235
          xs: {span: 24},
          sm: {span: 5}
236 237
        },
        wrapperCol: {
238 239
          xs: {span: 24},
          sm: {span: 16}
240
        },
241 242 243
        graphDatasource: {
          nodes: [],
          edges: []
244
        },
245
        validatorRules: {
246 247
          departName: {rules: [{required: true, message: '请输入机构/部门名称!'}]},
          orgCode: {rules: [{required: true, message: '请输入机构编码!'}]},
248
          orgCategory: {rules: [{required: true, message: '请输入机构类型!'}]},
249
          mobile: {rules: [{validator: this.validateMobile}]}
250 251
        },
        url: {
252 253 254 255 256
          delete: '/sys/sysDepart/delete',
          edit: '/sys/sysDepart/edit',
          deleteBatch: '/sys/sysDepart/deleteBatch',
          exportXlsUrl: "sys/sysDepart/exportXls",
          importExcelUrl: "sys/sysDepart/importExcel",
257
        },
258
        orgCategoryDisabled:false,
259 260 261 262 263
      }
    },
    computed: {
      importExcelUrl: function () {
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
264 265
      }
    },
266
    methods: {
267 268 269
      loadData() {
        this.refresh();
      },
270 271 272 273 274 275
      loadTree() {
        var that = this
        that.treeData = []
        that.departTree = []
        queryDepartTreeList().then((res) => {
          if (res.success) {
276
            for (let i = 0; i < res.result.length; i++) {
277 278 279 280
              let temp = res.result[i]
              that.treeData.push(temp)
              that.departTree.push(temp)
              that.setThisExpandedKeys(temp)
281 282
              that.getAllKeys(temp);
              // console.log(temp.id)
283
            }
284
            this.loading = false
285
          }
286
        })
287
      },
288 289 290 291 292
      setThisExpandedKeys(node) {
        if (node.children && node.children.length > 0) {
          this.iExpandedKeys.push(node.key)
          for (let a = 0; a < node.children.length; a++) {
            this.setThisExpandedKeys(node.children[a])
293 294 295
          }
        }
      },
296 297 298 299 300 301 302 303 304
      refresh() {
        this.loading = true
        this.loadTree()
      },
      // 右键操作方法
      rightHandle(node) {
        this.dropTrigger = 'contextmenu'
        console.log(node.node.eventKey)
        this.rightClickSelectedKey = node.node.eventKey
305
      },
306
      onExpand(expandedKeys) {
307 308 309 310 311 312
        console.log('onExpand', expandedKeys)
        // if not set autoExpandParent to false, if children expanded, parent can not collapse.
        // or, you can remove all expanded children keys.
        this.iExpandedKeys = expandedKeys
        this.autoExpandParent = false
      },
313 314 315 316 317 318 319 320 321 322 323 324
      backFlowList() {
        this.$router.back(-1)
      },
      // 右键点击下拉框改变事件
      dropStatus(visible) {
        if (visible == false) {
          this.dropTrigger = ''
        }
      },
      // 右键店家下拉关闭下拉框
      closeDrop() {
        this.dropTrigger = ''
325
      },
326 327
      addRootNode() {
        this.$refs.nodeModal.add(this.currFlowId, '')
328
      },
329
      batchDel: function () {
330
        console.log(this.checkedKeys)
331 332 333 334 335 336
        if (this.checkedKeys.length <= 0) {
          this.$message.warning('请选择一条记录!')
        } else {
          var ids = ''
          for (var a = 0; a < this.checkedKeys.length; a++) {
            ids += this.checkedKeys[a] + ','
337
          }
338
          var that = this
339
          this.$confirm({
340
            title: '确认删除',
341
            content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据,以及子节点数据吗?',
342 343
            onOk: function () {
              deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
344 345 346 347 348 349
                if (res.success) {
                  that.$message.success(res.message)
                  that.loadTree()
                  that.onClearSelected()
                } else {
                  that.$message.warning(res.message)
350
                }
351
              })
352
            }
353
          })
354 355
        }
      },
356 357 358
      onSearch(value) {
        let that = this
        if (value) {
359
          searchByKeywords({keyWord: value}).then((res) => {
360 361
            if (res.success) {
              that.departTree = []
362
              for (let i = 0; i < res.result.length; i++) {
363 364
                let temp = res.result[i]
                that.departTree.push(temp)
365
              }
366 367
            } else {
              that.$message.warning(res.message)
368 369
            }
          })
370 371
        } else {
          that.loadTree()
372 373 374
        }

      },
375 376 377 378
      nodeModalOk() {
        this.loadTree()
      },
      nodeModalClose() {
379
      },
380 381 382
      hide() {
        console.log(111)
        this.visible = false
383
      },
384
      onCheck(checkedKeys, info) {
385
        console.log('onCheck', checkedKeys, info)
386
        this.hiding = false
387 388 389 390 391 392 393 394
        //this.checkedKeys = checkedKeys.checked
        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
        if(this.checkStrictly){
          this.checkedKeys = checkedKeys.checked;
        }else{
          this.checkedKeys = checkedKeys
        }
        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
395
      },
396
      onSelect(selectedKeys, e) {
397
        console.log('selected', selectedKeys, e)
398 399 400 401 402 403 404 405 406
        this.hiding = false
        let record = e.node.dataRef
        console.log('onSelect-record', record)
        this.currSelected = Object.assign({}, record)
        this.model = this.currSelected
        this.selectedKeys = [record.key]
        this.model.parentId = record.parentId
        this.setValuesToForm(record)

407 408

      },
409 410
      // 触发onSelect事件时,为部门树右侧的form表单赋值
      setValuesToForm(record) {
411 412 413 414 415
        if(record.orgCategory == '1'){
          this.orgCategoryDisabled = true;
        }else{
          this.orgCategoryDisabled = false;
        }
416
        this.form.getFieldDecorator('fax', {initialValue: ''})
417
        this.form.setFieldsValue(pick(record, 'departName','orgCategory', 'orgCode', 'departOrder', 'mobile', 'fax', 'address', 'memo'))
418
      },
419 420
      getCurrSelectedTitle() {
        return !this.currSelected.title ? '' : this.currSelected.title
421
      },
422 423
      onClearSelected() {
        this.hiding = true
JEECG低代码平台's avatar
JEECG低代码平台 已提交
424
        this.checkedKeys = []
425 426 427
        this.currSelected = {}
        this.form.resetFields()
        this.selectedKeys = []
428
      },
429 430
      handleNodeTypeChange(val) {
        this.currSelected.nodeType = val
431
      },
432 433
      notifyTriggerTypeChange(value) {
        this.currSelected.notifyTriggerType = value
434
      },
435 436 437 438 439
      receiptTriggerTypeChange(value) {
        this.currSelected.receiptTriggerType = value
      },
      submitCurrForm() {
        this.form.validateFields((err, values) => {
440
          if (!err) {
441 442
            if (!this.currSelected.id) {
              this.$message.warning('请点击选择要修改部门!')
443 444 445
              return
            }

446
            let formData = Object.assign(this.currSelected, values)
447
            console.log('Received values of form: ', formData)
448
            httpAction(this.url.edit, formData, 'put').then((res) => {
449
              if (res.success) {
450 451
                this.$message.success('保存成功!')
                this.loadTree()
452 453
              } else {
                this.$message.error(res.message)
454 455 456
              }
            })
          }
457
        })
458
      },
459 460
      emptyCurrForm() {
        this.form.resetFields()
461
      },
462 463
      nodeSettingFormSubmit() {
        this.form.validateFields((err, values) => {
464 465 466
          if (!err) {
            console.log('Received values of form: ', values)
          }
467
        })
468
      },
469 470
      openSelect() {
        this.$refs.sysDirectiveModal.show()
471
      },
472 473 474 475 476 477 478 479 480
      handleAdd(num) {
        if (num == 1) {
          this.$refs.departModal.add()
          this.$refs.departModal.title = '新增'
        } else if (num == 2) {
          let key = this.currSelected.key
          if (!key) {
            this.$message.warning('请先选中一条记录!')
            return false
481
          }
482 483 484 485 486
          this.$refs.departModal.add(this.selectedKeys)
          this.$refs.departModal.title = '新增'
        } else {
          this.$refs.departModal.add(this.rightClickSelectedKey)
          this.$refs.departModal.title = '新增'
487 488
        }
      },
489
      handleDelete() {
490
        deleteByDepartId({id: this.rightClickSelectedKey}).then((resp) => {
491 492 493 494 495 496 497 498 499 500
          if (resp.success) {
            this.$message.success('删除成功!')
            this.loadTree()
          } else {
            this.$message.warning('删除失败!')
          }
        })
      },
      selectDirectiveOk(record) {
        console.log('选中指令数据', record)
501
        this.nodeSettingForm.setFieldsValue({directiveCode: record.directiveCode})
502
        this.currSelected.sysCode = record.sysCode
503
      },
504
      getFlowGraphData(node) {
505
        this.graphDatasource.nodes.push({
506 507
          id: node.id,
          text: node.flowNodeName
508
        })
509 510
        if (node.children.length > 0) {
          for (let a = 0; a < node.children.length; a++) {
511 512
            let temp = node.children[a]
            this.graphDatasource.edges.push({
513 514 515 516
              source: node.id,
              target: temp.id
            })
            this.getFlowGraphData(temp)
517 518
          }
        }
519
      },
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
     // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
      expandAll () {
        this.iExpandedKeys = this.allTreeKeys
      },
      closeAll () {
        this.iExpandedKeys = []
      },
      checkALL () {
        this.checkStriccheckStrictlytly = false
        this.checkedKeys = this.allTreeKeys
      },
      cancelCheckALL () {
        //this.checkedKeys = this.defaultCheckedKeys
        this.checkedKeys = []
      },
      switchCheckStrictly (v) {
        if(v==1){
          this.checkStrictly = false
        }else if(v==2){
          this.checkStrictly = true
        }
      },
      getAllKeys(node) {
        // console.log('node',node);
        this.allTreeKeys.push(node.key)
        if (node.children && node.children.length > 0) {
          for (let a = 0; a < node.children.length; a++) {
            this.getAllKeys(node.children[a])
          }
        }
      }
      // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
      
553
    },
554 555 556
    created() {
      this.currFlowId = this.$route.params.id
      this.currFlowName = this.$route.params.name
557 558
      // this.loadTree()
    },
559 560 561 562

  }
</script>
<style scoped>
563 564 565 566
  .ant-card-body .table-operator {
    margin: 15px;
  }

567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
  .anty-form-btn {
    width: 100%;
    text-align: center;
  }

  .anty-form-btn button {
    margin: 0 5px;
  }

  .anty-node-layout .ant-layout-header {
    padding-right: 0
  }

  .header {
    padding: 0 8px;
  }

  .header button {
    margin: 0 3px
  }

  .ant-modal-cust-warp {
    height: 100%
  }

  .ant-modal-cust-warp .ant-modal-body {
    height: calc(100% - 110px) !important;
    overflow-y: auto
  }

  .ant-modal-cust-warp .ant-modal-content {
    height: 90% !important;
    overflow-y: hidden
  }

602 603 604
  #app .desktop {
    height: auto !important;
  }
605 606 607 608 609

  /** Button按钮间距 */
  .ant-btn {
    margin-left: 3px
  }
610 611 612 613 614 615 616 617 618 619 620 621

  .drawer-bootom-button {
    /*position: absolute;*/
    bottom: 0;
    width: 100%;
    border-top: 1px solid #e8e8e8;
    padding: 10px 16px;
    text-align: left;
    left: 0;
    background: #fff;
    border-radius: 0 0 2px 2px;
  }
622
</style>