<template>
<div ref="layout" class="layout" @touchstart="webviewScrollStart" @touchmove="webviewScrollMove" @touchend="webviewScrollEnd">
<div ref="layout" class="layout">
<slot name="header">
<LayoutHeader v-if="!hideHeader"
class="layout-header"
:title="title"
:opacity="opacity"
:show-back="showBack"
:back-action="backAction"
<LayoutHeader
v-if="!hideHeader"
class="layout-header"
:title="title"
:opacity="opacity"
:show-back="showBack"
:back-action="backAction"
></LayoutHeader>
</slot>
... ... @@ -18,7 +19,7 @@
<script>
export default {
name: 'LayoutApp',
name: "LayoutApp",
props: {
title: String,
opacity: {
... ... @@ -58,14 +59,11 @@ export default {
webviewScrollMove(e) {
if (this.isTouchStart && !this.isStop) {
let scrollTop = this.$refs.layout.scrollTop;
this.touchMoveY = e.changedTouches[0].pageY;
if (scrollTop <= 0 && this.touchMoveY > this.touchStartY ) {
if (scrollTop <= 0 && this.touchMoveY > this.touchStartY) {
e.preventDefault();
}
}
},
webviewScrollEnd() {
this.isTouchStart = false;
... ...
<template>
<LayoutApp ref="layout" :title="title">
<div class="order-page" @scroll="checkScroll">
<div class="order-page">
<div class="product">
<ImgSize
class="pro-img"
... ... @@ -119,20 +119,20 @@
</template>
<script>
import LayoutApp from '../../../components/layout/layout-app';
import ScrollView from '../../../components/layout/scroll-view';
import ImgSize from '../../../components/img-size';
import { createNamespacedHelpers } from 'vuex';
import InputUfo from './components/input-ufo';
import { Checkbox } from 'cube-ui';
import { get } from 'lodash';
import Modal from './components/modal';
import OrderCheck from '../components/confirm/agree';
const { mapState, mapActions } = createNamespacedHelpers('order/priceChange');
import LayoutApp from "../../../components/layout/layout-app";
import ScrollView from "../../../components/layout/scroll-view";
import ImgSize from "../../../components/img-size";
import { createNamespacedHelpers } from "vuex";
import InputUfo from "./components/input-ufo";
import { Checkbox } from "cube-ui";
import { get } from "lodash";
import Modal from "./components/modal";
import OrderCheck from "../components/confirm/agree";
const { mapState, mapActions } = createNamespacedHelpers("order/priceChange");
// orderCode = 1233499619151
export default {
name: 'noEntryDetail',
name: "noEntryDetail",
components: {
OrderCheck,
Modal,
... ... @@ -144,35 +144,35 @@ export default {
},
data() {
return {
title: '调价',
title: "调价",
agreementURL:
'https://activity.yoho.cn/feature/3187.html?share_id=5851&title=ufo-%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE',
"https://activity.yoho.cn/feature/3187.html?share_id=5851&title=ufo-%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE",
platformFeeModalVisible: false,
platformFee: {
amount: '-¥0',
appraiseFee: '¥0.00',
packageFee: '¥0.00',
serviceFee: '¥0.00',
goodsPaymentRatePercent: '0.00%',
payChannelPercentage: '0.00%'
amount: "-¥0",
appraiseFee: "¥0.00",
packageFee: "¥0.00",
serviceFee: "¥0.00",
goodsPaymentRatePercent: "0.00%",
payChannelPercentage: "0.00%"
},
bankTransferFee: '-¥0',
income: '¥0',
errorTip: '',
chgPrice: '',
bankTransferFee: "-¥0",
income: "¥0",
errorTip: "",
chgPrice: "",
calced: false,
earnestMoney: '¥0',
earnestMoney: "¥0",
// 保证金
earnestPrice: 0,
isAgree: false,
labelOption: {
label: '我已阅读并同意'
label: "我已阅读并同意"
},
time: 15000
};
},
asyncData({ store, router }) {
return store.dispatch('order/priceChange/fetchOrder', {
return store.dispatch("order/priceChange/fetchOrder", {
orderCode: router.params.orderCode
});
},
... ... @@ -181,7 +181,7 @@ export default {
// this.inputChange = debounce(this.onChange.bind(this), 500);
},
computed: {
...mapState(['noEntryOrderInfo']),
...mapState(["noEntryOrderInfo"]),
goodsInfo() {
return this.noEntryOrderInfo.goodsInfo || {};
},
... ... @@ -193,37 +193,37 @@ export default {
chgPrice() {
this.calced = false;
this.platformFee = {
amount: '-¥0',
appraiseFee: '¥0.00',
packageFee: '¥0.00',
serviceFee: '¥0.00',
goodsPaymentRatePercent: '0.00%',
payChannelPercentage: '0.00%'
amount: "-¥0",
appraiseFee: "¥0.00",
packageFee: "¥0.00",
serviceFee: "¥0.00",
goodsPaymentRatePercent: "0.00%",
payChannelPercentage: "0.00%"
};
this.bankTransferFee = '-¥0';
this.income = '¥0';
this.earnestMoney = '¥0';
this.bankTransferFee = "-¥0";
this.income = "¥0";
this.earnestMoney = "¥0";
this.earnestPrice = 0;
}
},
methods: {
...mapActions([
'fetchOrder',
'postNoEntryCalcPrice',
'postNoEntryChangePrice'
"fetchOrder",
"postNoEntryCalcPrice",
"postNoEntryChangePrice"
]),
checkPrice(price) {
let valid = false;
if (!price) {
this.errorTip = '没有价格';
this.errorTip = "没有价格";
return false;
} else if (!/^\d+$/.test(price)) {
this.errorTip = '价格只能为正整数';
this.errorTip = "价格只能为正整数";
} else if (!/9$/.test(price)) {
this.errorTip = '出售价格必须以9结尾';
this.errorTip = "出售价格必须以9结尾";
} else {
this.errorTip = '';
this.errorTip = "";
valid = true;
}
console.log(this.errorTip, valid);
... ... @@ -233,15 +233,15 @@ export default {
// 点击提交按钮
if (this.isAgree && this.calced) {
this.$createDialog({
type: 'confirm',
content: '重新出售后本次出售保证金原路返回',
type: "confirm",
content: "重新出售后本次出售保证金原路返回",
confirmBtn: {
text: '我再想想',
text: "我再想想",
active: true,
disabled: false
},
cancelBtn: {
text: '重新出售',
text: "重新出售",
active: false,
disabled: false
},
... ... @@ -264,11 +264,11 @@ export default {
console.log(result);
if (result && result.code === 200) {
this.platformFee = get(result, 'data.platformFee', '');
this.bankTransferFee = get(result, 'data.bankTransferFee', '');
this.income = '¥' + get(result, 'data.income', '');
this.earnestMoney = '¥' + get(result, 'data.earnestMoney', '');
this.earnestPrice = get(result, 'data.earnestMoney', 0);
this.platformFee = get(result, "data.platformFee", "");
this.bankTransferFee = get(result, "data.bankTransferFee", "");
this.income = "¥" + get(result, "data.income", "");
this.earnestMoney = "¥" + get(result, "data.earnestMoney", "");
this.earnestPrice = get(result, "data.earnestMoney", 0);
this.calced = true;
} else {
if (result.message) {
... ... @@ -278,7 +278,7 @@ export default {
this.$createToast({
txt: this.errorTip,
type: 'txt'
type: "txt"
}).show();
}
},
... ... @@ -289,7 +289,7 @@ export default {
} else {
this.$createToast({
txt: this.errorTip,
type: 'txt'
type: "txt"
}).show();
}
},
... ... @@ -300,7 +300,7 @@ export default {
showEarnestQuestion() {
// 跳转保证金说明页
console.log('showEarnest');
console.log("showEarnest");
this.$xianyu.goXianyuNewPage({ url: this.agreementURL });
},
... ... @@ -322,14 +322,14 @@ export default {
this.$createOrderPayType({
orderCode: result.data.orderCode,
price: parseFloat(`${earnestPrice}`).toFixed(2),
desc: '保证金',
desc: "保证金",
extra: JSON.stringify({
type: 'sell',
type: "sell",
back: {
name: 'InSaleOrderList'
name: "InSaleOrderList"
},
forward: {
name: 'SellPayOk',
name: "SellPayOk",
query: {
orderCode: result.data.orderCode
}
... ... @@ -338,9 +338,9 @@ export default {
onCloseAction() {
that.clearData();
that.$router.replace({
name: 'sellOrderDetail',
name: "sellOrderDetail",
params: {
owner: 'sell',
owner: "sell",
code: result.data.orderCode
}
});
... ... @@ -348,8 +348,8 @@ export default {
}).show();
} else {
this.$createToast({
txt: result.message || '调价失败',
type: 'txt'
txt: result.message || "调价失败",
type: "txt"
}).show();
}
... ... @@ -360,19 +360,19 @@ export default {
// console.log(this.$router);
this.platformFeeModalVisible = false;
this.platformFee = {
amount: '-¥0',
appraiseFee: '¥0.00',
packageFee: '¥0.00',
serviceFee: '¥0.00',
goodsPaymentRatePercent: '0.00%',
payChannelPercentage: '0.00%'
amount: "-¥0",
appraiseFee: "¥0.00",
packageFee: "¥0.00",
serviceFee: "¥0.00",
goodsPaymentRatePercent: "0.00%",
payChannelPercentage: "0.00%"
};
this.bankTransferFee = '-¥0';
this.income = '¥0';
this.errorTip = '';
this.chgPrice = '';
this.bankTransferFee = "-¥0";
this.income = "¥0";
this.errorTip = "";
this.chgPrice = "";
this.calced = false;
this.earnestMoney = '¥0';
this.earnestMoney = "¥0";
this.isAgree = false;
},
checkScroll(e) {
... ...
<template>
<LayoutApp :show-back="true" title="出售" :back-action="backAction">
<div class="order-page">
<!-- <Scroll :options="scrollOption">-->
<!-- <Scroll :options="scrollOption">-->
<div class="container">
<ProductInfo :data="productDetail" class="product-info"></ProductInfo>
<InputPrice @input="changePrice"
:num="num" :value="price"
@on-blur="compute" :super-sell="superSell"
@on-num-change="onNumChange"
<InputPrice
@input="changePrice"
:num="num"
:value="price"
@on-blur="compute"
:super-sell="superSell"
@on-num-change="onNumChange"
>
</InputPrice>
<OrderMargin class="order-item order-margin" :data="fee" :super-sell="superSell" :url="tipUrl"></OrderMargin>
<OrderMargin
class="order-item order-margin"
:data="fee"
:super-sell="superSell"
:url="tipUrl"
></OrderMargin>
<OrderFee class="order-item" :data="fee"></OrderFee>
<AddressInfo :data="address" class="order-item"></AddressInfo>
<div class="white-space"></div>
</div>
<!-- </Scroll>-->
<!-- </Scroll>-->
</div>
<div class="footer">
<OrderAgree :value="agree" @input="changeAgree" class="agree-wrapper" :desc="agreeDesc" :url="url"></OrderAgree>
<OrderAgree
:value="agree"
@input="changeAgree"
class="agree-wrapper"
:desc="agreeDesc"
:url="url"
></OrderAgree>
<div class="btn-wrapper">
<YohoButton :txt="txt" class="submit-btn" @click="onClick" :disable="!agree"></YohoButton>
<YohoButton
:txt="txt"
class="submit-btn"
@click="onClick"
:disable="!agree"
></YohoButton>
</div>
</div>
</LayoutApp>
</template>
<script>
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 { Types, UserType } from 'store/order/order-confirm';
import { Scroll } from 'cube-ui';
import { get } from 'lodash';
import { createNamespacedHelpers, mapState } from 'vuex';
const { mapState: mapOrderState, mapActions: mapOrderAction, mapMutations: mapOrderMutations } = createNamespacedHelpers('order/orderConfirm');
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 { Types, UserType } from "store/order/order-confirm";
import { Scroll } from "cube-ui";
import { get } from "lodash";
import { createNamespacedHelpers, mapState } from "vuex";
const {
mapState: mapOrderState,
mapActions: mapOrderAction,
mapMutations: mapOrderMutations
} = createNamespacedHelpers("order/orderConfirm");
export default {
name: 'SellOrderConfirm',
props: ['productId', 'storageId'],
name: "SellOrderConfirm",
props: ["productId", "storageId"],
components: {
Scroll,
ProductInfo,
... ... @@ -58,56 +80,78 @@ export default {
},
data() {
return {
txt: '提交',
txt: "提交",
error: false,
agreeDesc: '有货卖家协议',
url: 'https://activity.yoho.cn/feature/6773.html?share_id=9479&title=%E9%97%B2%E9%B1%BC%E6%BD%AE%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE',
agreeDesc: "有货卖家协议",
url:
"https://activity.yoho.cn/feature/6773.html?share_id=9479&title=%E9%97%B2%E9%B1%BC%E6%BD%AE%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE",
superSell: false,
addNumError: false,
scrollOption: {
bounce: false,
click: true
},
tipUrl: 'https://activity.yoho.cn/feature/6773.html?share_id=9479&title=%E9%97%B2%E9%B1%BC%E6%BD%AE%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE'
tipUrl:
"https://activity.yoho.cn/feature/6773.html?share_id=9479&title=%E9%97%B2%E9%B1%BC%E6%BD%AE%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE"
};
},
activated() {
this.fetchUserStatus().then(result => {
this.superSell = get(result, 'data.entrySellerType', 0) !== 0;
this.superSell = get(result, "data.entrySellerType", 0) !== 0;
});
this.fetchOrderAddress({ tabType: UserType.sell });
this.$store.dispatch('product/getSelectedTradeProduct', {
this.$store.dispatch("product/getSelectedTradeProduct", {
productId: this.productId,
storageId: this.storageId
});
},
beforeRouteLeave(to, from, next) {
if (to.name !== 'address') {
if (to.name !== "address") {
this[Types.CLEAR_SELL_STATUS]();
}
next();
},
computed: {
...mapOrderState(['address', 'fee', 'price', 'agree', 'num']),
...mapOrderState(["address", "fee", "price", "agree", "num"]),
...mapState({
productDetail: state => {
const leastPrice = get(state.product.selectedProductInfo, 'size.least_price', 0);
const storageNum = get(state.product.selectedProductInfo, 'size.storage_num', 0);
const suggestHighPrice = get(state.product.selectedProductInfo, 'size.suggest_high_price', 0);
const suggestLowPrice = get(state.product.selectedProductInfo, 'size.suggest_low_price', 0);
const bidPrice = get(state.product.selectedProductInfo, 'size.bid_moster_price', 0);
let priceType = '最低现货价:';
let goodPrice = '';
let priceBidType = '最高求购价:';
let goodBidPrice = '¥-';
const leastPrice = get(
state.product.selectedProductInfo,
"size.least_price",
0
);
const storageNum = get(
state.product.selectedProductInfo,
"size.storage_num",
0
);
const suggestHighPrice = get(
state.product.selectedProductInfo,
"size.suggest_high_price",
0
);
const suggestLowPrice = get(
state.product.selectedProductInfo,
"size.suggest_low_price",
0
);
const bidPrice = get(
state.product.selectedProductInfo,
"size.bid_moster_price",
0
);
let priceType = "最低现货价:";
let goodPrice = "";
let priceBidType = "最高求购价:";
let goodBidPrice = "¥-";
if (!storageNum) {
if (suggestHighPrice && suggestLowPrice) {
priceType = '建议售价:';
priceType = "建议售价:";
goodPrice = `¥${suggestLowPrice}-¥${suggestHighPrice}`;
} else {
goodPrice = '¥-';
goodPrice = "¥-";
}
} else {
goodPrice = `¥${leastPrice}`;
... ... @@ -120,13 +164,33 @@ export default {
}
return {
goodImg: get(state.product.selectedProductInfo, 'product.goods_list[0].image_list[0].image_url', ''),
productName: get(state.product.selectedProductInfo, 'product.product_name', ''),
productId: get(state.product.selectedProductInfo, 'product.product_id', ''),
colorName: get(state.product.selectedProductInfo, 'product.goods_list[0].color_name', ''),
sizeName: get(state.product.selectedProductInfo, 'size.size_name', ''),
skup: get(state.product.selectedProductInfo, 'size.skup', ''),
bidSkup: get(state.product.selectedProductInfo, 'size.bid_skup', ''),
goodImg: get(
state.product.selectedProductInfo,
"product.goods_list[0].image_list[0].image_url",
""
),
productName: get(
state.product.selectedProductInfo,
"product.product_name",
""
),
productId: get(
state.product.selectedProductInfo,
"product.product_id",
""
),
colorName: get(
state.product.selectedProductInfo,
"product.goods_list[0].color_name",
""
),
sizeName: get(
state.product.selectedProductInfo,
"size.size_name",
""
),
skup: get(state.product.selectedProductInfo, "size.skup", ""),
bidSkup: get(state.product.selectedProductInfo, "size.bid_skup", ""),
goodPrice,
priceType,
goodBidPrice,
... ... @@ -140,44 +204,62 @@ export default {
})
},
methods: {
...mapOrderAction(['fetchOrderAddress', 'fetchUserStatus', 'fetchOrderPrice', 'submitOrder', 'fetchPayList']),
...mapOrderMutations([Types.CHANGE_PRICE, Types.CHANGE_AGREE, Types.CLEAR_SELL_STATUS, Types.CHANGE_SELL_NUM]),
...mapOrderAction([
"fetchOrderAddress",
"fetchUserStatus",
"fetchOrderPrice",
"submitOrder",
"fetchPayList"
]),
...mapOrderMutations([
Types.CHANGE_PRICE,
Types.CHANGE_AGREE,
Types.CLEAR_SELL_STATUS,
Types.CHANGE_SELL_NUM
]),
onClick() {
this.submit();
},
compute() {
if (this.productDetail.bidPrice && (Number(this.price) > 0) && (Number(this.price) <= this.productDetail.bidPrice)) {
if (
this.productDetail.bidPrice &&
Number(this.price) > 0 &&
Number(this.price) <= this.productDetail.bidPrice
) {
this.$createDialog({
type: 'confirm',
type: "confirm",
title: `最高求购价${this.productDetail.bidPrice}`,
content: '已有求购高于您的出价,可直接变现',
content: "已有求购高于您的出价,可直接变现",
confirmBtn: {
text: '我再想想',
text: "我再想想",
active: true,
disabled: false,
disabled: false
},
cancelBtn: {
text: '确定变现',
text: "确定变现",
active: false,
disabled: false
},
onCancel: () => {
this.$store.commit('order/sellerAskOrder/SELLER_ASK_SET_PRODUCTINFO', {
goodImg: this.productDetail.goodImg,
colorName: this.productDetail.colorName,
sizeName: this.productDetail.sizeName,
goodPrice: this.productDetail.bidPrice,
productId: this.productDetail.productId,
bid_moster_price: this.productDetail.bidPrice,
});
this.$store.commit(
"order/sellerAskOrder/SELLER_ASK_SET_PRODUCTINFO",
{
goodImg: this.productDetail.goodImg,
colorName: this.productDetail.colorName,
sizeName: this.productDetail.sizeName,
goodPrice: this.productDetail.bidPrice,
productId: this.productDetail.productId,
bid_moster_price: this.productDetail.bidPrice
}
);
// 跳转变现
this.$router.push({
name: 'sellAskOrder',
name: "sellAskOrder",
query: {
skup: this.productDetail.bidSkup,
price: this.productDetail.bidPrice,
price: this.productDetail.bidPrice
}
});
}
... ... @@ -189,7 +271,7 @@ export default {
address_id: this.address?.address_id,
num: this.num,
price: this.price,
storage_id: this.storageId,
storage_id: this.storageId
}).then(result => {
if (result.error) {
this.error = result.error;
... ... @@ -197,7 +279,7 @@ export default {
this.$createToast({
time: 1500,
txt: result.error,
type: 'txt'
type: "txt"
}).show();
if (result.code === 438) {
... ... @@ -217,8 +299,8 @@ export default {
if (!this.address) {
this.$createToast({
time: 1500,
txt: '请选择地址',
type: 'txt'
txt: "请选择地址",
type: "txt"
}).show();
return false;
}
... ... @@ -232,22 +314,21 @@ export default {
if (this.productDetail.isSuggest) {
if (Number(this.price) > this.productDetail.suggestHighPrice) {
this.$createDialog({
type: 'confirm',
content: '超出建议售价将被限制展示,建议下调至合理价格区间',
type: "confirm",
content: "超出建议售价将被限制展示,建议下调至合理价格区间",
confirmBtn: {
text: '修改价格',
text: "修改价格",
active: true,
disabled: false,
disabled: false
},
cancelBtn: {
text: '仍要上架',
text: "仍要上架",
active: false,
disabled: false
},
onCancel: () => {
this.submitHandler();
}
}).show();
} else {
this.submitHandler();
... ... @@ -273,14 +354,14 @@ export default {
address_id: this.address?.address_id,
num: this.num,
price: this.price,
storage_id: this.storageId,
storage_id: this.storageId
});
if (orderResult.code !== 200) {
this.$createToast({
time: 1500,
txt: orderResult.message,
type: 'txt'
type: "txt"
}).show();
return;
}
... ... @@ -291,13 +372,13 @@ export default {
time: 1500,
txt: orderResult.message,
mask: true,
type: 'txt'
type: "txt"
}).show();
await this.delay(1500);
this.$router.replace({
name: 'ProductDetail',
name: "ProductDetail",
params: {
productId: this.productId
}
... ... @@ -307,18 +388,18 @@ export default {
this.$createOrderPayType({
price: parseFloat(`${this.fee.earnestMoney}`).toFixed(2),
desc: '保证金',
desc: "保证金",
orderCode: orderResult.data.orderCode,
extra: JSON.stringify({
type: UserType.sell,
back: {
name: 'ProductDetail',
name: "ProductDetail",
params: {
productId: this.productId
}
},
forward: {
name: 'SellPayOk',
name: "SellPayOk",
query: {
orderCode: orderResult.data.orderCode
}
... ... @@ -331,7 +412,7 @@ export default {
},
onClose(orderCode) {
this.$router.replace({
name: 'sellOrderDetail',
name: "sellOrderDetail",
params: {
owner: UserType.sell,
code: orderCode
... ... @@ -340,7 +421,7 @@ export default {
},
onNumChange({ count, type }) {
console.log(count, type, this.addNumError);
if (type === 'add' && this.addNumError) {
if (type === "add" && this.addNumError) {
return;
}
... ... @@ -354,7 +435,7 @@ export default {
},
backAction() {
this.$router.replace({
name: 'ProductDetail',
name: "ProductDetail",
params: {
productId: this.productId
}
... ... @@ -403,6 +484,7 @@ export default {
width: 100%;
border-top: 1px solid #eee;
z-index: 1;
background: #fff;
}
.btn-wrapper {
... ... @@ -425,5 +507,4 @@ export default {
line-height: 80px;
font-size: 28px;
}
</style>
... ...
{
"name": "xianyu-ufo-app-web",
"version": "0.0.2-beta-36",
"version": "0.0.2-beta-37",
"private": true,
"description": "Xianyu Project With Express",
"repository": {
... ...