Commit 2d1a0746 by caoyanzhi

Merge branch 'feature/微信图文升级'

parents e2a0f08d c0dd76ee
......@@ -66,6 +66,7 @@ export default {
},
created() {
this.loadImgList();
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '素材库', path: '' }, { name: '图文', path: '' }]);
},
data() {
return {
......
<template>
<img-text is-publish></img-text>
</template>
<script>
import ImgText from './index.vue';
export default {
name: 'imgtextpublic',
components: { ImgText }
};
</script>
<template>
<el-dialog class="sync-imgtext__dialog" title="同步微信图文" :visible.sync="show" width="30%" :before-close="close" v-loading="loading">
<div class="gic-modal-bd text-center">
<el-dialog class="sync-imgtext__dialog" :title="wxscType == 4 ? '同步微信草稿箱图文' : '同步已发布的微信图文'" :visible.sync="show" width="30%" :before-close="close" v-loading="loading">
<div class="gic-modal-bd">
<div class="gic-modal-content">
<p class="fz16" style="margin-bottom:20px">
微信图文共<span> {{ count }} </span><span @click="getSyncInfo" class="blue" style="margin-left:10px;">刷新</span>
{{ wxscType == 4 ? '微信草稿箱里的图文共' : '已发布微信图文共' }}<span> {{ count }} </span><span @click="getSyncInfo" class="blue" style="margin-left:10px;">刷新</span>
</p>
<p class="gray fz12">同步全部图文可能会需要比较久的时间,请耐心等待</p>
<div style="margin-bottom: 10px">
同步条数:
<el-select style="width: 160px" :disabled="!(loadStatus === 1 && count !== 0)" v-model="size" placeholder="选择同步条数">
<el-option v-for="item in sizeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</div>
<p class="gray fz12">同步全部图文可能会需要比较久的时间,请耐心等待...</p>
</div>
</div>
<div class="text-center pt20">
<el-select class="w100" v-if="loadStatus === 1 && count !== 0" v-model="size" placeholder="选择群发类型">
<el-option v-for="item in sizeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<template slot="footer">
<el-button @click="close">取消</el-button>
<el-button v-if="loadStatus === 1" type="primary" @click="syncWechat()">立即同步</el-button>
<el-button v-if="loadStatus === 0" type="primary" :loading="true">同步中</el-button>
<el-button v-if="loadStatus === 3" icon="el-icon-error" type="danger">同步失败</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
......@@ -25,6 +29,11 @@ export default {
show: {
type: Boolean,
default: false
},
// 4:草稿列表 5:发布列表
wxscType: {
type: [Number, String],
default: ''
}
},
watch: {
......@@ -40,16 +49,24 @@ export default {
loading: false,
count: 0,
size: 5,
sizeOptions: [{ label: '5条', value: 5 }, { label: '10条', value: 10 }, { label: '20条', value: 20 }, { label: '全部', value: 999999 }] // eslint-disable-line
sizeOptions: [
{ label: '最新的5条', value: 5 },
{ label: '最新的10条', value: 10 },
{ label: '最新的20条', value: 20 },
{ label: '全部', value: 999999 }
]
};
},
methods: {
close() {
this.$emit('update:show', false);
this.$nextTick(() => {
this.size = 5;
});
},
async getSyncInfo() {
this.loading = true;
let res = await getSyncInfo();
let res = await getSyncInfo({ wxscType: this.wxscType });
this.count = res.result.wechatCount;
this.loadStatus = res.result.status;
this.loading = false;
......@@ -57,11 +74,12 @@ export default {
async syncWechat() {
this.loadStatus = 0;
const num = this.size === 999999 ? this.count : this.size;
let res = await syncWechatImageText({ num });
let res = await syncWechatImageText({ num, wxscType: this.wxscType });
if (num <= 20 && res.errorCode === 0) {
this.$tips({ type: 'success', message: '同步成功' });
this.loadStatus = 1;
this.close();
this.$emit('syncSuccess');
}
}
}
......
......@@ -72,6 +72,7 @@ export default {
this.$emit('backImg', this.model);
this.copyDisabled = this.disabled;
},
immediate: true,
deep: true
}
},
......
......@@ -79,6 +79,15 @@ export default {
}
},
{
path: 'check-imgtext/:id',
name: '查看图文',
component: () => import(/* webpackChunkName: "wechat" */ '../../views/wechat/editor.vue'),
meta: {
type: 'edit',
path: '/wechat/temp/check-imgtext'
}
},
{
path: 'temp',
name: '素材库',
component: () => import(/* webpackChunkName: "wechat" */ '../../views/wechat/temp.vue'),
......@@ -87,13 +96,21 @@ export default {
children: [
{
path: 'imgtext',
name: '图文',
name: '图文草稿箱',
component: () => import(/* webpackChunkName: "wechat" */ '../../components/libs/imgTextTemp/index.vue'),
meta: {
path: '/wechat/temp/imgtext'
}
},
{
path: 'imgtextpublic',
name: '图文发布列表',
component: () => import(/* webpackChunkName: "wechat" */ '../../components/libs/imgTextTemp/imgtextpublic.vue'),
meta: {
path: '/wechat/temp/imgtextpublic'
}
},
{
path: 'img',
name: '图片',
component: () => import(/* webpackChunkName: "wechat" */ '../../components/libs/imgTemp/index.vue'),
......
......@@ -33,6 +33,8 @@ export const getSyncInfo = params => requests(PREFIX + 'get-sync-info', params);
//素材库--图文--同步微信侧 图文素材数据
export const syncWechatImageText = params => requests(PREFIX + 'sync-wechatImage-text', params);
export const wechatDraftPublish = params => requests(PREFIX + 'wechat-draft-publish', params);
//素材库--图片--图片分页列表
export const loadImgList = params => requests(PREFIX + 'page-marketing-wechat-image', params);
......
......@@ -355,7 +355,7 @@
</div>
</h3>
<!-- 只有实时才是单图文 -->
<marketing-event :readOnly="isInfo || onlineStatus == 2" :show-delete-tooltip="isEdit && analyseConfig.open_flag == 1" show-out-coupon-icon ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1" :use-stored="useStoredFlag && ['consume', 'stored'].includes(form.effectAction) && form.effectType == 0" :use-qfxx="form.effectType !== 0"></marketing-event>
<marketing-event :effectType="form.effectType" :readOnly="isInfo || onlineStatus == 2" :show-delete-tooltip="isEdit && analyseConfig.open_flag == 1" show-out-coupon-icon ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1" :use-stored="useStoredFlag && ['consume', 'stored'].includes(form.effectAction) && form.effectType == 0" :use-qfxx="form.effectType !== 0"></marketing-event>
<!-- 只有非实时&&选择卡券了展示提示 -->
<div v-if="currentCard.comName && form.effectType != 0 && couponAutoGetFlag" class="fz13 regular-font-color line-height2" style="margin-left:120px;margin-top:30px;">
* 用户在领取卡券后需要<b class="bold">同步至ERP</b>,如果关闭用户<b class="bold">手动领取</b>,卡券在<b class="bold">批量投放</b>时会需要将卡券信息批量同步至ERP。 <br />
......
......@@ -17,13 +17,26 @@
</template>
</el-table-column>
<el-table-column label="图片" align="left" width="120px" class-name="table-img">
<template slot-scope="scope">
<div slot-scope="scope">
<img width="100" height="50" class="border-radius__default" :src="scope.row.itemList.length ? scope.row.itemList[0].qcloudImageUrl || '' : ''" alt="" />
</template>
</div>
</el-table-column>
<el-table-column label="图文标题" align="left" min-width="100px">
<template slot-scope="scope">
<a class="blue" :href="scope.row.itemList.length ? scope.row.itemList[0].mediaUrl || '' : ''" target="_blank">{{ scope.row.itemList.length ? scope.row.itemList[0].titleName || '' : '' }}</a>
<span>标题:</span><a class="blue" :href="scope.row.itemList.length ? scope.row.itemList[0].mediaUrl || '' : ''" target="_blank">{{ scope.row.itemList.length ? scope.row.itemList[0].titleName || '' : '' }}</a>
<div>
<span>{{ effectType != 0 ? '图文m_id:' : '图文a_id:' }}</span>
<el-tooltip v-if="effectType != 0 && scope.row.draftMediaId" placement="top" :content="scope.row.draftMediaId">
<span class="media-id">{{ scope.row.draftMediaId }}</span>
</el-tooltip>
<el-tooltip v-else-if="effectType == 0 && scope.row.articleId" placement="top" :content="scope.row.articleId">
<span class="media-id">{{ scope.row.articleId }}</span>
</el-tooltip>
<span v-else>--</span>
</div>
<!-- <el-tooltip v-if="scope.row.articleId" placement="top" :content="scope.row.articleId">
<span class="media-id">{{ scope.row.articleId }}</span>
</el-tooltip> -->
</template>
</el-table-column>
<el-table-column label="作者" prop="updateTimeStr" align="left" width="120px">
......@@ -62,6 +75,11 @@ export default {
// 图文 实时发送这个参数为true,过滤图文仅要单图文
type: Boolean,
default: false
},
// 智能营销的时效 0:触点 1:重复 2:单次
effectType: {
type: [Number, String],
default: 0
}
},
created() {
......@@ -92,6 +110,9 @@ export default {
loadImgTextList() {
this.loading = true;
const params = { ...this.listParams };
if (this.effectType != 0) {
params.wxscType = 2;
}
if (this.singleFlag) {
params.singleFlag = 1; // 不是实时就不穿这个参数,不传表示全部
}
......@@ -147,4 +168,12 @@ export default {
.dm-imgtext-list {
width: 100%;
}
.media-id {
display: inline-block;
vertical-align: top;
max-width: 190px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
......@@ -34,7 +34,7 @@
</transition>
</div>
<!-- 弹窗组件 -->
<component :is="dialogCom" @sendItem="saveToList" :showOutCouponIcon="showOutCouponIcon" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag" :read-only="readOnly || showView" :resource-status="resourceStatus"></component>
<component :is="dialogCom" @sendItem="saveToList" :effectType="effectType" :showOutCouponIcon="showOutCouponIcon" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag" :read-only="readOnly || showView" :resource-status="resourceStatus"></component>
</section>
</template>
......@@ -152,6 +152,11 @@ export default {
type: Boolean,
default: true
},
// 智能营销的时效 0:触点 1:重复 2:单次
effectType: {
type: [Number, String],
default: 0
},
useQfxx: Boolean,
showDeleteTooltip: Boolean
},
......
......@@ -35,12 +35,13 @@
<div class="editor_triangle"></div>
<div class="editor-inner">
<p class="line-height2"><span class="danger-color">*</span> 标题</p>
<dm-input size="medium" v-model="activeImgText.titleName" :maxlength="64"></dm-input>
<dm-input size="medium" v-model="activeImgText.titleName" :disabled="isCheckImg" :maxlength="64"></dm-input>
<p class="line-height2 pt10">作者</p>
<dm-input size="medium" v-model="activeImgText.authorName" :byteType="1" :maxlength="8"></dm-input>
<dm-input size="medium" v-model="activeImgText.authorName" :disabled="isCheckImg" :byteType="1" :maxlength="8"></dm-input>
<p class="line-height2 pt10">封面 <span class="gray fz12">(大图片建议尺寸:900像素 * 500像素)</span></p>
<upload-img url="/api-marketing/marketing-wechat-image-save" class="inline-block" :model.sync="postImg" :showImg="false" width="auto" label="本地上传" tips="" :labelStyle="{ padding: '8px 15px', fontSize: '14px', borderRadius: '4px' }"></upload-img>
<upload-img url="/api-marketing/marketing-wechat-image-save" class="inline-block" :disabled="isCheckImg" :model.sync="postImg" :showImg="false" width="auto" label="本地上传" tips="" :labelStyle="{ padding: '8px 15px', fontSize: '14px', borderRadius: '4px' }"></upload-img>
<el-button
:disabled="isCheckImg"
class="ml5"
@click="
postFlag = true;
......@@ -49,12 +50,12 @@
>从素材中选择</el-button
>
<div class="cover_preview" v-show="activeImgText.qcloudImageUrl" :style="'background-image: url(' + activeImgText.qcloudImageUrl + ')'"></div>
<el-checkbox class="pt10" v-show="activeImgText.qcloudImageUrl" v-model="activeImgText.imageType" :true-label="1" :false-label="0">封面图片显示在正文中</el-checkbox>
<el-checkbox class="pt10" v-show="activeImgText.qcloudImageUrl" v-model="activeImgText.imageType" :disabled="isCheckImg" :true-label="1" :false-label="0">封面图片显示在正文中</el-checkbox>
<p class="line-height2 pt10">摘要 <span class="gray fz12">(选填,如果不填写会默认抓取正文前54个字)</span></p>
<dm-input size="medium" v-model="activeImgText.remark" type="textarea" :rows="4" :maxlength="120"></dm-input>
<dm-input size="medium" v-model="activeImgText.remark" :disabled="isCheckImg" type="textarea" :rows="4" :maxlength="120"></dm-input>
<p class="line-height2 mt10"><span class="danger-color">*</span> 正文</p>
<div class="toolbar">
<div class="toolbar" v-if="!isCheckImg">
<span
@click="
postFlag = false;
......@@ -62,11 +63,11 @@
"
><i class="el-icon-picture"></i><span> 图片</span></span
>
<span @click="preVideo"><i class="iconfont icon-shipin"></i><span> 视频</span></span>
<!-- <span @click="preVideo"><i class="iconfont icon-shipin"></i><span> 视频</span></span> -->
<!-- <span @click="cardShow = true"><i class="iconfont icon-qiaquan"></i><span> 卡券</span></span> -->
</div>
<vue-ueditor-wrap ref="ueditor" v-model="activeImgText.content" :destroy="false" :config="config" @ready="ready" :myInit="myInit"></vue-ueditor-wrap>
<el-checkbox class="pt10" v-model="activeImgText.originalStatus" :true-label="1" :false-label="0">原文链接</el-checkbox>
<el-checkbox class="pt10" v-model="activeImgText.originalStatus" :disabled="isCheckImg" :true-label="1" :false-label="0">原文链接</el-checkbox>
<el-input size="medium" v-if="activeImgText.originalStatus" v-model="activeImgText.originalUrl"></el-input>
</div>
</div>
......@@ -108,7 +109,7 @@
</el-dialog>
<preview :show.sync="previewShow" :imgTextList="imgTextList" :firstImgText="firstImgText"></preview>
<div class="btn-wrap_fixed" :class="{ on: asideShow }">
<el-button type="primary" @click="submit" :loading="subLoading">保 存</el-button>
<el-button type="primary" v-if="$route.path.indexOf('check-imgtext') <= 0" @click="submit" :loading="subLoading">保 存</el-button>
<el-button @click="previewShow = true">预 览</el-button>
<el-button @click="$router.go(-1)">返 回</el-button>
</div>
......@@ -131,6 +132,7 @@ import { upRecord, downRecord, voidStr } from '@/utils/index.js';
export default {
data() {
return {
isCheckImg: false,
loading: false,
subLoading: false,
activeClass: 'first',
......@@ -221,7 +223,20 @@ export default {
},
created() {
this.getMarketingUserInfo();
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '素材库', path: '/wechat/temp' }, { name: '图文编辑', path: '' }]);
// editor
// editor:id
// check-imgtext:id
const bread = [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '素材库', path: '/wechat/temp' }];
if (this.$route.path == '/wechat/editor') {
bread.push({ name: '新建图文', path: '' });
} else if (this.$route.path.indexOf('check-imgtext') >= 0) {
bread.push({ name: '查看图文', path: '' });
this.isCheckImg = true;
this.config.readonly = true;
} else {
bread.push({ name: '编辑图文', path: '' });
}
this.$store.commit('mutations_breadcrumb', bread);
//监听获取图片 封面图或者正文图片
// eslint-disable-next-line
$bus.$on('img-temp-choose', val => {
......@@ -411,7 +426,7 @@ export default {
let res = await saveUpdateWechatImageText({ wechatTeletext: JSON.stringify(params) });
if (res.errorCode === 0) {
this.$tips({ type: 'success', message: type ? '编辑图文成功' : '新建图文成功' });
this.$router.push('/wechat/temp/imgtext');
this.$router.go(-1);
} else {
this.$tips({ type: 'error', message: res.message || type ? '编辑图文失败' : '新建图文失败' });
}
......
......@@ -16,7 +16,7 @@
</div>
<div>
<span class="dm-input_label" style="margin-right:12px">发送时间:</span>
<el-select class="w250" v-model="info.sendType" :disabled="isInfo">
<el-select class="w250" v-model="info.sendType" :disabled="isInfo || isEdit">
<el-option v-for="(v, i) in sendTypeOptions" :key="i" :value="v.value" :label="v.label"></el-option>
</el-select>
<el-date-picker class="w250" :disabled="isInfo" v-if="info.sendType" v-model="info.sendTime" type="datetime" placeholder="选择日期时间" align="right" :picker-options="pickerOptions"></el-date-picker>
......@@ -30,14 +30,14 @@
<div class="pt10 pb20">
<span class="dm-input_label">选择会员:</span>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="0">会员筛选</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="1">
<el-radio v-model="info.memberType" :disabled="isInfo || isEdit" :label="0">会员筛选</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo || isEdit" :label="1">
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="2">会员分组</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo || isEdit" :label="2">会员分组</el-radio>
</div>
<div v-show="info.memberType === 0">
<vue-gic-people v-bind="storeParams" :projectName="projectName" :isAdd="isAdd" :triggerReset="true" :useId="useId" :hasSearchData="hasSearchData" :sceneValue="sceneValue" ref="peopleFilter" @findFilter="findFilter" @getBackData="getBackData" @editHide="editHide" @editShow="editShow" @hideBtn="hideBtn" />
......@@ -52,14 +52,14 @@
<section class="dm-form__wrap" v-if="$route.meta.type !== 'imgText'">
<h3 class="dm-title__label">群发内容设置</h3>
<span class="dm-input_label">群发类型:</span>
<el-radio-group v-model="info.contentType">
<el-radio-group :disabled="isInfo || isEdit" v-model="info.contentType">
<el-radio :label="0" :disabled="isInfo">图文</el-radio>
<el-radio :label="1" :disabled="isInfo">文本</el-radio>
<el-radio :label="2" :disabled="isInfo">图片</el-radio>
</el-radio-group>
<div class="pt20">
<div v-show="info.contentType === 0" style="padding:15px; border:1px solid #DCDFE6;border-radius:2px;">
<dm-img-text :isGroupSend="true" :showSelf="false" :showSelfFlag="showSelfFlag" @get-data="getImgTextData" :radioShow="true" :auto="false" :imageTextId="info.imageTextId" :activeId="info.imageTextWechatId"></dm-img-text>
<dm-img-text :isGroupSend="true" :disabled="isInfo || isEdit" :showSelf="false" :showSelfFlag="showSelfFlag" @get-data="getImgTextData" :radioShow="true" :auto="false" :imageTextId="info.imageTextId" :activeId="info.imageTextId"></dm-img-text>
</div>
<dm-img-box :isGroupSend="true" :selfSwitch="false" v-show="info.contentType === 2" :mediaId="info.mediaId" @get-data="getImgData"></dm-img-box>
<div v-show="info.contentType === 1">
......@@ -198,7 +198,9 @@ export default {
);
},
created() {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '发送记录', path: '/wechat' }, { name: '微信群发', path: '' }]);
this.$nextTick(() => {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '发送记录', path: '/wechat' }, { name: '微信群发', path: '' }]);
});
if (this.imgTextFlag) {
this.wechatImageTextEdit();
}
......@@ -505,7 +507,7 @@ export default {
.then(res => {
this.loading = false;
if (res.errorCode === 0) {
this.$tips({ type: 'success', message: res.message || '操作成功' });
this.$tips({ type: 'success', message: this.$route.meta.type == 'edit' ? '编辑群发成功' : '新建群发成功' });
setTimeout(_ => {
if (this.imgTextFlag) {
// 图片使用时跳转到图片列表
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment