... ... @@ -81,6 +81,11 @@ export default [
path: '/xianyu/channel',
component: () => import(/* webpackChunkName: "channel" */ './channel/channel')
},
{
name: 'home',
path: '/',
component: () => import(/* webpackChunkName: "channel" */ './channel/channel')
},
...news,
...Mine,
...Trade,
... ...
... ... @@ -9,13 +9,13 @@
<!--商品信息-->
<div class="productDetail">
<div class="productImageWrapper">
<!--<ImageFormat class="image" :lazy="lazy" :src="" :width="136" :height="180"></ImageFormat>-->
<ImageFormat class="image" :lazy="lazy" :src="originProductData.image" :width="136" :height="180"></ImageFormat>
</div>
<div class="productPrice">
<span class="size">{{sizeInfo}}</span>
<div class="pricedetail">
<span class="priceTitle">最低售价</span>
<span class="price">{{''}}</span>
<span class="priceTitle">最低售价: </span>
<span class="price">{{originProductData.least_price || '-'}}</span>
</div>
</div>
</div>
... ... @@ -23,49 +23,46 @@
<span class="inputViewIcon">
¥
</span>
<Input class="wordText" v-model="inputPrice" clearable="true" type="number" placeholder="定价需以9为结尾,例如1999"></Input>
<Input class="wordText" v-model="inputPrice" type="number" placeholder="定价需以9为结尾" @input="onTextChange"></Input>
</div>
<div>
<div class="sales">
<span class="tipHeaderText">需要支付保证金:</span>
<span class="tipPriceText">¥{{''}}</span>
<span class="tipPriceText">¥{{computeInfo.depositAmount}}</span>
</div>
</div>
<div class="saleDetailTips">
{{terms}}
{{configTip.tips}}
</div>
<div class="space"></div>
<div class="line"></div>
<div class="space"></div>
<div>
<span>商品金额:</span>
<span>{{''}}</span>
</div>
<div>
<span>运费:</span>
<span>{{''}}</span>
</div>
<div>
<span>预计实付金额:</span>
<span>{{''}}</span>
<div class="feeContainer" v-for="(item,index ) in computeInfo.promotionFormulaList">
<span :class="{'feeCommonText': true, 'feeTotalLeft':index === computeInfo.promotionFormulaList.length - 1}">{{item.promotion}}</span>
<span :class="{'feeCommonText': true, 'feeTotalRight':index === computeInfo.promotionFormulaList.length - 1}">{{item.promotionAmount}}</span>
</div>
<div class="space"></div>
<div class="line"></div>
<div class="space"></div>
<order-address></order-address>
<order-address :data="addressInfo"></order-address>
<div class="line"></div>
<div class="space"></div>
<day-choose></day-choose>
<day-choose :value="chooseDay" :options="dayOptions" :choose="BUYER_ASK_SET_CHOOSEDAY"></day-choose>
<div class="space"></div>
<div class="line"></div>
<div class="bottomContainer">
<Button type="submit" disabled="true">提交</Button>
<OrderAgree :value="isAgreeTerms" @input="isAgreeTerms = !isAgreeTerms" class="agree-wrapper"></OrderAgree>
<div>
<Button :disabled="!isAgreeTerms" type="submit" @click="submitClick">提交</Button>
</div>
</div>
</div>
... ... @@ -79,13 +76,19 @@
import {Input, Button} from 'cube-ui';
import OrderAddress from './components/confirm/address';
import DayChoose from './components/askorder/day-choose';
import OrderAgree from './components/confirm/agree';
import { createNamespacedHelpers } from 'vuex';
import {debounce, get} from 'lodash';
const {mapState, mapActions, mapMutations, mapGetters} = createNamespacedHelpers(
'order/buyerAskOrder'
);
export default {
name: 'BuyerAskOrder',
components: {Button, DayChoose, OrderAddress},
components: {Button, Input, DayChoose, OrderAddress, OrderAgree},
props: {
lazy: Boolean,
product: Object,
storageId: Number,
},
component: {
Input,
... ... @@ -95,18 +98,198 @@ export default {
data() {
return {
inputPrice: '',
terms: '求购须支付定金。\n卖家接单后,你需要在24小时内支付商品款。卖家将在你付款后36小时内发货。'
isAgreeTerms: false,
};
},
computed: {
...mapState([
'notFirstOrder',
'addressInfo',
'originProductData',
'configTip',
'computeInfo',
'isShowToast',
'toasMessage',
'chooseDay',
'isShowDialog',
'preTip',
'publishresult',
]),
...mapGetters([
'dayOptions',
'chooseDayId',
]),
sizeInfo: {
get() {
return '44'
// return goodsInfo ? goodsInfo.colorName + ',' + goodsInfo.sizeName : ''
return this.originProductData.colorName + ', ' + this.originProductData.sizeName + '码';// '黑色, 48码';
}
},
},
mounted() {
this.BUYER_ASK_SET_STORAGEID(this.storageId);
this.fetchBuyerOrderCount({ tabType: 'buy'});
this.fetchConfig();
this.$on("addressinfo", function (address) {
console.log(address)
})
},
watch: {
isShowToast(val) {
if (val) {
this.showToast();
}
},
isShowDialog(val) {
if (val) {
this.showDialog();
}
}
},
methods: {
...mapMutations([
'BUYER_ASK_SET_SHOWTOAST',
'BUYER_ASK_SET_CHOOSEDAY',
'BUYER_ASK_SET_SHOWDIALOG',
'BUYER_ASK_SET_STORAGEID',
]),
...mapActions([
'fetchConfig',
'fetchBuyerOrderCount',
'buyerCompute',
'buyerPrePublish',
'buyerPublish',
]),
onTextChange: debounce(function() {
if (this.originProductData.least_price && this.originProductData.skup && this.originProductData.least_price <= this.inputPrice) {
this.showBuyDialog();
} else {
this.buyerCompute({price: this.inputPrice, storage_id: this.storageId });
}
}, 500, {leading: false, trailing: true}),
showToast() {
this.BUYER_ASK_SET_SHOWTOAST(false);
this.$createToast({
time: 1000,
type: 'txt',
txt: this.toasMessage
}).show();
},
showBuyDialog() {
this.$createDialog({
type: 'confirm',
title: '求购价格过高',
content: '您的出价高于当前售价,建议直接购买',
confirmBtn: {
text: '去购买',
active: true,
disabled: false,
href: 'javascript:;',
},
cancelBtn: {
text: '取消',
active: false,
disabled: false,
href: 'javascript:;'
},
onConfirm: () => {
this.$router.push({
name: 'OrderBuyConfirm',
query: {
storageId: this.storageId || '',
skup: this.originProductData.skup || '',
productId: this.originProductData.productId || '',
},
});
},
onCancel: () => {
this.buyerCompute({price: this.inputPrice, storage_id: this.storageId });
}
}).show();
},
showDialog() {
this.BUYER_ASK_SET_SHOWDIALOG(false);
if (this.preTip) {
this.$createDialog({
type: 'confirm',
title: this.preTip.title || '',
content: this.preTip.content || `确认以${this.inputPrice}元的价格求购`,
confirmBtn: {
text: this.preTip.confirm,
active: true,
disabled: false,
href: 'javascript:;',
},
cancelBtn: {
text: this.preTip.cancel,
active: false,
disabled: false,
href: 'javascript:;'
},
onConfirm: () => {
this.publishProduct()
},
onCancel: () => {
}
}).show();
} else {
this.publishProduct()
}
},
submitClick() {
this.buyerPrePublish({price: this.inputPrice, storage_id: this.storageId, address_id: this.addressInfo.address_id});
},
publishProduct() {
this.buyerPublish({price: this.inputPrice, storage_id: this.storageId, address_id: this.addressInfo.address_id, time_limit_id: this.chooseDayId}).then(() => {
this.payOrder();
});
},
payOrder() {
let vm = this;
this.$createOrderPayType({
price: get(this.publishresult, 'depositAmount', ''),
desc: '保证金',
orderCode: get(this.publishresult, 'orderCode', ''),
extra: JSON.stringify({
type: 'buy',
back: {
name: 'ProductDetail',
params: {
productId: get(this.originProductData, 'productId', '')
}
},
forward: {
name: 'SellPayOk',
query: {
orderCode: get(this.publishresult, 'orderCode', ''),
}
}
}),
onCloseAction() {
// vm.onClose(orderResult.data.orderCode);
}
}).show();
}
}
};
</script>
... ... @@ -119,9 +302,10 @@ export default {
}
.topContainer {
height: calc(100% - 100px);
padding-left: 20px;
padding-right: 20px;
height: calc(100% - 100*2px);
padding-left: 20*2px;
padding-right: 20*2px;
margin-bottom: 200px;
}
.topView {
... ... @@ -135,50 +319,51 @@ export default {
.title {
font-weight: bold;
font-size: 34px;
font-size: 34*2px;
color: #000;
letter-spacing: 0.41px;
line-height: 41px;
margin-left: 20px;
margin-top: 5px;
letter-spacing: 0.41*2px;
line-height: 41*2px;
margin-left: 20*2px;
margin-top: 5*2px;
}
.productDetail {
display: flex;
flex-direction: row;
width: calc(100% - 40);
height: 120px;
margin-left: 20px;
width: calc(100% - 40*2px);
height: 120*2px;
margin-left: 20*2px;
align-items: center;
margin-top: 5px;
margin-top: 5*2px;
background-color: white;
}
.productImageWrapper {
width: 120px;
height: 120px;
width: 120*2px;
height: 120*2px;
background-color: white;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.productImage {
width: 110px;
height: 110px;
width: 110*2px;
height: 110*2px;
}
.productPrice {
width: calc(100% - 120px - 40px - 10px);
height: 120px;
margin-left: 10px;
width: calc(100% - 120*2px - 40*2px - 10*2px);
height: 120*2px;
margin-left: 10*2px;
}
.size {
margin-top: 37px;
margin-top: 37*2px;
font-family: "PingFang SC";
font-size: 12px;
font-size: 12*2px;
color: #999;
letter-spacing: 0;
}
... ... @@ -186,39 +371,39 @@ export default {
.pricedetail {
display: flex;
flex-direction: row;
height: 30px;
margin-top: 5px;
height: 30*2px;
margin-top: 5*2px;
align-items: flex-end;
}
.priceTitle {
font-family: "PingFang SC";
font-size: 14px;
font-size: 14*2px;
color: #000;
letter-spacing: 0;
}
.price {
font-family: "DIN Alternate";
font-size: 14px;
font-size: 14*2px;
color: #000;
line-height: 20.5px;
line-height: 20.5*2px;
letter-spacing: 0px;
}
.priceTip {
font-family: "PingFang SC";
font-size: 12px;
font-size: 12*2px;
color: #D0021B;
letter-spacing: 0px;
width: 80px;
width: 80*2px;
text-align: right;
}
.inputView {
width: calc(100% - 40px);
height: 50px;
border-radius: 5px;
width: calc(100%);
height: 50*2px;
border-radius: 5*2px;
display: flex;
flex-direction: row;
align-items: center;
... ... @@ -226,16 +411,18 @@ export default {
}
.inputViewIcon{
line-height: 50px;
font-size: 20px;
line-height: 50*2px;
font-size: 20*2px;
color: #000;
margin-left: 10px;
margin-left: 10*2px;
}
.wordText {
margin-left: 10px;
margin-left: 10*2px;
font-family: "DIN Alternate";
font-size: 16px;
font-size: 28*2px;
height: 100%;
line-height: 100%;
color: #000;
width: 100%;
background-color: transparent;
... ... @@ -249,59 +436,95 @@ export default {
.tipHeaderText {
font-family: "PingFang SC";
font-size: 14px;
font-size: 14*2px;
color:#000;
letter-spacing: 0;
margin-left: 20px;
margin-top: 15px;
//<!--margin-left: 20*2px;-->
margin-top: 15*2px;
}
.tipPriceText {
font-family: "PingFang SC";
font-size: 14px;
font-size: 14*2px;
color: #D0021B;
letter-spacing: 0;
margin-top: 15px;
margin-top: 15*2px;
}
.saleDetailTips {
font-family: "PingFang SC";
font-size: 12px;
font-size: 12*2px;
color: #999;
letter-spacing: 0px;
margin-top: 5px;
margin-left: 20px;
width: calc(100% - 40px);
margin-top: 5*2px;
//<!--margin-left: 20*2px;-->
width: calc(100% - 40*2px);
}
.space {
width: 100%;
background-color: white;
height: 20px;
height: 20*2px;
}
.line {
width: 100%;
height: 1px;
height: 1*2px;
background-color: #eee;
}
.priceCell {
display: flex;
width: 100%;
height: 25px;
height: 25*2px;
align-items: center;
justify-content: space-between;
}
.feeContainer {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: row;
margin-bottom: 6*2px;
}
.feeCommonText {
font-family: PingFang-SC-Regular;
font-size: 14*2px;
color: #999999;
letter-spacing: 0;
}
.feeTotalLeft {
font-family: PingFang-SC-Regular;
font-size: 14*2px;
color: #000000;
letter-spacing: 0;
}
.feeTotalRight {
font-family: PingFangSC-Regular;
font-size: 14px;
color: #D0021B;
letter-spacing: 0;
text-align: right;
}
.bottomContainer {
position: absolute;
bottom: 0px;
height: 100px;
display: flex;
align-items: stretch;
/*height: 100px;*/
width: 100%;
left: 0px;
}
.agree-wrapper {
height: 60px;
background-color: white;
border-top: 1px solid #eee;
padding: 0 40px;
line-height: 60px;
}
</style>
... ...
... ... @@ -11,7 +11,7 @@
</div>
</div>
<Select
v-model="value"
v-model="chooseday"
:title="title"
:options="options"
@change="change"
... ... @@ -27,12 +27,37 @@ import {Select} from 'cube-ui';
export default {
name: 'DayChoose',
props: {
options: {
type: Array,
default: [],
},
value: {
type: String,
default: '',
},
choose: {
type: Function,
default: ()=>{},
}
},
components: {Select},
computed: {
chooseday: {
get() {
return this.value;
},
set(val) {
}
}
},
data() {
return {
options: ['1天', '3天', '7天', '15天', '30天'],
value: '7天',
// options: ['1天', '3天', '7天', '15天', '30天'],
// value: '7天',
title: '选择求购时限',
};
... ... @@ -40,6 +65,7 @@ export default {
methods: {
change(value, index, text) {
console.log('change', value, index, text);
this.choose && this.choose(value);
}
}
... ...
... ... @@ -52,6 +52,19 @@ export default [
name: 'buyerAskOrder', // 买家求购确认
path: '/xianyu/order/buyeraskorder.html',
component: () => import('./buyer-ask-order'),
props: route => ({
storageId: route.query.storageId
})
},
{
name: 'sellAskOrder', // 卖家求购确认
path: '/xianyu/order/selleraskorder.html',
component: () => import('./seller-ask-order'),
props: route => ({
skup: route.query.skup,
price: route.query.price,
})
},
// 物流信息
... ...
<!--卖家求购变现-->
<template>
<LayoutApp :show-back="true">
<div class="body">
<TitleComp txt="变现"></TitleComp>
<ProductInfo :data="originProductData" class="product-info"></ProductInfo>
<div class="inputView">
<span class="inputViewIcon">
¥
</span>
<span class="wordText">{{price}}</span>
</div>
<OrderMargin class="order-item order-margin" :data="computeTip"></OrderMargin>
<OrderFee class="order-item" :data="computeTip"></OrderFee>
<AddressInfo :data="addressInfo" class="order-item"></AddressInfo>
</div>
<div class="footer">
<OrderAgree :value="isAgreeTerms" @input="isAgreeTerms = !isAgreeTerms" class="agree-wrapper"></OrderAgree>
<div>
<Button :disabled="!isAgreeTerms" type="submit" @click="submitClick">提交</Button>
</div>
</div>
</LayoutApp>
</template>
<script>
import {Button} from 'cube-ui';
import ProductInfo from './components/confirm/product';
import InputPrice from './components/confirm/input-price';
import AddressInfo from './components/confirm/address';
import TitleComp from './components/confirm/title';
import OrderMargin from './components/confirm/order-margin';
import OrderFee from './components/confirm/order-fee';
import OrderAgree from './components/confirm/agree';
import {get} from 'lodash'
import { createNamespacedHelpers} from 'vuex';
const { mapState, mapActions, mapMutations, mapGetters} = createNamespacedHelpers(
'order/sellerAskOrder'
);
export default {
name: 'seller-ask-order',
props: {
skup: Number,
price: Number,
},
components: {
Button,
ProductInfo,
AddressInfo,
InputPrice,
TitleComp,
OrderMargin,
OrderFee,
OrderAgree
},
data() {
return {
isAgreeTerms: false,
};
},
computed: {
...mapState([
'originProductData',
// 'price',
'computeTip',
'addressInfo',
'publishinfo',
]),
...mapGetters([
]),
},
mounted() {
this.fetchSellerOrderCount({tabType: 'sell'});// 19268
this.sellerCompute({price: this.price, skup: this.skup});
},
watch: {
},
methods: {
...mapMutations([
]),
...mapActions([
'fetchSellerOrderCount',
'sellerCompute',
'sellerPublish',
]),
submitClick() {
this.sellerPublish({price: this.price, skup: this.skup, address_id: this.addressInfo.address_id})
.then(() => {
this.payOrder();
});
},
payOrder() {
let vm = this;
this.$createOrderPayType({
price: get(this.computeTip, 'earnestMoney', 0),
desc: '保证金',
orderCode: get(this.publishinfo, 'orderCode', ''),
extra: JSON.stringify({
type: 'sell',
back: {
name: 'ProductDetail',
params: {
productId: get(this.originProductData, 'productId', '')
}
},
forward: {
name: 'SellPayOk',
query: {
orderCode: get(this.publishinfo, 'orderCode', '')
}
}
}),
onCloseAction() {
// vm.onClose(orderResult.data.orderCode);
}
}).show();
}
}
};
</script>
<style lang="scss" scoped>
.body {
height: 100%;
margin: 0 40px;
padding-bottom: 200px;
overflow-y: auto;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
z-index: 1;
}
.inputView {
width: calc(100%);
height: 50*2px;
border-radius: 5*2px;
display: flex;
flex-direction: row;
align-items: center;
background-color: #f5f5f5;
}
.inputViewIcon{
line-height: 50*2px;
font-size: 20*2px;
color: #000;
margin-left: 10*2px;
}
.wordText {
margin-left: 10*2px;
font-family: "DIN Alternate";
font-size: 28*2px;
height: 50*2px;
line-height: 50*2px;
color: #000;
width: 100%;
background-color: transparent;
}
.agree-wrapper {
height: 60px;
background-color: white;
border-top: 1px solid #eee;
padding: 0 40px;
line-height: 60px;
}
.order-item {
padding-top: 40px;
padding-bottom: 40px;
}
.order-item + .order-item {
border-top: 1px solid #eee;
}
</style>
... ...
... ... @@ -8,7 +8,12 @@
v-show="isVisible"
@mask-click="maskClick">
<transition :name="transition" appear>
<div class="cube-action-sheet-panel" v-show="isVisible" @click.stop>
<div class="cube-action-sheet-panel"
:class="{'with-radius': hasBorderRadius}"
:style="panelStyle"
v-show="isVisible"
ref="panel"
@click.stop="fakeMask">
<slot></slot>
</div>
</transition>
... ... @@ -26,6 +31,20 @@ export default {
type: String,
default: 'bottom',
},
panelStyle: {
type: Object,
default() {
return {};
},
},
hasBorderRadius: {
type: Boolean,
default: true,
},
emulateMask: {
type: Boolean,
default: false,
},
},
data() {
return {
... ... @@ -59,7 +78,12 @@ export default {
this._shownCallback();
});
}
}
},
fakeMask(e) {
if (this.emulateMask && e.target === this.$refs.panel) {
this.hide();
}
},
},
components: {
'cube-popup': Popup,
... ...
<template>
<action-sheet @hidden="onHidden" position="right" ref="popup">
<action-sheet @hidden="onHidden" position="right" ref="popup"
:panelStyle="{background: 'transparent', paddingLeft: '20%'}"
:hasBorderRadius="false"
:emulateMask="true">
<div class="buy-sheet">
<div class="header">
<div class="back-wrapper flex" @touchend="onBack">
<div class="back"></div>
</div>
</div>
<div class="header">求购<i class="cubeic-question"></i></div>
<div class="title">
<div class="title-thumbnail">
<square-img :src="imageUrl" :width="300" :height="300"/>
</div>
<div>选择尺码填写理想的价格发布求购</div>
<div>{{productDetail.product_name}} {{goodsName}}</div>
</div>
<div class="size-list">
... ... @@ -17,7 +17,7 @@
<ul>
<li :class="['size-item', item.available ? '': 'disable']" v-for="(item, idx) in sizeViewList" :key="idx" @click="buy(item)">
<div class="size"><span>{{item.name}}</span><span v-if="item.subName">{{item.subName}}</span></div>
<div class="price">¥ {{item.price}} <i class="cubeic-arrow"></i></div>
<div class="price">最高求购价 ¥{{item.price}} <i class="cubeic-arrow"></i></div>
</li>
</ul>
</cube-scroll>
... ... @@ -29,13 +29,13 @@
<script>
import { Scroll } from 'cube-ui';
import { get } from 'lodash';
import { createNamespacedHelpers } from 'vuex';
import { createNamespacedHelpers, mapActions } from 'vuex';
import ActionSheet from './action-sheet';
import stateShortCutsMixins from '../mixins';
import SquareImg from './square-img';
const { mapActions, mapGetters } = createNamespacedHelpers('product');
const { mapActions: mapProductAction, mapGetters } = createNamespacedHelpers('product');
export default {
name: 'BuySheet',
... ... @@ -48,14 +48,14 @@ export default {
computed: {
...mapGetters(['productDetail']),
sizeList() {
return get(this.productDetail, 'goods_list_tabs.goods_list[0].size_list', []);
return get(this.productDetail, 'goods_list[0].size_list', []);
},
sizeViewList() {
return this.sizeList.map(info => {
let price;
if (info.least_price > 0) {
price = `${info.least_price}`;
if (info.bid_moster_price > 0) {
price = `${info.bid_moster_price}`;
} else {
price = '-';
}
... ... @@ -69,6 +69,7 @@ export default {
price,
storage_id: info.storage_id,
available: info.storage_num > 0 && price !== '-',
skup: info.skup,
};
});
},
... ... @@ -83,26 +84,49 @@ export default {
this.$refs.popup.show();
},
methods: {
...mapActions(['updateTradeInfo']),
...mapActions('order/buyerAskOrder', [
'BUYER_ASK_SET_PRODUCTINFO'
]),
...mapProductAction(['updateTradeInfo']),
onHidden() {
this.$emit('hidden');
},
buy(product) {
if (!product.available) {
return;
}
this.onBack();
this.updateTradeInfo({
productId: this.productDetail.product_id,
sizeInfo: product,
}).then((data) => {
this.$router.push({
name: 'OrderBuyConfirm',
query: data,
});
});
this.$yoho.auth()
.then(() => {
this.hide();
this.updateTradeInfo({
productId: this.productDetail.product_id,
sizeInfo: product,
}).then((data) => {
/**
* 跳转到求购确认页面
* data:
* productId: number
* sizeId: number
* storageId: number
*/
this.$store.commit('order/buyerAskOrder/BUYER_ASK_SET_PRODUCTINFO', {
least_price: this.productDetail.least_price,
sizeName: product.name,
sizeId: get(data, 'sizeId', ''),
colorName: get(this.productDetail, 'goods_list[0].color_name', ''),
product_name: this.goodsName,
productId: get(data, 'productId', ''),
image: this.imageUrl,
skup: product.skup,
})
this.$router.push({
name: 'buyerAskOrder',
query: {
storageId: data.storageId || ''
},
});
});
})
},
onBack() {
hide() {
this.$refs.popup.hide();
},
},
... ... @@ -117,54 +141,39 @@ export default {
display: flex;
flex-direction: column;
position: relative;
.size-list {
flex: 1;
padding: 10px 40px;
overflow: scroll;
}
padding: 0 40px;
background: #fff;
}
.title-thumbnail {
width: 140px;
height: 140px;
margin: 0 auto;
display: block;
.size-list {
flex: 1 0 100%;
overflow: hidden;
}
.header {
width: 100%;
height: 90px;
padding-left: 40px;
padding-right: 40px;
display: flex;
justify-content: flex-end;
align-items: stretch;
box-sizing: border-box;
position: absolute;
top: 0;
right: 40px;
line-height: 88px;
font-size: 28px;
color: #999;
letter-spacing: 0;
text-align: right;
}
.flex {
display: flex;
align-items: center;
}
.back-wrapper {
height: 100%;
}
.back {
width: 48px;
height: 48px;
background: url(~statics/image/address/close.png) no-repeat;
background-size: cover;
}
.title-thumbnail {
width: 200px;
height: 200px;
margin: 0 auto;
display: block;
}
.title {
padding: 20px 40px 80px;
font-size: 24px;
color: #999;
letter-spacing: 0;
text-align: center;
font-weight: bold;
font-size: 0.9em;
border-bottom: 1px solid #ddd;
padding-bottom: 28px;
}
.size-item {
... ... @@ -172,17 +181,14 @@ export default {
justify-content: space-between;
align-items: center;
color: #000;
font-size: 32px;
padding: 40px;
margin-bottom: 40px;
border-bottom: 1px solid #ddd;
line-height: 120px;
border-bottom: 1px solid #eee;
.size {
line-height: 1.8;
display: flex;
font-size: 1.3em;
font-weight: bold;
align-items: baseline;
font-size: 40px;
letter-spacing: 0;
span:nth-child(2) {
font-size: 0.8em;
... ... @@ -194,15 +200,20 @@ export default {
.price {
display: flex;
align-items: center;
font-size: 24px;
letter-spacing: 0;
text-align: right;
i {
display: inline-block;
margin-left: 5px;
color: #999;
color: #888;
}
}
&.disable {
.size, .price {
.size,
.price {
color: #999;
}
}
... ...
... ... @@ -26,8 +26,10 @@
@select="onSelectSize"
@add="onAdd" />
<transition name="slide-up">
<div class="footer" v-if="isTradable">
<cube-button @click="select" class="active">{{config.title}}</cube-button>
<div class="footer" v-if="isAvailable">
<cube-button v-if="config.type === 'sell'" @click="convertToCash" :class="{active: isMarketable}">变现<span> <i>¥</i>{{cashPrice}}</span></cube-button>
<cube-button @click="select" :class="{active: isTradable}">{{config.title}}</cube-button>
</div>
</transition>
</div>
... ... @@ -38,13 +40,13 @@
<script>
import { Scroll, Button } from 'cube-ui';
import { get } from 'lodash';
import { createNamespacedHelpers } from 'vuex';
import { createNamespacedHelpers, mapActions } from 'vuex';
import ActionSheet from './action-sheet';
import SizeList from './size-list';
import SquareImg from './square-img';
const { mapActions, mapState } = createNamespacedHelpers('product');
const { mapActions: mapProductActions, mapState } = createNamespacedHelpers('product');
export default {
name: 'SizeSelectSheet',
... ... @@ -113,12 +115,34 @@ export default {
(this.config.type === 'buy' && this.selectedSize.storage_num > 0 && this.selectedSize.least_price !== '-') ||
(this.config.type === 'sell'));
},
/**
* 变现价格,使用bid_moster_price
*/
cashPrice() {
if (this.selectedSize && this.selectedSize.hasOwnProperty('bid_moster_price')) {
return this.selectedSize.bid_moster_price;
}
return '-';
},
/**
* 可变现
* 通过bid_moster_price或bid_skup判断
*/
isMarketable() {
return this.cashPrice > 0;
}
},
mounted() {
this.$refs.popup.show();
},
methods: {
...mapActions(['updateTradeInfo']),
...mapActions('order/sellerAskOrder', [
'SELLER_ASK_SET_PRODUCTINFO'
]),
...mapProductActions(['updateTradeInfo']),
onHidden() {
this.$emit('hidden');
},
... ... @@ -145,6 +169,37 @@ export default {
bid_skup: this.selectedSize.bid_skup,
});
},
convertToCash() {
if (!this.isMarketable) {
return;
}
this.hide();
if (get(this.selectedSize, 'bid_skup', 0) == 0) {
return;
}
this.$yoho.auth()
.then(() => {
this.$store.commit('order/sellerAskOrder/SELLER_ASK_SET_PRODUCTINFO',{
goodImg: get(this.product, 'goods_list[0].image_list[0].image_url', ''),
colorName: get(this.product, 'goods_list[0].color_name', ''),
sizeName: this.sizeName,
goodPrice: get(this.productDetail, 'least_price', 0),
productId: this.product.product_id
});
// 跳转变现
this.$router.push({
name: 'sellAskOrder',
query: {
skup: get(this.selectedSize, 'bid_skup', 0),
price: get(this.selectedSize, 'bid_moster_price', 0),
}
});
});
},
},
};
</script>
... ...
... ... @@ -21,6 +21,7 @@
<span class="dot" :class="{active: props.current === index}" v-for="(item, index) in props.dots">{{index + 1}}</span>
</template>
</cube-slide>
<div class="qiugou" @click="qiugou"></div>
</div>
<div class="info">
... ... @@ -87,7 +88,7 @@
@select="onSelectTradeProduct"
@add="onRequestSize"/>
<size-request-sheet v-if="showSizeRequestSheet" @hidden="onSizeRequestHidden"/>
<buy-sheet v-if="showBuySheet" @hidden="onBuyHidden"/>
<buy-sheet v-if="showBuySheet" @hidden="onBuyHidden" />
</div>
</template>
... ... @@ -284,7 +285,6 @@ export default {
},
async sell() {
await this.$yoho.auth();
this.selectSizeConfig = {
dest: 'OrderSellConfirm',
type: 'sell',
... ... @@ -350,7 +350,12 @@ export default {
onSizeRequestHidden() {
this.showSizeRequestSheet = false;
},
qiugou() {
this.showBuySheet = true;
},
onBuyHidden() {
this.showBuySheet = false;
},
},
};
</script>
... ... @@ -393,6 +398,16 @@ export default {
background-color: #08304b;
}
}
.qiugou {
position: absolute;
top: 0;
right: - 58px;
width: 58px;
height: 48px;
background: top left url("~statics/image/product/qiugou@3x.png") no-repeat;
background-size: 100% 100%;
}
}
.cube-slide-item {
... ...
... ... @@ -21,5 +21,7 @@ export default {
// 修改根状态
this.state.order.orderConfirm.address = addressInfo;
this.state.order.buyerAskOrder.addressInfo = addressInfo;
this.state.order.sellerAskOrder.addressInfo = addressInfo;
}
};
... ...
/**
* buyer-ask-order.js
*@author dennis
*@createtime 9/25/19
*@description 买家求购状态管理
*/
import {Types} from './types';
import {
get
} from 'lodash';
const {
BUYER_ORDERCOUNT_REQUEST,
BUYER_ORDERCOUNT_SUCCESS,
BUYER_ORDERCOUNT_FAILURE,
BUYER_ADDRESS_REQUEST,
BUYER_ADDRESS_SUCCESS,
BUYER_ADDRESS_FAILURE,
BUYER_ASK_CONFIG_SUCCESS,
BUYER_ASK_CONFIG_FAILURE,
BUYER_ASK_COMPUTE_REQUEST,
BUYER_ASK_COMPUTE_SUCCESS,
BUYER_ASK_COMPUTE_FAILURE,
BUYER_ASK_PREPUBLISH_SUCCESS,
BUYER_ASK_PREPUBLISH_FAILURE,
BUYER_ASK_PREPUBLISH_REQUEST,
BUYER_ASK_PUBLISH_REQUEST,
BUYER_ASK_PUBLISH_SUCCESSS,
BUYER_ASK_PUBLISH_FAILURE,
BUYER_ASK_SET_SHOWTOAST,
BUYER_ASK_SET_CHOOSEDAY,
BUYER_ASK_SET_SHOWDIALOG,
BUYER_ASK_SET_STORAGEID,
BUYER_ASK_SET_PRODUCTINFO,
} = Types;
const TIP = '请求失败';
const DEFAULT_COMPUTE_INFO = {
depositAmount: '0',
promotionFormulaList: [
{
promotion: '商品金额',
promotionAmount: '¥-'
},
{
promotion: '运费',
promotionAmount: '¥-'
},
{
promotion: '实付金额',
promotionAmount: '¥-'
}
]
};
const DEFUALT_CONFIG_TIP = {
timeLimit: {
defaultItem: {
desc: '7天',
id: 3
},
items: [
{
desc: '1天',
id: 1
},
{
desc: '3天',
id: 2
},
{
desc: '7天',
id: 3
},
{
desc: '15天',
id: 4
},
{
desc: '30天',
id: 5
}
]
},
tips: '求购须支付定金。卖家接单后,你需要在24小时内支付商品款。卖家将在你付款后36小时内发货。'
};
const TEST_PRODUCT_INFO = {
least_price: 1119.00,
max_price: 20000.00,
max_sort_id: 10,
min_price: 0.01,
offer_price: 200.00,
product_code: 'OMRG001S181851110112',
product_id: 10000068,
product_name: 'Timberland 红色女靴',
sale_time: '2016.01.01',
image: 'http://img11.static.yhbimg.com/goodsimg/2018/10/18/17/0124eed582cab20be7047c796c314cbc76.jpg?imageMogr2/thumbnail/{width}x{height}/background/d2hpdGU=/position/center/quality/80'
};
export default function() {
return {
namespaced: true,
state: {
notFirstOrder: false,
storageId: '10000130',
originProductData: TEST_PRODUCT_INFO,
addressInfo: null,
configTip: DEFUALT_CONFIG_TIP,
iscomputefetch: false,
isprepublish: false,
ispublish: false,
computeInfo: DEFAULT_COMPUTE_INFO,
preTip: null,
publishresult: {},
toasMessage: '',
isShowToast: false,
chooseDay: '7天',
isShowDialog: false,
},
getters: {
dayOptions(state) {
let orginallist = get(state, ['configTip', 'timeLimit', 'items'], []);
return orginallist.map(item => {
return get(item, ['desc'], '');
});
},
chooseDayId(state) {
let orginallist = get(state, ['configTip', 'timeLimit', 'items'], []);
let dayid = 3;
orginallist.forEach(item => {
if (item.desc === state.chooseDay) {
dayid = item.id;
}
});
return dayid;
},
},
mutations: {
[BUYER_ASK_SET_PRODUCTINFO](state, payload) {
state.originProductData = payload
},
[BUYER_ASK_SET_STORAGEID](state, payload) {
state.storageId = payload
},
[BUYER_ASK_SET_SHOWTOAST](state, payload) {
state.isShowToast = payload ? true : false;
},
[BUYER_ASK_SET_SHOWDIALOG](state, payload) {
state.isShowDialog = payload ? true : false;
},
[BUYER_ASK_SET_CHOOSEDAY](state, payload) {
state.chooseDay = payload;
},
[BUYER_ORDERCOUNT_REQUEST](state) {
},
[BUYER_ORDERCOUNT_SUCCESS](state, data) {
state.notFirstOrder = get(data, ['cnt'], 0) > 0;
},
[BUYER_ORDERCOUNT_FAILURE](state, message) {
},
[BUYER_ADDRESS_REQUEST]() {
},
[BUYER_ADDRESS_SUCCESS](state, payload) {
let list = payload || [];
let defaultAddress;
list.forEach(item => {
if (item.is_default === 'Y') {
defaultAddress = item;
}
});
state.addressInfo = defaultAddress;
},
[BUYER_ADDRESS_FAILURE]() {
},
[BUYER_ASK_CONFIG_SUCCESS](state, payload) {
state.configTip = payload;
},
[BUYER_ASK_CONFIG_FAILURE](state, payload) {
},
[BUYER_ASK_COMPUTE_REQUEST](state) {
state.iscomputefetch = true;
},
[BUYER_ASK_COMPUTE_SUCCESS](state, payload) {
state.iscomputefetch = false;
state.computeInfo = payload;
},
[BUYER_ASK_COMPUTE_FAILURE](state, payload) {
state.iscomputefetch = false;
state.computeInfo = DEFAULT_COMPUTE_INFO;
state.toasMessage = payload;
state.isShowToast = true;
},
[BUYER_ASK_PREPUBLISH_REQUEST](state) {
state.isprepublish = true;
},
[BUYER_ASK_PREPUBLISH_SUCCESS](state, payload) {
state.isprepublish = false;
if (payload) {
state.preTip = payload;
} else {
state.preTip = null;
}
state.isShowDialog = true;
},
[BUYER_ASK_PREPUBLISH_FAILURE](state, payload) {
state.isprepublish = false;
state.preTip = null;
state.toasMessage = payload;
state.isShowToast = true;
},
[BUYER_ASK_PUBLISH_REQUEST](state) {
state.ispublish = true;
},
[BUYER_ASK_PUBLISH_SUCCESSS](state, payload) {
state.ispublish = false;
state.publishresult = payload;
},
[BUYER_ASK_PUBLISH_FAILURE](state, payload) {
state.ispublish = false;
state.publishresult = {};
state.toasMessage = payload;
state.isShowToast = true;
}
},
actions: {
fetchBuyerOrderCount({commit, dispatch}, {tabType = 'buy', uid} = {}) {
commit(BUYER_ORDERCOUNT_REQUEST);
this.$api.get('/api/order/ordercount', {
tabType,
uid
}).then(result => {
if (result.code === 200) {
commit(BUYER_ORDERCOUNT_SUCCESS, result.data);
if (get(result, ['data', 'cnt'], 0) > 0) {
dispatch('fetchAddress', {});
} else {
console.log('first order');
}
} else {
commit(BUYER_ORDERCOUNT_FAILURE, result.message);
}
}, error => {
commit(BUYER_ORDERCOUNT_FAILURE, '');
console.log(error);
});
},
fetchAddress({commit}, {uid} = {}) {
commit(BUYER_ADDRESS_REQUEST);
this.$api.get('/api/address/gethidden', {
uid
}).then(result => {
if (result.code === 200) {
commit(BUYER_ADDRESS_SUCCESS, result.data);
} else {
commit(BUYER_ADDRESS_FAILURE, result.message);
}
}, error => {
commit(BUYER_ADDRESS_FAILURE, '');
console.log(error);
});
},
fetchConfig({commit}, {} = {}) {
this.$api.get('/api/order/buyaskconfig', {
}).then(result => {
if (result.code === 200) {
commit(BUYER_ASK_CONFIG_SUCCESS, result.data);
} else {
console.log(result);
}
}, error => {
console.log(error);
});
},
buyerCompute({commit}, {price = 0, storage_id = 0, uid} = {}) {
commit(BUYER_ASK_COMPUTE_REQUEST);
this.$api.get('/api/order/buyeraskcompute', {
uid,
price,
storage_id,
}).then(result => {
if (result.code === 200) {
commit(BUYER_ASK_COMPUTE_SUCCESS, get(result, ['data'], {}));
} else {
commit(BUYER_ASK_COMPUTE_FAILURE, get(result, ['message'], TIP));
}
}, error => {
console.log(error);
commit(BUYER_ASK_COMPUTE_FAILURE, TIP);
});
},
buyerPrePublish({commit, dispatch}, {price = 0, storage_id = 0, uid, address_id = ''} = {}) {
commit(BUYER_ASK_PREPUBLISH_REQUEST);
this.$api.get('/api/order/buyeraskprepublish', {
price,
storage_id,
uid,
address_id,
}).then(result => {
if (result.code === 200) {
commit(BUYER_ASK_PREPUBLISH_SUCCESS, get(result, ['data', 'dialog'], null));
} else {
commit(BUYER_ASK_PREPUBLISH_FAILURE, result.message);
}
}, error => {
console.log(error);
commit(BUYER_ASK_PREPUBLISH_FAILURE, TIP);
});
},
async buyerPublish({commit, dispatch}, {price = 0, storage_id = 0, uid, address_id = '', time_limit_id = ''} = {}) {
commit(BUYER_ASK_PUBLISH_REQUEST);
return this.$api.get('/api/order/buyeraskpublish', {
price,
storage_id,
uid,
address_id,
time_limit_id
}).then(result => {
if (result.code === 200) {
commit(BUYER_ASK_PUBLISH_SUCCESSS, result.data);
} else {
commit(BUYER_ASK_PUBLISH_FAILURE, result.message);
}
}, error => {
console.log(error);
commit(BUYER_ASK_PUBLISH_FAILURE, TIP);
});
}
}
};
}
... ...
... ... @@ -2,8 +2,10 @@ import priceChange from './price-change';
import orderList from './order-list';
import orderConfirm from './order-confirm';
import orderDetail from './order-detail';
import buyerAskOrder from './buyer-ask-order';
import orderLogistics from './order-logistics';
import orderDeliver from './order-deliver';
import sellerAskOrder from './seller-ask-order';
import inSaleOrderList from './in-sale-order-list';
export default function() {
... ... @@ -14,8 +16,10 @@ export default function() {
orderList: orderList(),
orderConfirm: orderConfirm(),
orderDetail: orderDetail(),
buyerAskOrder: buyerAskOrder(),
logisticsInfo: orderLogistics(),
orderDeliver: orderDeliver(),
sellerAskOrder: sellerAskOrder(),
inSaleOrderList: inSaleOrderList(),
},
};
... ...
/**
* seller-ask-order.js
*@author dennis
*@createtime 9/29/19
*@description 卖家求购变现状态管理
*/
import {Types} from './types';
import {get} from 'lodash';
const TIP = '请求失败';
const {
SELLER_ORDERCOUNT_REQUEST,
SELLER_ORDERCOUNT_SUCCESS,
SELLER_ORDERCOUNT_FAILURE,
SELLER_ADDRESS_REQUEST,
SELLER_ADDRESS_SUCCESS,
SELLER_ADDRESS_FAILURE,
SELLER_ASK_COMPUTE_REQUEST,
SELLER_ASK_COMPUTE_SUCCESS,
SELLER_ASK_COMPUTE_FAILURE,
SELLER_ASK_PUBLISH_REQUEST,
SELLER_ASK_PUBLISH_SUCCESS,
SELLER_ASK_PUBLISH_FAILURE,
SELLER_ASK_SET_PRICE,
SELLER_ASK_SET_SKUP,
SELLER_ASK_SET_PRODUCTINFO,
} = Types;
const TEST_PRODUCT_INFO = {
least_price: 1119.00,
max_price: 20000.00,
max_sort_id: 10,
min_price: 0.01,
offer_price: 200.00,
product_code: 'OMRG001S181851110112',
product_id: 10000068,
product_name: 'Timberland 红色女靴',
sale_time: '2016.01.01',
goodImg: 'http://img11.static.yhbimg.com/goodsimg/2018/10/18/17/0124eed582cab20be7047c796c314cbc76.jpg?imageMogr2/thumbnail/{width}x{height}/background/d2hpdGU=/position/center/quality/80',
colorName: '黑色',
sizeName: '42码',
goodPrice: 1119.00,
};
export default function() {
return {
namespaced: true,
state: {
originProductData: TEST_PRODUCT_INFO,
price: 1200,
computeTip: null,
addressInfo: null,
publishinfo: null,
},
getter: {
},
mutations: {
[SELLER_ASK_SET_PRODUCTINFO](state, payload) {
state.originProductData = payload
},
[SELLER_ORDERCOUNT_SUCCESS](state, payload) {
},
[SELLER_ADDRESS_SUCCESS](state, payload) {
let list = payload || [];
let defaultAddress;
list.forEach(item => {
if (item.is_default === 'Y') {
defaultAddress = item;
}
});
state.addressInfo = defaultAddress;
},
[SELLER_ASK_COMPUTE_REQUEST](state) {
},
[SELLER_ASK_COMPUTE_SUCCESS](state, payload) {
state.computeTip = payload
},
[SELLER_ASK_COMPUTE_FAILURE](state, payload) {
state.computeTip = null
},
[SELLER_ASK_PUBLISH_REQUEST](state) {
},
[SELLER_ASK_PUBLISH_SUCCESS](state, payload) {
state.publishinfo = payload
},
[SELLER_ASK_PUBLISH_FAILURE](state, payload) {
state.publishinfo = null
}
},
actions: {
fetchSellerOrderCount({commit, dispatch}, {tabType = 'sell', uid} = {}) {
this.$api.get('/api/order/ordercount', {
tabType,
uid
}).then(result => {
if (result.code === 200) {
commit(SELLER_ORDERCOUNT_SUCCESS, result.data);
if (get(result, ['data', 'cnt'], 0) > 0) {
dispatch('fetchSellerAddress', {});
} else {
console.log('first order');
}
} else {
console.log(result.message);
// commit(BUYER_ORDERCOUNT_FAILURE, result.message);
}
}, error => {
console.log(error);
});
},
fetchSellerAddress({commit}, {uid} = {}) {
this.$api.get('/api/address/gethidden', {
uid
}).then(result => {
if (result.code === 200) {
commit(SELLER_ADDRESS_SUCCESS, result.data);
} else {
console.log(result.message);
// commit(BUYER_ADDRESS_FAILURE, result.message);
}
}, error => {
console.log(error);
});
},
sellerCompute({commit}, {price, skup, uid} = {}) {
commit(SELLER_ASK_COMPUTE_REQUEST);
this.$api.get('/api/order/sellask/compute', {
price,
skup,
uid,
}).then(result => {
if (result.code === 200) {
commit(SELLER_ASK_COMPUTE_SUCCESS, result.data);
} else {
commit(SELLER_ASK_COMPUTE_FAILURE, result.message);
}
}, error => {
console.log(error);
commit(SELLER_ASK_COMPUTE_FAILURE, TIP);
});
},
sellerPublish({commit}, {price, skup, address_id, uid} = {}) {
commit(SELLER_ASK_PUBLISH_REQUEST);
return this.$api.get('/api/order/sellask/publish', {
price,
skup,
address_id,
uid,
}).then(result => {
if (result.code === 200) {
commit(SELLER_ASK_PUBLISH_SUCCESS, result.data);
} else {
commit(SELLER_ASK_PUBLISH_FAILURE, result.message);
}
}, error => {
console.log(error);
commit(SELLER_ASK_PUBLISH_FAILURE, TIP);
});
}
},
};
}
... ...
/**
* types.js
*@author dennis
*@createtime 9/25/19
*@description 枚举
*/
export const Types = {
BUYER_ORDERCOUNT_REQUEST: 'BUYER_ORDERCOUNT_REQUEST',
BUYER_ORDERCOUNT_SUCCESS: 'BUYER_ORDERCOUNT_SUCCESS',
BUYER_ORDERCOUNT_FAILURE: 'BUYER_ORDERCOUNT_FAILURE',
BUYER_ADDRESS_REQUEST: 'BUYER_ADDRESS_REQUEST',
BUYER_ADDRESS_SUCCESS: 'BUYER_ADDRESS_SUCCESS',
BUYER_ADDRESS_FAILURE: 'BUYER_ADDRESS_FAILURE',
BUYER_ASK_CONFIG_SUCCESS: 'BUYER_ASK_CONFIG_SUCCESS',
BUYER_ASK_CONFIG_FAILURE: 'BUYER_ASK_CONFIG_FAILURE',
BUYER_ASK_COMPUTE_REQUEST: 'BUYER_ASK_COMPUTE_REQUEST',
BUYER_ASK_COMPUTE_SUCCESS: 'BUYER_ASK_COMPUTE_SUCCESS',
BUYER_ASK_COMPUTE_FAILURE: 'BUYER_ASK_COMPUTE_FAILURE',
BUYER_ASK_PREPUBLISH_SUCCESS: 'BUYER_ASK_PREPUBLISH_SUCCESS',
BUYER_ASK_PREPUBLISH_FAILURE: 'BUYER_ASK_PREPUBLISH_FAILURE',
BUYER_ASK_PREPUBLISH_REQUEST: 'BUYER_ASK_PREPUBLISH_REQUEST',
BUYER_ASK_PUBLISH_REQUEST: 'BUYER_ASK_PUBLISH_REQUEST',
BUYER_ASK_PUBLISH_SUCCESSS: 'BUYER_ASK_PUBLISH_SUCCESSS',
BUYER_ASK_PUBLISH_FAILURE: 'BUYER_ASK_PUBLISH_FAILURE',
BUYER_ASK_SET_SHOWTOAST: 'BUYER_ASK_SET_SHOWTOAST',
BUYER_ASK_SET_CHOOSEDAY: 'BUYER_ASK_SET_CHOOSEDAY',
BUYER_ASK_SET_SHOWDIALOG: 'BUYER_ASK_SET_SHOWDIALOG',
BUYER_ASK_SET_STORAGEID: 'BUYER_ASK_SET_STORAGEID',
BUYER_ASK_SET_PRODUCTINFO: 'BUYER_ASK_SET_PRODUCTINFO',
SELLER_ORDERCOUNT_REQUEST: 'SELLER_ORDERCOUNT_REQUEST',
SELLER_ORDERCOUNT_SUCCESS: 'SELLER_ORDERCOUNT_SUCCESS',
SELLER_ORDERCOUNT_FAILURE: 'SELLER_ORDERCOUNT_FAILURE',
SELLER_ADDRESS_REQUEST: 'SELLER_ADDRESS_REQUEST',
SELLER_ADDRESS_SUCCESS: 'SELLER_ADDRESS_SUCCESS',
SELLER_ADDRESS_FAILURE: 'SELLER_ADDRESS_FAILURE',
SELLER_ASK_COMPUTE_REQUEST: 'SELLER_ASK_COMPUTE_REQUEST',
SELLER_ASK_COMPUTE_SUCCESS: 'SELLER_ASK_COMPUTE_SUCCESS',
SELLER_ASK_COMPUTE_FAILURE: 'SELLER_ASK_COMPUTE_FAILURE',
SELLER_ASK_PUBLISH_REQUEST: 'SELLER_ASK_PUBLISH_REQUEST',
SELLER_ASK_PUBLISH_SUCCESS: 'SELLER_ASK_PUBLISH_SUCCESS',
SELLER_ASK_PUBLISH_FAILURE: 'SELLER_ASK_PUBLISH_FAILURE',
SELLER_ASK_SET_PRICE: 'SELLER_ASK_SET_PRICE',
SELLER_ASK_SET_SKUP: 'SELLER_ASK_SET_SKUP',
SELLER_ASK_SET_PRODUCTINFO: 'SELLER_ASK_SET_PRODUCTINFO',
};
... ...
... ... @@ -2,6 +2,7 @@ module.exports = {
'/api/address/gethidden': {
auth: true,
api: 'app.address.gethidden',
auth: true,
params: {}
},
'/api/address/getTags': {
... ...
// 查询订单数量
const ORDER_COUNT = 'ufo.order.getAllCnt';
//返回求购期限
const BUYER_ASK_CONFIG = 'ufo.buyer.bid.config';
//计算价格
const BUYER_ASK_COMPUTE = 'ufo.buyer.bid.compute';
//预发布,提示
const BUYER_ASK_TIPS = 'ufo.buyer.bid.prePublish';
//发布
const BUYER_ASK_PUBLISH = 'ufo.buyer.bid.publish';
//买家调价计算
const BUYER_ASK_COMPUTE_CHANGE_PRICE = 'ufo.buyer.bid.computeChangePrice';
//买家预调价
const BUYER_ASK_PRE_CHANGE_PRICE = 'ufo.buyer.bid.preChangePrice';
//买家调价
const BUYER_ASK_CHANGE_PRICE = 'ufo.buyer.bid.changePrice';
//变现前计算
const SELLER_ASK_PRE_COMPUTE = 'ufo.seller.bid.compute';
//变现
const SELLER_ASK_PUBLISH = 'ufo.seller.bid.publish';
module.exports = {
ORDER_COUNT,
BUYER_ASK_CONFIG,
BUYER_ASK_COMPUTE,
BUYER_ASK_TIPS,
BUYER_ASK_PUBLISH,
BUYER_ASK_COMPUTE_CHANGE_PRICE,
BUYER_ASK_PRE_CHANGE_PRICE,
BUYER_ASK_CHANGE_PRICE,
SELLER_ASK_PRE_COMPUTE,
SELLER_ASK_PUBLISH,
};
... ...
... ... @@ -4,8 +4,10 @@ const listApi = require('./list-api-map');
const homeApi = require('./home-api-map');
const passportApi = require('./passport-api-map');
const addressApi = require('./address-api-map');
const buyerAskApi = require('./buyerask-api-map')
const orderListApi = require('./order-api-map');
const categoryApi = require('./category-api-map');
const sellerAskApi = require('./sellerask-api-map');
module.exports = {
...orderApi,
... ... @@ -14,6 +16,8 @@ module.exports = {
...homeApi,
...passportApi,
...addressApi,
...buyerAskApi,
...orderListApi,
...categoryApi,
...sellerAskApi,
};
... ...
/**
* buyerask-api-map.js
*@author dennis
*@createtime 9/26/19
*@description 买家求购
*/
const API = require('./api-constants');
module.exports = {
'/api/order/buyaskconfig': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_CONFIG,
params: {}
},
'/api/order/buyeraskcompute': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_COMPUTE,
params: {
price: {type: Number, required: true},
storage_id: {type: Number, required: true},
}
},
'/api/order/buyeraskprepublish': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_TIPS,
params: {
price: {type: Number, required: true},
storage_id: {type: Number, required: true},
address_id: {type: String, required: true},
}
},
'/api/order/buyeraskpublish': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_PUBLISH,
params: {
price: {type: Number, required: true},
storage_id: {type: Number, required: true},
address_id: {type: String, required: true},
time_limit_id: {type: Number, required: true}, // 有效期
}
},
'/api/order/buyerask/computechangeprice': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_COMPUTE_CHANGE_PRICE,
params: {
price: {type: Number, required: true},
orderCode: {type: String, required: true},
}
},
'/api/order/buyerask/prechangeprice': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_PRE_CHANGE_PRICE,
params: {
price: {type: Number, required: true},
orderCode: {type: String, required: true},
}
},
'/api/order/buyerask/changeprice': {
ufo: true,
auth: true,
path: 'shopping/bid',
api: API.BUYER_ASK_CHANGE_PRICE,
params: {
price: {type: Number, required: true},
orderCode: {type: String, required: true},
}
}
};
... ...
const API = require('./api-constants');
module.exports = {
// 获取调价商品及尺码信息
'/api/ufo/seller/entryGoodsSizeList': {
... ... @@ -92,7 +94,6 @@ module.exports = {
ufo: true,
auth: true,
api: 'ufo.order.list',
// 类型定义
params: {
limit: { type: Number }, // page size
... ... @@ -225,6 +226,16 @@ module.exports = {
auth: true,
ufo: true,
api: 'ufo.sellerOrder.computePublishPrd',
},
'/api/order/ordercount': {
ufo: true,
auth: true,
api: API.ORDER_COUNT,
params: {
tabType: { type: String, require: true }, // 订单来源
}
},
// 判断用户状态
... ...
/**
* sellerask-api-map.js
*@author dennis
*@createtime 9/29/19
*@description 卖家求购变现
*/
const API = require('./api-constants');
module.exports = {
'/api/order/sellask/compute': {
ufo: true,
auth: true,
path: '',
api: API.SELLER_ASK_PRE_COMPUTE,
params: {
skup: {type: Number, required: true},
price: {type: Number, required: true},
}
},
'/api/order/sellask/publish': {
ufo: true,
auth: true,
path: '',
api: API.SELLER_ASK_PUBLISH,
params: {
skup: {type: Number, required: true},
price: {type: Number, required: true},
address_id: {type: String, required: true},
}
},
}
... ...
... ... @@ -70,7 +70,7 @@ module.exports = async (req, res, next) => {
} else if (apiInfo.ufo) {
result = await apiCtx[method]({
api: ufoAPI,
url: apiInfo.path || '',
url: apiInfo.path ? apiInfo.path : '',
data: params,
param: {
cache: cache,
... ... @@ -86,6 +86,7 @@ module.exports = async (req, res, next) => {
});
}
if (result) {
// console.log(result);
return res.json(handleResult(result, apiInfo));
}
return res.json({
... ...