Commit 226e839e by shaojiawen

Merge branch 'dev' of http://git.gicdev.com/dm4/welfare into dev

parents 41cebfd7 b7d92e95
.ml40[data-v-90e25754]{margin-left:40px}.filter-block[data-v-90e25754]{color:#303133;background:#f7f8fa;padding:20px;margin-bottom:20px}.filter-block span[data-v-90e25754]{margin-left:10px;margin-right:10px;line-height:20px}.card[data-v-90e25754]{padding-left:70px;min-height:70px;position:relative}.card img[data-v-90e25754]{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:4px}.card .name[data-v-90e25754]{color:#303133;padding-top:8px;margin-bottom:7px;line-height:22px}.el-icon-delete[data-v-3e211f3a]{display:inline-block;font-size:17px;padding:9px;margin-right:10px;color:#909399;border:1px solid #e4e7ed;border-radius:50%;vertical-align:middle;cursor:pointer;position:relative;top:-60px}.el-icon-delete[data-v-3e211f3a]:hover{background:#fef0f0;border:1px solid #fbc4c4;color:#f5222d}
\ No newline at end of file
.ml40[data-v-20cf549a]{margin-left:40px}.filter-block[data-v-20cf549a]{color:#303133;background:#f7f8fa;padding:20px;margin-bottom:20px}.filter-block span[data-v-20cf549a]{margin-left:10px;margin-right:10px;line-height:20px}.card[data-v-20cf549a]{padding-left:70px;min-height:70px;position:relative}.card img[data-v-20cf549a]{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:4px}.card .name[data-v-20cf549a]{color:#303133;padding-top:8px;margin-bottom:7px;line-height:22px}.el-icon-delete[data-v-51536a1e]{display:inline-block;font-size:17px;padding:9px;margin-right:10px;color:#909399;border:1px solid #e4e7ed;border-radius:50%;vertical-align:middle;cursor:pointer;position:relative;top:-60px}.el-icon-delete[data-v-51536a1e]:hover{background:#fef0f0;border:1px solid #fbc4c4;color:#f5222d}
\ No newline at end of file
.ct[data-v-1a4621fb]{padding-left:20px;padding-right:20px;position:relative}.ct i[data-v-1a4621fb]{position:absolute;left:0;top:3px}.ct p[data-v-1a4621fb]{font-size:13px;font-weight:400;color:#606266;line-height:22px}.ct .tips[data-v-1a4621fb]{font-size:13px;line-height:1;color:#606266;margin-left:90px;margin-top:8px}.ct .tips[data-v-1a4621fb]:before{content:"*";color:#ff943e;margin-right:3px}[data-v-544d1af3] .el-table__row .hover-btn{opacity:0;-webkit-transition:all .1s;transition:all .1s}[data-v-544d1af3] .el-table__row.hover-row .hover-btn{opacity:1}.card[data-v-544d1af3]{padding-left:70px;min-height:70px;position:relative}.card img[data-v-544d1af3]{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:4px}.card .name[data-v-544d1af3]{color:#303133;padding-top:8px;margin-bottom:7px;line-height:22px}.ct-block[data-v-544d1af3]{background:rgba(47,84,235,.07);text-align:center;padding:20px 0 16px}.ct-block p[data-v-544d1af3]{font-size:16px;color:#303133;line-height:22px}.ct-block div[data-v-544d1af3]{margin:10px 0 15px;color:#606266;line-height:17px}.ml40[data-v-544d1af3]{margin-left:40px}.filter-block[data-v-544d1af3]{color:#303133;background:#f7f8fa;padding:20px;margin-bottom:20px}.filter-block span[data-v-544d1af3]{margin-left:10px;margin-right:10px;line-height:20px}.dm-switch[data-v-457d5c5a] .el-switch__label{color:#606266}.dm-switch[data-v-457d5c5a] .el-switch__label.is-active{color:#303133}.w260[data-v-b43f3084]{width:260px}.result[data-v-34452bfd]{text-align:center}.result p[data-v-34452bfd]:first-child{color:#303133;font-size:14px;line-height:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:24px}.result i[data-v-34452bfd]{font-size:24px;margin-right:8px}.send-preview[data-v-0ab93ec9]{-webkit-transition:all .3s ease;transition:all .3s ease;opacity:0;visibility:hidden;z-index:1000;position:fixed;width:100%;height:100%;overflow-y:hidden;left:0;top:0}.send-preview.visible[data-v-0ab93ec9]{visibility:visible;opacity:1}.send-preview div.block[data-v-0ab93ec9]{margin:0 auto;z-index:3;position:relative;top:0;height:100%;width:100%}.send-preview div.block img[data-v-0ab93ec9]{width:100%}.send-preview ul[data-v-0ab93ec9]{position:absolute;bottom:10px}.send-preview .content[data-v-0ab93ec9]{height:100%;width:100%;position:absolute;left:0;top:0}.send-preview .content .avatar[data-v-0ab93ec9]{position:absolute;right:75.5px;top:119px}.send-preview .content .avatar[data-v-0ab93ec9] i{font-size:18px;line-height:35px}.send-preview .content .blk[data-v-0ab93ec9]{position:absolute;padding:22px 15px 13px 15px;right:129.5px;top:119px;width:224px;background:#fff;-webkit-box-shadow:0 2px 8px 0 rgba(0,0,0,.1);box-shadow:0 2px 8px 0 rgba(0,0,0,.1);border-radius:10px}.send-preview .content .blk .card[data-v-0ab93ec9]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.send-preview .content .blk .card i[data-v-0ab93ec9]{position:relative;top:2px}.send-preview .content .blk pre[data-v-0ab93ec9]{margin:15px auto;line-height:18px}.send-preview .bg[data-v-0ab93ec9]{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1;display:block;background:rgba(0,0,0,.5)}.send-preview .btn[data-v-0ab93ec9]{position:absolute;height:80px;width:368px;top:773px;left:63px;background:#fff;overflow:hidden;border-radius:0 0 50px 50px}.send-preview .btn li[data-v-0ab93ec9]{float:left;width:50%;line-height:80px;color:#606266;text-align:center;font-size:18px}.send-preview .btn li.active[data-v-0ab93ec9]{color:#2f54eb}.page[data-v-0ab93ec9]{width:308px;position:absolute;top:98px;left:50%;margin-left:-154px}.page .title[data-v-0ab93ec9]{color:#335782;font-size:16px;margin:16px 0;text-align:center}.page .page-card[data-v-0ab93ec9]{background:#fff;padding:20px;height:650px;border-radius:4px}.page .give-rule[data-v-0ab93ec9]{margin-top:70px}.page .give-rule dd[data-v-0ab93ec9]{text-align:center;color:#2c3038;font-size:18px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #e6e6e6}.page .give-rule dt[data-v-0ab93ec9]{font-size:14px;line-height:24px}.page .card-content[data-v-0ab93ec9]{-webkit-box-shadow:0 2px 8px 0 rgba(136,148,156,.15);box-shadow:0 2px 8px 0 rgba(136,148,156,.15);overflow:hidden;position:relative;height:70px;padding-left:91px;background:#fff}.page .card-content img.exchange[data-v-0ab93ec9]{width:50px}.page .card-content .dl[data-v-0ab93ec9]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:91px;color:#fff;height:100%;text-align:center;position:absolute;left:0;top:0;background:#3970b5}.page .card-content .dl[data-v-0ab93ec9]:after{content:"";width:6px;height:100%;background:url([object Module]) repeat-y;position:absolute;left:-3px;top:0}.page .card-content .dl p[data-v-0ab93ec9]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:28px;font-weight:700;line-height:100px;height:100px;text-align:center}.page .card-content .dl p span[data-v-0ab93ec9]{margin-right:2px;font-size:18px}.page .card-d[data-v-0ab93ec9]{padding:10px 10px 5px 10px;position:relative;height:100%}.page .card-d-title[data-v-0ab93ec9]{height:18px;font-size:13px;font-weight:500;color:#2c3038;line-height:18px;margin-bottom:11px;position:relative;margin-top:2px;padding-left:48px}.page .card-d-title span[data-v-0ab93ec9]{position:absolute;left:-20px;bottom:-7px;width:84px;padding:2px 0 2px;border-radius:1px;text-align:center;color:#fff;line-height:28px;font-weight:400;font-size:20px;display:inline-block;-webkit-transform:scale(.5);transform:scale(.5)}.page .card-d-time[data-v-0ab93ec9]{height:15px;font-size:12px;font-weight:400;color:#2c3038;line-height:15px}.page .card-d-option[data-v-0ab93ec9]{width:calc(200% - 48px);position:absolute;bottom:0;left:-40%;font-size:22px;font-weight:400;color:#2c3038;line-height:32px;-webkit-transform:scale(.5);transform:scale(.5);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.page .card-d-option img[data-v-0ab93ec9]{width:24px;height:24px}.page .card-d-option .right[data-v-0ab93ec9]{margin-left:auto}.slide-fade-enter-active[data-v-0ab93ec9]{-webkit-transition:all .3s ease;transition:all .3s ease}.slide-fade-leave-active[data-v-0ab93ec9]{-webkit-transition:all .8s cubic-bezier(1,.5,.8,1);transition:all .8s cubic-bezier(1,.5,.8,1)}.slide-fade-enter[data-v-0ab93ec9],.slide-fade-leave-to[data-v-0ab93ec9]{-webkit-transform:translateX(10px);transform:translateX(10px);opacity:0}.mt8[data-v-5dfc879c]{margin-top:8px}.cardForm[data-v-5dfc879c]{padding:30px 20px}.cardForm .w165[data-v-5dfc879c]{width:165px!important}.cardForm .w265[data-v-5dfc879c]{width:265px!important}.cardForm .tips[data-v-5dfc879c]{font-size:12px;color:#909399;margin-left:8px}.cardForm .step[data-v-5dfc879c]{margin:20px auto 48px}.cardForm[data-v-5dfc879c] .el-form .el-input-number .el-input,.cardForm[data-v-5dfc879c] .el-form .el-select .el-input{width:100%}.cardForm[data-v-5dfc879c] .el-form .w260,.w260[data-v-5dfc879c] input,.w260[data-v-5dfc879c] textarea{width:260px}.cardEffectiveMode1[data-v-5dfc879c]{position:relative}.cardEffectiveMode1-time[data-v-5dfc879c]{position:absolute;top:0;left:100px}.cardEffectiveMode1-time.is2[data-v-5dfc879c]{top:47px}.content[data-v-5dfc879c]{margin-bottom:30px}.info .row[data-v-f71e8c96] .el-form-item{margin-bottom:12px}.w500[data-v-f71e8c96] input,.w500[data-v-f71e8c96] textarea{width:500px}.card-info[data-v-f71e8c96]{padding:24px 20px;position:relative}.card-info .title[data-v-f71e8c96]{font-size:14px;font-weight:700;color:#303133;line-height:22px;margin-bottom:24px}.card-info[data-v-f71e8c96] .btn-area{display:none}.card-info[data-v-f71e8c96] .el-form-item__content{color:#303133}.card-info[data-v-f71e8c96] .el-form .el-input-number .el-input,.card-info[data-v-f71e8c96] .el-form .el-select .el-input{width:100%}.card-info[data-v-f71e8c96] .el-form .dm-input,.card-info[data-v-f71e8c96] .el-form .el-input,.card-info[data-v-f71e8c96] .el-form .el-input-number,.card-info[data-v-f71e8c96] .el-form .el-select,.card-info[data-v-f71e8c96] .el-form .el-textarea{width:352px}.cardSelect[data-v-1324332a] .el-button{width:350px!important}.cardSelect[data-v-1324332a] .reveal .card img.flag{display:none}[data-v-1324332a] .dashed-btn .el-button{width:350px;border-style:dashed;border-radius:2px}[data-v-1324332a] .dashed-btn .el-button:not(.is-disabled){background:#fff;color:#606266;border-color:#c0c4cc}[data-v-1324332a] .dashed-btn .el-button:not(.is-disabled):hover{border-color:#2f54eb;color:#2f54eb}[data-v-1324332a] .dashed-btn .el-button.is-disabled{color:#c0c4cc}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-76577a52"],{"1e4b":function(t,a,e){"use strict";e.r(a);var c=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",[e("div",{staticClass:"enter"},t._l(t.wfTypes,(function(a,c){return e("div",{key:c,class:"b"+(c+1)},[e("span",{staticClass:"title"},[t._v(t._s(a.title))]),e("router-link",{staticClass:"target",attrs:{to:a.target}},[e("i",{staticClass:"icon-right-circle iconfont-welfare4"})])],1)})),0)])},n=[],i=e("f9e4"),r={name:"Index",data:function(){return{wfTypes:i["b"]}}},l=r,s=(e("ccb6"),e("5d22")),u=Object(s["a"])(l,c,n,!1,null,"8987bf3a",null);a["default"]=u.exports},"56c2":function(t,a,e){},ccb6:function(t,a,e){"use strict";e("56c2")},f9e4:function(t,a,e){"use strict";e.d(a,"b",(function(){return c})),e.d(a,"a",(function(){return n}));e("00f2"),Array(31).fill().map((function(t,a){return{label:"".concat(a+1,"号"),value:"".concat(a+1)}})),Array(28).fill().map((function(t,a){return{label:"".concat(a+1,"号"),value:"".concat(a+1)}})).concat({label:"月底",value:"0"}),Array(12).fill().map((function(t,a){return{label:"".concat(a+1,"月"),value:"".concat(a+1)}}));var c=[{title:"实物礼品",target:"/gift-manage/real-gift",code:"w-real-gifts"},{title:"虚拟礼品",target:"/gift-manage/virtual-gift",code:"w-virtual-gifts"},{title:"GIC 卡券",target:"/gic-card/list",code:"w-gic-card"},{title:"GIC 卡券包",target:"/card-package/list",code:"w-card-package"}],n={1:"增加",2:"减少"}}}]);
\ No newline at end of file
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-9632093e"],{"0687":function(t,a,e){},"1e4b":function(t,a,e){"use strict";e.r(a);var c=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",[e("div",{staticClass:"enter"},t._l(t.wfTypes,(function(a,c){return e("div",{key:c,class:"b"+(c+1)},[e("span",{staticClass:"title"},[t._v(t._s(a.title))]),e("router-link",{staticClass:"target",attrs:{to:a.target}},[e("i",{staticClass:"icon-right-circle iconfont-welfare4"})])],1)})),0)])},n=[],i=e("f9e4"),r={name:"Index",data:function(){return{wfTypes:i["b"]}}},l=r,s=(e("ccb6"),e("2877")),u=Object(s["a"])(l,c,n,!1,null,"8987bf3a",null);a["default"]=u.exports},ccb6:function(t,a,e){"use strict";e("0687")},f9e4:function(t,a,e){"use strict";e.d(a,"b",(function(){return c})),e.d(a,"a",(function(){return n}));e("6c7b"),Array(31).fill().map((function(t,a){return{label:"".concat(a+1,"号"),value:"".concat(a+1)}})),Array(28).fill().map((function(t,a){return{label:"".concat(a+1,"号"),value:"".concat(a+1)}})).concat({label:"月底",value:"0"}),Array(12).fill().map((function(t,a){return{label:"".concat(a+1,"月"),value:"".concat(a+1)}}));var c=[{title:"实物礼品",target:"/gift-manage/real-gift",code:"w-real-gifts"},{title:"虚拟礼品",target:"/gift-manage/virtual-gift",code:"w-virtual-gifts"},{title:"GIC 卡券",target:"/gic-card/list",code:"w-gic-card"},{title:"GIC 卡券包",target:"/card-package/list",code:"w-card-package"}],n={1:"增加",2:"减少"}}}]);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -48,7 +48,7 @@
<script src="//web-1251519181.file.myqcloud.com/components/preview-img.1.0.3.js"></script><!-- 图片预览 -->
<script src="//web-1251519181.file.myqcloud.com/components/delete.1.1.4.js"></script><!-- 删除轻弹窗 -->
<script src="//web-1251519181.file.myqcloud.com/components/input-number.1.0.10.js"></script><!-- 输入框 -->
<script src="//web-1251519181.file.myqcloud.com/components/welfare-selector.0.0.4.js"></script><!-- 福利选择器 -->
<script src="//web-1251519181.file.myqcloud.com/components/welfare-selector.0.0.6.js"></script><!-- 福利选择器 -->
<script src="//web-1251519181.file.myqcloud.com/components/acc-group-select.1.0.5.js"></script><!-- 账号分组组件 -->
<script src="//web-1251519181.file.myqcloud.com/components/editor.1.1.13.js"></script><!-- 富文本编辑器 -->
</body>
......
......@@ -59,6 +59,12 @@ let destory = {
couponConsumeOrder: '/coupon-log/coupon-consume-order', // 核销 - 订单信息
couponConsume: '/coupon-log/coupon-consume', // 核销 - 核销
couponDestroy: '/coupon-log/coupon-destroy', // 销毁
importCode: {
url: '/coupon/import-custom-code',
method: 'post',
headers: { 'Content-Type': 'multipart/form-data;' },
file: true
}, // 导入券码
};
......@@ -69,7 +75,6 @@ export default { ...card, ...destory };
export const downloadCouponCSV = config.api + welfarePrefix + '/destroy-plugin/download-destroy-code-template'; // 下载导入GIC券号csv示例文件
export const importCode = config.api + welfarePrefix + '/destroy-plugin/import-destroy-code'; // 导入券码
export const importDestoryCode = welfarePrefix + '/destroy-plugin/import-destroy-code'; // 上传销毁code列表
export const downloadDestroyCodeTemplate = config.api + welfarePrefix + '/coupon/download-code-template'; // 下载销毁模板示例
......@@ -24,11 +24,10 @@
</div>
<!-- bread插槽 -->
<div slot="bread">
<!-- <app-info force-init ref="appInfo" /> -->
<app-info :code="moduleCode" />
</div>
</dm-layout>
<!-- <el-dialog :visible="noAreaWarnVisible" append-to-body width="500px" :close-on-press-escape="false" :close-on-click-modal="true" :show-close="false" lock-scroll>
<el-dialog :visible="noAreaWarnVisible && project.includes('card')" append-to-body width="500px" :close-on-press-escape="false" :close-on-click-modal="true" :show-close="false" lock-scroll>
<div class="text-center">
<p class="gray02 fz16" style="display:flex;justify-content: center;align-items: center;"><i class="el-icon-warning fz30 mr5 warning-color"></i>暂无资源权限</p>
<p class="fz13 gray03 mt20">没有资源权限,如:可操作的会员卡、服务号等,请联系管理员进行配置</p>
......@@ -38,7 +37,7 @@
<el-button @click="toAppCenter"> 返回应用中心</el-button>
</div>
</span>
</el-dialog> -->
</el-dialog>
<switch-page />
</div>
</template>
......
......@@ -224,4 +224,23 @@ export const getHours2 = (time) => {
let minute = now.getMinutes();
// minute >= 10 ? (minute = minute) : (minute = '0' + minute); //判断小于10的分的情况
return hour + ':' + minute;
};
/**
* 获取文件大小,obj为dom对象
* @param {File} obj 文件类型
* @returns {Number} 文件大小(单位为KB)
*/
export const getFileSize = (obj) => {
let fileSize = 0;
const isIE = /msie/i.test(navigator.userAgent) && !window.opera;
if (isIE && !obj.files) {
const filePath = obj.value;
const fileSystem = new ActiveXObject('Scripting.FileSystemObject'); // eslint-disable-line
const file = fileSystem.GetFile(filePath);
fileSize = file.Size;
} else {
fileSize = obj.files[0].size;
}
return Math.round(fileSize / 1024); // 单位为KB
};
\ No newline at end of file
......@@ -30,24 +30,17 @@
<dm-acc-group-select :etype.sync="ruleForm.operAuthType" :group-ids.sync="ruleForm.operAuth" />
</el-form-item>
<el-form-item>
<el-button type="primary" v-if="isAdd" @click="addForm">确认新建</el-button>
<el-button type="primary" v-if="isAdd" @click="addForm">保存并添加卡券</el-button>
<el-button type="primary" :disabled="ruleForm.packageStock == info.packageStock" v-else @click="editForm">保存</el-button>
</el-form-item>
<el-form-item v-if="!isAdd" class="is-required">
<el-tooltip content="若添加的卡券为固定有效期,仅允许添加和有效期限时间重合的卡券" placement="bottom" slot="label" open-delay="200">
<span class="tooltip-icon">添加卡券</span>
</el-tooltip>
<!-- <div v-loading="cardLoading">
<div class="mb10">
卡券id:<el-input v-model="couponForm.couponId" style="width:200px" class="mr10" />
库存值:<el-input v-model="couponForm.stock" style="width:100px" />
<el-button type="text" @click="addCard" class="ml5">保存</el-button>
</div>
</div> -->
<el-button class="dashed" @click="showSelector = true">添加卡券</el-button>
<div class="imitation-table" v-if="couponList.length" style="width:100%;" v-loading="cardLoading">
<el-button class="dashed" :disabled="couponList.length > 10" @click="showSelector = true">添加卡券 {{ couponList.length }}/{{ 10 }}</el-button>
<div class="imitation-table mt20" v-if="couponList.length" style="width:100%;" v-loading="cardLoading">
<el-row class="thead">
<el-col :span="5">卡券信息</el-col>
<el-col :span="5">卡券名称</el-col>
<el-col :span="5">使用有效期</el-col>
<el-col :span="4">卡券包内剩余库存</el-col>
<el-col :span="4">福利可占库存</el-col>
......@@ -70,9 +63,7 @@
<span v-else class="state-point state-point-success">{{ item.welfareStatus == 2 ? '已删除' : '已过期' }}</span>
</el-col>
<el-col :span="3">
<dm-delete @confirm="delCard(item)" tips="删除后已占用库存将被释放,确认删除?">
<el-button type="text">删除</el-button>
</dm-delete>
<el-button @click="delCard(item)" type="text">删除</el-button>
</el-col>
</el-row>
<div v-if="item.remainedStock < ruleForm.packageStock" class="gray03"><i class="el-icon-warning mr5 danger-color"></i>卡券包库存大于福利库存,请调整福利占用库存</div>
......@@ -98,6 +89,7 @@
</template>
<script>
import { showConfirm } from '@/utils/common';
import { getTimesByReq } from '@/utils/common.js';
import { cardType } from '@/config/mapping/gic-card';
import { formatDateTimeByType } from '@/utils/index.js';
......@@ -209,16 +201,18 @@ export default {
},
// 删除卡券
delCard({ couponId }) {
const params = {
couponPackageId: this.couponPackageId,
couponId
};
this.cardLoading = false;
delPackageItem(params).then(res => {
this.cardLoading = false;
this.refreshCouponList();
}).catch(() => {
showConfirm('<div>确认删除该卡券吗?</div><div>删除后已占用库存将被释放</div>', () => {
const params = {
couponPackageId: this.couponPackageId,
couponId
};
this.cardLoading = false;
delPackageItem(params).then(res => {
this.cardLoading = false;
this.refreshCouponList();
}).catch(() => {
this.cardLoading = false;
});
});
},
refreshCouponList() {
......
......@@ -85,8 +85,7 @@
</el-table-column>
<el-table-column label="卡券包状态" min-width="120">
<template slot="header">
<el-tooltip placement="top" open-delay="200">
<div slot="content">使用中:在福利组件中展示;<br/>已过期:在福利组件中不展示;</div>
<el-tooltip placement="top" open-delay="200"><div slot="content">未生效:卡券包中无卡券,福利组件不展示;<br/>已生效:在福利组件中展示;<br/>已过期:在福利组件中不展示</div>
<span class="tooltip-icon">卡券包状态</span>
</el-tooltip>
</template>
......
import { reRreshRoute, formatDateTimeByType, deepClone } from '@/utils';
import api from '@/api/gic-card';
import api, { downloadCouponCSV } from '@/api/gic-card';
import { isEmpty } from '@/utils/index';
import { showConfirm } from '@/utils/common';
import { predefineColors, startDayOptionsDay, startDayOptionsMonth } from '@/config/mapping/gic-card';
import { marketPrefix as prefix } from '@/config';
import resultDialog from './module/result-dialog';
import sendPreview from './module/send-preview';
import importCode from './module/import-code';
import commomApi from '@/api/common.js';
const { uploadUrl, getRelationId } = commomApi;
const { addCard, copyCard, checkDemoCode, getMallShopList } = api;
const { addCard, copyCard, checkDemoCode, getMallShopList, importCode } = api;
// 禁止回车
const preventEnter = function(e) {
......@@ -119,8 +118,7 @@ export default {
name: 'card-form',
components: {
resultDialog,
sendPreview,
importCode
sendPreview
},
data() {
// 校验优惠金额和折扣额度
......@@ -281,6 +279,14 @@ export default {
callback();
};
const validUploadFileList = (rule, value, callback) => {
if (this.ruleForm1.customCodeFlag == 2 && this.fileList.length == 0) {
callback(new Error('请导入券码文件'));
return;
}
callback();
};
return {
loading: false,
active: 1,
......@@ -304,7 +310,7 @@ export default {
rules1: {
cardName: { required: true, message: '请输入卡券名称', trigger: 'blur' },
remarkName: { required: true, message: '请输入备注名称', trigger: 'blur' },
subTitle: { required: true, message: '请输入卡券副标题', trigger: 'blur' },
// subTitle: { required: true, message: '请输入卡券副标题', trigger: 'blur' },
denomination: { required: true, validator: validDenomination, trigger: 'blur' },
goodsDiscountCheckLower: { required: true, validator: validDiscount, type: 'min', trigger: 'blur' },
goodsDiscountCheck: { required: true, validator: validDiscount, type: 'max', trigger: 'blur' },
......@@ -320,6 +326,7 @@ export default {
{ required: true, trigger: 'blur', message: '请输入成本' },
{ validator: validMin0, trigger: 'change', message: '成本必须大于0' }
],
uploadFlag: { required: true, validator: validUploadFileList, trigger: 'change' },
cardEffectiveMode0: [ { validator: validTime, trigger: 'change' } ],
cardEffectiveMode1: [ { required: true, validator: validEffectTimeMode, trigger: 'change' } ],
customCode: [
......@@ -345,7 +352,7 @@ export default {
visible: false,
disabled: true
},
importVisible: false, // 导入券码model
uploadFileloading: false,
fileList: [], // 导入券码的的文件的列表
// 线下门店适用
xxsy: { ...defaultXxsy },
......@@ -864,6 +871,26 @@ export default {
}
return true;
},
downloadCouponCSV() {
window.open(downloadCouponCSV);
},
uploadCode() {
this.uploadFileloading = true;
const file = this.$refs.file.files[0];
importCode({
file,
remark: this.remark,
couponId: this.couponId
}).then(res => {
this.uploadFileloading = false;
this.fileList.push({ name: file.name });
this.$tips({ message: '上传成功', type: 'success' });
this.$refs.file.value = '';
this.$refs.ruleForm1.validateField('uploadFlag');
}).catch(() => {
this.uploadFileloading = false;
});
},
// **********商品选择器*************
confirm(keyName, res) { // 点击确认返回数据
this[keyName].goodsFilterId = res.goodsSelectorId;
......@@ -945,6 +972,7 @@ export default {
},
'ruleForm1.customCodeFlag'(val) {
this.$refs.ruleForm1.validateField('customCode');
this.$refs.ruleForm1.validateField('uploadFlag');
},
'ruleForm1.giveFlag'(val) {
if (val) {
......
......@@ -29,9 +29,10 @@
<el-form-item prop="remarkName" label="备注名">
<dm-input class="w260" v-model="ruleForm1.remarkName" :byte-type="1" :maxlength="10" />
</el-form-item>
<el-form-item prop="subTitle" label="副标题">
<!-- 20210303 ui不要副标题 -->
<!-- <el-form-item prop="subTitle" label="副标题">
<dm-input class="w260" v-model="ruleForm1.subTitle" :byte-type="1" :maxlength="18"></dm-input>
</el-form-item>
</el-form-item> -->
<el-form-item class="is-required" prop="color" label="卡券颜色">
<div class="color-picker-custom">
<span class="color vertical-top">{{ ruleForm1.color }}</span>
......@@ -102,16 +103,23 @@
</div>
</div>
</el-form-item>
<el-form-item>
<el-radio v-model="ruleForm1.customCodeFlag" :label="2" @change="(v) => { if(v == 2) { importVisible = true } }">
<span @click="ruleForm1.customCodeFlag = 2;importVisible = true">导入券码</span>
<span class="gray03 cursor" v-if="fileList.length > 0">
<el-popover placement="top-start" title="已上传列表" width="250" trigger="hover">
<ul><li v-for="(f, idx) in fileList" :key="idx" class="ellipsis"><i class="el-icon-success success-color mr5"></i>{{ f.name }}({{ f.size }}k)</li></ul>
<i slot="reference" class="el-icon-document ml5"></i>
</el-popover>
</span>
</el-radio>
<el-form-item prop="uploadFlag">
<el-radio v-model="ruleForm1.customCodeFlag" :label="2">导入券码</el-radio>
<div class="inline-block" v-show="ruleForm1.customCodeFlag == 2">
<input style="position:absolute;top:3px;opacity:0;height:0px;width:0px;" type="file" name="file" accept=".csv" ref="file" @change="uploadCode">
<el-button :disabled="fileList.length >= 10" :loading="uploadFileloading" class="dashed" @click="$refs.file.click()"><i class="iconfont-components4 icon-cp-shangc mr5"></i>上传</el-button>
<el-button type="text" class="ml20" @click="downloadCouponCSV">点击下载文件模板</el-button>
<el-popover placement="bottom" width="350" trigger="hover" open-delay="200">
<ul>
<li>1. 单次上传最多可支持 5000 条</li>
<li>2. 券码格式可由 6~20 位的数字或字母组成</li>
<li>3. 若券码为纯数字组成,为避免发生意外错误,请将其格式设置为 ‘文本’ 格式</li>
<li>4. 仅支持.csv 文件的导入 (建议直接下载模板,在模板的基础上进行数据的填充)</li>
</ul>
<el-button class="ml30" type="text" slot="reference">查看导入规则</el-button>
</el-popover>
</div>
<ul style="padding-left:112px;margin-top:5px;" class="gray01"><li v-for="(f, idx) in fileList" :key="idx" class="ellipsis"><i class="el-icon-document mr10"></i>{{ f.name }}</li></ul>
</el-form-item>
<!-- 自定义号段库存最大100w 随机生成默认10w最大一千万 -->
<el-form-item v-if="!ruleForm1.customCodeFlag" key="couponStock" prop="couponStock" label="库存数量">
......@@ -308,7 +316,6 @@
<el-button slot="footer" class="mt30" @click="handleResClose">关闭</el-button>
</result-dialog>
<send-preview :data="ruleForm1" :visible.sync="preview.visible" /><!-- 转赠预览 -->
<import-code :coupon-id="couponId" :visible.sync="importVisible" open-type="blank" @success="(fileList)=> { fileList = fileList; }" /><!-- 导入券码 -->
<div style="opacity:0;height:1px;visiable:hidden;">
<!-- 链接小工具 -->
<dm-link-tools :member-card-id="currentAreaId" v-if="currentAreaId" :data="ruleForm1.giveBannerJumpUrl" ref="link" @save="onSave" @onHide="onHide" />
......
......@@ -229,8 +229,7 @@ export default {
});
},
// 关闭导入券码弹窗
importCodeSuccess(fileList) {
this.fileList = fileList;
importCodeSuccess() {
this.getCardInfo('code');
},
// ***********门店选择器***************
......
......@@ -15,7 +15,7 @@
<el-form-item label="卡券类型">{{ info.cardType != undefined ? cardType[info.cardType].label : '--' }}</el-form-item>
<el-form-item label="卡券名称">{{ info.cardName }}</el-form-item>
<el-form-item label="备注名">{{ info.remarkName }}</el-form-item>
<el-form-item label="副标题">{{ info.subTitle }}</el-form-item>
<!-- <el-form-item label="副标题">{{ info.subTitle }}</el-form-item> -->
<el-form-item prop="color" label="卡券颜色">
<div class="color-picker-custom">
<span class="color vertical-top">{{ ruleForm.color }}</span>
......@@ -23,7 +23,7 @@
</div>
</el-form-item>
<el-form-item label="导入券码" v-if="info.customCodeFlag === 2 && isEdit">
<el-button type="text" @click="importVisible = true">上传</el-button>
<el-button type="text" @click="importVisible = true">上传文件</el-button>
<span class="gray03 cursor" v-if="fileList.length > 0">
<el-popover open-delay="200" placement="top-start" title="已上传列表" width="250" trigger="hover">
<ul><li v-for="(f, idx) in fileList" :key="idx" class="ellipsis"><i class="el-icon-success success-color mr5"></i>{{ f.name }}({{ f.size }}k)</li></ul>
......
......@@ -61,7 +61,7 @@
<div class="card">
<img :src="scope.row.imgUrl" draggable="false" />
<p class="name ellipsis-100" :title="scope.row.cardName">{{ scope.row.cardName }}</p>
<p :title="scope.row.subTitle" class="fz12 gray-lighter ellipsis-100" style="line-height:17px;">
<p :title="scope.row.remarkName" class="fz12 gray-lighter ellipsis-100" style="line-height:17px;">
<el-popover placement="top-start" width="300" trigger="hover" open-delay="200" :offset="-8">
<div class="gray01 fz14">
<p style="margin-bottom:5px;">福利ID:{{ scope.row.couponId }}</p>
......@@ -69,7 +69,7 @@
</div>
<i class="el-icon-question cursor fz12 gray-lighter" slot="reference"></i>
</el-popover>
{{ scope.row.subTitle }}
{{ scope.row.remarkName }}
</p>
</div>
</template>
......@@ -140,7 +140,7 @@
</div>
<adjust-stock ref="adjust" title="调整可占用库存" :show.sync="adjustStock" :total-count="currentCard.remainedStock" @handleSubmit="adjustStockBack" /><!-- 调整库存 -->
<sync-stock :visible.sync="syncStock.visible" :coupon-id="syncStock.couponId" :type="1" @syncSuccess="getTableList" /><!-- 同步库存 -->
<import-code :coupon-id="codeDialog.couponId" ref="importCode" :visible.sync="codeDialog.visible" @close="(len) => { if(len) { getTableList(); } }" /><!-- 导入券码 -->
<import-code :coupon-id="codeDialog.couponId" ref="importCode" :visible.sync="codeDialog.visible" @success="getTableList" @close="(len) => { if(len) { getTableList(); } }" /><!-- 导入券码 -->
</div>
</template>
......
<template>
<el-dialog title="批量导入券码" :visible.sync="visible" width="600px" @close="close" :close-on-click-modal="false" :show-close="!loading">
<div v-loading="loading">
<div>
<span class="mr15"><i class="danger-color mr5">*</i>选择文件:</span>
<el-upload :data="{ couponId }" :headers="{ isControl: true }" :with-credentials="true" :action="importCode" :show-file-list="false" :file-list="fileList" accept=".csv" class="inline-block" :on-progress="onProgress" :on-success="onSuccess" :on-error="onError" :before-upload="beforeUpload">
<el-button :disabled="loading" class="dashed upload" icon="iconfont-market4 icon-shangchuan mr5">{{ loading ? '上传中' : '点击上传'}}</el-button>
</el-upload>
<el-button type="text" class="ml10" @click="downloadCouponCSV">点击下载CSV模板</el-button>
<!-- <el-button type="text" class="ml10 hover-btn deep" @click="viewErrorList">导入失败记录</el-button> -->
<ul class="file-list">
<li v-for="(f, idx) in fileList" :key="idx">
<i class="el-icon-document gray03 fl"></i>
<p class="ellipsis-80">{{ f.name }}({{ f.size }}k)</p>
<i class="el-icon-success success-color fr"></i>
</li>
</ul>
</div>
<p class="rule">导入规则</p>
<ul>
<li>1. 单次上传最多可支持 5000 条</li>
<li>2. 券码格式可由 6~20 位的数字或字母组成</li>
<li>3. 若券码为纯数字组成,为避免发生意外错误,请将其格式设置为 ‘文本’ 格式</li>
<li>4. 仅支持.csv 文件的导入 (建议直接下载模板,在模板的基础上进行数据的填充)</li>
</ul>
</div>
<el-dialog title="批量导入券码" :visible.sync="visible" width="600px" @close="close">
<el-form v-loading="loading" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="140px">
<el-form-item prop="file" label="导入券码文件">
<input style="position:absolute;top:3px;opacity:0;height:0px;width:0px;" type="file" name="file" accept=".csv" ref="file" @change="change">
<el-button class="dashed" @click="$refs.file.click()"><i class="iconfont-components4 icon-cp-shangc upload-icon mr5"></i>上传</el-button>
<el-button type="text" class="ml20" @click="downloadCouponCSV">点击下载文件模板</el-button>
<el-popover placement="bottom" width="350" trigger="hover" open-delay="200">
<ul>
<li>1. 单次上传最多可支持 5000 条</li>
<li>2. 券码格式可由 6~20 位的数字或字母组成</li>
<li>3. 若券码为纯数字组成,为避免发生意外错误,请将其格式设置为 ‘文本’ 格式</li>
<li>4. 仅支持.csv 文件的导入 (建议直接下载模板,在模板的基础上进行数据的填充)</li>
</ul>
<el-button class="ml30" type="text" slot="reference">查看导入规则</el-button>
</el-popover>
<div v-if="fileName"><i class="el-icon-document mr10"></i>{{ fileName }}</div>
</el-form-item>
<el-form-item prop="remark" label="调整备注">
<el-input type="textarea" v-model="ruleForm.remark" class="w260" :col="4" maxlength="240" show-word-limit />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" :disabled="loading" @click="close">确认</el-button>
<el-button @click="close">取消</el-button>
<el-button type="primary" :disabled="loading" @click="submitForm">确认</el-button>
</span>
</el-dialog>
</template>
<script>
import { SUCCESS_CODE } from '@/config';
import { downloadCouponCSV, importCode } from '@/api/gic-card';
// import { SUCCESS_CODE } from '@/config';
import gicCardApi, { downloadCouponCSV } from '@/api/gic-card';
const { importCode } = gicCardApi;
export default {
name: 'ImportCode',
props: {
......@@ -45,106 +43,70 @@ export default {
type: String,
required: true
},
openType: {
openType: { // 暂无用
type: String, // 打开方式
default: 'self', // self在本窗口打开 blank在新窗口打开
}
},
},
data() {
const validateFile = (rule, value, callback) => {
console.log(this.$refs.file);
console.log(this.$refs.file.value);
if (this.$refs.file.value === '') {
callback(new Error('请导入券码文件'));
return;
}
callback();
};
return {
importCode,
loading: false,
fileList: [], // 已上传列表
file: {} // 储存当前上传文件
// fileList: [], // 已上传列表
ruleForm: {
remark: '',
},
rules: {
file: { required: true, validator: validateFile, trigger: 'blur' },
remark: { required: true, message: '请输入备注', trigger: 'change' }
},
fileName: '',
};
},
methods: {
// 查看导入失败记录
viewErrorList() {
const { couponId } = this;
if(this.openType === 'self') {
this.$router.push(`/gic-card/code-error/list?id=${couponId}`);
} else {
// 新窗口
let routeData = this.$router.resolve({ path: '/gic-card/code-error/list', query: { id: couponId } });
window.open(routeData.href, '_blank');
}
},
beforeUpload(file) {
this.file = {
name: file.name,
size: file.size
};
return file;
change() {
this.fileName = this.$refs.file.files[0].name;
},
onSuccess(res) {
if(res.code === SUCCESS_CODE) {
this.loading = false;
this.fileList.push({ ...this.file });
this.$emit('success', this.fileList);
this.file = {};
} else {
this.onError(res);
}
},
onError(error) {
this.file = {};
this.$tips({ message: error.message || '上传出错', type: 'error' });
this.loading = false;
},
onProgress() {
this.loading = true;
submitForm() {
this.$refs.ruleForm.validate((valid) => {
if (!valid) {
return;
}
const file = this.$refs.file;
this.loading = true;
importCode({
file: file.files[0],
remark: this.ruleForm.remark,
couponId: this.couponId
}).then(res => {
this.loading = false;
this.$tips({ message: '上传成功', type: 'success' });
this.$refs.ruleForm.validateField('file');
this.$emit('success');
this.close();
}).catch(() => {
this.loading = false;
});
});
},
downloadCouponCSV() {
window.open(downloadCouponCSV);
},
close() {
this.$emit('update:visible', false);
this.$emit('close', this.fileList.length);
this.fileName = '';
this.ruleForm.remark = '';
this.$refs.file.value = '';
this.$refs.ruleForm.resetFields();
}
},
};
</script>
<style lang="scss" scoped>
.upload {
display: inline-block;
width: 175px;
line-height: 15px !important;
}
.file-list {
margin-left: 95px;
li {
height:37px;
line-height:37px;
background:rgba(242,243,247,1);
border-radius:2px;
margin-bottom: 5px;
padding-left: 13px;
padding-right: 27px;
margin-top: 10px;
i {
margin-top: 12px;
}
p {
display: inline-block;
width: 80%;
margin-left: 5px;
}
}
}
.rule {
color: $gray03;
padding-top: 22px;
margin-top: 36px;
border-top: 1px solid $gray-separator;
margin-bottom: 11px;
& + ul {
color: $gray03;
li {
font-size:12px;
line-height:20px;
}
}
}
</style>
\ No newline at end of file
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