|
|
<template> <div> <div class="container"> <div class="item"> <div class="left">短信模板名称</div> <div style="width: 70%;"> <el-select v-model="smsTemplatesSelectValue" placeholder="请选择短信模板" style="width:500px;" @change="smsTemplateSelectChangeMethod"> <el-option v-for="item in smsTemplatesOptions" :key="item.id" :label="item.title" :value="item"> </el-option> </el-select> </div> </div> <div class="item"> <div class="left">签名名称</div> <div style="width: 70%;"> <el-select v-model="smsSignsSelectValue" placeholder="请选择签名" style="width:500px;"> <el-option v-for="item in smsSignsOptions" :key="item.id" :label="item.text" :value="item.text"> </el-option> </el-select> </div> </div> <div class="item"> <div class="left">短信预览</div> <div style="width: 70%;"> <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="finallyShowContent" style="width:500px;" disabled> </el-input><br /> <p class="explain">当前发送内容{{smsTemplatesSelectValue.text?smsPreview?smsPreview.length:smsTemplatesSelectValue.text.length:0}}个字,预计发送条数约为 {{smsTemplatesSelectValue.text?Math.ceil(smsPreview?smsPreview.length/67:smsTemplatesSelectValue.text.length/67):0}}条短信</p> <p class="example">(实际发送时,如有模板变量会影响计费条数,请特别关注)</p> <p style="font-size: 16px;">短信计费的条数,计费规则请参考 <a href="https://cloud.tencent.com/document/product/382/18058#.E7.9F.AD.E4.BF.A1.E5.86.85.E5.AE.B9.E9.95.BF.E5.BA.A6.E8.AE.A1.E7.AE.97.E8.A7.84.E5.88.99" target="_blank" style="color:#00a4ff">国内短信内容长度计算规则</a> 或 国<a href="https://cloud.tencent.com/document/product/382/18052#.E5.9B.BD.E9.99.85.E7.9F.AD.E4.BF.A1.E5.86.85.E5.AE.B9.E9.95.BF.E5.BA.A6.E8.AE.A1.E7.AE.97.E8.A7.84.E5.88.99" target="_blank" style="color:#00a4ff">国际/港澳台短信内容长度计算规则</a></p> </div> </div> <div class="item"> <div class="left">短信模板参数</div> <div style="width: 70%;"> <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="templateParams" style="width:500px;" @change="smsPreviewMethod"> </el-input> <p class="explain">多个参数之间用英文逗号(<span style="color:#e54545">,</span>)隔开例如:</p> <p class="example auto-typing">xx公司,xx元,xx服务器</p> </div> </div> <div class="item"> <div class="left">发送对象</div> <div style="width: 70%;"> <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="mobilesStr" style="width:500px;"> </el-input> <p class="explain">发送的对象不能超过<span style="color:#e54545">10</span>个,多个手机号码之间用英文逗号(<span style="color:#e54545">,</span>)隔开,例如:</p> <p class="example auto-typing ">135xxxxxxxx,138xxxxxxxx,159xxxxxxxx</p> </div> </div> <div class="item"> <div class="left">用户是否需要回复该短信</div> <div style="width: 70%;"> <el-radio v-model="userNeedReplySmsRadio" label="0">不需要</el-radio> <el-radio v-model="userNeedReplySmsRadio" label="1">需要</el-radio> </div> </div> <div class="item" v-if="userNeedReplySmsRadio==='1'"> <div class="left">回复截至天数</div> <div style="width: 20%;"> <el-input placeholder="请输入天数" v-model="replyEndDay"> <template slot="append">天内</template> </el-input> </div> </div> </div> <div style="display:flex; flex-direction:row-reverse"> <el-button @click="handleCancel" style="margin-left:30px;">取 消</el-button> <el-button type="primary" @click="sendSmsMethod" v-loading="showSendDialogVisibleLoading">确 定</el-button> </div> <el-dialog title="发送结果" :append-to-body='true' :visible.sync="sendResultVisible" width="30%" :close-on-click-modal="false"> <el-table :data="sendResult" style="width: 100%"> <el-table-column prop="username" label="用户" width="180"> </el-table-column> <el-table-column prop="mobile" label="手机号" width="180"> </el-table-column> <el-table-column prop="" label="状态"> <template slot-scope="scope"> <div style="display:flex;align-items: center;"> <el-tag type="success" v-if="scope.row.sendStatus=='0'">成功</el-tag> <el-tag type="info" v-if="scope.row.sendStatus=='1'">待审核</el-tag> <el-tag type="danger" v-if="scope.row.sendStatus=='2'">失败</el-tag> <el-tag type="danger" v-if="scope.row.sendStatus=='3'">发送中</el-tag> <el-tag type="danger" v-if="scope.row.sendStatus=='4'">结束</el-tag> </div> </template> </el-table-column> </el-table> </el-dialog> </div></template>
<script> import util from '@/common/js/util'; //全局公共库
import Sticky from '@/components/Sticky' // 粘性header组件
import { mapGetters } from 'vuex'; import { listUser } from '@/api/mdp/sys/user'; import { listSmsTemplate } from '@/api/mdp/sms/smsTemplate'; import { groupSendSmsApi, listSmsSign } from '@/api/mdp/sms/smsSign'; export default { computed: { ...mapGetters([ 'userInfo' ]) }, props: ['visible', 'smsBodyParams','smsUserList','loadPhonenoByUserid'], watch: { 'visible': function(visible) { if (visible == true) { this.getMobilesStr(); this.getSmsTemplates(); this.getSmsSigns(); if(this.smsBodyParams){ this.templateParams=this.smsBodyParams.join(","); } } } }, data() { return { sendResultVisible: false, sendResult: [], replyEndDay: '', userNeedReplySmsRadio: '0', activeName: 'first', showSendDialogVisibleLoading: false, finallyShowContent: '', smsPreview: '', templateParams: '', mobilesStr: '', smsSignsSelectValue: '', smsTemplatesSelectValue: '', smsSignsOptions: [], smsTemplatesOptions: [], selectShopVisible: false, shopId: '', locationId: '', branchId: '', sendSmsVisible: false, textarea: '', value: '', form: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '' } }; }, methods: { //展示选择门店的方法
showSelectShopMethod() { this.selectShopVisible = true; }, sureMethod(row) { this.selectShopVisible = false; this.branchId = row.branchId; this.shopId = row.shopId; this.locationId = row.id; this.getSmsTemplates(); }, showSendDialogVisibleMethod() { this.shopId = this.userInfo.shopId; this.locationId = this.userInfo.locationId; this.branchId = this.userInfo.branchId; this.sendSmsVisible = true; //获取短信签名
this.getSmsSigns(); //this.sendSmsVisible=!this.sendSmsVisible;
},
handleCancel:function(){ this.$emit('cancel'); }, sendSmsMethod() { let that = this; if (!this.smsTemplatesSelectValue) { this.$notify({position:'bottom-left',showClose: true, message: "请选择某个模板", type: 'error' }); return; } if (!this.smsSignsSelectValue) { this.$notify({position:'bottom-left',showClose: true, message: "请选择某个签名", type: 'error' }); return; } if (!this.mobilesStr) { this.$notify({position:'bottom-left',showClose: true, message: "发送对象不能为空", type: 'error' }); return; } /* var mobilesStr = ''; for (let i = 0; i < this.sels.length; i++) { if (i != 0) { mobilesStr = mobilesStr + "," + this.sels[i].phoneno; } else { mobilesStr += this.sels[i].phoneno; } } */ var mobileArr = this.mobilesStr.split(","); if (mobileArr.length > 10) { this.$notify({position:'bottom-left',showClose: true, message: "发送的对象不能超过10个", type: 'error' }); return; } for (let i = 0; i < mobileArr.length; i++) { if (!/^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/.test( mobileArr[i])) { this.$notify({position:'bottom-left',showClose: true, message: mobileArr[i] + "手机号码不对", type: 'error' }); return; } if (this.mobilesStr.lastIndexOf(mobileArr[i]) != this.mobilesStr.indexOf(mobileArr[i])) { this.$notify({position:'bottom-left',showClose: true, message: "请填写不同的手机号码进行发送", type: 'error' }); return; } } var templateParamsArr = this.templateParams.split(","); //统计短信模板变量出现的次数
var reg = /\{\d\}/; let smsTemplateVariableCount = this.smsTemplatesSelectValue.text.split(reg).length - 1; if (templateParamsArr.length != smsTemplateVariableCount) { this.$notify({position:'bottom-left',showClose: true, message: "输入的短信模板参数与短信模板的变量的数目不一致", type: 'error' }); return; } if (this.userNeedReplySmsRadio === '1' && !this.replyEndDay) { this.$notify({position:'bottom-left',showClose: true, message: "如果勾选需要用户回复,必须填写天数", type: 'error' }); return; } if (this.userNeedReplySmsRadio === '1' && !/^\d+$/.test(this.replyEndDay)) { this.$notify({position:'bottom-left',showClose: true, message: "天数必须是正整数", type: 'error' }); return; } let params = { "smsTemplateParams": this.templateParams, "mobiles": this.mobilesStr, "smsSign": this.smsSignsSelectValue, "smsTemplateId": this.smsTemplatesSelectValue.id, "smsTtemplateText": this.smsTemplatesSelectValue.text, "nationCode": "86", "userid": this.userInfo.userid, "branchId": this.smsTemplatesSelectValue.branchId, "shopId": this.smsTemplatesSelectValue.shopId, "locationId": this.smsTemplatesSelectValue.locationId, "replyEndDay": this.replyEndDay, "userNeedReplySms": this.userNeedReplySmsRadio }; this.showSendDialogVisibleLoading = true; that.sendResult = []; groupSendSmsApi(params).then((res) => { this.showSendDialogVisibleLoading = false; var tips = res.data.tips; if (tips.isOk) { for (let i = 0; i < res.data.data.length; i++) { for (let j = 0; j < that.sels.length; j++) { if (res.data.data[i].mobile == that.sels[j].phoneno) { res.data.data[i].username = that.sels[j].username } } } this.sendResultVisible = true; that.sendResult = res.data.data; }; this.$notify({position:'bottom-left',showClose: true, message: tips.msg, type: tips.isOk ? 'success' : 'error' }); }).catch(err => { this.sendSmsVisible = false }); }, //查询短信模板
getSmsTemplates() { let params = { "shopId": this.userInfo.shopId, "locationId": this.userInfo.locationId, "branchId": this.userInfo.branchId, "status": "0" }; this.finallyShowContent = ''; this.smsPreview = ''; this.smsTemplatesSelectValue = ''; this.smsTemplatesOptions = []; listSmsTemplate(params).then((res) => { var tips = res.data.tips; if (tips.isOk) { this.smsTemplatesOptions = res.data.data; } else { this.$notify({position:'bottom-left',showClose: true, message: tips.msg, type: 'error' }); }
}).catch(); }, //查询短信签名
getSmsSigns() { let params = { "status": "0", "shopId": this.userInfo.shopId }; this.smsSignsOptions = []; listSmsSign(params).then((res) => { var tips = res.data.tips; if (tips.isOk) { this.smsSignsOptions = res.data.data; } else { this.$notify({position:'bottom-left',showClose: true, message: tips.msg, type: 'error' }); } }).catch(); }, smsTemplateSelectChangeMethod() { this.finallyShowContent = this.smsTemplatesSelectValue.text; }, //短信预览的方法
smsPreviewMethod(value) { //求出模板中的变量的数量
var reg = /\{\d\}/; this.smsPreview = ''; if (!this.smsTemplatesSelectValue.text) { return; } this.finallyShowContent = this.smsTemplatesSelectValue.text; let smsTemplateVariableCount = this.smsTemplatesSelectValue.text.split(reg).length - 1; let valueArr = value.split(","); let finallyStr = this.smsTemplatesSelectValue.text; for (let i = 0; i < smsTemplateVariableCount; i++) { if (i < valueArr.length) { let k = i + 1; var regex = new RegExp('\\{' + k + '\\}'); finallyStr = finallyStr.replace(regex, valueArr[i]) } }; this.smsPreview = finallyStr; this.finallyShowContent = this.smsPreview; }, getMobilesStr(){ this.mobilesStr = ''; if(this.loadPhonenoByUserid==true){ let userids=this.smsUserList.map(user=>user.userid); listUser({userids:userids,branchId:this.userInfo.branchId}).then(res=>{ if(res.data.tips.isOk){ let users=res.data.data; let phonenoList=users.map(user=>user.phoneno); this.mobilesStr=phonenoList.join(","); } }); }else{ let phonenoList=this.smsUserList.map(user=>user.phoneno); this.mobilesStr=phonenoList.join(","); } }, //初始化数据
initData() { this.templateParams = '', this.mobilesStr = ''; this.smsTemplatesSelectValue = ''; this.smsSignsSelectValue = ''; }
}, components: {
}, mounted() { this.$nextTick(() => { this.getSmsTemplates(); this.getSmsSigns(); this.getMobilesStr(); if(this.smsBodyParams){ this.templateParams=this.smsBodyParams.join(","); } }); } }</script>
<style> .container { display: flex; flex-direction: column; width: 80%; margin: 0 auto; }
.item { display: flex; flex-direction: row; align-items: center; margin-bottom: 30px; }
.item .left { width: 200px; font-size: 20px; color: #888; padding-right: 60px; align-self: flex-start; margin-top: 10px; }
.item .explain { font-size: 16px; width: 500px; }
.item .example { font-size: 16px; color: #e54545 }
.auto-typing { font-weight: bold; overflow: hidden; width: 53ch; border-right: 1px solid transparent; white-space: nowrap; animation: typing 5s steps(53) 5s forwards; }
@keyframes typing { from { width: 0; } }</style>
|