Files
uni-pos/src/views/ceres/sms/manage/Edit.vue
T
2020-07-10 08:24:30 +08:00

508 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="app-container">
<el-form
ref="form" :model="smsTask" :rules="rules"
label-position="right"
label-width="100px" status-icon
>
<el-row>
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item :label="$t('table.smsTask.templateId')" prop="templateId">
<el-select
v-model="smsTask.templateId" :disabled="type==='view'" :multiple="false"
filterable
placeholder="请输入关键词" style="width:300px;" @change="changeTemplate"
>
<el-option v-for="item in smsTemplateList" :key="item.id" :label="item.name + '('+item.customCode+')'" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item v-show="type==='view'" :label="$t('table.smsTask.status')" prop="status">
<el-tag :disabled="type==='view'" :type="smsTask.status | statusFilter">{{ smsTask.status.desc }}</el-tag>
</el-form-item>
</el-col>
</el-row>
<el-form-item :label="$t('table.smsTask.receiver')" prop="receiver">
<el-tag
v-for="tag in receiverList" :key="tag" :closable="type!=='view'"
:disable-transitions="false"
@close="handleClose(tag)"
>{{ tag }}</el-tag>
<el-input
v-if="receiverVisible" ref="saveTagInput" v-model="receiver"
:disabled="type==='view'"
class="input-new-tag" @blur="handleInputConfirm" @keyup.enter.native="handleInputConfirm"
/>
<el-button v-else :disabled="type==='view'" class="button-new-tag" @click="showInput">添加</el-button>
</el-form-item>
<el-form-item :label="$t('table.smsTask.topic')" prop="topic">
<el-input v-model="smsTask.topic" :disabled="type==='view'" />
</el-form-item>
<el-form-item :label="$t('table.smsTask.content')" prop="content2">
<el-row class="message">
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item v-for="(item, key, index) in smsTask.templateParam" :key="index" :label="key" prop="content">
<el-input :disabled="type==='view'" :value="item" maxlength="255" @input="(value)=>{templateCode(value,key,index)}" />
</el-form-item>
</el-col>
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item label="预览:">
<div class="article" v-html="smsTask.content"></div>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-row>
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item label="定时发送" prop="sendTime">
<el-radio-group v-model="timing" :disabled="type==='view'" size="medium">
<el-radio-button :label="false"></el-radio-button>
<el-radio-button :label="true"></el-radio-button>
</el-radio-group>
<el-date-picker
v-show="timing"
v-model="smsTask.sendTime"
:disabled="type==='view'"
:picker-options="pickerOptions"
align="right"
format="yyyy-MM-dd HH:mm:ss"
placeholder="选择发送时间"
style="margin-left:20px"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
/>
</el-form-item>
</el-col>
<el-col :sm="12" :xs="24" style="margin-top: 10px;">
<el-form-item v-show="type==='view'" label="是否草稿" prop="draft">
<el-radio-group v-model="smsTask.draft" :disabled="type==='view'" size="medium">
<el-radio-button :label="false"></el-radio-button>
<el-radio-button :label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="dialog-footer">
<el-button
v-show="type!=='view'" :disabled="disabled" plain
type="primary"
@click="submitForm(false)"
>立即发送</el-button>
<el-button
v-show="type!=='view'" :disabled="disabled" plain
type="warning"
@click="submitForm(true)"
>存草稿</el-button>
</div>
<aside v-show="type!=='view'" class="tips">
模板提示
<p>1.长度不超过500字单条短信超过70字后按67字/条分多条计费</p>
<p>2.短信模板内容不能包含符号</p>
</aside>
<div v-show="type==='view'">
<send-status-index ref="statusList" :dialog-visible="dialog.isVisible" />
</div>
</div>
</template>
<script>
import smsTemplateApi from '@/api/SmsTemplate.js'
import smsTaskApi from '@/api/SmsTask.js'
import { validMobile } from '@/utils/my-validate'
import SendStatusIndex from './SendStatusIndex'
export default {
name: 'SmsTaskEdit',
components: { SendStatusIndex },
filters: {
statusFilter (status) {
const map = {
WAITING: 'danger',
SUCCESS: 'success',
FAIL: 'error'
}
return map[status] || 'success'
}
},
props: {
},
data () {
return {
dialog: {
isVisible: false
},
type: 'add',
smsTask: this.initSmsTask(),
smsTemplateList: [],
receiverList: [],
receiverVisible: false,
receiver: '',
timing: false,
disabled: false,
smsTemplate: '',
content: '',
rules: {
topic: [
{ required: true, message: this.$t('rules.require'), trigger: 'blur' },
{ min: 1, max: 255, message: this.$t('rules.range4to10'), trigger: 'blur' }
],
templateId: { required: true, message: this.$t('rules.require'), trigger: 'blur' },
sendTime: {
validator: (rule, value, callback) => {
const vm = this
if (vm.timing) {
if (vm.smsTask.sendTime) {
callback()
} else {
callback('请选择发送日期')
}
} else {
callback()
}
}, trigger: 'change'
}
},
pickerOptions: {
shortcuts: [{
text: '一小时后',
onClick (picker) {
const date = new Date()
date.setTime(date.getTime() + 3600 * 1000 * 1)
picker.$emit('pick', date)
}
}, {
text: '明天',
onClick (picker) {
const date = new Date()
date.setTime(date.getTime() + 3600 * 1000 * 24)
picker.$emit('pick', date)
}
}, {
text: '一周后',
onClick (picker) {
const date = new Date()
date.setTime(date.getTime() + 3600 * 1000 * 24 * 7)
picker.$emit('pick', date)
}
}]
}
}
},
computed: {
},
watch: {
$route () {
if (this.$route.path === '/sms/manage/edit') {
this.initSmsTemplateList()
this.loadSendStatus()
}
}
},
mounted () {
// 在vue的mount阶段执行的函数都是顺序执行,不会阻塞的,所以如果希望mount阶段的函数也是阻塞的,需要额外写一个async函数,然后把需要同步执行的函数写到里面,然后在mount阶段调用这个额外写的函数
this.initSmsTemplateList()
this.loadSendStatus()
},
methods: {
loadSendStatus () {
const type = this.$route.query.type
const id = this.$route.query.id
if (type === 'view') {
this.$refs.statusList.setTaskId(id)
}
},
async loadSmsTask () {
const type = this.$route.query.type
const id = this.$route.query.id
this.type = type
if (type) { // 切换到别的页面时,无需重置表单
// this.smsTask = this.initSmsTask()
this.reset()
}
if (type === 'view') {
this.disabled = true
} else {
this.disabled = false
}
if (id) {
await smsTaskApi.get(id)
.then(response => {
const res = response.data
this.smsTask = { ...this.smsTask, ...res.data }
if (type !== 'edit') {
this.smsTask.id = ''
}
this.changeTemplate(this.smsTask.templateId)
this.receiverList = this.smsTask.receiver.split(",")
if (this.smsTask.templateParams) {
this.smsTask.templateParam = JSON.parse(this.smsTask.templateParams)
}
this.smsTask.content = res.data.content
console.log('查询')
if (this.smsTask.sendTime) {
this.timing = true
} else {
this.timing = false
}
this.smsTemplate = this.smsTemplateList.find(item => item.id === this.smsTask.templateId)
})
}
},
changeTemplate (id) {
const vm = this
// vm.preSearch()
if (id) {
// 遍历模板添加文本框
for (const item of vm.smsTemplateList) {
if (item.id === id) {
let templateParam = {}
if (typeof (item.templateParams) === 'string') {
templateParam = JSON.parse(item.templateParams)
} else {
templateParam = item.templateParams
}
for (const prop in templateParam) {
templateParam[prop] = ''
}
vm.smsTemplate = item
if (vm.type !== 'view') {
console.log('赋值')
vm.smsTask.templateParam = templateParam
// vm.smsTask.content = item.content
this.content = item.content
}
break
}
}
vm.changeContent()
}
},
// 模板文本框输入内容
templateCode (val, key) {
const vm = this
vm.smsTask.templateParam[key] = val
vm.changeContent()
},
// 短信内容处理
changeContent () {
const vm = this
if (!vm.smsTemplate) {
return
}
const type = vm.smsTemplate.providerType.code
let content = vm.smsTemplate.content
for (const key in vm.smsTask.templateParam) {
let strs = ''
if (type == "TENCENT") {
strs = '{' + key + '}'
} else {
strs = '${' + key + '}'
}
if (vm.smsTask.templateParam[key]) {
content = content.replace(strs, vm.smsTask.templateParam[key])
}
}
if (vm.type !== 'view') {
console.log('赋值')
vm.smsTask.content = content
}
},
async initSmsTemplateList () {
await smsTemplateApi.page({ current: 1, size: 10000, model: {}})
.then(response => {
const res = response.data
if (res.isSuccess) {
this.smsTemplateList = res.data.records
}
})
await this.loadSmsTask() // 顺序不能变
},
initSmsTask () {
return {
templateId: '',
receiver: '',
topic: '',
templateParam: {},
sendTime: null,
content: '',
draft: false,
status: {
code: '',
desc: ''
}
}
},
reset () {
// 先清除校验,再清除表单,不然有奇怪的bug
this.$refs.form.clearValidate()
this.$refs.form.resetFields()
this.smsTask = this.initSmsTask()
this.receiverList = []
},
submitForm (draft) {
const vm = this
if (vm.smsTask.templateParam && Object.keys(vm.smsTask.templateParam).length > 0) {
let flag = false
for (const key in vm.smsTask.templateParam) {
if (!vm.smsTask.templateParam[key]) {
flag = true
break
}
}
if (flag) {
vm.$message({
message: '发送内容不能为空',
type: 'error'
})
return
}
} else {
vm.$message({
message: '发送内容不能为空',
type: 'error'
})
return
}
this.$refs.form.validate((valid) => {
if (valid) {
vm.editSubmit(draft)
} else {
return false
}
})
},
editSubmit (draft) {
const vm = this
vm.smsTask.draft = draft
vm.smsTask.receiver = vm.receiverList.join(',')
if (!vm.timing) {
vm.smsTask.sendTime = null
}
if (vm.type === 'edit') {
vm.update()
} else {
vm.save()
}
},
save () {
const vm = this
vm.disabled = true
smsTaskApi.save(vm.smsTask)
.then((response) => {
vm.disabled = false
const res = response.data
if (res.isSuccess) {
vm.$message({
message: vm.$t('tips.createSuccess'),
type: 'success'
})
vm.reset()
vm.$router.push('/sms/manage')
}
})
},
update () {
const vm = this
vm.disabled = true
smsTaskApi.update(vm.smsTask)
.then((response) => {
vm.disabled = false
const res = response.data
if (res.isSuccess) {
vm.$message({
message: vm.$t('tips.createSuccess'),
type: 'success'
})
vm.reset()
vm.$router.push('/sms/manage')
}
})
},
handleClose (tag) {
this.receiverList.splice(this.receiverList.indexOf(tag), 1)
},
showInput () {
this.receiverVisible = true
this.$nextTick(() => {
this.$refs.saveTagInput.$refs.input.focus()
})
},
handleInputConfirm () {
const vm = this
// 正则校验
const inputValue = vm.receiver
if (inputValue) {
if (!validMobile(inputValue)) {
this.$message({
message: '该手机号不合法',
type: 'error'
})
vm.$refs.saveTagInput.focus()
return
}
if (this.receiverList.indexOf(inputValue) === -1) {
vm.receiverList.push(inputValue)
vm.receiverVisible = false
vm.receiver = ''
} else {
this.$message({
message: '该账号已经存在',
type: 'error'
})
vm.$refs.saveTagInput.focus()
}
} else {
this.receiverVisible = false
}
}
}
}
</script>
<style lang="scss" scoped>
.el-tag {
margin-right: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 120px;
vertical-align: bottom;
}
.message {
border: 1px solid #ddd;
padding-bottom: 10px;
}
aside {
margin-top: 10px;
margin-bottom: 0;
}
.tips {
border: 1px solid #ddd;
margin-left: 18px;
}
.tips p {
text-indent: 20px;
padding: 0;
margin: 0px;
}
.article {
font-size: 12px;
height: auto;
}
</style>