zhouwx
2024-08-30 1f6893d24ba87313d4114c68813073ead53b2e12
src/views/Admin/contactBook/contactors.vue
@@ -23,18 +23,29 @@
            <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 style="margin: 20px 0;display: flex;justify-content: space-between">
          <div style="display: flex;align-items: center">
            <a-button  type="primary" style="margin-right: 10px" @click="editData('add',{})">新增</a-button>
            <a-button  type="primary" @click="massImport()">批量导入</a-button>
          </div>
          <a-button type="primary" @click="openExport">批量导出</a-button>
        </div>
        <div style="display: flex;align-items: center;margin-bottom: 15px">
          <a-input v-model="search.searchParams.name" placeholder="请输入姓名" style="width: 250px;margin-right: 10px"></a-input>
          <a-input v-model="search.searchParams.phone" placeholder="请输入电话" style="width: 250px;margin-right: 10px"></a-input>
          <a-input v-model="search.searchParams.company" placeholder="请输入单位" style="width: 250px;margin-right: 10px"></a-input>
          <a-button  type="primary" style="margin-right: 10px" @click="getUserList()">查询</a-button>
          <a-button   @click="resetSearch()">重置</a-button>
        </div>
        <div class="table-cont">
          <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.id" bordered>
          <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.id.toString()" bordered>
            <template #index="text,record,index">
              {{ index + 1 }}
            </template>
            <template #orgName="text,record,index">
              {{currentKey.length>0?currentKey[0].split('-')[1]: ''}}
            </template>
<!--            <template #orgStructureName="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>
@@ -65,6 +76,33 @@
        </a-form-model-item>
      </a-form-model>
    </a-modal>
    <a-modal v-model="exportDialog" title="导出通讯录" :footer="null" centered :afterClose="closeDialog">
      <a-form-model ref="ruleForm" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false">
        <a-form-model-item label="行政区划" >
          <a-tree-select
              v-model="exportAreaId"
              style="width: 100%"
              :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
              :tree-data="treeData"
              placeholder="请选择行政区划"
              :replaceFields="replaceFields"
              @change="changeArea"
          />
        </a-form-model-item>
        <div v-if=" json_data.length>0">
          <download-excel :data="json_data" :fields="json_fields" name="责任人导出.xlsx" style="display: flex;justify-content: flex-end">
            <a-button type="primary">批量导出</a-button>
          </download-excel>
        </div>
        <div v-else style="text-align: center;color: salmon">暂无人员导出</div>
      </a-form-model>
    </a-modal>
    <a-modal v-model="importDialog" title="导入失败列表" :footer="null" centered :afterClose="closeImportDialog">
      <span style="margin-bottom: 20px;font-size: 16px">{{errorMsg}}</span>
      <a-table :columns="errColumns" :data-source="errorData"  :rowKey="record=>record.id" bordered :pagination="false" :scroll="{y:'200px'}">
      </a-table>
    </a-modal>
  </div>
</template>
@@ -80,10 +118,9 @@
} from "@/api/contactBook";
import subMenu from "@/views/Admin/contactBook/subMenu";
import contactorsMod from "@/views/Admin/components/contactorsMod"
import {importUser} from "@/api/user";
import {getExportData, importUser} from "@/api/user";
import importNew from "@/assets/importNew.xlsx";
import exampleFile from "@/assets/example.xlsx";
import JSONBig from 'json-bigint'
export default {
  name: 'sameLevel',
  components: {
@@ -103,12 +140,14 @@
      unittype: null,
      districtId: null,
      currentKey: [],
      importDialog:false,
      search:{
        pageIndex: 1,
        pageSize: 10,
        searchParams: {
          name: '',
          phone: '',
          company: '',
          orgStructureId: null
        }
      },
@@ -128,10 +167,8 @@
        },
        {
          title: '所属组织架构',
          dataIndex: 'orgName',
          scopedSlots: {
            customRender: 'orgName'
          }
          dataIndex: 'orgStructureName',
          key: 'orgStructureName'
        },
        {
          title: '所属单位',
@@ -180,21 +217,75 @@
        onChange: ( page, pageSize ) => this.onPageChange(page,pageSize),
        showTotal: total => `共 ${total} 条`
      },
      paginationErr: {
        current: 1,
        defaultCurrent: 1,
        defaultPageSize: 10,
        total: 0,
        onChange: ( page, pageSize ) => this.onPageChangeErr(page,pageSize),
        showTotal: total => `共 ${total} 条`
      },
      fieldNames:{
        label: 'name',
        value: 'id',
        children: 'children'
      },
      currentId: null
      currentId: null,
      exportDialog: false,
      areaId: null,
      areaData: [],
      exportAreaId: null,
      replaceFields: {
        children:'children',
        title:'name',
        key:'id',
        value: 'code'
      },
      json_fields: {
        'ID': {
          field: 'id',
          callback: value => {
            return '&nbsp;'+value
          }
        },
        '姓名': 'name',
        '所属当前级别行政区划': 'districtName',
        '区划编号': 'districtCode',
        '组织架构': 'orgStructureName',
        '单位': 'company',
        '职务': 'post',
        '电话号码': 'phone',
        '责任类型': {
          field: 'orgUserTypes',
          callback: (value) => {
            return value?value.map(i=>i.typeName + '(' + i.orgUserTags.map(j=>j.tagName).join('/') +')').join(','): ''
          }
        },
      },
      json_data: [],
      errorData: [],
      errorMsg: '',
      errColumns:[
        {
          title: '姓名',
          dataIndex: 'name',
          key: 'name'
        },
        {
          title: '失败原因',
          dataIndex: 'errorMsg',
          key: 'errorMsg'
        },
      ],
    }
  },
  created() {
    const t = this
    t.unittype = getUserInfo().unittype
    t.districtId = getUserInfo().districtId
    t.getStructure()
    t.getUserList()
    t.getUpdataData()
    t.getStructure()
  },
  mounted() {
@@ -207,7 +298,7 @@
  methods:{
    downloadFile(){
      const link = document.createElement('a')
      link.href = exampleFile
      link.href = importNew
      link.target = '_blank'
      link.download = '通讯录导入模板.xlsx'
      link.click()
@@ -249,6 +340,11 @@
          this.uploadLoading = false
          this.visible = false
          await this.getUserList()
          if(res.data.data && res.data.data.length>0){
            this.errorMsg = res.data.msg
            this.errorData = res.data.data
            this.importDialog = true;
          }
        }else{
          this.$message.warning(res.data.msg);
          this.uploadLoading = false
@@ -258,24 +354,48 @@
    clearMod(){
      this.fileList = []
    },
    closeDialog(){
      this.exportAreaId = null;
      this.json_data = [];
      this.exportDialog = false;
    },
    closeImportDialog(){
      this.errorMsg = '';
      this.errorData = [];
      this.importDialog = false;
    },
    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('暂无可操作的单位,请先进入“组织架构维护页面”新建相应的本级单位')
        }
        console.log('res',res)
        t.treeData = t.filterBranches(res.data.data,['自治区直辖县级行政区划'])
        console.log('treeData',t.treeData)
        // 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)
      }
    },
    filterBranches(branches, targetNames) {
      return branches.filter(branch => {
        if (targetNames.includes(branch.name)) {
          return false; // 过滤掉当前分支
        }
        if (branch.children && branch.children.length > 0) {
          branch.children = this.filterBranches(branch.children, targetNames);
        }
        return true; // 保留当前分支
      });
    },
    firstIdWithOrgStructures(node) {
      if (node.orgStructures && node.orgStructures.length > 0) {
@@ -303,6 +423,9 @@
      }
    },
    openExport() {
      this.exportDialog = true
    },
    handleClick(e) {
      this.currentId = e.keyPath[1]?e.keyPath[1].split('-')[0]:e.keyPath[0].split('-')[0]
@@ -312,6 +435,7 @@
        searchParams: {
          name: '',
          phone: '',
          company: '',
          orgStructureId: null
        }
      }
@@ -343,20 +467,31 @@
      t.search = {
        pageIndex: 1,
        pageSize: 10,
        searchParams: {
          name: '',
          phone: '',
          company: '',
          orgStructureId: t.search.searchParams.orgStructureId
        }
      }
      t.getUserList()
    },
    editData(type,data){
      const t = this
      if(type == 'add' && (!t.currentId || !t.currentKey)){
        t.$message.warning('暂无可操作的单位,请先进入“组织架构维护页面”新建相应的本级单位')
        return
      if(type == 'add'){
        if(!t.currentId || !t.currentKey){
          t.$message.warning('请先在左侧选择单位再进行新增')
          return
        }else {
          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)
        }
      }else{
        t.$refs.contactMod.openDialog(type,data,data.districtId,data.orgStructureName,data.orgStructureId)
      }
      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){
@@ -382,6 +517,18 @@
        },
      });
    },
    changeArea(value){
      console.log('val',this.exportAreaId)
      getExportData(this.exportAreaId).then(res => {
        if(res.data.code == 100){
          this.json_data = res.data.data
          console.log('this.json_data',this.json_data)
        }else{
          this.$message.warning(res.data.msg);
        }
      })
    },
    async deliverTask(){
      const t = this