| | |
| | | <template> |
| | | <div class="inner"> |
| | | <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>--> |
| | |
| | | |
| | | <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-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 in riskOptions" :key="item.value" :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-form-model-item prop="warningLevel"> |
| | | <a-select placeholder="请选择预警级别" v-model="form.warningLevel" style="width: 240px" allowClear @change="handleLevel"> |
| | | <a-select-option v-for="item in levelOptions" :key="item.value" :value="item.value"> |
| | | {{ item.name }} |
| | | </a-select-option> |
| | |
| | | </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-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>{{department}}</span> |
| | | <!-- <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> |
| | | <br/><br/> |
| | | <!-- 子单位--> |
| | | <a-row :gutter="24"> |
| | | <a-col :span="12"> |
| | | <b style="margin-bottom: 6px">选择接收单位:</b> |
| | | <a-form-model-item prop="svalue"> |
| | | <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.svalue" |
| | | v-model="form.receiver" |
| | | :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" |
| | | placeholder="选择工作通知接收单位" |
| | | allow-clear |
| | | multiple |
| | | tree-default-expand-all |
| | | @change="onChanges" |
| | | @search="onSearch" |
| | | @select="onSelect" |
| | | :tree-data="areaUsers" |
| | | :replaceFields="replaceFields" |
| | | > |
| | | <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> |
| | | </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 }} |
| | | <div> |
| | | <b>平级接收人选择:</b> |
| | | </div> |
| | | <a-form-model-item prop="recipient"> |
| | | <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"> |
| | | {{ item.recipientName }} |
| | | </a-select-option> |
| | | </a-select> |
| | | </a-form-model-item> |
| | |
| | | <!-- </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()"> |
| | | 确认发送 |
| | | </a-button> |
| | | </div> |
| | |
| | | <h2>短信预览</h2> |
| | | <div class="mobile"> |
| | | <div class="mesg"> |
| | | <P>【{{form.title}}】{{form.message}}。发布单位:{{department}}</P> |
| | | <P>{{form.content}}发布单位:{{form.publishingUnit}}</P> |
| | | </div> |
| | | |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | |
| | | |
| | | const OPTIONS = ['自治区消防(李XX)', '自治区公安厅(王XX)', '自治区自然资源厅(刘XX)']; |
| | | import { getPeerRecipient, getAreaWithUserIfo } from '@/api/user' |
| | | import { massSend } from "@/api/send"; |
| | | import {getUserInfo} from "@/util/storage"; |
| | | export default { |
| | | name: "release", |
| | | name: "massSend", |
| | | data() { |
| | | return { |
| | | message: '', |
| | | signname: '自然灾害风险预警提示', |
| | | userInfo: {}, |
| | | department: '自治区自然灾害综合监测预警中心', |
| | | filteredOptions:[], |
| | | wrapperCol: { span: 24 }, |
| | | form: { |
| | | title: '', |
| | | riskType: 1, |
| | | level: 1, |
| | | type: 'a', |
| | | svalue: undefined, |
| | | sameDep: [], |
| | | message: '', |
| | | overTime: '' |
| | | id: null, |
| | | emergType: null, |
| | | disasterType: undefined, |
| | | warningLevel: undefined, |
| | | content: '', |
| | | publishingUnit: '', |
| | | receiver: [], |
| | | recipient: [], |
| | | verticalRecipient: [], |
| | | horizontalRecipient: [] |
| | | }, |
| | | checkAll: false, |
| | | areaUsers: [], |
| | | replaceFields: { |
| | | children:'children', |
| | | title:'name', |
| | | key:'id', |
| | | value: 'id' |
| | | }, |
| | | riskOptions: [ |
| | | {name: '地震',value: 1}, |
| | |
| | | {name: '红色预警',value: 1}, |
| | | {name: '橙色预警',value: 2}, |
| | | {name: '黄色预警',value: 3}, |
| | | {name: '蓝色预警',value: 4}, |
| | | {name: '其他短信通知',value: 5} |
| | | ] |
| | | {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'}], |
| | | 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.userInfo = getUserInfo() |
| | | t.form.publishingUnit = t.userInfo.company |
| | | t.getSameLevel() |
| | | t.getAreaUsers() |
| | | }, |
| | | computed: { |
| | | }, |
| | | methods: { |
| | | // 获取同级接收人 |
| | | async getSameLevel(){ |
| | | let t = this |
| | | let res = await getPeerRecipient() |
| | | if(res.data.code == 100){ |
| | | if(res.data.data){ |
| | | t.filteredOptions = res.data.data |
| | | }else{ |
| | | this.$message.warning('暂无数据'); |
| | | } |
| | | }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{ |
| | | this.$message.warning('暂无数据'); |
| | | } |
| | | }else{ |
| | | this.$message.warning(res.data.msg); |
| | | } |
| | | }, |
| | | |
| | | //选择子部门部分 |
| | | onChanges(value) { |
| | | if(value.find(i=>i.value == 'all')){ |
| | | console.log('全选了') |
| | | }else{ |
| | | this.svalue = value; |
| | | onChanges(value,label,extra) { |
| | | const t = this |
| | | if(t.form.receiver.length == 0){ |
| | | t.checkAll = false |
| | | } |
| | | |
| | | // for(let i of value){ |
| | | // t.form.verticalRecipient = [...t.form.verticalRecipient,...t.findNodeById(t.areaUsers,i.value).users] |
| | | // } |
| | | }, |
| | | |
| | | checkChange(e) { |
| | | const t = this |
| | | this.checkAll = !this.checkAll |
| | | if(t.checkAll == true){ |
| | | t.form.receiver = t.traverseTree(t.areaUsers[0]) |
| | | }else{ |
| | | t.form.receiver = [] |
| | | } |
| | | }, |
| | | |
| | | confirmSend(){ |
| | | this.$refs.ruleForm.validate(valid => { |
| | | if (valid) { |
| | | this.form.verticalRecipient = [] |
| | | this.form.horizontalRecipient = [] |
| | | const aList = this.form.receiver.map(item=>this.findNodeById(this.areaUsers,item.value)?.users) |
| | | const newAList = [].concat(...aList) |
| | | for(let i of newAList){ |
| | | const {realName,...data} = i |
| | | const {company: recipientUnit,...rest} = data |
| | | const obj = {recipientUnit,recipientType:1,...rest} |
| | | this.form.verticalRecipient.push(obj) |
| | | } |
| | | console.log(this.svalue); |
| | | }, |
| | | 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,...rest} |
| | | this.form.horizontalRecipient.push(obj) |
| | | } |
| | | const {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() |
| | | }else{ |
| | | this.$message.error(res.data.msg) |
| | | this.$refs.ruleForm.clearValidate() |
| | | this.$refs.ruleForm.resetFields() |
| | | } |
| | | }) |
| | | }else{ |
| | | console.log('error submit!!'); |
| | | return false; |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | onSearch() { |
| | | console.log(...arguments); |
| | | // console.log(...arguments); |
| | | }, |
| | | onSelect() { |
| | | console.log(...arguments); |
| | | // console.log(...arguments); |
| | | }, |
| | | //选择平级部门部分 |
| | | handleRisk(selectedItems) { |
| | |
| | | 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; |
| | | }, |
| | | |
| | | // 将树状数据所有id和name放入对象数组 |
| | | traverseTree(treeData) { |
| | | let result = []; |
| | | function traverse(node) { |
| | | 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.name +' '+ i.phone).join(',')+')' |
| | | } |
| | | if(node.children){ |
| | | this.userTitTree(node.children) |
| | | } |
| | | } |
| | | return treeData |
| | | } |
| | | }, |
| | | } |
| | | </script> |