Files
jjx-web-sign-only/pages/order/order.vue
T
2026-10-08 18:20:51 +08:00

1007 lines
35 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="">
<top-bar></top-bar>
<common-nav></common-nav>
<view class="w-1200">
<el-row :gutter="10">
<el-col :span="4">
<el-menu @select="menuSelect" :default-active="menuIndex" class="el-menu-vertical-demo">
<el-menu-item index="0">
<i class="el-icon-edit"></i>
<span slot="title">我卖出的</span>
</el-menu-item>
<el-menu-item index="1">
<i class="el-icon-warning-outline"></i>
<span slot="title">我购买的</span>
</el-menu-item>
<el-menu-item index="2">
<i class="el-icon-circle-check"></i>
<span slot="title">线下交易</span>
</el-menu-item>
</el-menu>
</el-col>
<el-col :span="20">
<el-card shadow="never">
<el-tabs v-model="activeName" @tab-click="query(1, true)" v-if="menuIndex !== '2'">
<el-tab-pane label="全部" name="all">
</el-tab-pane>
<el-tab-pane label="待付款" name="0"></el-tab-pane>
<el-tab-pane label="待发货" name="1"></el-tab-pane>
<el-tab-pane label="待收货" name="2"></el-tab-pane>
<!-- <el-tab-pane label="已取消" name="-1"></el-tab-pane>-->
<el-tab-pane label="已完成" name="4"></el-tab-pane>
<el-tab-pane label="退款中" name="5"></el-tab-pane>
<el-tab-pane label="退款成功" name="6"></el-tab-pane>
<el-tab-pane label="退款拒绝" name="7"></el-tab-pane>
</el-tabs>
<el-descriptions border size="small">
<el-descriptions-item label="订单编号">
<el-input placeholder="请输入订单编号" @keyup.enter.native="query(1)"
v-model="keyword"/>
</el-descriptions-item>
<!-- <el-descriptions-item label="下单时间"><input placeholder="下单时间"/>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="采购商品"><input placeholder="请输入采购商品"/>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="订单类型" v-if="menuIndex === '1'">
<el-select v-model="orderType" placeholder="请选择" @change="query(1)">
<el-option :label="item" v-for="(item, index) in orderTypeList" :key="index"
:value="index"/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="订单类型" v-else-if="menuIndex === '0'">
<el-select v-model="orderType" placeholder="请选择" @change="query(1)">
<el-option label="商城订单" :value="0"/>
<el-option label="询价订单" :value="4"/>
<el-option label="加工订单" :value="5"/>
<el-option label="旧货交易订单" :value="6"/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="订单类型" v-else>
<el-select v-model="orderType" placeholder="请选择" @change="query(1)">
<el-option label="询价订单" :value="4"/>
<el-option label="加工订单" :value="5"/>
<el-option label="旧货交易订单" :value="6"/>
</el-select>
</el-descriptions-item>
<!-- <el-descriptions-item label="买家名称">-->
<!-- <input placeholder="请输入买家名称"/>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="发票管理">-->
<!-- <el-select size="small" v-model="value2" placeholder="请选择">-->
<!-- <el-option v-for="item in options2" :key="item.value" :label="item.label"-->
<!-- :value="item.value">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-descriptions-item>-->
</el-descriptions>
<div class="flex justify-end items-center mt-20">
<el-button type="primary" size="small" @click.native="query(1)">搜索</el-button>
<el-button type="primary" size="small" plain @click.native="reset">重置</el-button>
</div>
</el-card>
<el-card shadow="never" style="margin-top: 20px;">
<view class="order-list">
<view class="item" v-for="(item, index) in tableData.rows" :key="index">
<view class="info">
<view class="title">
<text>订单编号:{{ item.orderNo }}</text>
<text v-if="item.sheet" class="ml-20">({{ item.sheet.title }})</text>
</view>
<view class="sub-title flex flex-col justify-start items-start">
<view v-if="item.signMethod !== 1">订单状态:
<text class="text-main">{{ orderStatusList[item.orderStatus] }}</text>
</view>
<view class="flex justify-start items-center">
<text>订单类型:{{ orderTypeList[item.type] }}</text>
<text v-if="item.type === 1">({{
item.subType === 0 ? '企业' : '产品'
}})
</text>
<text class="text-main" v-if="item.type === 3">(过期时间:{{
item.upgradeExpiredAt
}})
</text>
<text class="text-main" v-if="item.type === 8">(过期时间:{{
dayjs(item.spot.topExpiredAt).format('YYYY-MM-DD HH:mm:ss')
}})({{
item.goods[0].goodsId === '-1' ? '全国' : provincesData.find(province => parseInt(province.code) === parseInt(item.goods[0].goodsId)).name
}})
</text>
</view>
<template v-if="item.type === 7 && item.goods[0].isSingleQuote">
<view v-if="item.goods[0].type === 'enquiry'">报价类型:找买家</view>
<view v-if="item.goods[0].type === 'old'">报价类型:旧货交易</view>
<view v-if="item.goods[0].type === 'process'">报价类型:找加工</view>
<view>报价内容:{{ item.goods[0].sheet.title }}</view>
</template>
<template v-if="item.type === 7 && !item.goods[0].isSingleQuote">
<view class="flex justify-start items-center">
<span>{{ item.goods[0].goodsName }}</span>
<span class="text-main" v-if="userInfo.quoteExpiredAt">(过期时间:{{
dayjs(userInfo.quoteExpiredAt).format('YYYY-MM-DD HH:mm:ss')
}})</span>
</view>
</template>
<text>创建时间:{{ item._add_time_str }}</text>
<text class="text-main" v-if="item.type > 3 && item.payList">
最新支付状态:{{ item.buyerStatusStr }}
</text>
<template>
<view class="text-main" v-if="item.type < 4 && item.orderStatus > 4 && item.refundReason">
<view>
退款原因:{{ item.refundReason }}
</view>
<view v-if="item.refundPhotos" class="mt-20">
<text>退款附件:</text>
<el-image v-for="(photo, photoIndex) in item.refundPhotos" :preview-src-list="item.refundPhotos"
:key="photoIndex" :src="photo" style="width: 80px; height: 80px" class="mr-25" fit="cover"/>
</view>
</view>
</template>
<text class="text-main" v-if="item.type < 4 && item.orderStatus === 7">
退款拒绝原因:{{ item.refundRefuseReason }}
</text>
</view>
<view class="action">
<template
v-if="(item.type > 3 && item.type < 7) || [14, 15].includes(item.type)">
<el-button plain size="mini" class="btn-buy pointer" @click="contact(item)">
联系交易方
</el-button>
<template v-if="item.type > 3 && item.orderStatus < 3 && item.isSeller">
<template
v-if="!item.payList || !['尾款', '货到付款'].includes(item.payList.type) || (['尾款', '货到付款'].includes(item.payList.type) && item.payList.buyerRefuse)">
<el-divider direction="vertical"></el-divider>
<el-button type="primary" size="mini" class="pointer"
@click="makePayList(item)">
创建支付单
</el-button>
</template>
</template>
<template v-if="item.type > 3 && item.payStatus > 0">
<el-divider direction="vertical"></el-divider>
<el-button type="warning" size="mini" class="pointer"
@click="showPayList(item)">
查看支付单
</el-button>
</template>
<template v-if="item.contractId">
<el-divider direction="vertical"></el-divider>
<el-button plain size="mini" class="btn-buy pointer"
@click="viewContract(item.contractId)">
查看合同
</el-button>
</template>
<!-- <template v-if="item.type > 3 && item.orderStatus === 1 && item.isSeller">-->
<!-- <el-divider direction="vertical"></el-divider>-->
<!-- <el-button plain size="mini" class="btn-buy pointer"-->
<!-- @click="setExpress(item)">-->
<!-- 发货-->
<!-- </el-button>-->
<!-- </template>-->
</template>
<template v-if="[0, 1, 2, 3, 7, 8, 9].includes(item.type)">
<el-button plain size="mini" class="btn-close pointer"
v-if="[0, 1].includes(item.type)"
@click="showGoods(item)">商品列表
</el-button>
<template v-if="item.orderStatus === 0">
<el-button plain size="mini" class="btn-close pointer"
@click="navTo(`/pages/index/shop/pay?id=${item._id}`)"
>去支付
</el-button>
<el-divider direction="vertical"></el-divider>
<el-button plain size="mini" class="pointer" type="info"
@click="cancel(item)"
>取消订单
</el-button>
<el-divider direction="vertical"></el-divider>
<template v-if="item.orderStatus === 4">
<el-divider direction="vertical"/>
<el-button plain size="mini"
@click="showServicePhone()">客服电话
</el-button>
<el-divider direction="vertical"/>
<el-button plain size="mini"
@click="showServiceQR()">客服二维码
</el-button>
</template>
</template>
<template v-if="item.orderStatus >= 2 && item.type === 0">
<el-divider direction="vertical"></el-divider>
<el-button plain size="mini" class="btn-buy pointer"
@click="showExpressInfo(item)">
物流信息
</el-button>
<template v-if="item.isBuyer && item.orderStatus === 2">
<el-divider direction="vertical"></el-divider>
<el-button size="mini" type="success"
@click="confirmExpress(item._id)">
确认收货
</el-button>
</template>
<!-- <template v-if="item.orderStatus === 5 && item.isSeller">-->
<!-- <el-button size="mini" type="success"-->
<!-- @click.native="changeRefundStatus(item._id, 6)">同意退款-->
<!-- </el-button>-->
<!-- <el-button size="mini" type="danger"-->
<!-- @click.native="changeRefundStatus(item._id, 7)">拒绝退款-->
<!-- </el-button>-->
<!-- </template>-->
</template>
<el-button size="mini" type="success" v-if="item.orderStatus === 11 && item.isSeller"
@click.native="showSend(item)">已完成
</el-button>
<el-button size="mini" type="success" v-if="item.orderStatus === 3 && item.isBuyer" plain>
商家已完成发送
</el-button>
<el-button size="mini" type="success" v-if="item.orderStatus === 3 && item.isBuyer"
@click.native="changeOrderStatus(item._id, 4)">确认收到
</el-button>
</template>
<template
v-if="([1, 2, 4, 7, 8, 9].includes(item.orderStatus)
&& ((item.type > 3 && item.hasPay && item.isBuyer)
|| (item.type < 3 && [1, 2, 3, 4, 7, 8, 9].includes(item.orderStatus) && item.isBuyer)
))">
<el-divider direction="vertical"/>
<el-button plain size="mini" class="btn-close pointer"
@click="showRefund(item)">申请退款
</el-button>
</template>
<template v-if="item.orderStatus === 1 && item.isSeller && item.type === 0">
<el-divider direction="vertical"/>
<el-button plain size="mini" class="btn-close pointer"
@click="setExpress(item)">发货
</el-button>
</template>
</view>
</view>
<view class="tool" v-if="item.type < 4 || (item.type > 6 && item.type !== 14)">
<view class="price">
<template v-if="item.orderStatus !== 10">
<text
:class="[parseFloat(item.offAmount) !== parseFloat(item.amount) ? 'text-line-through text-gray': 'red']">
¥{{ item.amount ? parseFloat(item.amount).toFixed(2) : '' }}
</text>
<text class="red"
v-if="parseFloat(item.offAmount) !== parseFloat(item.amount)">
¥{{ item.offAmount }}
</text>
</template>
<text v-else class="red">待报价</text>
<text>总金额</text>
</view>
<view class="status">
<view class="icon">
<img v-if="item.orderStatus === 0" src="/static/images/order/toBePaid.png"
alt=""/>
</view>
</view>
</view>
</view>
<view class="paginatio">
<el-pagination
@current-change="query"
background
layout="prev, pager, next"
:page-size="pageSize"
:total="tableData.total">
</el-pagination>
</view>
</view>
</el-card>
</el-col>
</el-row>
</view>
<common-footer></common-footer>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="80%">
<make-pay v-if="dialogVisible && clickedInfo && dialogType === 'create'" :info="clickedInfo"
@close="dialogVisible = false;query(1)" :pay-type-list="payTypeList"/>
<pay-list v-else-if="dialogVisible && dialogType === 'pay-list'" :pay-list="payList"
@refresh="payRefresh"/>
<goods v-if="dialogVisible && dialogType === 'goods-list'" :goods="clickedInfo.goods" :order="clickedInfo"
:selfProduct="clickedInfo.selfProduct"/>
<set-express v-if="dialogVisible && dialogType === 'set-express'" :id="clickedInfo._id" :info="clickedInfo"
@close="dialogVisible = false;query(1)"/>
<set-refund v-if="dialogVisible && dialogType === 'set-refund'" :id="clickedInfo._id"
@close="dialogVisible = false;query(1)"/>
<express-info v-if="dialogVisible && dialogType === 'express-info'" :info="clickedInfo"
@close="dialogVisible = false;"/>
<set-send v-if="dialogVisible && dialogType === 'task-send'" :order-info="clickedInfo"
@close="reloadOrder()"/>
</el-dialog>
</view>
</template>
<script>
import {
Agreement
} from "@icon-park/vue";
import Shop from "../index/shop/shop.vue";
import ShopOrder from "./components/shopOrder.vue";
import Goods from "./components/goods.vue";
import SetExpress from "./components/setExpress.vue";
import ExpressInfo from "./components/expressInfo.vue";
import MakePay from "./components/makePay.vue";
import PayList from "./components/payList.vue";
import SetRefund from "./components/setRefund.vue";
import dayjs from "dayjs";
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
import SetSend from "./components/setSend.vue";
const CREATE_PAY_LIST_CONFIRM_CONTENT = `1、您已充分知悉、了解并认可本订单及合同的全部内容以及各方的权利义务;<br>2、请您按照订单或合同约定创建支付单,否则将存在被驳回的风险。若申请被驳回,请及时沟通处理,完成整改后再次提交。`
export default {
components: {
SetSend,
SetRefund,
PayList,
MakePay,
SetExpress,
Goods,
ShopOrder,
Shop,
Agreement,
ExpressInfo
},
data() {
return {
provincesData: provinces,
dialogVisible: false,
dialogType: '',
dialogTitle: '',
clickedInfo: null,
activeName: 'all',
value: '',
options: [{
value: '自主交易',
label: '自主交易'
}],
pageIndex: 1,
menuIndex: '0',
formData: {
status: null,
tradeMethod: null
},
tableData: {
total: 0,
rows: []
},
pageSize: 5,
orderType: null,
orderTypeList: [
'商城订单',
'金久信自营增值服务',
'保证金',
'会员升级',
'询价订单',
'加工订单',
'旧货订单',
'报价次数',
'现货广告',
'旧货加急',
'旧货次数',
'金久信学堂下载次数',
'司法调证',
'金久信签约宝次数',
'金久信签约宝',
'金久信自营询价',
// '旧货次数',
],
orderStatusList: [
'待支付',
'待发货',
'待收货',
'待确认',
'已完成',
'退款审核中',
'退款成功',
'退款拒绝',
'',
'',
'待报价',
'已派单待完成',
],
payList: [],
keyword: '',
orderPayList: [],
payInfo: {},
payTypeList: ['预付款', '进度款', '尾款', '货到付款', '全款'],
topExpiredAt: '',
userInfo: null
}
},
onLoad(options) {
if (!vk.getVuex('$user.userInfo.mobile')) {
this.$confirm('请先绑定手机号', '提示', {
confirmButtonText: '确定',
showCancelButton: false,
type: 'warning'
}).then(() => {
vk.redirectTo(`/pages/auth/login/wechat?state=jjx_` + vk.getVuex('$user.userInfo.accountType'))
}).catch(() => {
vk.redirectTo(`/pages/auth/login/wechat?state=jjx_` + vk.getVuex('$user.userInfo.accountType'))
})
return
}
if (options.menuIndex) this.menuIndex = options.menuIndex
if (options.activeName) this.activeName = options.activeName
if (options.keyword) this.keyword = options.keyword
this.query(1)
vk.userCenter.getCurrentUserInfo({
success: (data) => {
this.topExpiredAt = data.userInfo.topExpiredAt
this.userInfo = data.userInfo
}
})
},
methods: {
dayjs,
menuSelect(e) {
this.menuIndex = String(e)
this.query(1, true)
},
async query(pageIndex, resetFilter = false, activeName = null) {
if (resetFilter) {
this.keyword = null
this.orderType = null
}
if (activeName) this.activeName = activeName
console.log(this.activeName)
this.tableData = await vk.callFunction({
url: 'client/order/kh/getList',
title: '请求中...',
data: {
pageIndex,
pageSize: this.pageSize,
keyword: this.keyword,
isSeller: this.menuIndex === '0' ? 1 : 0,
type: this.orderType,
signMethod: this.menuIndex === '2' ? 1 : null,
orderStatus: this.activeName === 'all ' ? null : parseInt(this.activeName),
},
});
this.tableData.rows.map(item => {
item.buyerStatusStr = ''
if (item.type > 3 && item.payList) {
item.buyerStatusStr = `${item.payList.type}-`
if (item.payList.buyerRefuse) {
item.buyerStatusStr += `买家已拒绝:${item.payList.refuseReason}。`
if (item.isSeller) item.buyerStatusStr += '请等待卖家重新创建支付单'
else item.buyerStatusStr += '请重新创建支付单'
} else {
if (item.payList.hasPaid) {
if (item.payList.sellerConfirm) item.buyerStatusStr += '卖家已确认收款'
else item.buyerStatusStr += '买家已支付,待卖家确认收款'
} else item.buyerStatusStr += '买家未支付'
}
}
return item
})
},
reset() {
this.orderType = null
this.keyword = null
this.query(1)
},
contact(item) {
try {
const mobile = item.isBuyer ? item.seller.mobile : item.buyer.mobile
this.$confirm(`交易方联系方式:${mobile}`, '', {
cancelButtonText: '关闭',
showConfirmButton: false
})
} catch (e) {
this.$confirm(`交易方未留下联系方式`, '', {
cancelButtonText: '关闭',
showConfirmButton: false
})
}
},
async makePayList(item) {
try {
await this.$confirm(CREATE_PAY_LIST_CONFIRM_CONTENT, '创建支付单', {
confirmButtonText: '我已知晓', cancelButtonText: '取消', showCancelButton: true,
type: 'warning', dangerouslyUseHTMLString: true
})
} catch (e) {
return
}
const {rows} = await vk.callFunction({
url: 'client/order/kh/orderPayList',
title: '请求中...',
data: {
id: item._id
},
});
if (rows.length > 0 && !rows[rows.length - 1].buyerRefuse && !rows[rows.length - 1].sellerConfirm) {
return this.$message.error('还有未确认的支付单,无法继续创建。请到支付单中查看并确认收款')
}
this.orderPayList = rows
this.clickedInfo = item
this.dialogType = 'create'
this.dialogTitle = '创建支付单'
this.dialogVisible = true
},
async showPayList(item) {
this.clickedInfo = item
await this.getPayList()
this.dialogVisible = true
this.dialogTitle = '查看支付单'
this.dialogType = 'pay-list'
},
async showSend(item) {
this.clickedInfo = item
this.dialogVisible = true
this.dialogTitle = '任务内容上传'
this.dialogType = 'task-send'
},
async getPayList() {
const {rows} = await vk.callFunction({
url: 'client/order/kh/orderPayList',
title: '请求中...',
data: {id: this.clickedInfo._id}
})
this.payList = rows
},
viewContract(contractId) {
vk.callFunction({
url: 'client/contract/kh/viewContract',
title: '请求中...',
data: {
contractId
},
success: (res) => {
window.open(res.data)
}
});
},
navTo(url) {
vk.navigateTo({
url: url
})
},
async buyerRefuse(index) {
this.payList[index].buyerRefuse = true
await vk.callFunction({
url: 'client/order/kh/payRefuse',
title: '请求中...',
data: {
id: this.payList[index]._id
}
})
},
showGoods(item) {
this.clickedInfo = item;
this.dialogTitle = '商品列表'
this.dialogType = 'goods-list';
this.dialogVisible = true
},
showRefund(item) {
this.clickedInfo = item;
this.dialogTitle = '退款申请'
this.dialogType = 'set-refund';
this.dialogVisible = true
},
setExpress(item) {
this.clickedInfo = item;
this.dialogTitle = '发货'
this.dialogType = 'set-express';
this.dialogVisible = true
},
showExpressInfo(item) {
this.clickedInfo = item;
this.dialogTitle = '发货详情'
this.dialogType = 'express-info';
this.dialogVisible = true
},
confirmExpress(id) {
this.$confirm('只确认数量和金额,质保按双方合同约定内容执行', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
await vk.callFunction({
url: 'client/order/kh/changeOrderStatus',
title: '请求中...',
data: {
id,
orderStatus: 4
}
})
this.activeName = '4'
await this.query(1)
})
},
payRefresh(menuIndex) {
this.getPayList()
this.query(1, null, menuIndex)
},
async cancel({_id}) {
this.$confirm('确认取消订单吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
await vk.callFunction({
url: 'client/order/kh/changeOrderStatus',
title: '请求中...',
data: {
id: _id,
orderStatus: -1
}
})
await this.query(1)
})
},
async showServicePhone() {
const res = await vk.callFunction({
url: 'client/dict/pub/getDetail',
data: {
id: '657d8fca55b337cfadbe1063'
}
})
this.$confirm(`${res.content}`, '平台客服', {
cancelButtonText: '关闭',
showConfirmButton: false
})
},
async showServiceQR() {
const res = await vk.callFunction({
url: 'client/dict/pub/getDetail',
data: {
id: '657d9025e0ec19b5040feb40'
}
})
const h = this.$createElement;
this.$confirm(`<image src="${res.content}" style="width: 100px;height: 100px;"/>`, '平台客服二维码', {
cancelButtonText: '关闭',
showConfirmButton: false,
dangerouslyUseHTMLString: true
})
},
async changeRefundStatus(id, orderStatus) {
if (orderStatus === 7) {
this.$prompt('请输入驳回理由', '提示', {
showCancelButton: true,
showInput: true,
}).then(async ({value}) => {
await vk.callFunction({
url: 'client/order/kh/changeRefundStatus',
data: {
id,
orderStatus,
refundRefuseReason: value
}
})
this.$message({
type: 'success',
message: '驳回成功'
})
await this.query(1)
})
} else {
await vk.callFunction({
url: 'client/order/kh/changeRefundStatus',
data: {
id,
orderStatus
}
})
await this.query(1)
}
},
async changeOrderStatus(id, orderStatus) {
await vk.callFunction({
url: 'client/order/kh/changeOrderStatus',
data: {
id,
orderStatus
}
})
await this.query(1)
},
reloadOrder() {
this.dialogVisible = false
this.query(1)
}
}
}
</script>
<style scoped lang="scss">
.w-1200 {
width: 1200px;
margin: 20px auto;
}
.contract-list {
background-color: #FFFFFF;
padding: 10px 20px 20px;
}
.order-list {
display: flex;
flex-direction: column;
.item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f3f3f3;
.info {
.title {
font-size: 16px;
font-weight: bold;
line-height: 2em;
display: flex;
align-items: center;
justify-content: flex-start;
.el-tag {
margin-left: 10px;
}
}
.sub-title {
color: #999999;
}
.action {
padding: 10px 0;
display: flex;
flex-direction: row;
align-items: center;
.btn-buy, .btn-close {
color: #A92924;
}
}
}
.tool {
display: flex;
background-color: #f3f3f3;
.price {
margin: 0 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 90px;
.red {
font-size: 16px;
color: #A92924;
font-weight: bold;
}
}
.status {
.icon {
margin: 0 20px;
img {
width: 100px;
}
}
}
}
}
}
.transaction-list {
display: flex;
flex-direction: column;
.item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f3f3f3;
.info {
.title {
display: flex;
font-size: 16px;
font-weight: bold;
line-height: 2em;
.buyer, .seller {
font-size: 14px;
font-weight: normal;
display: flex;
margin: 0 30px;
}
.el-tag {
margin-left: 10px;
}
}
.caigou {
display: flex;
align-items: center;
.item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border: none;
.icon {
display: flex;
justify-content: center;
align-items: center;
margin: 10px;
background-color: #f3f3f3;
padding: 10px;
border-radius: 100px;
.el-icon-shopping-bag-1, .el-icon-location-outline {
font-size: 30px;
}
}
.infos {
display: flex;
flex-direction: column;
.unit {
color: #A92924
}
}
}
}
.sub-title {
color: #999999;
}
.action {
padding: 10px 0;
display: flex;
flex-direction: row;
align-items: center;
.btn-buy, .btn-close {
color: #A92924;
}
}
}
.tool {
display: flex;
width: 180px;
align-items: center;
justify-content: space-around;
flex-direction: column;
.btn {
margin: 5px 0;
}
.price {
margin: 0 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.red {
font-size: 16px;
color: #A92924;
font-weight: bold;
}
}
.status {
.icon {
margin: 0 20px;
img {
width: 100px;
}
}
}
}
}
}
.paginatio {
margin: 20px auto;
display: flex;
justify-content: center;
}
.contract-box {
display: flex;
justify-content: space-between;
border-bottom: solid 1px #e8e8e8;
padding: 10rpx 0;
}
.contract-left {
}
.contract-right {
text-align: right;
font-size: 13px;
}
.trade-method {
display: flex;
margin-bottom: 20px;
border-bottom: solid 2px #f4f4f4;
}
.trade-method-item {
cursor: pointer;
font-size: 18px;
margin-right: 15px;
height: 40px;
line-height: 40px;
}
.trade-method-item.active {
color: #A92924;
border-bottom: solid 2px #A92924;
}
.contract-left-top {
display: flex;
align-items: center;
}
.contract-product {
margin: 0 10px;
}
.contract-left-center {
height: 40px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
color: #999999;
font-size: 12px;
flex-direction: column;
margin-top: 5px;
}
.contract-left-bottom {
display: flex;
}
.contract-status {
display: flex;
}
.contract-status-tag {
margin-left: 2px;
}
.sign {
padding: 20px 20px 20px 25px;
font-size: 14px;
.icon {
line-height: 18px;
}
}
</style>