Authored by OF1706

Merge branch 'feature/return' of http://git.yoho.cn/fe/yohobuy-node into feature/return

... ... @@ -177,8 +177,6 @@ const exchangeSubmit = (orderCode, goods, consigneeName, areaCode, address, mobi
delivery_tpye: deliveryType
};
console.log(options);
return api.post('', options);
};
... ...
... ... @@ -121,7 +121,7 @@ const getReturnsList = co(function*(uid, page, limit) {
let t = {
returnId: item.id,
orderNum: item.order_code,
orderTime: _.replace(item.oreder_create_time, '-', '/'),
orderTime: item.order_create_time,
returnTime: item.create_time,
returnStatus: item.status_name
};
... ... @@ -183,8 +183,9 @@ const getOrderRefund = (orderCode, uid) => {
let cnAlphabet = value.cn_alphabet || 'cnalphabet';
let item = {
href: getProductUrlBySkc(value.product_id, value.goods_id, cnAlphabet),
thumb: helpers.image(value.goods_image, 60, 60),
name: value.product_name,
color: value.color_name,
color: value.factory_color_name,
size: value.size_name,
price: value.last_price,
skn: value.product_skn,
... ... @@ -243,6 +244,7 @@ const getOrderRefund = (orderCode, uid) => {
}
});
resData.returnBankMode = _.get(result, 'data.return_bank_mode', '');
resData.returnAmountMode = result.data.return_amount_mode;
}
... ... @@ -323,6 +325,7 @@ const getRefundDetail = (applyId, uid) => {
let data = result[0].data;
let detail = {
isChange: false,
returnId: applyId,
orderNum: data.source_order_code,
nowStatus: data.status_name,
applyTime: data.create_time,
... ... @@ -334,7 +337,6 @@ const getRefundDetail = (applyId, uid) => {
if (+data.status !== 0) {
detail.express = {
id: _.get(data, 'notice.express_id', ''),
returnId: applyId,
company: _.get(data, 'notice.express_company', ''),
number: _.get(data, 'notice.express_number', '')
};
... ... @@ -384,6 +386,7 @@ const getChangeDetail = (applyId, uid) => {
let data = result[0].data;
let detail = {
isChange: true,
returnId: applyId,
orderNum: data.source_order_code,
nowStatus: data.status_name,
applyTime: data.create_time,
... ... @@ -393,7 +396,6 @@ const getChangeDetail = (applyId, uid) => {
if (+data.status !== 0 && +data.delivery_tpye !== 20) {
detail.express = {
id: _.get(data, 'notice.express_id', ''),
returnId: applyId,
company: _.get(data, 'notice.express_company', ''),
number: _.get(data, 'notice.express_number', ''),
expressDeadLine: _.get(data, 'notice.date', '')
... ... @@ -409,7 +411,7 @@ const getChangeDetail = (applyId, uid) => {
});
if (data.canCancel === 'Y') {
detail.canCancelUrl = '/home/returns/cancelChange';
detail.canCancelUrl = helpers.urlFormat('/home/returns/cancelChange');
}
resData.detail = detail;
... ... @@ -451,8 +453,6 @@ const saveExchange = (req, uid) => {
zipCode = req.body.zipCode,
deliveryType = req.body.deliveryType;
console.log('deliveryType' + deliveryType);
if (_.isEmpty(orderCode) || orderCode < 1 || _.isEmpty(goods) ||
_.isEmpty(deliveryType) || _.isEmpty(consigneeName) || _.isEmpty(areaCode) ||
_.isEmpty(address) || _.isEmpty(mobile)) {
... ... @@ -539,14 +539,14 @@ const getOrderExchange = (orderCode, uid) => {
// tar note 为每个特殊商品都添加标识
if (value.is_limit_skn === 'Y') {
item.specialNoticeBo = {
title: _.get(result, 'data.special_notice.title', ''),
title: _.get(result, 'data.specialNoticeBo.title', ''),
remark1: remarks[0] || '',
remark2: remarks[1] || ''
};
// tar note 对数组做处理,为不显示的添加 inactive
if (result.data.special_return_reason) {
let spReason = result.data.special_return_reason;
if (result.data.special_exchange_reason) {
let spReason = result.data.special_exchange_reason;
_.forEach(item.reason, (subVal, subKey) => { // eslint-disable-line
if (_.indexOf(spReason, subKey)) {
... ... @@ -597,7 +597,7 @@ const getOrderExchange = (orderCode, uid) => {
if (size.length) {
colorSize.push({
color: val.color_name,
color: val.factory_goods_name,
colorId: val.color_id,
goodsId: val.goods_id,
sizeList: size
... ...
... ... @@ -656,7 +656,7 @@ const editUserHabitsInfo = (req, uid) => {
if (req.body.dress) {
dressArr = req.body.dress;
habitsInfo.dress = dressArr.join(',');
habitsInfo.dress = dressArr instanceof Array ? dressArr.join(',') : dressArr;
} else {
habitsInfo.dress = '';
}
... ...
... ... @@ -41,6 +41,15 @@
<td class="return-goods-info">
<a href="{{href}}">{{name}}</a>
<span>颜色:{{color}} 尺码:{{size}}</span>
{{#if specialNoticeBo}}
<div class="special-tip">
<span>{{specialNoticeBo.title}} <i class="doubt"></i></span>
<div class="special-content">
<span>{{specialNoticeBo.remark1}}<br/>{{specialNoticeBo.remark2}}</span>
<i class="arrow"></i>
</div>
</div>
{{/if}}
</td>
{{#if banMsg}}
... ... @@ -51,7 +60,7 @@
<td class="exchange-choose-wrap">
<p>
颜色要换成:
<select class="exchange-color">
<select class="exchange-color" {{#if isLimitSkn}}disabled{{/if}}>
<option value="0">请选择颜色</option>
{{# colorSize}}
<option value="{{goodsId}}">{{color}}</option>
... ... @@ -67,7 +76,7 @@
</p>
<p>
尺码要换成:
<select class="exchange-size">
<select class="exchange-size" {{#if isLimitSkn}}disabled{{/if}}>
<option value="0">请选择尺码</option>
</select>
</p>
... ... @@ -76,7 +85,7 @@
<select class="return-reason">
<option value="0">请选择换货原因</option>
{{# reason}}
<option value="{{id}}">{{name}}</option>
<option value="{{id}}" {{#if inactive}}disabled{{/if}}>{{name}}</option>
{{/ reason}}
</select>
</td>
... ... @@ -109,6 +118,9 @@
<select id="area">
<option value="0">请选择区县</option>
</select>
<select id="streets">
<option value="0">请选择乡镇/街道</option>
</select>
<input type="text" value="{{address}}" name="address">
</dd>
<dd>
... ... @@ -151,7 +163,9 @@
<input type="hidden" value="{{sku}}" name="sku">
<input type="hidden" value="{{price}}" name="price">
<input type="hidden" value="{{goods_type_id}}" name="typeid">
<input type="checkbox" checked="true">
{{#unless isLimitSkn}}
<input type="checkbox" checked="true">
{{/unless}}
{{/unless}}
</td>
<td width="60">
... ... @@ -160,6 +174,15 @@
<td class="return-goods-info">
<a href="{{href}}">{{name}}</a>
<span>颜色:{{color}} 尺码:{{size}}</span>
{{#if specialNoticeBo}}
<div class="special-tip">
<span>{{specialNoticeBo.title}} <i class="doubt"></i></span>
<div class="special-content">
<span>{{specialNoticeBo.remark1}}<br/>{{specialNoticeBo.remark2}}</span>
<i class="arrow"></i>
</div>
</div>
{{/if}}
</td>
<td class="refund-price">
{{price}}
... ... @@ -203,26 +226,21 @@
<p class="type-alipay type-alipay-tips">支付宝需经过实名认证!</p>
<table class="refund-pay-table">
<tr class="type-bank">
<td class="td1">银行所在地</td>
<td>收款银行</td>
<td>
<select id="province">
<option value="0">请选择省份</option>
</select>
<select id="city">
<option value="0">请选择城市</option>
</select>
<select id="area">
<option value="0">请选择区县</option>
<select name="bank_id" id="bank-id">
{{# returnBankMode}}
<option value="{{id}}" data="{{needSubbranch}}">{{title}}</option>
{{/ returnBankMode}}
</select>
<span class="hide" id="bank-name-span">
<input type="text" name="bank-name" id="bank-name" >&nbsp;例:江苏省南京市奥体支行
</span>
</td>
</tr>
<tr class="type-bank">
<td>收款银行:</td>
<td><input type="text" name="bank-name" id="bank-name">&nbsp;例:招商银行</td>
</tr>
<tr class="type-bank">
<td>收款人姓名:</td>
<td><input type="text" name="payee-name" id="payee-name">&nbsp;例:李白</td>
<td><input type="text" name="payee-name" placeholder="开户人姓名" id="payee-name">&nbsp;例:李白</td>
</tr>
<tr class="type-bank">
<td>收款账户:</td>
... ... @@ -230,7 +248,7 @@
</tr>
<tr class="type-alipay">
<td>收款人姓名:</td>
<td><input type="text" name="alipay-name" id="alipay-name"></td>
<td><input type="text" name="alipay-name" placeholder="您的真实姓名,请不要写昵称" id="alipay-name"></td>
</tr>
<tr class="type-alipay">
<td>收款账户:</td>
... ...
... ... @@ -19,6 +19,11 @@
{{/ statusList}}
</ul>
</div>
{{#if canCancelUrl}}
<div class="cancel-return">
如果您不想{{#if ../returnDetail}}退货{{^}}换货{{/if}}了,您可以 <a href="javascript:;" data-id="{{returnId}}" class="cancel-trigger" data-url="{{canCancelUrl}}">取消申请</a>
</div>
{{/if}}
<div class="detail-container">
{{# express}}
<h2>请填写寄回快递单号,以便我们查询</h2>
... ... @@ -37,7 +42,7 @@
{{/ expressList}}
</select>
<input type="text" id="express-number" value="{{number}}" placeholder="请填写快递单号">
<input type="hidden" id="return-id" value="{{returnId}}">
<input type="hidden" id="return-id" value="{{../returnId}}">
<button type="button" id="submit-btn">确定</button>
</p>
<p class="express-view-box">
... ...
... ... @@ -49,7 +49,7 @@
<div class="return-status">
{{returnStatus}}
</div>
<div class="operation">
<div class="operation {{#if canCancelUrl}}cancel-return{{/if}}">
{{#if canCancel}}
<a class="op-item cancel-trigger" href="javascript:;" data-id="{{returnId}}" data-url="{{canCancelUrl}}">取消申请</a>
{{/ if}}
... ...
... ... @@ -10,9 +10,9 @@ var $goodsTable = $('#goods-table'),
$checkBox = $goodsTable.find('input[type="checkbox"]'),
$reasons = $goodsTable.find('.return-reason'),
$refundType = $('input[name="refund-type"]'),
$province = $('#province'),
$city = $('#city'),
$areaCode = $('#area');
$areaCode = $('#streets'),
$bankNameSpan = $('#bank-name-span'),
$bankId = $('#bank-id');
var $refundInfo = $('#refund-pay-info'),
$payYoho = $refundInfo.find('.type-yoho'),
... ... @@ -33,7 +33,28 @@ var pageType = 0, // 0-换货 1-退货
disPhone = '',
verifyTip = '',
colorSize = {},
timer;
timer,
needSubbranch = '';
var option = {
className: 'refund-dialog',
btns: [
{
id: 'refund-sure',
btnClass: ['refund-sure'],
name: '确定提交'
},
{
id: 'refund-cancel close',
btnClass: ['refund-cancel close'],
name: '返回修改'
}
]
};
var refundConfirm = {};
var Dialog = require('../common/dialog').Dialog;
require('../plugins/jquery.qupload');
require('../common/ajaxfileupload');
... ... @@ -107,7 +128,8 @@ if ($refundInfo.length) {
defaultArea = defaultArea ? defaultArea : '';
Addr.loadAllData(defaultArea, {
areaDomId: 'area'
areaDomId: 'area',
streetsDomId: 'streets'
});
// 页面获取size列表数据
... ... @@ -131,6 +153,22 @@ $reasons.change(function() {
}
});
// 选择退款银行
$bankId.change(function() {
switchSubBank();
});
// 切换支行银行信息
function switchSubBank() {
needSubbranch = $bankId.children('option:selected').attr('data');
if (needSubbranch === 'Y') {
$bankNameSpan.removeClass('hide');
} else {
$bankNameSpan.addClass('hide');
}
$refundInfo.find('input[name="bank-name"]').val('');
}
$checkBox.change(function() {
var $par = $(this).parent().parent();
... ... @@ -162,7 +200,7 @@ $goodsTable.on('click', '.btn-del', function(e) {
resetImg($p);
});
//上传图片事件
// 上传图片事件
function fileChangeEvent() {
// 图片上传
... ... @@ -207,7 +245,7 @@ function fileChangeEvent() {
alert(data.message);
}
},
error: function(error) { /** data, status, e **/
error: function() { /** data, status, e **/
alert('上传失败,请稍后再试!');
},
complete: function() {
... ... @@ -219,9 +257,9 @@ function fileChangeEvent() {
}
fileChangeEvent();//初始化上传图片事件
fileChangeEvent();// 初始化上传图片事件
$exchange.on('change', '#area', function() {
$exchange.on('change', '#streets', function() {
var code = $(this).val() * 1;
if (code) {
... ... @@ -316,33 +354,22 @@ function packGoogsList() {
}
// 打包退货信息
function packRefundInfo() {
function packRefundInfo(returnMode) {
var res = {};
res.goods = packGoogsList();
res.payment = {};
$refundType.each(function() {
if ($(this).prop('checked')) {
res.payment.return_amount_mode = $(this).val() * 1;
}
});
if (!verifyTip && !res.payment.return_amount_mode) {
verifyTip = '请选择退款方式';
}
res.payment = {return_amount_mode: returnMode};
if (res.payment.return_amount_mode === 2) {
res.payment.province = $province.val();
res.payment.city = $city.val();
res.payment.area_code = $areaCode.val();
if (!verifyTip && !res.payment.area_code * 1) {
verifyTip = '请选择银行所在地';
}
res.payment.bank_id = $bankId.val() * 1;
res.payment.head_bank_name = $bankId.children('option:selected').text();
if (!verifyTip && res.payment.bank_id === 0) {
verifyTip = '请选择银行';
}
res.payment.bank_name = $.trim($refundInfo.find('input[name="bank-name"]').val());
if (!verifyTip && !res.payment.bank_name) {
verifyTip = '请填写银行名称';
if (!verifyTip && !res.payment.bank_name && needSubbranch === 'Y') {
verifyTip = '请填写支行名称';
}
res.payment.payee_name = $.trim($refundInfo.find('input[name="payee-name"]').val());
... ... @@ -432,25 +459,7 @@ function loadWaiting(status) {
}
}
// 提交申请
$('.save-btn').click(function() {
var url, data;
verifyTip = ''; // 初始化提示语
if (pageType) {
url = '/home/returns/saveRefund';
data = packRefundInfo();
} else {
url = '/home/returns/saveExchange';
data = packExchangeInfo();
}
data.orderCode = orderCode;
if (verifyTip) {
alert(verifyTip); //eslint-disable-line
return;
}
function saveRefundExchange(url, data) {
loadWaiting(true);
$.ajax({
type: 'POST',
... ... @@ -466,4 +475,70 @@ $('.save-btn').click(function() {
loadWaiting(false);
}
});
}
// 提交申请
$('.save-btn').click(function() {
var url,
data = {
orderCode: orderCode
},
returnMode = 0,
tip = '',
content = '';
verifyTip = ''; // 初始化提示语
if (pageType) {
url = '/home/returns/saveRefund';
// 付款方式
$refundType.each(function() {
if ($(this).prop('checked')) {
returnMode = $(this).val() * 1;
}
});
if (!verifyTip && !returnMode) {
verifyTip = '请选择退款方式';
} else {
$.extend(data, packRefundInfo(returnMode));
}
if (returnMode === 2) {
tip = '请确保账户名与账户一致,如果账号与名称不符或填写错误,会影响退款时效或退到他人账户,请谨慎填写!',
content = '<h2 class="title">确认提交</h2><div class="refund-tips">' + tip + '</div>';
} else if (returnMode === 3) {
tip = '支付宝账户需要经过实名认证,账户与真实姓名必须相符,可以在支付宝个人中心查看,' +
'如果账户与名称不符或填写错误,会影响退款时效或退到他人账户,请谨慎填写!',
content = '<h2 class="title">确认提交</h2><div class="refund-tips">' + tip + '</div>';
}
} else {
url = '/home/returns/saveExchange';
$.extend(data, packExchangeInfo());
}
if (verifyTip) {
alert(verifyTip); //eslint-disable-line
return;
}
if (pageType) {
refundConfirm = new Dialog($.extend(true, {}, option, {
content: content,
btns: [{
cb: function() {
refundConfirm.close();
saveRefundExchange(url, data);
}
}, {
cb: function() {
loadWaiting(false);
}
}]
})).show();
} else {
saveRefundExchange(url, data);
}
});
... ...
... ... @@ -2,16 +2,19 @@
font-size: 12px;
.title {
background-image: resolve('home/refund-apply.png');
background-image: resolve("home/refund-apply.png");
}
.exchange .title {
background-image: resolve('home/exchange-apply.png');
background-image: resolve("home/exchange-apply.png");
}
select {
width: 85px;
font-size: 12px;
outline: none;
}
.apply-container {
padding: 10px;
... ... @@ -25,32 +28,36 @@
span {
color: #f00;
}
.footwear-tip {
height: 142px;
line-height: 18px;
margin-top: 20px;
padding-left: 536px;
background: resolve('home/footwear-tips.jpg') no-repeat;
background: resolve("home/footwear-tips.jpg") no-repeat;
span {
color: #666;
}
span:first-child {
display: block;
margin-bottom: 15px;
}
}
}
h2 {
height: 21px;
line-height: 21px;
padding-left: 23px;
background: resolve('home/complaint-icon.png') no-repeat 5px 5px #efefef;
background: resolve("home/complaint-icon.png") no-repeat 5px 5px #efefef;
border: 1px #e6e6e6 solid;
font-size: 12px;
color: #333;
font-weight: 400;
}
.goods-list-table {
width: 100%;
margin-bottom: 10px;
... ... @@ -76,10 +83,12 @@
color: #666;
padding: 5px;
}
.return-goods-info {
> * {
display: block;
}
a {
color: #468fa2;
text-decoration: none;
... ... @@ -88,10 +97,12 @@
text-overflow: ellipsis;
white-space: nowrap;
}
span {
color: #999;
}
}
.exchange-choose-wrap {
width: 185px;
border: 1px solid #e6e6e6;
... ... @@ -100,16 +111,19 @@
p {
line-height: 29px;
}
select {
width: 85px;
}
}
.refund-price {
width: 185px;
color: #666;
font-weight: bold;
text-align: center;
}
.return-reason-wrap {
width: 200px;
text-align: center;
... ... @@ -117,6 +131,7 @@
select {
width: 190px;
}
label {
color: #999;
padding: 4px 20px;
... ... @@ -124,15 +139,18 @@
border: 1px solid #dadada;
}
}
.border-style {
border: 1px solid #e6e6e6;
}
.ex-tips,
.re-tips {
text-align: left;
padding-left: 10px;
color: #666;
}
.problem-description {
display: none;
}
... ... @@ -172,7 +190,7 @@
padding: 2px;
display: block;
margin: 0 0 10px 10px;
background: resolve('home/up-pic-back.png') no-repeat;
background: resolve("home/up-pic-back.png") no-repeat;
position: relative;
img {
... ... @@ -188,7 +206,7 @@
.up-image-list .btn-del {
padding: 8px;
background: resolve('home/del-icon.png') no-repeat;
background: resolve("home/del-icon.png") no-repeat;
color: #468fa2;
display: none;
position: absolute;
... ... @@ -222,7 +240,7 @@
margin-bottom: 5px;
overflow: hidden;
input[type='file'] {
input[type="file"] {
position: absolute;
left: 0;
top: 0;
... ... @@ -258,7 +276,7 @@
line-height: 22px;
padding-top: 11px;
color: #666;
background: resolve('home/refund_tips.png') no-repeat;
background: resolve("home/refund_tips.png") no-repeat;
display: none;
}
... ... @@ -283,6 +301,7 @@
background-position: 0 -70px;
}
}
.refund-pay-table {
width: 100%;
margin-bottom: 25px;
... ... @@ -290,12 +309,24 @@
td {
padding: 5px 0 5px 5px;
}
tr td:first-child {
width: 310px;
text-align: right;
}
input,
select {
font-size: 11px;
padding: 3px;
}
input {
width: 165px;
}
}
}
.exchange-detail {
padding: 30px;
... ... @@ -305,6 +336,7 @@
color: #333;
margin: 10px 0;
}
dd {
padding: 10px 5px;
... ... @@ -313,10 +345,12 @@
margin-top: 0;
vertical-align: middle;
}
input[type="radio"]:first-child {
margin-left: 0;
}
}
dd > label {
line-height: 20px;
width: 100px;
... ... @@ -337,7 +371,7 @@
width: 138px;
height: 34px;
border: 0;
background: resolve('home/submit-btn.png') no-repeat;
background: resolve("home/submit-btn.png") no-repeat;
color: #fff;
font-size: 14px;
font-weight: bold;
... ... @@ -353,7 +387,7 @@
line-height: 34px;
font-size: 14px;
color: #8c8686;
background: resolve('home/return-waiting.png') no-repeat center top;
background: resolve("home/return-waiting.png") no-repeat center top;
vertical-align: top;
display: none;
... ... @@ -377,3 +411,45 @@
}
}
}
.refund-dialog {
width: 380px;
.title {
font-size: 24px;
font-weight: bold;
}
.close {
top: 12px;
.iconfont {
font-size: 30px;
}
}
.refund-tips {
font-size: 14px;
line-height: 25px;
margin: 25px 0 35px;
color: #444;
}
.refund-sure {
background: #000;
color: #fff;
}
.refund-cancel.close {
position: relative;
top: 0;
right: 0;
}
.btn {
padding: 2px 15px;
width: 90px;
font-size: 15px;
margin-bottom: 25px;
}
}
... ...