From 1f6893d24ba87313d4114c68813073ead53b2e12 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 30 八月 2024 09:26:22 +0800 Subject: [PATCH] 群发新通讯录懒加载 --- src/views/Admin/massSend.vue | 755 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 649 insertions(+), 106 deletions(-) diff --git a/src/views/Admin/massSend.vue b/src/views/Admin/massSend.vue index 59301a3..ad09f01 100644 --- a/src/views/Admin/massSend.vue +++ b/src/views/Admin/massSend.vue @@ -1,11 +1,19 @@ <template> <div class="inner"> + <a-alert + message="管理员身份无法进行短信群发操作" + banner + closable + v-if="userInfo.role.id === 1" + type="error" + style="margin-bottom: 12px" + /> <h2>预警信息发布</h2> - <a-form-model :model="form" :wrapper-col="wrapperCol"> + <a-form-model ref="ruleForm" :model="form" :rules="rules" :wrapper-col="wrapperCol"> <div class="left"> - <a-form-model-item prop="title"> - <a-input v-model="form.title" placeholder="请输入标题" style="height: 50px; font-size: 20px;" /> - </a-form-model-item> +<!-- <a-form-model-item prop="title">--> +<!-- <a-input v-model="form.title" placeholder="请输入标题" style="height: 50px; font-size: 20px;" />--> +<!-- </a-form-model-item>--> <!-- <a-row>--> <!-- <a-col :span="12" style="display: flex;align-items: center">--> <!-- <span style="display: block;margin-bottom: 24px">相关灾种</span>--> @@ -19,96 +27,185 @@ <a-row> <a-col :span="12"> - <a-form-model-item prop="type"> - <a-radio-group v-model="form.type" default-value="a" button-style="solid"> - <a-radio-button value="a"> + <a-form-model-item prop="emergType"> + <a-radio-group v-model="form.emergType" button-style="solid"> + <a-radio-button :value="2"> 常规 </a-radio-button> - <a-radio-button value="b"> + <a-radio-button :value="1"> 紧临 </a-radio-button> </a-radio-group> </a-form-model-item> </a-col> <a-col :span="12" style="display: flex;align-items: center;justify-content: right"> - <a-form-model-item prop="riskType" style="margin-right: 20px"> - <a-select placeholder="请选择相关灾种" v-model="form.riskType" style="width: 240px" allowClear @change="handleRisk"> - <a-select-option v-for="item in riskOptions" :key="item.value" :value="item.value"> + <a-form-model-item prop="disasterType" style="margin-right: 20px"> + <a-select placeholder="请选择相关灾种" v-model="form.disasterType" style="width: 240px" allowClear @change="handleRisk"> + <a-select-option v-for="(item,index) in riskOptions" :key="item.id" :value="item.value"> {{ item.name }} </a-select-option> </a-select> </a-form-model-item> - <a-form-model-item prop="level"> - <a-select placeholder="请选择预警级别" v-model="form.level" style="width: 240px" allowClear @change="handleLevel"> - <a-select-option v-for="item in levelOptions" :key="item.value" :value="item.value"> + <a-form-model-item prop="warningLevel"> + <a-select placeholder="请选择预警级别" v-model="form.warningLevel" style="width: 240px" allowClear @change="handleLevel"> + <a-select-option v-for="(item,index) in levelOptions" :key="item.id" :value="item.value"> {{ item.name }} </a-select-option> </a-select> </a-form-model-item> </a-col> </a-row> - <a-form-model-item prop="message"> - <a-textarea v-model="form.message" placeholder="请输入短信通知内容部分" :auto-size="{ minRows: 3, maxRows: 5 }" /> + <a-form-model-item prop="content"> + <a-textarea v-model="form.content" placeholder="请输入短信通知内容部分" :auto-size="{ minRows: 3, maxRows: 5 }" /> </a-form-model-item> - <a-row> +<!-- <a-row>--> +<!-- <a-col :span="12">--> +<!-- <a-button>上传附件</a-button>--> +<!-- </a-col>--> +<!-- <a-col :span="12" style="display: flex;align-items: center;justify-content: right">--> +<!-- <b style="margin-bottom: 24px">超时设置:</b>--> +<!-- <a-form-model-item prop="overTime">--> +<!-- <a-input v-model="form.overTime" style="width:200px;" placeholder="输入时间" suffix="分钟"/>--> +<!-- </a-form-model-item>--> +<!-- </a-col>--> +<!-- </a-row>--> +<!-- <span><b>发布单位:</b>{{form.publishingUnit}}</span>--> + + <a-row :gutter="24" v-if="unittype == 1"> <a-col :span="12"> - <a-button>上传附件</a-button> - </a-col> - <a-col :span="12" style="display: flex;align-items: center;justify-content: right"> - <b style="margin-bottom: 24px">超时设置:</b> - <a-form-model-item prop="overTime"> - <a-input v-model="form.overTime" style="width:200px;" placeholder="输入时间" suffix="分钟"/> - </a-form-model-item> + <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> - <span><b>发布单位:</b>{{department}}</span> - <br/><br/> - <!-- 子单位--> + <a-row :gutter="24"> - <a-col :span="12"> - <b style="margin-bottom: 6px">选择接收单位:</b> - <a-form-model-item prop="svalue"> + <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 + @change="onChangeUser" + v-model="form.txlUsers" + tree-checkable + :tree-data="addressBook" + + :replaceFields="{ + title: 'name', // == 下拉框显示值 == + children: 'children', + value: 'id' + }" + search-placeholder="请选择" + class="color-select" + :maxTagCount="3" + style="min-width: 100%" + :dropdownStyle="{ width: '600px' }" + :dropdownMatchSelectWidth="false" + treeNodeLabelProp="label" + :load-data="onLoadData" + > + </a-tree-select> +<!-- <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="checkTxlAll2" @change="checkTxlChange2"> + 全选 + </a-checkbox> + </div> + <a-form-model-item prop="txlUsers"> <a-tree-select show-search tree-checkable - treeCheckStrictly style="width: 100%" - v-model="form.svalue" + v-model="form.txlUsers" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" - placeholder="选择工作通知接收单位" + placeholder="选择原通讯录接收人" allow-clear multiple - tree-default-expand-all - @change="onChanges" - @search="onSearch" - @select="onSelect" - > - <a-tree-select-node key="0" value="all" title="全选"> - </a-tree-select-node> - <a-tree-select-node key="0-1" value="乌鲁木齐" title="乌鲁木齐(张XX 13268813610)"> - <a-tree-select-node key="0-1-1" value="米东区" title="米东区(张XX 13268813610)"> - <a-tree-select-node key="0-1-1-1" value="XX村1" title="XX村(李有田 13268813610)" /> - </a-tree-select-node> - <a-tree-select-node key="0-1-2" value="天山区" title="天山区"> - <a-tree-select-node key="0-1-2-1" value="XX村2"> - <b slot="title" style="color: #08c">XX村</b> - </a-tree-select-node> - </a-tree-select-node> - </a-tree-select-node> + :maxTagCount="3" + @change="onTxlChanges2" + @search="onTxlSearch" + @select="onTxlSelect" + :tree-data="oldAddressBook" + :replaceFields="replaceOldTxlFields" + > </a-tree-select> </a-form-model-item> </a-col> - <a-col :span="12"> - <b style="margin-bottom: 6px">平级接收人选择:</b> - <a-form-model-item prop="sameDep"> - <a-select mode="multiple" placeholder="选择平级接收单位" v-model="form.sameDep" @change="handle"> - <a-select-option v-for="item in filteredOptions" :key="item" :value="item"> - {{ item }} - </a-select-option> - </a-select> - </a-form-model-item> - </a-col> </a-row> +<!-- <a-row :gutter="24">--> +<!-- <a-col :span="12">--> +<!-- <div style="display:flex;justify-content: space-between;align-items: center;">--> +<!-- <b>选择接收单位:</b>--> +<!-- <a-checkbox :checked="checkAll" @change="checkChange">--> +<!-- 全选--> +<!-- </a-checkbox>--> +<!-- </div>--> +<!-- <a-form-model-item prop="receiver">--> +<!-- <a-tree-select--> +<!-- show-search--> +<!-- tree-checkable--> +<!-- treeCheckStrictly--> +<!-- style="width: 100%"--> +<!-- v-model="form.receiver"--> +<!-- :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"--> +<!-- placeholder="选择工作通知接收单位"--> +<!-- allow-clear--> +<!-- multiple--> +<!-- :maxTagCount="3"--> +<!-- @change="onChanges"--> +<!-- @search="onSearch"--> +<!-- @select="onSelect"--> +<!-- :tree-data="areaUsers"--> +<!-- :replaceFields="replaceFields"--> +<!-- >--> +<!-- </a-tree-select>--> +<!-- </a-form-model-item>--> +<!-- </a-col>--> +<!-- <a-col :span="12">--> +<!-- <div style="display:flex;justify-content: space-between;align-items: center;">--> +<!-- <b>平级接收人选择:</b>--> +<!-- <a-checkbox :checked="checkSlAll" @change="checkSlChange">--> +<!-- 全选--> +<!-- </a-checkbox>--> +<!-- </div>--> +<!-- <a-form-model-item>--> +<!-- <a-select mode="multiple" placeholder="选择平级接收单位" v-model="form.recipient" @change="handle">--> +<!-- <a-select-option v-for="item in filteredOptions" :key="item.id" :value="item.id" :maxTagCount="3">--> +<!-- {{ item.recipientName }}({{item.company}} {{item.phone}})--> +<!-- </a-select-option>--> +<!-- </a-select>--> +<!-- </a-form-model-item>--> +<!-- </a-col>--> +<!-- </a-row>--> <!-- <div>--> <!-- <b>选择审批领导:</b> --> <!-- <a-select show-search placeholder="请选择审批领导"--> @@ -126,7 +223,7 @@ <!-- </a-select>--> <!-- </div>--> <div style="display: flex;justify-content: right"> - <a-button type="primary" style="width: 250px;"> + <a-button type="primary" style="width: 250px;" @click="confirmSend()" :disabled="userInfo.role.id==1?true:false" v-preventReClick="1500"> 确认发送 </a-button> </div> @@ -136,7 +233,7 @@ <h2>短信预览</h2> <div class="mobile"> <div class="mesg"> - <P>【{{form.title}}】{{form.message}}。发布单位:{{department}}</P> + <P>【防灾减灾工作提示】{{form.content}}</P> </div> </div> @@ -146,65 +243,442 @@ </template> <script> - - - const OPTIONS = ['自治区消防(李XX)', '自治区公安厅(王XX)', '自治区自然资源厅(刘XX)']; +import {getPeerRecipient, getAreaWithUserIfo, getUserByGroup} from '@/api/user' +import { TreeSelect } from 'ant-design-vue'; +import { massSend } from "@/api/send"; +import {getUserInfo} from "@/util/storage"; +import {getNewAddressBook, getNewAddressBookArea, getNewAddressBookUser} from "@/api/contactBook"; +import {debounce} from "@/util/debounce"; export default { - name: "release", + name: "massSend", data() { return { - message: '', - signname: '自然灾害风险预警提示', + newBookUsers: [], + currentLoadedKeys: [], + districtId: null, + userInfo: getUserInfo(), department: '自治区自然灾害综合监测预警中心', + filteredOptions:[], wrapperCol: { span: 24 }, + isNewTxl: 1, + unittype: null, form: { - title: '', - riskType: 1, - level: 1, - type: 'a', - svalue: undefined, - sameDep: [], - message: '', - overTime: '' + id: null, + emergType: null, + disasterType: undefined, + warningLevel: undefined, + content: '', + publishingUnit: '', + txlUsers: [], + receiver: [], + recipient: [], + addressBookRecipient: [], + verticalRecipient: [], + horizontalRecipient: [] }, + checkTxlAll1: false, + checkTxlAll2: false, + checkAll: false, + checkSlAll: false, + oldAddressBook: [], + addressBook: [], + replaceTxlFields: { + children:'children', + title:'name', + key:'id', + value: 'code' + }, + replaceOldTxlFields: { + children:'userInfos', + title:'name', + key:'id', + value: 'id' + }, + areaUsers: [], riskOptions: [ - {name: '地震',value: 1}, - {name: '洪涝',value: 2}, - {name: '气象',value: 3}, - {name: '泥石流',value: 4}, - {name: '水旱',value: 5}, - {name: '森林草原火灾',value: 6} + {id: 1,name: '地震',value: 1}, + {id: 2,name: '气象',value: 3}, + {id: 3,name: '地质灾害',value: 4}, + {id: 4,name: '水旱',value: 5}, + {id: 5,name: '森林草原火灾',value: 6} ], levelOptions: [ - {name: '红色预警',value: 1}, - {name: '橙色预警',value: 2}, - {name: '黄色预警',value: 3}, - {name: '蓝色预警',value: 4}, - {name: '其他短信通知',value: 5} - ] + {id: 6,name: '红色预警',value: 1}, + {id: 7,name: '橙色预警',value: 2}, + {id: 8,name: '黄色预警',value: 3}, + {id: 9,name: '蓝色预警',value: 4} + ], + rules: { + emergType: [{ required: true, message: '请选择紧急类型', trigger: 'change'}], + 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'}], + // horizontalRecipient: [{ required: true, message: '请选择平级接收人', trigger: 'change'}] + } }; }, components: {}, - computed: { - filteredOptions() { - return OPTIONS.filter(o => !this.form.sameDep.includes(o)); - }, + created() { + const t = this + t.unittype = getUserInfo().unittype + t.form.publishingUnit = t.userInfo.company + t.districtId = t.userInfo.districtId + t.getUserByGroup() + t.getNewAddressBook() + t.getSameLevel() + t.getAreaUsers() + + }, + computed: { }, methods: { - //选择子部门部分 - onChanges(value) { - if(value.find(i=>i.value == 'all')){ - console.log('全选了') - }else{ - this.svalue = value; + // 获取原通讯录 + async getUserByGroup(){ + let t = this + let res = await getUserByGroup() + if(res.data.code == 100){ + if(res.data.data){ + let bookData = [] + bookData = res.data.data.filter(i=>i.userInfos?.length>0) + for(let j of bookData){ + j.id = j.id.toString() + '-' + '1' + j.userInfos.map((item)=>{ + item.name = item.name + '('+ item.company + ' ' + item.phone.replace(/(\d{3})\d{4}(\d+)/, "$1****$2") + ')' + return item + }) } - console.log(this.svalue); - }, + t.oldAddressBook = bookData + }else{ + console.log('暂无数据') + } + }else{ + this.$message.warning(res.data.msg); + } + }, + + // 获取新通讯录 + async getNewAddressBook(){ + let t = this + let res = await getNewAddressBookArea() + if(res.data.code == 100){ + if(res.data.data){ + const data = t.filterBranches(res.data.data,['自治区直辖县级行政区划']) + // console.log(' 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 + t.addressBook = this.getData(data,'book') + console.log(' t.addressBook', t.addressBook) + }else{ + console.log('暂无数据') + } + }else{ + this.$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; // 保留当前分支 + }); + }, + getData(data, dataIndex) { + const list = data.map((item, index) => { + if (item.children && item.children.length > 0) { + item.children = item.children.map((child) => { + return { + ...child, + type: 'children', // 添加标识符,判断是否为children/labels 给需求4使用 + label: child.name, // a-tree-select 中为选中子节点的内容和展示字节点内容做区分 + } + }) + this.getData(item.children, dataIndex + '-' + index) + } else { + item.children = [] + } + + if (item.orgStructures && item.orgStructures.length > 0) { + + item.children = item.orgStructures.map((label) => { + return { + ...label, + id: label.orgId, + type: 'label', + label: label.orgName, + name: `${label.orgName}`, // 需求2 + } + }).concat( + item.children.map((child) => { + return { + ...child, + type: 'children', + label: child.name, + } + }) + ) + + + // item.children = item.children.map((child) => { + // return { + // ...child, + // type: 'children', + // label: child.name, + // } + // }).concat( + // item.orgStructures.map((label) => { + // return { + // ...label, + // id: label.orgId, + // type: 'label', + // label: label.orgName, + // name: `${label.orgName}`, // 需求2 + // } + // }) + // ) + } + return { + ...item, + label: item.name, + key: dataIndex + '-' + index, + } + }) + return list + }, + onChangeUser(value, label, extra){ + this.form.txlUsers = this.form.txlUsers.filter(item=> { + const i = String(item) + if(i.indexOf('user') != -1){ + return item + } + }) + }, + onLoadData(treeNode) { + // 懒加载内部数据 + const _this = this + return new Promise(resolve => { + if(treeNode.dataRef.children && treeNode.dataRef.children.length>0){ + resolve() + }else { + this.loadData(treeNode) + resolve() + } + }) + }, + async loadData (treeNode) { + let orgId = null + if(treeNode.dataRef.orgId){ + orgId = treeNode.dataRef.orgId.slice(2) + }else { + orgId = treeNode.dataRef.id + } + console.log('treeNode',treeNode) + let res = await getNewAddressBookUser(orgId) + if(res.data.code === 100) { + + this.newBookUsers = this.newBookUsers.concat(res.data.data) + treeNode.dataRef.children = res.data.data.map(item => { + return { + ...item, + label: item.name + ' '+ item.phone.replace(/(\d{3})\d{4}(\d+)/, "$1****$2"), + name: item.name + '('+ item.company + ' ' + item.phone.replace(/(\d{3})\d{4}(\d+)/, "$1****$2") + ')', + id: 'user-' + item.id, + isLeaf: true + } + }) + this.$forceUpdate(); + } + }, + + changeTxl(e){ + this.checkTxlAll1 = false + this.checkTxlAll2 = false + this.form.txlUsers = [] + }, + + // 获取同级接收人 + async getSameLevel(){ + let t = this + let res = await getPeerRecipient() + if(res.data.code == 100){ + if(res.data.data){ + t.filteredOptions = res.data.data + }else{ + console.log('暂无数据') + } + }else{ + this.$message.warning(res.data.msg); + } + }, + + // 获取接收单位 + async getAreaUsers(){ + let t = this + let res = await getAreaWithUserIfo() + if(res.data.code == 100){ + if(res.data.data){ + const treeD = [] + t.userTitTree(res.data.data) + treeD.push(t.findNodeById(res.data.data,t.userInfo.districtId)) + t.areaUsers = treeD + }else{ + console.log('暂无数据') + } + }else{ + this.$message.warning(res.data.msg); + } + }, + + //选择子部门部分 + onTxlChanges1(value,label,extra) { + const t = this + if(t.form.txlUsers.length == 0){ + t.checkTxlAll1 = false + } + }, + onTxlChanges2(value,label,extra) { + const t = this + 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.orgUsers && i.orgUsers.length>0) + res = res.concat(...i.orgUsers) + } + t.form.txlUsers = res.map(i=>i.id) + }else{ + t.form.txlUsers = [] + } + }, + checkTxlChange2(e) { + const t = this + 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.txlUsers = [] + } + }, + + confirmSend(){ + this.$refs.ruleForm.validate(valid => { + if (valid) { + this.form.addressBookRecipient = [] + this.form.verticalRecipient = [] + this.form.horizontalRecipient = [] + + let address = [] + if(this.isNewTxl == 1){ + const userIds = this.form.txlUsers.map(item => item.slice(5)) + address = userIds.map(item => { + const {id,name,phone,company,...rest} = this.findUser(item) + const data = { id,name,phone,company } + console.log('daa',data) + return data + }) + }else { + address = this.form.txlUsers.map((item)=> + { + this.findUserById(item).recipientType = 3 + const {id,name,phone,company,...rest} = this.findUserById(item) + const data = { id,name,phone,company } + data.name = data.name.split('(')[0] + return data + } + ) + } + this.form.addressBookRecipient = address + const aList = this.form.receiver.map(item=>this.findNodeById(this.areaUsers,item.value)?.users) + if(aList.includes(null)){ + this.$message.error('选择接收单位时存在无用户的单位') + return + } + const newAList = [].concat(...aList) + for(let i of newAList){ + const {id,roleId,...data} = i + const {company: recipientUnit,...rest} = data + const obj = {recipientUnit,recipientType:1,...rest} + this.form.verticalRecipient.push(obj) + } + + if(this.form.recipient.length>0){ + const bList = this.form.recipient.map(item => this.filteredOptions.find(i=>i.id == item)) + for(let i of bList){ + const {recipientName: name, company: recipientUnit,...rest} = i + const obj = {name,recipientUnit,recipientType:2,realName: name,...rest} + const {id,...noId} = obj + this.form.horizontalRecipient.push(noId) + } + } + const {txlUsers,receiver,recipient,...data} = this.form + massSend(data).then( res =>{ + if(res.data.code == 100){ + this.$message.success('信息群发成功') + this.$refs.ruleForm.clearValidate() + this.$refs.ruleForm.resetFields() + this.form.recipient = [] + this.checkTxlAll = false + this.checkAll = false + this.checkSlAll = false + }else{ + this.$message.error(res.data.msg) + this.$refs.ruleForm.clearValidate() + this.$refs.ruleForm.resetFields() + } + }) + }else{ + console.log('error submit!!'); + return false; + } + }) + }, + findUser(id){ + for(let i of this.newBookUsers){ + if(i.id == id){ + return i + } + } + return null + }, + onSearch() { - console.log(...arguments); + // console.log(...arguments); }, onSelect() { - console.log(...arguments); + // console.log(...arguments); + }, + onTxlSearch() { + // console.log(...arguments); + }, + onTxlSelect() { + // console.log(...arguments); }, //选择平级部门部分 handleRisk(selectedItems) { @@ -213,9 +687,6 @@ handleLevel(selectedItems) { // this.selectedItems = selectedItems; }, - handle(selectedItems) { - // this.selectedItems = selectedItems; - }, onChange(){ console.log(this.value) }, @@ -233,6 +704,78 @@ option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 ); }, + + // 根据id查对象 + findNodeById(data,value) { + for (const node of data) { + if (node.id === value) { + return node; + } + if (node.children) { + const foundNode = this.findNodeById(node.children, value); + if (foundNode) { + return foundNode; + } + } + } + return null; + }, + + findUserById(id){ + 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 + } + }, + + // 将树状数据所有id和name放入对象数组 + traverseTree(treeData) { + let result = []; + function traverse(node) { + if(node.users && node.users.length>0){ + result.push({ label: node.name, value: node.id }); + if (node.children && node.children.length > 0) { + for (let child of node.children) { + traverse(child); + } + } + } + } + traverse(treeData); + return result; + }, + + // 将树状数据新增title字段放入users的姓名电话 + userTitTree(treeData) { + for(const node of treeData){ + if(node.users){ + node.name = node.name + '('+node.users.map(i=>i.realName +' '+ i.phone).join(',')+')' + } + if(node.children){ + this.userTitTree(node.children) + } + } + return treeData + } }, } </script> @@ -276,4 +819,4 @@ } } -</style> \ No newline at end of file +</style> -- Gitblit v1.9.2