马宇豪
2024-06-04 0d32ef0479cb7d7d0f24b4e866994d43dfaf82e6
添加通讯录
已修改3个文件
已添加6个文件
已删除1个文件
1802 ■■■■■ 文件已修改
src/api/contactBook.js 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/menu/index.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Torelease.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/components/contactorsMod.vue 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/contactBook/contactors.vue 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/contactBook/structure.vue 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/contactBook/subMenu.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/massSend.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/responsor.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/contactBook.js
对比新文件
@@ -0,0 +1,120 @@
//将拦截器整体导入
import request from '@/util/request'//导入已经写好的拦截器
// 获取架构树
export function getStructure(){
    return request({
        url: '/sys/districtInfo/org',
        method: 'get'
    })
}
// 新增
export function addDep(data){
    return request({
        url: '/org/structure/add',
        method: 'post',
        data: data,
    })
}
// 修改
export function editDep(data){
    return request({
        url: '/org/structure/update',
        method: 'post',
        data: data,
    })
}
// 修改
export function editArea(data){
    return request({
        url: '/sys/districtInfo/update',
        method: 'post',
        data: data,
    })
}
// 删除
export function delStructure(id){
    return request({
        url: '/org/structure/delete/' + id,
        method: 'delete'
    })
}
// 更新统计
export function getUpdateData(){
    return request({
        url: '/org/user/task/statistic',
        method: 'get'
    })
}
// 下发更新任务
export function deliverUpdate(){
    return request({
        url: '/org/user/task/update',
        method: 'get'
    })
}
// 架构详情
export function getStructureDetail(id){
    return request({
        url: '/org/structure/findById/' + id,
        method: 'get'
    })
}
// 分页
export function getContactors(data){
    return request({
        url: '/org/user/page',
        method: 'post',
        data: data,
    })
}
// 新增
export function addContactors(data){
    return request({
        url: '/org/user/add',
        method: 'post',
        data: data,
    })
}
// 更新
export function updateContactors(data){
    return request({
        url: '/org/user/update',
        method: 'post',
        data: data,
    })
}
// 删除
export function delContactors(id){
    return request({
        url: '/org/user/delete/' + id,
        method: 'delete'
    })
}
// 无需更新
export function noUpdate(id){
    return request({
        url: '/org/user/no/update/' + id,
        method: 'get'
    })
}
// 通讯录下拉接口
export function getNewAddressBook(){
    return request({
        url: '/org/structure/select/user',
        method: 'get'
    })
}
src/layout/menu/index.js
@@ -77,18 +77,34 @@
                },
                {
                    MenuID: "33",
                    MenuTitle: "平级接收人管理",
                    MenuTitle: "(旧)平级接收人管理",
                    MenuPath: "/samelevel",
                },
                {
                    MenuID: "34",
                    MenuTitle: "平级接收人分组",
                    MenuTitle: "(旧)平级接收人分组",
                    MenuPath: "/samelevelGroup",
                },
                {
                    MenuID: "35",
                    MenuTitle: "原通讯录",
                    MenuPath: "/addressBook",
                }
            ],
        },
        {
            MenuTitle: "通讯录管理",
            Icon: "book",
            MenuID: "5",
            Children: [{
                MenuID: "51",
                MenuTitle: "责任人管理",
                MenuPath: "/contactors",
            },
                {
                    MenuID: "52",
                    MenuTitle: "组织架构维护",
                    MenuPath: "/structure",
                }
            ],
        },
@@ -157,7 +173,34 @@
                    MenuPath: "/msgReview",
                },
            ],
        }
        },
        {
            MenuTitle: "短信管理",
            Icon: "message",
            MenuID: "3",
            Children: [{
                MenuID: "31",
                MenuTitle: "常规群发",
                MenuPath: "/massSend",
            }
            ],
        },
        {
            MenuTitle: "通讯录管理",
            Icon: "book",
            MenuID: "5",
            Children: [{
                MenuID: "51",
                MenuTitle: "责任人管理",
                MenuPath: "/contactors",
            },
                {
                    MenuID: "52",
                    MenuTitle: "组织架构维护",
                    MenuPath: "/structure",
                }
            ],
        },
    ],
    workerMenu: [{
        MenuTitle: "首页",
@@ -232,12 +275,12 @@
                },
                {
                    MenuID: "33",
                    MenuTitle: "平级接收人管理",
                    MenuTitle: "(旧)平级接收人管理",
                    MenuPath: "/samelevel",
                },
                {
                    MenuID: "34",
                    MenuTitle: "平级接收人分组",
                    MenuTitle: "(旧)平级接收人分组",
                    MenuPath: "/samelevelGroup",
                },
                {
@@ -248,6 +291,22 @@
            ],
        },
        {
            MenuTitle: "通讯录管理",
            Icon: "book",
            MenuID: "5",
            Children: [{
                MenuID: "51",
                MenuTitle: "责任人管理",
                MenuPath: "/contactors",
            },
                {
                    MenuID: "52",
                    MenuTitle: "组织架构维护",
                    MenuPath: "/structure",
                }
            ],
        },
        {
            MenuTitle: "设置",
            Icon: "setting",
            MenuID: "4",
src/router/index.js
@@ -100,6 +100,18 @@
            meta: { title: '原通讯录' },
            component: () => import('@/views/Admin/addressBook'),
        },
        {
            path: '/contactors',
            name: 'contactors',
            meta: { title: '责任人管理' },
            component: () => import('@/views/Admin/contactBook/contactors'),
        },
        {
            path: '/structure',
            name: 'structure',
            meta: { title: '组织架构管理' },
            component: () => import('@/views/Admin/contactBook/structure'),
        },
      {
        path: '/user',
        name: 'user',
src/views/Admin/Torelease.vue
文件已删除
src/views/Admin/components/contactorsMod.vue
对比新文件
@@ -0,0 +1,397 @@
<template>
  <a-modal
      :title="title"
      :visible="visible"
      centered
      :confirm-loading="confirmLoading"
      width="50%"
      cancelText="取消"
      okText="确认"
      @ok="onSubmit"
      @cancel="handleCancel"
      :afterClose="clearMod"
  >
    <a-form-model ref="ruleForm" :rules="rules" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false">
      <a-row>
        <a-col :span="12">
          <a-form-model-item label="姓名" prop="name">
            <a-input v-model.trim="form.name" :disabled="isView"/>
          </a-form-model-item>
        </a-col>
        <a-col :span="12">
          <a-form-model-item label="手机号码" prop="phone">
            <a-input v-model.trim="form.phone" :disabled="isView"/>
          </a-form-model-item>
        </a-col>
      </a-row>
      <a-row>
        <a-col :span="12">
          <a-form-model-item label="所属单位" prop="company">
            <a-input v-model.trim="form.company" :disabled="isView"/>
          </a-form-model-item>
        </a-col>
        <a-col :span="12">
          <a-form-model-item label="职务" prop="post">
            <a-input v-model.trim="form.post" :disabled="isView"/>
          </a-form-model-item>
        </a-col>
      </a-row>
      <a-row>
        <a-col :span="12">
          <a-form-model-item label="行政区划">
            <a-tree-select
                v-model="areaId"
                style="width: 100%"
                :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
                :tree-data="areaData"
                placeholder="行政区划"
                :replaceFields="replaceFields"
                disabled
            />
          </a-form-model-item>
        </a-col>
        <a-col :span="12">
          <a-form-model-item label="组织架构">
            <a-input v-model="orgName" disabled/>
          </a-form-model-item>
        </a-col>
      </a-row>
      <a-row>
        <a-col :span="12">
          <a-form-model-item label="排位顺序">
            <a-input type="number" v-model.number="form.orderNum" :disabled="isView"/>
          </a-form-model-item>
        </a-col>
      </a-row>
      <a-row>
        <a-col :span="24">
<!--          <template v-for="(item,index) in options">-->
            <a-form-model-item label="责任类别"  :label-col="{span: 3}" :wrapper-col="{span: 14}" prop="typeList">
              <a-checkbox-group
                  v-model="form.typeList"
                  :options="options"
                  @change="onTypeChange"
                  :disabled="isView"
                  style="width: 100%;"
              />
            </a-form-model-item>
<!--          </template>-->
        </a-col>
      </a-row>
      <a-row>
        <a-col :span="24" v-for="(item,index) in options">
          <a-form-model-item v-if="item.children && item.children.length>0 && form.typeList.find(i=>i == item.label)" :label="item.label" :label-col="{span: 3}" :wrapper-col="{span: 14}" :prop="'tagList.' + item.label">
            <a-checkbox-group
                v-model="form.tagList[item.label]"
                :options="item.children"
                @change="onTagChange"
                :disabled="isView"
            />
          </a-form-model-item>
        </a-col>
      </a-row>
    </a-form-model>
  </a-modal>
</template>
<script>
import {addContactors,updateContactors} from '@/api/contactBook'
import {verifySimplePhone} from "@/util/validate";
import {getDistrictInfo} from "@/api/login";
export default {
  name: 'addressUserMod',
  props: ['groupList'],
  data () {
    let validatePhone = (rule, value, callback)=>{
      if(value === ''){
        callback(new Error('请输入手机号'))
      }else{
        if(!verifySimplePhone(value)){
          callback(new Error('手机号格式有误'))
        }else{
          callback()
        }
      }
    }
    return {
      title: '新增责任人',
      visible: false,
      isView: false,
      confirmLoading: false,
      areaData: [],
      labelCol: { span: 6 },
      wrapperCol: { span: 14 },
      areaId: null,
      orgName: '',
      form: {
        id: null,
        name: '',
        phone: '',
        company: '',
        post: '',
        orgStructureId: null,
        districtId: null,
        districtCode: '',
        orderNum: 0,
        typeList: [],
        tagList: {}
      },
      tagList: [],
      rules: {
        name: [{ required: true, message: '请输入姓名', trigger: 'blur'}],
        phone: [{ required: true, validator: validatePhone, trigger: 'blur'}],
        company: [{ required: true, message: '请输入单位名称', trigger: 'blur'}],
        post: [{ required: true, message: '请输入职务', trigger: 'change'}],
        typeList: [{ required: true, message: '请选择责任类别', trigger: 'change'}],
        tagList: []
      },
      options: [
        {
          value: '党委政府',
          label: '党委政府',
          children: [
            {
              value: '主要领导',
              label: '主要领导',
            },
            {
              value: '分管领导',
              label: '分管领导',
            }
          ]
        },
        {
          value: '两委三部',
          label: '两委三部',
          children: [
            {
              value: '安委会成员单位',
              label: '安委会成员单位'
            },
            {
              value: '减灾委成员单位',
              label: '减灾委成员单位'
            },
            {
              value: '防汛抗旱指挥部',
              label: '防汛抗旱指挥部'
            },
            {
              value: '抗震救灾指挥部',
              label: '抗震救灾指挥部'
            },
            {
              value: '森林草原防灭火指挥部',
              label: '森林草原防灭火指挥部'
            }
          ]
        },
        {
          value: '应急部门',
          label: '应急部门',
          children: [
            {
              value: '应急部门',
              label: '应急部门'
            }
          ]
        },
        {
          value: '救援队伍',
          label: '救援队伍',
          children: [
            {
              value: '救援队伍',
              label: '救援队伍'
            }
          ]
        }
      ],
      replaceFields: {
        children:'children',
        title:'name',
        key:'id',
        value: 'id'
      },
    }
  },
  created() {
    const t = this
    t.getDistrictInfo()
  },
  methods:{
    openDialog(type,data,areaId,orgName,orgId){
      const t = this
      t.createRules()
      t.areaId = Number(areaId)
      t.orgName = orgName
      if(type == 'add'){
        t.title = '新增责任人'
        t.isView = false
        t.form = {
          id: null,
          name: '',
          phone: '',
          company: '',
          post: '',
          orgStructureId: Number(orgId),
          districtId: t.areaId,
          districtCode: t.findCodeById(t.areaData,t.areaId),
          orderNum: 0,
          typeList: [],
          tagList: {}
        }
      }else{
        for(let i in data){
          if(t.isValidKey(i,t.form)){
            t.form[i] = data[i]
          }
        }
        t.form.typeList = []
        t.form.tagList = {}
        t.form.typeList = data.orgUserTypes.map(i=>i.typeName)
        // for(let i of data.orgUserTypes){
        //   t.form.tagList[i.typeName] = i.orgUserTags.map(j=>j.tagName)
        // }
        // Vue.set方法添加新属性确保响应式
        for (let i of data.orgUserTypes) {
          t.$set(t.form.tagList, i.typeName, i.orgUserTags.map(j => j.tagName));
        }
        if(type == 'edit'){
          t.title = '编辑责任人'
          t.isView = false
        }else{
          t.title = '责任人详情'
          t.isView = true
        }
      }
      t.visible = true
    },
    isValidKey(key, object){
      return key in object;
    },
    createRules(){
      for(let i of this.options){
        this.rules.tagList[i.label] = (
            {
              required: true,
              validator: (rule, value, callback) => {
                if (!value || value.length === 0) {
                  callback(new Error('请选择标签类别'));
                } else {
                  callback();
                }
              },
              trigger: 'change'
            }
        )
      }
    },
    onTypeChange(checkedValue) {
      console.log(checkedValue,this.form.typeList,666);
    },
    onTagChange(checkedValue) {
      console.log(checkedValue,this.form.tagList,777);
    },
    clearMod(){
      this.$refs.ruleForm.clearValidate()
      this.$refs.ruleForm.resetFields()
      this.rules.tagList = []
    },
    onSubmit() {
      this.$refs.ruleForm.validate(valid => {
        if (valid) {
          if(this.title == '新增责任人'){
            const {id,tagList,...data} = this.form
            data.typeList = this.form.typeList.map(item=>{
              const newTagList = this.form.tagList[item].map(i=>{
                return {
                  tagName: i
                }
              })
              return {
                typeName: item,
                tagList: newTagList
              }
            })
            addContactors(data).then((res)=>{
              if(res.data.code == 100){
                this.$message.success('新增责任人成功')
                this.$emit('refresh')
                this.visible = false
              }else{
                this.$message.error(res.data.msg)
              }
            })
          }else if(this.title == '编辑责任人'){
            const {tagList,...data} = this.form
            data.typeList = this.form.typeList.map(item=>{
              const newTagList = this.form.tagList[item].map(i=>{
                return {
                  tagName: i
                }
              })
              return {
                typeName: item,
                tagList: newTagList
              }
            })
            updateContactors(data).then((res)=>{
              if(res.data.code == 100){
                this.$message.success('修改责任人成功')
                this.$emit('refresh')
                this.visible = false
              }else{
                this.$message.error(res.data.msg)
              }
            })
          }else{
            this.visible = false
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    async getDistrictInfo(){
      let res = await getDistrictInfo()
      if(res.data.code == 100){
        this.areaData = res.data.data
      } else {
        this.$message.warning(res.data.msg);
      }
    },
    findCodeById(data, id) {
      for (let item of data) {
        if (item.id === id) {
          return item.code;
        }
        if (item.children && item.children.length > 0) {
          const code = this.findCodeById(item.children, id);
          if (code) {
            return code;
          }
        }
      }
      return null; // 如果未找到,返回 null
    },
    handleCancel(e) {
      const t = this
      t.visible = false;
    }
  }
}
</script>
<style lang="less" scoped>
</style>
src/views/Admin/contactBook/contactors.vue
对比新文件
@@ -0,0 +1,376 @@
<template>
  <div class="inner">
    <a-row>
      <a-col :span="4">
        <a-menu
            style="width: calc(100% - 20px)"
            :default-selected-keys="currentKey"
            :open-keys.sync="openKeys"
            :selectedKeys="currentKey"
            mode="inline"
            @click="handleClick"
        >
          <template v-for="(item,index) in treeData">
            <sub-menu ref="subMenuRef" :key="item.id+'-'+item.name" :menu-info="item"></sub-menu>
          </template>
        </a-menu>
      </a-col>
      <a-col :span="20">
        <div style="display: flex;justify-content: space-between">
          <div>最新更新要求下发时间:{{updateData.gmtModified?updateData.gmtModified:'暂无数据'}}</div>
          <div style="display: flex;align-items: center">
            <div>总数:<span style="color: blue;margin-right: 10px">{{updateData.totalCount?updateData.totalCount:'暂无数据'}}</span>待更新:<span style="color: orange;margin-right: 10px">{{updateData.updateNoCount?updateData.updateNoCount:'暂无数据'}}</span>已更新:<span style="color: green;margin-right: 10px">{{updateData.updateYesCount?updateData.updateYesCount: '暂无数据'}}</span>更新率:<span style="color: blue;margin-right: 10px">{{updateData.updatedRate?updateData.updatedRate + '%':'暂无数据'}}</span></div>
            <a-button type="danger" @click="deliverTask" v-if="!unittype || unittype == 1">下发更新任务</a-button>
          </div>
        </div>
        <div style="margin: 20px 0">
          <a-button  type="primary" style="margin-right: 10px" @click="editData('add',{})">新增</a-button>
          <a-button  type="primary" @click="massImport()">批量导入</a-button>
        </div>
        <div class="table-cont">
          <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.id" bordered>
            <template #index="text,record,index">
              {{ index + 1 }}
            </template>
            <template #orgName="text,record,index">
              {{currentKey.length>0?currentKey[0].split('-')[1]: ''}}
            </template>
            <template #orgUserTypes="text,record,index">
              {{record.orgUserTypes?record.orgUserTypes.map(i=>i.typeName + '(' + i.orgUserTags.map(j=>j.tagName).join('/') +')').join(','): ''}}
            </template>
            <template #updateStatus="text,record,index">
              <span v-if="text == 0" style="color: green">已更新</span>
              <span v-else style="color: red">待更新</span>
            </template>
            <template #action="action,row">
              <a-button type="link" @click="editData('view',row)">详情</a-button>
              <a-button type="link" @click="editData('edit',row)">更新</a-button>
              <a-button type="link" v-if="row.updateStatus == 1" @click="noNeed(row)">无需更改</a-button>
              <a-button type="link" class="delBtn" @click="delData(row)">删除</a-button>
            </template>
          </a-table>
        </div>
      </a-col>
      <contactors-mod ref="contactMod" @refresh="getUserList()"></contactors-mod>
    </a-row>
  </div>
</template>
<script>
import {getUserInfo} from "@/util/storage";
import {
  getStructure,
  getStructureDetail,
  getUpdateData,
  getContactors,
  delContactors,
  noUpdate, deliverUpdate
} from "@/api/contactBook";
import subMenu from "@/views/Admin/contactBook/subMenu";
import contactorsMod from "@/views/Admin/components/contactorsMod"
export default {
  name: 'sameLevel',
  components: {
    subMenu,
    contactorsMod
  },
  data () {
    return {
      openKeys: [],
      areaVal: [],
      unittype: null,
      districtId: null,
      currentKey: [],
      search:{
        pageIndex: 1,
        pageSize: 10,
        searchParams: {
          name: '',
          phone: '',
          orgStructureId: null
        }
      },
      columns:[
        {
          title: '序号',
          dataIndex: 'index',
          scopedSlots: {
            customRender: 'index'
          }
        },
        {
          title: '姓名',
          dataIndex: 'name',
          key: 'name',
          align: 'center'
        },
        {
          title: '所属组织架构',
          dataIndex: 'orgName',
          scopedSlots: {
            customRender: 'orgName'
          }
        },
        {
          title: '所属单位',
          dataIndex: 'company',
          key: 'company',
        },
        {
          title: '职务',
          dataIndex: 'post',
          key: 'post',
        },
        {
          title: '电话号码',
          dataIndex: 'phone',
          key: 'phone',
        },
        {
          title: '责任类型',
          dataIndex: 'orgUserTypes',
          scopedSlots: {
            customRender: 'orgUserTypes'
          }
        },
        {
          title: '更新状态',
          dataIndex: 'updateStatus',
          scopedSlots: {
            customRender: 'updateStatus'
          }
        },
        {
          title: '操作',
          width: '12%',
          key: 'action',
          scopedSlots: { customRender: 'action' }
        },
      ],
      treeData: [],
      updateData: {},
      tableData: [],
      pagination: {
        current: 1,
        defaultCurrent: 1,
        defaultPageSize: 10,
        total: 0,
        onChange: ( page, pageSize ) => this.onPageChange(page,pageSize),
        showTotal: total => `共 ${total} 条`
      },
      fieldNames:{
        label: 'name',
        value: 'id',
        children: 'children'
      },
      currentId: null
    }
  },
  created() {
    const t = this
    t.unittype = getUserInfo().unittype
    t.districtId = getUserInfo().districtId
    t.getUserList()
    t.getUpdataData()
    t.getStructure()
  },
  mounted() {
  },
  watch: {
    openKeys(val) {
      console.log('openKeys', val);
    }
  },
  methods:{
    async getStructure(){
      const t = this
      const res = await getStructure()
      if(res.data.code == 100){
        t.treeData = res.data.data
        const firstItem = this.firstIdWithOrgStructures(res.data.data[0])
        if(firstItem){
          t.openKeys =  [firstItem.id +'-'+  firstItem.name]
          t.currentId = firstItem.id
          t.currentKey = [firstItem.orgStructures[0].id +'-'+  firstItem.orgStructures[0].orgName]
        }else{
          t.$message.warning('暂无可操作的单位,请先进入“组织架构维护页面”新建相应的本级单位')
        }
      }else{
        t.$message.warning(res.data.msg)
      }
    },
    firstIdWithOrgStructures(node) {
      if (node.orgStructures && node.orgStructures.length > 0) {
        return node
      }
      if (node.children && node.children.length > 0) {
        for (let child of node.children) {
          const result = this.firstIdWithOrgStructures(child);
          if (result) {
            return result
          }
        }
      }
      return null;
    },
    async getUpdataData(){
      const t = this
      const res = await getUpdateData();
      if(res.data.code == 100){
        t.updateData = res.data.data
      }else{
        t.$message.warning(res.data.msg);
      }
    },
    handleClick(e) {
      console.log(e)
      this.currentId = e.keyPath[1]?e.keyPath[1].split('-')[0]:e.keyPath[0].split('-')[0]
      this.search = {
        pageIndex: 1,
        pageSize: 10,
        searchParams: {
          name: '',
          phone: '',
          orgStructureId: null
        }
      }
      this.currentKey = [e.key]
      this.search.searchParams.orgStructureId = Number(e.key.split('-')[0])
      this.getUserList()
    },
    titleClick(e) {
      console.log('titleClick', e);
    },
    async getUserList(){
      const t = this
      const res = await getContactors(t.search);
      if(res.data.code == 100){
        t.tableData = res.data.data
        t.pagination.total = res.data.total
      }else{
        t.$message.warning(res.data.msg);
      }
    },
    massImport(){
      this.$message.warning('批量导入请联系管理人员')
    },
    resetSearch(){
      const t = this
      t.areaVal = []
      t.search = {
        pageIndex: 1,
        pageSize: 10,
      }
      t.getUserList()
    },
    editData(type,data){
      const t = this
      if(type == 'add' && (!t.currentId || !t.currentKey)){
        t.$message.warning('暂无可操作的单位,请先进入“组织架构维护页面”新建相应的本级单位')
        return
      }
      const areaId = t.currentId
      const orgName = t.currentKey.length>0?t.currentKey[0].split('-')[1]: ''
      const orgId = t.currentKey.length>0?t.currentKey[0].split('-')[0]: null
      t.$refs.contactMod.openDialog(type,data,areaId,orgName,orgId)
    },
    async delData(row){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否删除该条信息?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          delContactors(row.id).then(res=>{
            if(res.data.code == 100){
              t.$message.success('删除成功');
              t.getUserList()
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    },
    async deliverTask(){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否确认下发更新任务?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          deliverUpdate().then(res=>{
            if(res.data.code == 100){
              t.$message.success('下发成功')
              t.getUpdataData()
              t.getUserList()
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    },
    async noNeed(row){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否确认该信息无需更改?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          noUpdate(row.id).then(res=>{
            if(res.data.code == 100){
              t.$message.success('提交成功');
              t.getUserList()
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    },
    onPageChange(page, pageSize) {
      const t= this
      t.pagination.current = page
      t.search.pageIndex = page
      t.getUserList()
    },
  }
}
</script>
<style lang="less" scoped>
.delBtn{
  color: @danger
}
</style>
src/views/Admin/contactBook/structure.vue
对比新文件
@@ -0,0 +1,243 @@
<template>
  <div class="inner">
    <a-table
          :columns="columns"
          :data-source="tableData"
          :expanded-row-keys.sync="expandedRowKeys"
          :rowKey="record=>record.id"
          :pagination="false"
      >
      <template #name="name">
        <span style="color:#40a9ff;font-weight: bolder">{{name}}</span>
      </template>
        <template #action="action,row">
          <a-button type="link" @click="editData(row)">编辑</a-button>
          <a-button type="primary" @click="openAdd('add',row)">增加本级单位</a-button>
        </template>
      <template #expandedRowRender="text">
        <a-table
            :columns="innerColumns"
            :data-source="text.orgStructures"
            :rowKey="record=>record.id"
            :pagination="false"
            v-if="text.orgStructures && text.orgStructures.length>0"
            :showHeader="false"
        >
          <template #action="action,row">
            <a-button type="link" @click="openAdd('edit',row)">编辑</a-button>
            <a-button type="link" class="delBtn" @click="delData(row)">删除</a-button>
          </template>
        </a-table>
      </template>
    </a-table>
    <a-modal v-model="showDialog" :title="editTitle" :ok-text="editTitle" cancel-text="取消" @ok="addData" centered :afterClose="clearMod">
      <a-form-model ref="ruleForm" :rules="rules" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false">
        <a-form-model-item label="单位名称" prop="orgName">
          <a-input v-model="form.orgName"/>
        </a-form-model-item>
      </a-form-model>
    </a-modal>
    <a-modal v-model="showAreaDialog" title="修改" ok-text="确认" cancel-text="取消" @ok="confirmUpdate" centered>
      <a-form-model ref="areaRuleForm" :rules="areaRules" :model="areaForm" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false">
        <a-form-model-item label="区划名称" prop="name">
          <a-input v-model="areaForm.name"/>
        </a-form-model-item>
      </a-form-model>
    </a-modal>
  </div>
</template>
<script>
import {getUserInfo} from "@/util/storage";
import {getStructure, addDep, editDep, delStructure, editArea} from "@/api/contactBook";
export default {
  name: 'structure',
  components: {
  },
  data () {
    return {
      areaVal: [],
      unittype: null,
      districtId: null,
      columns:[
        {
          title: '名称',
          dataIndex: 'name',
          key: 'name',
          scopedSlots: {
            customRender: 'name'
          },
        },
        {
          title: '操作',
          width: '12%',
          key: 'action',
          scopedSlots: { customRender: 'action' }
        },
      ],
      innerColumns: [
        {
          title: '名称',
          dataIndex: 'orgName',
          key: 'orgName',
        },
        {
          title: '操作',
          width: '12%',
          key: 'action',
          scopedSlots: { customRender: 'action' }
        },
      ],
      form: {
        orgName: '',
        districtId: null,
        districtCode: ''
      },
      areaForm: {
        id: null,
        name: ''
      },
      labelCol: { span: 4 },
      wrapperCol: { span: 14 },
      rules: {
        orgName: [{ required: true, message: '请输入单位名称', trigger: 'blur'}],
      },
      areaRules: {
        name: [{ required: true, message: '请输入区划名称', trigger: 'blur'}],
      },
      innerData: [],
      tableData: [],
      editTitle: '新增',
      expandedRowKeys: [],
      showDialog: false,
      showAreaDialog: false
    }
  },
  created() {
    const t = this
    t.unittype = getUserInfo().unittype
    t.districtId = getUserInfo().districtId
    t.getStructure()
  },
  methods:{
    async getStructure(){
      const t = this
      const res = await getStructure();
      if(res.data.code == 100){
        t.tableData = res.data.data
      }else{
        t.$message.warning(res.data.msg);
      }
    },
    openAdd(type,row){
      if(type == 'add'){
        this.editTitle = '新增'
        this.form.districtCode = row.code
      }else{
        this.editTitle = '修改'
        this.form.orgName = row.orgName
      }
      this.form.districtId = row.id
      this.showDialog = true
    },
    addData(){
      this.$refs.ruleForm.validate(async valid => {
        if (valid) {
          if(this.editTitle == '新增'){
            const res = await addDep(this.form);
            if(res.data.code == 100){
              this.$message.success('新增成功');
              this.showDialog = false
              await this.getStructure()
            }else{
              this.$message.warning(res.data.msg);
            }
          }else{
            const data = {
              id: this.form.districtId,
              orgName: this.form.orgName
            }
            const res = await editDep(data);
            if(res.data.code == 100){
              this.$message.success('修改成功');
              this.showDialog = false
              await this.getStructure()
            }else{
              this.$message.warning(res.data.msg);
            }
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    clearMod(){
      this.form = {
        orgName: '',
        districtId: null,
        districtCode: ''
      }
    },
    editData(row){
      const t = this
      t.areaForm.id = row.id
      t.areaForm.name = row.name
      t.showAreaDialog = true
    },
    confirmUpdate(){
      this.$refs.areaRuleForm.validate(async valid => {
        if (valid) {
          const res = await editArea(this.areaForm);
          if(res.data.code == 100){
            this.$message.success('修改成功');
            this.showAreaDialog = false
            await this.getStructure()
          }else{
            this.$message.warning(res.data.msg);
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      })
    },
    async delData(row){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否删除该条信息?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          delStructure(row.id).then(res=>{
            if(res.data.code == 100){
              t.$message.success('删除成功');
              t.getStructure()
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    }
  }
}
</script>
<style lang="less" scoped>
.delBtn{
  color: @danger
}
</style>
src/views/Admin/contactBook/subMenu.vue
对比新文件
@@ -0,0 +1,45 @@
<template functional>
  <a-sub-menu :key="props.menuInfo.id+'-'+props.menuInfo.name">
    <span slot="title"><span>{{props.menuInfo.name + '(' + props.menuInfo.userTotalCount + ')'}}</span></span>
    <template v-if="props.menuInfo.orgStructures && props.menuInfo.orgStructures.length > 0">
      <a-menu-item-group :key="props.menuInfo.name + '1'">
        <a-menu-item :key="dep.id +'-'+dep.orgName" v-for="(dep, i) in props.menuInfo.orgStructures">
          {{ dep.orgName + '(' + dep.userCount + ')' }}
        </a-menu-item>
      </a-menu-item-group>
    </template>
    <template v-if="props.menuInfo.children && props.menuInfo.children.length > 0">
      <a-menu-item-group :key="props.menuInfo.name + '2'">
        <sub-menu v-for="(child, index) in props.menuInfo.children" :menu-info="child"></sub-menu>
      </a-menu-item-group>
    </template>
  </a-sub-menu>
</template>
<script>
import subMenu from "@/views/Admin/contactBook/subMenu";
export default {
  name: 'pspSubMenu',
  components: {
    subMenu
  },
  props: ['menuInfo'],
  data(){
    return {
    }
  },
  created(){
  },
  mounted() {
    console.log(this.$props,55)
  },
  methods: {
  }
}
</script>
<style lang="scss" scoped>
</style>
src/views/Admin/massSend.vue
@@ -70,13 +70,52 @@
<!--        </a-col>-->
<!--      </a-row>-->
<!--            <span><b>发布单位:</b>{{form.publishingUnit}}</span>-->
            <br/><br/>
            <!-- 子单位-->
      <a-row :gutter="24">
        <a-col :span="12">
          <a-radio-group v-model="isNewTxl" button-style="solid" style="margin-bottom: 20px" @change="changeTxl">
            <a-radio-button :value="1">
              新通讯录
            </a-radio-button>
            <a-radio-button :value="2">
              原通讯录
            </a-radio-button>
          </a-radio-group>
        </a-col>
      </a-row>
      <a-row :gutter="24">
        <a-col :span="12" v-if="isNewTxl == 1">
          <div style="display:flex;justify-content: space-between;align-items: center;">
            <b>新通讯录接收人:</b>
            <a-checkbox :checked="checkTxlAll1" @change="checkTxlChange1">
              全选
            </a-checkbox>
          </div>
          <a-form-model-item prop="txlUsers">
            <a-tree-select
                show-search
                tree-checkable
                style="width: 100%"
                v-model="form.txlUsers"
                :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
                placeholder="选择新通讯录接收人"
                allow-clear
                multiple
                :maxTagCount="3"
                @change="onTxlChanges1"
                @search="onTxlSearch"
                @select="onTxlSelect"
                :tree-data="addressBook"
                :replaceFields="replaceTxlFields"
            >
            </a-tree-select>
          </a-form-model-item>
        </a-col>
        <a-col :span="12" v-else>
          <div style="display:flex;justify-content: space-between;align-items: center;">
            <b>原通讯录接收人:</b>
            <a-checkbox :checked="checkTxlAll" @change="checkTxlChange">
            <a-checkbox :checked="checkTxlAll2" @change="checkTxlChange2">
              全选
            </a-checkbox>
          </div>
@@ -91,11 +130,11 @@
                allow-clear
                multiple
                :maxTagCount="3"
                @change="onTxlChanges"
                @change="onTxlChanges2"
                @search="onTxlSearch"
                @select="onTxlSelect"
                :tree-data="addressBook"
                :replaceFields="replaceTxlFields"
                :tree-data="oldAddressBook"
                :replaceFields="replaceOldTxlFields"
            >
            </a-tree-select>
          </a-form-model-item>
@@ -187,6 +226,7 @@
import { TreeSelect } from 'ant-design-vue';
import { massSend } from "@/api/send";
import {getUserInfo} from "@/util/storage";
import {getNewAddressBook} from "@/api/contactBook";
    export default {
        name: "massSend",
        data() {
@@ -195,6 +235,7 @@
                department: '自治区自然灾害综合监测预警中心',
        filteredOptions:[],
        wrapperCol: { span: 24 },
        isNewTxl: 1,
        form: {
          id: null,
          emergType: null,
@@ -209,23 +250,25 @@
          verticalRecipient: [],
          horizontalRecipient: []
        },
        checkTxlAll: false,
        checkTxlAll1: false,
        checkTxlAll2: false,
        checkAll: false,
        checkSlAll: false,
        oldAddressBook: [],
        addressBook: [],
        replaceTxlFields: {
          children:'orgUsers',
          title:'name',
          key:'id',
          value: 'id'
        },
        replaceOldTxlFields: {
          children:'userInfos',
          title:'name',
          key:'id',
          value: 'id'
        },
        areaUsers: [],
        replaceFields: {
          children:'children',
          title:'name',
          key:'id',
          value: 'id'
        },
        riskOptions: [
          {name: '地震',value: 1},
          {name: '气象',value: 3},
@@ -244,6 +287,7 @@
          disasterType: [{ required: true, message: '请选择灾种', trigger: 'change'}],
          warningLevel: [{ required: true, message: '请选择预警级别', trigger: 'change'}],
          content: [{ required: true, message: '请输入信息内容', trigger: 'blur'}],
          txlUsers: [{ required: true, message: '请选择通讯录接收人', trigger: 'blur'}],
          // receiver: [{ required: true, message: '请选择接收单位', trigger: 'change'}],
          // recipient: [{ required: true, message: '请选择平级接收人', trigger: 'change'}]
          // verticalRecipient: [{ required: true, message: '请选择接收单位', trigger: 'change'}],
@@ -256,6 +300,7 @@
      const t = this
      t.form.publishingUnit = t.userInfo.company
      t.getUserByGroup()
      t.getNewAddressBook()
      t.getSameLevel()
      t.getAreaUsers()
    },
@@ -277,6 +322,31 @@
                  return item
              })
            }
            t.oldAddressBook = bookData
          }else{
            console.log('暂无数据')
          }
        }else{
          this.$message.warning(res.data.msg);
        }
      },
      // 获取新通讯录
      async getNewAddressBook(){
        let t = this
        let res = await getNewAddressBook()
        if(res.data.code == 100){
          if(res.data.data){
            let bookData = []
            bookData = res.data.data.filter(i=>i.orgUsers?.length>0)
            for(let j of bookData){
              j['name'] = j.orgName
              j.id = j.id.toString() + '-' + '1'
              j.orgUsers.map((item)=>{
                item.name = item.name + '('+ item.company + ' ' + item.phone.replace(/(\d{3})\d{4}(\d+)/, "$1****$2") + ')'
                return item
              })
            }
            t.addressBook = bookData
          }else{
            console.log('暂无数据')
@@ -284,6 +354,12 @@
        }else{
          this.$message.warning(res.data.msg);
        }
      },
      changeTxl(e){
        this.checkTxlAll1 = false
        this.checkTxlAll2 = false
        this.form.txlUsers = []
      },
      // 获取同级接收人
@@ -320,62 +396,44 @@
      },
      //选择子部门部分
      onTxlChanges(value,label,extra) {
      onTxlChanges1(value,label,extra) {
        const t = this
        if(t.form.txlUsers.length == 0){
          t.checkTxlAll = false
          t.checkTxlAll1 = false
        }
      },
      checkTxlChange(e) {
      onTxlChanges2(value,label,extra) {
        const t = this
        this.checkTxlAll = !this.checkTxlAll
        if(t.checkTxlAll == true){
        if(t.form.txlUsers.length == 0){
          t.checkTxlAll2 = false
        }
      },
      checkTxlChange1(e) {
        const t = this
        this.checkTxlAll1 = !this.checkTxlAll1
        if(t.checkTxlAll1 == true){
          let res = []
          for(let i of t.addressBook){
            if(i.userInfos && i.userInfos.length>0)
            res = res.concat(...i.userInfos)
            if(i.orgUsers && i.orgUsers.length>0)
            res = res.concat(...i.orgUsers)
          }
          t.form.txlUsers = res.map(i=>i.id)
        }else{
          t.form.txlUsers = []
        }
      },
            //选择子部门部分
            onChanges(value,label,extra) {
      checkTxlChange2(e) {
        const t = this
        if(t.form.receiver.length == 0){
          t.checkAll = false
        }
      },
      checkChange(e) {
        const t = this
        this.checkAll = !this.checkAll
        if(t.checkAll == true){
          t.form.receiver = t.traverseTree(t.areaUsers[0])
        this.checkTxlAll2 = !this.checkTxlAll2
        if(t.checkTxlAll2 == true){
          let res = []
          for(let i of t.oldAddressBook){
            if(i.userInfos && i.userInfos.length>0)
              res = res.concat(...i.userInfos)
          }
          t.form.txlUsers = res.map(i=>i.id)
        }else{
          t.form.receiver = []
        }
      },
      //选择平级部门部分
      handle(selectedItems) {
        const t = this
        if(t.form.recipient.length == t.filteredOptions.length){
          t.checkSlAll = true
        }else{
          t.checkSlAll = false
        }
      },
      checkSlChange(e) {
        const t = this
        t.checkSlAll = !t.checkSlAll
        if(t.checkSlAll == true){
          t.form.recipient = t.filteredOptions.map(i=>i.id)
        }else{
          t.form.recipient = []
          t.form.txlUsers = []
        }
      },
@@ -389,7 +447,8 @@
            const address = this.form.txlUsers.map((item)=>
                {
                  this.findUserById(item).recipientType = 3
                  const {addressBookGroupId,...data} = this.findUserById(item)
                  const {id,name,phone,company,...rest} = this.findUserById(item)
                  const data = { id,name,phone,company }
                  data.name = data.name.split('(')[0]
                  return data
                }
@@ -495,16 +554,29 @@
      },
      findUserById(id){
        for(let i of this.addressBook){
          if(i.userInfos && i.userInfos.length>0){
            for(let j of i.userInfos){
              if(j.id == id){
                return j
        if(this.isNewTxl == 1){
          for(let i of this.addressBook){
            if(i.orgUsers && i.orgUsers.length>0){
              for(let j of i.orgUsers){
                if(j.id == id){
                  return j
                }
              }
            }
          }
          return null
        }else{
          for(let i of this.oldAddressBook){
            if(i.userInfos && i.userInfos.length>0){
              for(let j of i.userInfos){
                if(j.id == id){
                  return j
                }
              }
            }
          }
          return null
        }
        return null
      },
      // 将树状数据所有id和name放入对象数组
src/views/Admin/responsor.vue
对比新文件
@@ -0,0 +1,338 @@
<template>
  <div class="inner">
    <a-row type="flex" justify="space-between" style="margin-bottom: 20px">
      <a-col :span="4" v-if="unittype && unittype !== null">
        <a-button type="primary" @click="editData('add',{})">新增用户</a-button>
      </a-col>
      <a-col :span="20">
        <a-row type="flex" :gutter="14">
          <a-col :span="6">
            <a-select v-model="search.searchParams.peerRecipientGroupId" placeholder="选择分组" style="width: 100%" @change="handleChange" allowClear show-search :filter-option="filterOption">
              <a-select-option v-for="item in groupData" :value="item.id" :key="item.id">{{item.name}}</a-select-option>
            </a-select>
          </a-col>
          <a-col :span="6">
            <a-input v-model="search.searchParams.company" placeholder="单位名称" style="width: 100%"/>
          </a-col>
          <a-col :span="6" v-if="unittype == null || !unittype">
            <a-cascader :options="areaData" v-model="areaVal" placeholder="所属区域" expandTrigger="hover" :fieldNames="fieldNames" changeOnSelect @change="onChange" style="width: 100%"/>
          </a-col>
          <a-col :span="6">
            <a-button type="primary" @click="getUserList" v-preventReClick="1500">查询</a-button>
            <a-button style="margin-left: 12px" @click="resetSearch">重置</a-button>
            <a-button type="danger" style="margin-left: 12px" @click="delBySet">批量删除</a-button>
          </a-col>
        </a-row>
      </a-col>
    </a-row>
    <div class="table-cont">
      <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.id" bordered :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
        <template #unittype="unittype">
          <a-tag
              :color="unittype === 1 ? 'purple' : unittype === 2 ? 'blue' : unittype === 3 ? 'cyan' : 'green'"
          >
            {{ unittype==1?'省级':unittype==2?'地(市、州)级':unittype==3?'区县级':unittype==4?'村(乡、镇)级':'管理员' }}
          </a-tag>
        </template>
        <template #area="text,row">
          <span v-if="row.province !== null && row.province !== ''">{{row.province}}</span>
          <span v-if="row.city !== null && row.city !== ''">-{{row.city}}</span>
          <span v-if="row.area !== null && row.area !== ''">-{{row.area}}</span>
          <span v-if="row.town !== null && row.town !== ''">-{{row.town}}</span>
        </template>
        <template #action="action,row">
          <a-button type="link" @click="editData('edit',row)">编辑</a-button>
          <a-button type="link" class="delBtn" @click="delData(row)">删除</a-button>
        </template>
      </a-table>
    </div>
    <same-level-mod ref="sameLevelMod" @refresh="getUserList"></same-level-mod>
  </div>
</template>
<script>
import {delRecipient, delRecipientBatch, delUser, getRecipient, getSameLevelGroupList, getUser} from '@/api/user'
import sameLevelMod from "@/views/Admin/components/sameLevelMod"
import {getUserInfo} from "@/util/storage";
import {getDistrictInfo} from "@/api/login";
export default {
  name: 'sameLevel',
  components: {
    sameLevelMod
  },
  data () {
    return {
      areaVal: [],
      unittype: null,
      districtId: null,
      search:{
        pageIndex: 1,
        pageSize: 10,
        searchParams:{
          company: '',
          province: '',
          city: '',
          area: '',
          town: '',
          peerRecipientGroupId: undefined
        }
      },
      selectedRowKeys: [],
      columns:[
        {
          title: '单位名称',
          dataIndex: 'company',
          key: 'company'
        },
        {
          title: '接收人姓名',
          dataIndex: 'recipientName',
          key: 'recipientName'
        },
        {
          title: '所属分组',
          dataIndex: 'peerRecipientGroupName',
          key: 'peerRecipientGroupName'
        },
        {
          title: '手机号码',
          dataIndex: 'phone',
          key: 'phone'
        },
        {
          title: '级别',
          dataIndex: 'unittype',
          // key: 'unittype',
          scopedSlots: { customRender: 'unittype' }
        },
        {
          title: '行政区划',
          dataIndex: 'area',
          // key: 'area',
          scopedSlots: { customRender: 'area' }
        },
        {
          title: '操作',
          width: '12%',
          key: 'action',
          scopedSlots: { customRender: 'action' }
        },
      ],
      tableData: [],
      groupData: [],
      pagination: {
        current: 1,
        defaultCurrent: 1,
        defaultPageSize: 10,
        total: 0,
        onChange: ( page, pageSize ) => this.onPageChange(page,pageSize),
        showTotal: total => `共 ${total} 条`
      },
      areaData: [],
      fieldNames:{
        label: 'name',
        value: 'id',
        children: 'children'
      }
    }
  },
  created() {
    const t = this
    t.groupData = []
    t.unittype = getUserInfo().unittype
    t.districtId = getUserInfo().districtId
    t.getGroupList()
    t.getUserList()
    t.getDistrictInfo()
  },
  methods:{
    async getUserList(){
      const t = this
      if(t.search.searchParams.province == '' && t.search.searchParams.city == '' && t.search.searchParams.area == '' && t.search.searchParams.company == '' && t.search.searchParams.peerRecipientGroupId == undefined){
        const {searchParams,...data} = t.search
        const res = await getRecipient(data)
        if(res.data.code == 100){
          t.tableData = res.data.data
          t.pagination.total = res.data.total
        }else{
          t.$message.warning(res.data.msg);
        }
      }else{
        const res = await getRecipient(t.search)
        if(res.data.code == 100){
          t.tableData = res.data.data
          t.pagination.total = res.data.total
        }else{
          t.$message.warning(res.data.msg);
        }
      }
    },
    async getDistrictInfo(){
      let res = await getDistrictInfo()
      if(res.data.code == 100){
        this.areaData = res.data.data
      } else {
        this.$message.warning(res.data.msg);
      }
    },
    async getGroupList() {
      const t = this
      const res = await getSameLevelGroupList();
      if(res.data.code == 100){
        if(res.data.data){
          let arr = res.data.data
          t.groupData = arr.concat([{id: -1, name: '未分类'}])
        }else{
          t.groupData = [{
            id: -1,
            name: '未分类'
          }]
        }
      }else{
        this.$message.error(res.data.msg)
      }
    },
    resetSearch(){
      const t = this
      t.areaVal = []
      t.search = {
        pageIndex: 1,
        pageSize: 10,
        searchParams:{
          company: '',
          province: '',
          city: '',
          area: '',
          town: '',
          peerRecipientGroupId: undefined
        }
      }
      t.getUserList()
    },
    editData(type,data){
      const t = this
      t.$refs.sameLevelMod.openDialog(type,data,t.groupData)
      t.$refs.sameLevelMod.areaData = t.areaData
      t.$refs.sameLevelMod.form.unittype = t.unittype
      t.$refs.sameLevelMod.form.districtId = t.districtId
    },
    filterOption(input, option) {
      return (
          option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
      );
    },
    async delData(row){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否删除该条用户信息?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          delRecipient(row.id).then(res=>{
            if(res.data.code == 100){
              t.$message.success('删除用户信息成功');
              t.getUserList()
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    },
    // 根据id查对象
    findCodeById(data,value) {
      for (const node of data) {
        if (node.id === value) {
          return node;
        }
        if (node.children) {
          const foundNode = this.findCodeById(node.children, value);
          if (foundNode) {
            return foundNode;
          }
        }
      }
      return null;
    },
    async delBySet(){
      const t = this
      this.$confirm({
        title: '提示',
        content: h => <div>是否删除所选用户信息?</div>,
        cancelText: '取消',
        okText: '确认',
        centered: true,
        onOk() {
          delRecipientBatch(t.selectedRowKeys.join(',')).then(res=>{
            if(res.data.code == 100){
              t.$message.success('删除用户信息成功');
              t.getUserList()
              t.selectedRowKeys = []
            }else{
              t.$message.warning(res.data.msg);
            }
          })
        },
        onCancel() {
          console.log('Cancel');
        },
      });
    },
    onPageChange(page, pageSize) {
      const t= this
      t.pagination.current = page
      t.search.pageIndex = page
      t.getUserList()
    },
    onChange(value) {
      const t = this
      t.search.searchParams = {
        company: '',
        province: '',
        city: '',
        area: '',
        town: '',
        peerRecipientGroupId: undefined
      }
      if(value[0]){
        t.search.searchParams.province = t.findCodeById(t.areaData,value[0]).name
      }
      if(value[1]){
        t.search.searchParams.city = t.findCodeById(t.areaData,value[1]).name
      }
      if(value[2]){
        t.search.searchParams.area = t.findCodeById(t.areaData,value[2]).name
      }
      if(value[3]){
        t.search.searchParams.town = t.findCodeById(t.areaData,value[3]).name
      }
    },
    handleChange(value) {
      console.log(`selected ${value}`);
      this.getUserList()
    },
    onSelectChange(selectedRowKeys) {
      this.selectedRowKeys = selectedRowKeys;
    },
  }
}
</script>
<style lang="less" scoped>
.delBtn{
  color: @danger
}
</style>