Authored by 郭成尧

change-order-address

@@ -12,6 +12,8 @@ const headerModel = require('../../../doraemon/models/header'); // 头部model @@ -12,6 +12,8 @@ const headerModel = require('../../../doraemon/models/header'); // 头部model
12 const orderDetailModel = require('../models/orderDetail'); 12 const orderDetailModel = require('../models/orderDetail');
13 const orderModel = require('../models/order'); 13 const orderModel = require('../models/order');
14 const payModel = require('../../cart/models/pay'); 14 const payModel = require('../../cart/models/pay');
  15 +const addressModel = require('../models/address');
  16 +const addressProcess = require(global.utils + '/address-process');
15 17
16 const orderDetailData = (req, res, next) => { 18 const orderDetailData = (req, res, next) => {
17 let uid = req.user.uid; 19 let uid = req.user.uid;
@@ -139,9 +141,23 @@ const logistic = (req, res, next) => { @@ -139,9 +141,23 @@ const logistic = (req, res, next) => {
139 const addressModify = (req, res, next) => { 141 const addressModify = (req, res, next) => {
140 let uid = req.user.uid; 142 let uid = req.user.uid;
141 let orderCode = req.query.orderCode; 143 let orderCode = req.query.orderCode;
  144 + let areaCode = req.query.areaCode;
  145 + let provinceCode = req.query.provinceCode;
142 146
143 - orderDetailModel.orderDetailData(uid, orderCode).then(result => {  
144 - res.render('order-address-modify', Object.assign(result, { 147 + addressModel.getAddressData({uid: uid}).then(result => {
  148 + let userAddressList = result;
  149 + let addressData = addressProcess.getAddressByAreaCode(areaCode,
  150 + _.get(userAddressList, 'data', [])) || {};
  151 +
  152 + Object.assign(addressData, {
  153 + orderCode: orderCode,
  154 +
  155 + // provinceCode: provinceCode ? provinceCode : false, // TODO
  156 + provinceCode: '11',
  157 + province: '北京市' // TODO
  158 + });
  159 +
  160 + res.render('order-address-modify', Object.assign(addressData, {
145 pageHeader: headerModel.setNav({ 161 pageHeader: headerModel.setNav({
146 navTitle: '修改地址', 162 navTitle: '修改地址',
147 navBtn: false 163 navBtn: false
@@ -153,6 +169,34 @@ const addressModify = (req, res, next) => { @@ -153,6 +169,34 @@ const addressModify = (req, res, next) => {
153 }).catch(next); 169 }).catch(next);
154 }; 170 };
155 171
  172 +/**
  173 + * 修改订单地址
  174 + * @param {*} req
  175 + * @param {*} res
  176 + * @param {*} next
  177 + */
  178 +const changeAddress = (req, res, next) => {
  179 + let uid = req.user.uid;
  180 +
  181 + if (!uid) {
  182 + return res.json({
  183 + code: 502,
  184 + msg: '用户数据不存在!'
  185 + });
  186 + }
  187 +
  188 + orderDetailModel.changeAddress({
  189 + uid: req.user.uid,
  190 + orderCode: req.body.orderCode,
  191 + username: req.body.username,
  192 + areaCode: req.body.area_code,
  193 + address: req.body.address,
  194 + mobile: req.body.mobile
  195 + }).then(result => {
  196 + res.json(result);
  197 + }).catch(next);
  198 +};
  199 +
156 module.exports = { 200 module.exports = {
157 orderDetailData, 201 orderDetailData,
158 delOrder, 202 delOrder,
@@ -160,5 +204,6 @@ module.exports = { @@ -160,5 +204,6 @@ module.exports = {
160 cancelOrder, 204 cancelOrder,
161 refundApply, 205 refundApply,
162 logistic, 206 logistic,
163 - addressModify 207 + addressModify,
  208 + changeAddress
164 }; 209 };
@@ -100,7 +100,8 @@ const address = (params) => { @@ -100,7 +100,8 @@ const address = (params) => {
100 100
101 /* 加密地址 ID */ 101 /* 加密地址 ID */
102 _.forEach(selfAddress.data, (value, key) => { 102 _.forEach(selfAddress.data, (value, key) => {
103 - selfAddress.data[key].address_id = encodeURIComponent(crypto.encryption(null, selfAddress.data[key].address_id)); 103 + selfAddress.data[key].address_id =
  104 + encodeURIComponent(crypto.encryption(null, selfAddress.data[key].address_id));
104 }); 105 });
105 106
106 /* 如果有 ID 是地址编辑页面 */ 107 /* 如果有 ID 是地址编辑页面 */
@@ -218,5 +219,6 @@ module.exports = { @@ -218,5 +219,6 @@ module.exports = {
218 setDefaultAddress, 219 setDefaultAddress,
219 locationList, 220 locationList,
220 newGetAddress, 221 newGetAddress,
221 - chooseAddress 222 + chooseAddress,
  223 + getAddressData: _getAddressData
222 }; 224 };
@@ -286,7 +286,10 @@ const orderDetailData = (uid, orderCode) => { @@ -286,7 +286,10 @@ const orderDetailData = (uid, orderCode) => {
286 286
287 orderDetail = _.assign(orderDetail, { 287 orderDetail = _.assign(orderDetail, {
288 goodsAmount: orderDetail.paymentAmount, 288 goodsAmount: orderDetail.paymentAmount,
289 - url: '/home/orders/addressModify?orderCode=' + orderCode + '&relation=' + orderDetail.relation 289 + url: '/home/orders/addressModify?orderCode=' + orderCode +
  290 + '&areaCode=' + orderDetail.areaCode +
  291 + '&provinceCode=' + ((orderDetail.isSupportChangeProvince && orderDetail.provinceAreaCode) ?
  292 + orderDetail.provinceAreaCode : '')
290 }); 293 });
291 294
292 // 为支付的拆单配送信息 295 // 为支付的拆单配送信息
@@ -458,6 +461,36 @@ const logistics = (orderCode, uid) => { @@ -458,6 +461,36 @@ const logistics = (orderCode, uid) => {
458 }); 461 });
459 }; 462 };
460 463
  464 +/**
  465 + * 修改订单地址
  466 + * @param {参数} params
  467 + */
  468 +const changeAddress = (params) => {
  469 + let apiParams = {
  470 + method: 'app.SpaceOrders.updateDeliveryAddress',
  471 + order_code: params.orderCode,
  472 + uid: params.uid,
  473 + user_name: params.username,
  474 + area_code: params.areaCode,
  475 + address: params.address,
  476 + mobile: params.mobile
  477 + };
  478 +
  479 + if (params.addressId) {
  480 + Object.assign(apiParams, {
  481 + address_id: params.addressId
  482 + });
  483 + }
  484 +
  485 + if (params.phone) {
  486 + Object.assign(apiParams, {
  487 + phone: params.phone
  488 + });
  489 + }
  490 +
  491 + return api.post('', apiParams);
  492 +};
  493 +
461 module.exports = { 494 module.exports = {
462 orderDetailData, 495 orderDetailData,
463 closeReasons, 496 closeReasons,
@@ -465,5 +498,6 @@ module.exports = { @@ -465,5 +498,6 @@ module.exports = {
465 readdData, 498 readdData,
466 cancelOrder, 499 cancelOrder,
467 refundApply, 500 refundApply,
468 - logistics 501 + logistics,
  502 + changeAddress
469 }; 503 };
@@ -56,7 +56,8 @@ router.get('/delOrder', auth, orderDetailController.delOrder); // 删除订单 @@ -56,7 +56,8 @@ router.get('/delOrder', auth, orderDetailController.delOrder); // 删除订单
56 router.get('/readd', auth, orderDetailController.readdData); // 再次购买 56 router.get('/readd', auth, orderDetailController.readdData); // 再次购买
57 router.get('/cancelOrder', auth, orderDetailController.cancelOrder); // 取消订单 57 router.get('/cancelOrder', auth, orderDetailController.cancelOrder); // 取消订单
58 router.get('/refundApply', auth, orderDetailController.refundApply); // 申请退款 58 router.get('/refundApply', auth, orderDetailController.refundApply); // 申请退款
59 -router.get('/orders/addressModify', auth, orderDetailController.addressModify); // 订单详情地址修改 59 +router.get('/orders/addressModify', auth, orderDetailController.addressModify); // 订单详情地址修改页面
  60 +router.post('/orders/changeAddress', orderDetailController.changeAddress); // 提交新的地址数据
60 61
61 62
62 router.get('/', homeController.index); // 个人中心首页 63 router.get('/', homeController.index); // 个人中心首页
1 <div class="address-modify"> 1 <div class="address-modify">
2 <div class="tip">由于需要仓库调拨,目前暂不支持省地址修改,请您谅解!</div> 2 <div class="tip">由于需要仓库调拨,目前暂不支持省地址修改,请您谅解!</div>
3 - <div class="form"> 3 + <form class="form edit-address" id="areaForm">
4 <div class="form-group"> 4 <div class="form-group">
5 <label for="username">收货人:</label> 5 <label for="username">收货人:</label>
6 - <input name="username" type="text" value="小小明"> 6 + <input name="username" type="text" value="{{consignee}}">
7 </div> 7 </div>
8 <div class="form-group"> 8 <div class="form-group">
9 <label for="phone">联系电话:</label> 9 <label for="phone">联系电话:</label>
10 - <input name="phone" type="text" value="182****333"> 10 + <input name="phone" type="text" value="{{mobile}}">
11 </div> 11 </div>
  12 + {{#unless changeProvince}}
12 <div class="form-group disable"> 13 <div class="form-group disable">
13 <label for="province">所在省:</label> 14 <label for="province">所在省:</label>
14 - <input name="province" type="text" value="江苏省" class="disable" readonly> 15 + <input name="province" type="text" value="{{province}}" class="disable" readonly>
  16 + <input name="provinceCode" type="hidden" value="{{provinceCode}}">
15 </div> 17 </div>
16 - <div class="form-group"> 18 + {{/unless}}
  19 + <div class="form-group" id="area">
17 <label for="area">所在地区:</label> 20 <label for="area">所在地区:</label>
18 - <input name="area" type="text" value="南京市建邺区城区" readonly> 21 + <input name="area" type="text" value="{{area}}" readonly>
  22 + <input name="area_code" type="hidden" value={{area_code}}>
19 </div> 23 </div>
20 <div class="form-group"> 24 <div class="form-group">
21 <label for="address" class="label-address">详细地址:</label> 25 <label for="address" class="label-address">详细地址:</label>
22 - <textarea name="address" type="text" value="" maxlength="255">嘉陵江东街18号南京国家广告产业园12栋17层 26 + <textarea name="address" type="text" value="" maxlength="255">{{address}}
23 </textarea> 27 </textarea>
24 </div> 28 </div>
25 - </div> 29 + <input type="hidden" name="orderCode" value="{{orderCode}}">
  30 + </form>
26 <div class="tip"><span class="iconfont icon-info"></span>修改地址仅可修改一次,且会影响送货时间,请您谅解!</div> 31 <div class="tip"><span class="iconfont icon-info"></span>修改地址仅可修改一次,且会影响送货时间,请您谅解!</div>
27 <div class="btn-sure-line"> 32 <div class="btn-sure-line">
28 <button id="btnSure" class="btn-sure">确认修改</button> 33 <button id="btnSure" class="btn-sure">确认修改</button>
29 </div> 34 </div>
  35 +</div>
  36 +
  37 +<div id="vAddressAct">
  38 + <vue-address-act></vue-address-act>
30 </div> 39 </div>
  1 +const $ = require('yoho-jquery');
  2 +const Vue = require('vue');
  3 +const tip = require('../plugin/tip');
  4 +
1 require('home/order-address-modify.css'); 5 require('home/order-address-modify.css');
2 require('common.css'); 6 require('common.css');
3 require('../common'); 7 require('../common');
4 8
5 -let btnSure = $('#btnSure'); 9 +let $areaForm = $('#areaForm');
  10 +let $btnSure = $('#btnSure');
  11 +let $province = $('input[name=province]');
  12 +let $provinceCode = $('input[name=provinceCode]');
  13 +let $area = $('#area');
  14 +
  15 +
  16 +let vueAddressAct = require('home/address/address-act.vue');
  17 +
  18 +let addressVact = new Vue({
  19 + el: '#vAddressAct',
  20 + components: {
  21 + vueAddressAct: vueAddressAct
  22 + }
  23 +});
  24 +
  25 +/**
  26 + * 弹出地址选择框
  27 + */
  28 +$area.on('click', function() {
  29 + if ($provinceCode.val() && $province.val()) {
  30 + addressVact.$children[0].supportChangeProvince = false;
  31 + addressVact.$children[0].switchAddress($provinceCode.val(), $province.val());
  32 + }
  33 +
  34 + addressVact.$children[0].show = true;
  35 +});
6 36
7 -btnSure.on('click', function() {  
8 - console.log('ok'); 37 +/**
  38 + * 提交表单
  39 + */
  40 +$btnSure.on('click', function() {
  41 + $.post('/home/orders/changeAddress', $areaForm.serialize(), function(result) {
  42 + if (result && result.code === 200) {
  43 + tip.show(result.msg);
  44 + history.go(-1);
  45 + } else {
  46 + tip.show('系统错误,请重试!');
  47 + }
  48 + });
9 }); 49 });
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <div class="address-select-box"> 3 <div class="address-select-box">
4 <div class="component-title"><span class="title">所在地区</span><span class="iconfont close" @click="closeAddBox">&#xe623;</span></div> 4 <div class="component-title"><span class="title">所在地区</span><span class="iconfont close" @click="closeAddBox">&#xe623;</span></div>
5 <ul class="head-address-ul"> 5 <ul class="head-address-ul">
6 - <li v-if="province.title" :class="{ 'head-address-li': common.titleActive }" @click="clickTitle('province')">{{province.title}}</li> 6 + <li v-if="province.title" :class="{ 'head-address-li': common.titleActive, 'disable': !supportChangeProvince}" @click="clickTitle('province')">{{province.title}}</li>
7 <li v-if="city.title" :class="{ 'head-address-li': province.titleActive }" @click="clickTitle('city')">{{city.title}}</li> 7 <li v-if="city.title" :class="{ 'head-address-li': province.titleActive }" @click="clickTitle('city')">{{city.title}}</li>
8 <li v-if="area.title" :class="{ 'head-address-li': city.titleActive }" @click="clickTitle('area')">{{area.title}}</li> 8 <li v-if="area.title" :class="{ 'head-address-li': city.titleActive }" @click="clickTitle('area')">{{area.title}}</li>
9 <li v-if="street.title" :class="{ 'head-address-li': area.titleActive }">{{street.title}}</li> 9 <li v-if="street.title" :class="{ 'head-address-li': area.titleActive }">{{street.title}}</li>
@@ -36,6 +36,10 @@ @@ -36,6 +36,10 @@
36 </div> 36 </div>
37 </template> 37 </template>
38 <style> 38 <style>
  39 +.disable {
  40 + color: #a6a6a6;
  41 +}
  42 +
39 .icon-v:before { 43 .icon-v:before {
40 content: "\e6ea"; 44 content: "\e6ea";
41 } 45 }
@@ -173,6 +177,7 @@ @@ -173,6 +177,7 @@
173 module.exports = { 177 module.exports = {
174 data() { 178 data() {
175 return { 179 return {
  180 + supportChangeProvince: true, // 是否支持修改省
176 provinces: [], 181 provinces: [],
177 citys: [], 182 citys: [],
178 areas: [], 183 areas: [],
@@ -214,12 +219,20 @@ @@ -214,12 +219,20 @@
214 methods: { 219 methods: {
215 /* 返回标题处理 */ 220 /* 返回标题处理 */
216 returnTitle() { 221 returnTitle() {
217 - let getTitle = this.province.allTitle +  
218 - this.city.allTitle +  
219 - this.area.allTitle +  
220 - this.street.allTitle; 222 + let getTitle = '';
221 let returnTitle = ''; 223 let returnTitle = '';
222 224
  225 + if (this.supportChangeProvince) {
  226 + getTitle = this.province.allTitle +
  227 + this.city.allTitle +
  228 + this.area.allTitle +
  229 + this.street.allTitle;
  230 + } else {
  231 + getTitle = this.city.allTitle +
  232 + this.area.allTitle +
  233 + this.street.allTitle;
  234 + }
  235 +
223 if (getTitle.length > 11) { 236 if (getTitle.length > 11) {
224 returnTitle = getTitle.substr(0, 5) + '...' + getTitle.substr(-5); 237 returnTitle = getTitle.substr(0, 5) + '...' + getTitle.substr(-5);
225 } else { 238 } else {
@@ -359,6 +372,10 @@ @@ -359,6 +372,10 @@
359 clickTitle(type) { 372 clickTitle(type) {
360 switch (type) { 373 switch (type) {
361 case 'province': 374 case 'province':
  375 + if (!this.supportChangeProvince) {
  376 + alert('不允许修改省地址!'); // TODO
  377 + return false;
  378 + }
362 if (this.provinces.length < 1) { 379 if (this.provinces.length < 1) {
363 this.switchAddress(); 380 this.switchAddress();
364 } 381 }
  1 +/**
  2 + * 地址处理
  3 + */
  4 +
  5 +const _ = require('lodash');
  6 +
  7 +const getAddressByAreaCode = (areaCode, addressList) => {
  8 + return _.find(addressList, function(address) {
  9 + return parseInt(address.area_code, 10) === parseInt(areaCode, 10);
  10 + });
  11 +};
  12 +
  13 +module.exports = {
  14 + getAddressByAreaCode
  15 +};