123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 |
- <template>
- <div class="main-contain" v-loading="sending">
- <div class="position">
- <bread-crumb :crumbs="crumbs"></bread-crumb>
- </div>
- <div class="app-container" style="padding: 0 5px; background-color: #f6f8f9;">
- <div class="main-panel">
- <div class="preview-panel">
- <div class="form-title">
- <img class="icon" src="@/assets/img/sa_06.png" />
- <span>预览</span>
- </div>
- <div class="form-content">
- <div class="preview">
- <div class="bg">
- <div class="scroll">
- <div class="fake-time">9:41</div>
- <div class="content">
- {{ content_preview }}
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="edit-panel">
- <div class="form-title">
- <img class="icon" src="@/assets/img/sa_7.png" />
- <span>短信编辑</span>
- </div>
- <div class="form-content">
- <div class="input-panel">
- <el-input v-model="sms_content" type="textarea" :rows="4" resize="none" maxlength="500"></el-input>
- <div class="hint-text">已输入{{ total_content_length }}字(含签名和尾缀)按{{ sms_charge_count }}条短信计费</div>
- </div>
- <div v-if="designated_targets.length == 0" class="filters-panel">
- <div class="send-all-panel">
- <div class="text">
- <p class="title">推送全部客户</p>
- <p class="desc">将该短信推送给系统里的所有客户</p>
- </div>
- <div class="btn">
- <el-button type="primary" @click="sendToAllCustomersAction">发送</el-button>
- </div>
- </div>
- <div class="tag-filter-panel">
- <p class="title">按标签推送</p>
- <p class="desc">将该短信推送给相应标签客户</p>
- <div class="tag-panel">
- <div v-for="(tag, index) in tags" class="item-panel" :key="index">
- <el-tag :effect="tagEffect(tag)" @click="selectTagAction(tag)" @close="cancelSelectTagAction(tag)" :closable="isTagSelected(tag)">{{ tag.tag_name }}</el-tag>
- </div>
- </div>
- <p class="hint-text">*选择标签发送可以帮助您精准营销</p>
- <div class="send">
- <p class="text">已为您筛选 {{ tag_filtered_count }} 位客户</p>
- <div class="btn">
- <el-button type="primary" @click="sendToTagCustomersAction">发送</el-button>
- </div>
- </div>
- </div>
- </div>
- <div class="designated-targets-panel" v-else>
- <div class="send-panel">
- <div class="title">
- 推送指定客户
- </div>
- <div class="btn">
- <el-button type="primary" @click="sendToDesignatedCustomersAction">发送</el-button>
- </div>
- </div>
- <el-table :data="designated_targets" border max-height="500px">
- <el-table-column label="客户" prop="name" align="center"></el-table-column>
- <el-table-column label="手机号" prop="mobile" align="center"></el-table-column>
- </el-table>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </template>
-
- <script>
- import BreadCrumb from "@/scrm_pages/components/bread-crumb"
- import { sendsInitData, tagFilterCustomerCount, send2AllCustomers, send2TagCustomers, send2SpecificCustomers } from "@/api/sms"
-
- export default {
- name: "SMSSend",
- components: {
- BreadCrumb,
- },
- data() {
- return {
- crumbs: [
- { path: false, name: "短信管理" },
- { path: false, name: "群发短信" },
- ],
-
- sending: false,
- sms_content: "",
- tags: [],
- selecting_tags: [],
- tag_filtered_count: 0,
-
- action: 0,
- id: 0,
- designated_targets: [],
- }
- },
- computed: {
- content_preview: function() {
- return "【酷医聚客】" + this.sms_content + "退订回TD"
- },
- total_content_length: function() {
- return this.content_preview.length
- },
- sms_charge_count: function() {
- return parseInt(Math.ceil(this.total_content_length / 67.0))
- },
- },
- mounted() {
- this.designated_targets = this.$store.getters.sms_designated_targets.targets
- if (this.designated_targets.length > 0) {
- this.$store.dispatch("SMSClearTargets")
- } else {
- var action = this.$route.query.action
- var id = this.$route.query.id
- if (action != undefined && id != undefined) {
- this.action = action
- this.id = id
- }
-
- this.getInitData()
- }
- },
- methods: {
- getInitData: function() {
- sendsInitData(this.action, this.id).then(rs => {
- var resp = rs.data
- if (resp.state == 1) {
- this.tags = resp.data.tags
- this.sms_content = resp.data.default_content
-
- } else {
- this.$message.error(resp.msg)
- }
-
- }).catch(err => {
- this.$message.error(err)
- })
- },
- getTagCustomerCount: function() {
- var tag_ids = []
- for (let index = 0; index < this.selecting_tags.length; index++) {
- tag_ids.push(this.selecting_tags[index].id)
- }
- if (tag_ids.length == 0) {
- this.tag_filtered_count = 0
- return
- }
- tagFilterCustomerCount(tag_ids.join(",")).then(rs => {
- var resp = rs.data
- if (resp.state == 1) {
- this.tag_filtered_count = resp.data.count
- } else {
- console.log(resp.msg)
- }
- }).catch(err => {
- console.log(err)
- })
- },
-
- tagEffect: function(tag) {
- if (this.isTagSelected(tag)) {
- return "dark"
- } else {
- return "plain"
- }
- },
- isTagSelected: function(tag) {
- for (let index = 0; index < this.selecting_tags.length; index++) {
- if (this.selecting_tags[index].id == tag.id) {
- return true
- }
- }
- return false
- },
- selectTagAction: function(tag) {
- if (!this.isTagSelected(tag)) {
- this.selecting_tags.push(tag)
- this.getTagCustomerCount()
- }
- },
- cancelSelectTagAction: function(tag) {
- for (let index = 0; index < this.selecting_tags.length; index++) {
- if (this.selecting_tags[index].id == tag.id) {
- this.selecting_tags.splice(index, 1)
- this.getTagCustomerCount()
- break
- }
- }
- },
-
- isSMSContentValid: function() {
- if (this.sms_content.length == 0) {
- this.$message.error("请编辑短信内容")
- return false
- }
- if (this.sms_content.indexOf("【") >= 0 || this.sms_content.indexOf("】") >= 0) {
- this.$message.error("短信内容不得包含【】")
- return false
- }
- return true
- },
- sendToAllCustomersAction: function() {
- if (!this.isSMSContentValid()) {
- return
- }
- this.sending = true
- send2AllCustomers(this.sms_content).then(rs => {
- this.sending = false
- var resp = rs.data
- if (resp.state == 1) {
- this.$message.success("发送成功")
- } else {
- this.$message.error(resp.msg)
- }
-
- }).catch(err => {
- this.sending = false
- this.$message.error(err)
- })
- },
- sendToTagCustomersAction: function() {
- if (!this.isSMSContentValid()) {
- return
- }
- if (this.selecting_tags.length == 0) {
- this.$message.error("请选择标签")
- return
- }
-
- var tag_ids = []
- for (let index = 0; index < this.selecting_tags.length; index++) {
- tag_ids.push(this.selecting_tags[index].id)
- }
-
- this.sending = true
- send2TagCustomers(this.sms_content, tag_ids.join(",")).then(rs => {
- this.sending = false
- var resp = rs.data
- if (resp.state == 1) {
- this.$message.success("发送成功")
- } else {
- this.$message.error(resp.msg)
- }
-
- }).catch(err => {
- this.sending = false
- this.$message.error(err)
- })
- },
- sendToDesignatedCustomersAction: function() {
- if (!this.isSMSContentValid()) {
- return
- }
- var customer_ids = []
- for (let index = 0; index < this.designated_targets.length; index++) {
- customer_ids.push(this.designated_targets[index].id)
- }
-
- this.sending = true
- send2SpecificCustomers(this.sms_content, customer_ids.join(",")).then(rs => {
- this.sending = false
- var resp = rs.data
- if (resp.state == 1) {
- this.$message.success("发送成功")
- } else {
- this.$message.error(resp.msg)
- }
-
- }).catch(err => {
- this.sending = false
- this.$message.error(err)
- })
- },
- },
- }
- </script>
-
- <style lang="scss" scoped>
- .main-panel {
- width: 100%;
- display: flex;
- min-height: 600px;
- height: auto;
- box-sizing: border-box;
-
- .preview-panel {
- flex: 3;
- margin-right: 1rem;
- background-color: #fff;
-
- .form-content {
- width: 100%;
- padding: 14px 30px 14px 30px;
-
- .preview {
- width: 320px;
- height: 568px;
- background: #fff;
- position: relative;
- margin: 0 auto;
-
- .bg {
- position: relative;
- padding-top: 85px;
- padding-bottom: 40px;
- width: 320px;
- height: 568px;
- background: url(../../assets/img/message_preview_bg.png) 50% no-repeat;
- background-image: -webkit-image-set(url(../../assets/img/message_preview_bg.png) 1x,url(../../assets/img/message_preview_bg@2x.png) 2x);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-
- .scroll {
- height: 430px;
- overflow-x: hidden;
- overflow-y: auto;
-
- .fake-time {
- margin: auto;
- width: 310px;
- line-height: 40px;
- font-size: 12px;
- text-align: center;
- color: #999;
- background: #fff;
- }
-
- .content {
- display: inline-block;
- position: relative;
- left: 20px;
- margin-bottom: 12px;
- padding: 8px 15px;
- max-width: 260px;
- word-break: break-all;
- font-size: 16px;
- line-height: 1.25;
- color: #000;
- background: #e5e5ea;
- border-radius: 17px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .content::before {
- content: "";
- position: absolute;
- bottom: -2px;
- left: -7px;
- height: 20px;
- border-left: 20px solid #e5e5ea;
- border-bottom-right-radius: 16px 14px;
- -webkit-transform: translateY(-2px);
- -moz-transform: translateY(-2px);
- -ms-transform: translateY(-2px);
- transform: translateY(-2px);
- }
- .content::after {
- content: "";
- position: absolute;
- bottom: -2px;
- left: 20px;
- width: 10px;
- height: 20px;
- background: #fff;
- border-bottom-right-radius: 10px;
- -webkit-transform: translate(-30px,-2px);
- -moz-transform: translate(-30px,-2px);
- -ms-transform: translate(-30px,-2px);
- transform: translate(-30px,-2px);
- }
- }
- .scroll::-webkit-scrollbar {
- width: 5px;
- }
- }
- }
- }
- }
-
- .edit-panel {
- flex: 4;
- padding-bottom: 80px;
- background-color: #fff;
-
- .form-content {
- width: 100%;
- padding: 14px 30px 14px 30px;
-
- .input-panel {
- padding-top: 10px;
-
- .hint-text {
- margin-top: 5px;
- font-size: 12px;
- color: #a8b3ba;
- line-height: 30px;
- }
- }
-
- .filters-panel {
- margin-top: 50px;
-
- .send-all-panel {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .text {
- flex: 1;
-
- .title {
- font-size: 16px;
- color: #485b6d;
- font-weight: bold;
- height: 30px;
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 2;
- overflow: hidden;
- }
- .desc {
- font-size: 14px;
- color: #7b8a97;
- }
- }
- .btn {
- text-align: right;
- }
- }
- .tag-filter-panel {
- margin-top: 50px;
-
- .title {
- font-size: 16px;
- color: #485b6d;
- font-weight: bold;
- height: 30px;
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 2;
- overflow: hidden;
- }
- .desc {
- font-size: 14px;
- color: #7b8a97;
- }
- .tag-panel {
- margin-top: 15px;
- padding: 10px 15px 5px;
- background: #f4f7fa;
-
- .item-panel {
- display: inline-block;
- margin-bottom: 5px;
- margin-right: 5px;
- }
- }
- .hint-text {
- font-size: 12px;
- color: #a8b3ba;
- line-height: 30px;
- margin-top: 10px;
- }
- .send {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-top: 15px;
-
- .text {
- flex: 1;
- color: #7b8a97;
- font-size: 14px;
- }
- .btn {
- text-align: right;
- }
- }
- }
- }
-
- .designated-targets-panel {
- margin-top: 20px;
-
- .send-panel {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding-bottom: 10px;
-
- .title {
- flex: 1;
- font-size: 16px;
- color: #485b6d;
- font-weight: bold;
- height: 100%;
- }
- .btn {
- text-align: right;
- }
- }
- }
- }
- }
- }
- </style>
-
- <style lang="scss" scoped>
- .form-title {
- width: 100%;
- height: 60px;
- padding: 20px 0 20px 30px;
- border-bottom: 1px #dee2e5 solid;
-
- .icon {
- margin-top: -4px;
- vertical-align: middle;
- }
-
- span {
- font-size: 18px;
- font-weight: 500;
- color: #485b6d;
- margin-left: 10px;
- }
- }
- </style>
-
-
|