Browse Source

整个订单流转、账期订单融资、合同管理

devlop
邓雄飞 4 years ago
parent
commit
b8214f9f81
17 changed files with 705 additions and 188 deletions
  1. 7
      apis/creditManagementApi.js
  2. 33
      apis/orderApi.js
  3. 2
      components/qn-datetime-picker/qn-datetime-picker.vue
  4. 39
      enums/index.js
  5. 14
      pages.json
  6. 2
      pages/client-credit-detail/index.vue
  7. 2
      pages/client-list/index.vue
  8. 257
      pages/contract-manage/index.vue
  9. 42
      pages/credit-management/index.vue
  10. 208
      pages/credit-order-list/index.vue
  11. 18
      pages/mine/index.vue
  12. 6
      pages/order-detail/index.vue
  13. 7
      utils/hook.js
  14. 2
      utils/http/http.js
  15. 4
      utils/http/index.js
  16. 246
      utils/index.js
  17. 4
      utils/is.js

7
apis/creditManagementApi.js

@ -7,10 +7,3 @@ export function addPaper(data) {
data data
}) })
} }
export function getPaperCategory(data) {
return http.get({
url: '/base-paper-trading/get/product/category-list',
data
})
}

33
apis/orderApi.js

@ -107,3 +107,36 @@ export function supplierConfirmRepay(data) {
data data
}) })
} }
/**
* 账期订单融资列表
* @param {object} data enterpriseId status
*/
export function getFinanceList(data) {
return http.get({
url: '/base-paper-trading/get/supplier/order/financing/list/page',
data
})
}
/**
* 供应商获取合同列表
* @param {object} data signDate enterpriseId type
*/
export function getContractList(data) {
return http.get({
url: '/base-paper-trading/supplier/get/contract-list',
data
})
}
/**
* 获取已签署合同企业列表
* @param {object} data enterpriseId
*/
export function getCooperationList(data) {
return http.get({
url: '/base-paper-trading/supplier/get/contract-enterprise-list',
data
})
}

2
components/qn-datetime-picker/qn-datetime-picker.vue

@ -5,7 +5,7 @@
<view class="uni-date-editor--x" :class="{ 'uni-date-editor--x__disabled': disabled, 'uni-date-x--border': border }"> <view class="uni-date-editor--x" :class="{ 'uni-date-editor--x__disabled': disabled, 'uni-date-x--border': border }">
<view v-if="!isRange" class="uni-date-x uni-date-single"> <view v-if="!isRange" class="uni-date-x uni-date-single">
<input class="uni-date__x-input" type="text" v-model="singleVal" :placeholder="singlePlaceholderText" :disabled="true" /> <input class="uni-date__x-input" type="text" v-model="singleVal" :placeholder="singlePlaceholderText" :disabled="true" />
<uni-icons v-if="showClearIcon && singleVal" type="calendar" color="#e1e1e1" size="22"></uni-icons>
<uni-icons v-if="!showClearIcon && !singleVal" type="calendar" color="#e1e1e1" size="22"></uni-icons>
<view v-if="showClearIcon && singleVal" @click.stop="clear"> <view v-if="showClearIcon && singleVal" @click.stop="clear">
<uni-icons type="clear" color="#e1e1e1" size="15"></uni-icons> <uni-icons type="clear" color="#e1e1e1" size="15"></uni-icons>
</view> </view>

39
enums/index.js

@ -1,6 +1,8 @@
import env from '@/env/index.js' import env from '@/env/index.js'
const urlEnv = env === 'production' ? '' : `-${env}` const urlEnv = env === 'production' ? '' : `-${env}`
export const XAPPID = '503258978847966403'
/** /**
* 账号类型 * 账号类型
*/ */
@ -133,12 +135,12 @@ export const supplierOrderStatusMap = {
[supplierOrderStatusEnum.WAIT_SUPPLIER_CONFIRM]: '待确认', [supplierOrderStatusEnum.WAIT_SUPPLIER_CONFIRM]: '待确认',
[supplierOrderStatusEnum.WAIT_DELIVERY]: '待发货', [supplierOrderStatusEnum.WAIT_DELIVERY]: '待发货',
[supplierOrderStatusEnum.RECEIVED]: '已发货', [supplierOrderStatusEnum.RECEIVED]: '已发货',
[supplierOrderStatusEnum.WAIT_CLIENT_LOAN]: '待借款',
[supplierOrderStatusEnum.WAIT_CLIENT_LOAN]: '待客户借款',
[supplierOrderStatusEnum.PAYING]: '支付中', [supplierOrderStatusEnum.PAYING]: '支付中',
[supplierOrderStatusEnum.WAIT_CLIENT_PAY]: '待支付', [supplierOrderStatusEnum.WAIT_CLIENT_PAY]: '待支付',
[supplierOrderStatusEnum.PAY_FAIL]: '付款失败', [supplierOrderStatusEnum.PAY_FAIL]: '付款失败',
[supplierOrderStatusEnum.FINISHED]: '已完成', [supplierOrderStatusEnum.FINISHED]: '已完成',
[supplierOrderStatusEnum.WAIT_CLIENT_REPAY]: '待还款',
[supplierOrderStatusEnum.WAIT_CLIENT_REPAY]: '待客户还款',
[supplierOrderStatusEnum.REPAYING]: '还款中', [supplierOrderStatusEnum.REPAYING]: '还款中',
[supplierOrderStatusEnum.CANCELED]: '已取消' [supplierOrderStatusEnum.CANCELED]: '已取消'
} }
@ -157,3 +159,36 @@ export const paymentMethodMap = {
[paymentMethodEnum.MONTHLY_PAY]: '月结支付', [paymentMethodEnum.MONTHLY_PAY]: '月结支付',
[paymentMethodEnum.FLY_PAY]: '飞算支付' [paymentMethodEnum.FLY_PAY]: '飞算支付'
} }
/**
* 账期订单融资状态 30181 待客户借款,30182 待融资,30183 已融资,30184 融资失败
*/
export const financeStatusEnum = {
WAIT_CLIENT_LOAN: 30181,
WAIT_FINANCE: 30182,
FINISHED: 30183,
FAILED: 30184
}
/**
* 账期订单融资状态 30181 待客户借款,30182 待融资,30183 已融资,30184 融资失败
*/
export const financeStatusMap = {
[financeStatusEnum.WAIT_CLIENT_LOAN]: '待客户借款',
[financeStatusEnum.WAIT_FINANCE]: '待融资',
[financeStatusEnum.FINISHED]: '已融资',
[financeStatusEnum.FAILED]: '融资失败'
}
/**
* 合同类型1订单合同2担保合同
*/
export const contractTypeEnum = {
ORDER_CONTRACT: 1,
GUARANTEE_CONTRACT: 2
}
export const contractTypeMap = {
[contractTypeEnum.ORDER_CONTRACT]: '订单合同',
[contractTypeEnum.GUARANTEE_CONTRACT]: '担保合同'
}

14
pages.json

@ -223,6 +223,20 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "pages/credit-order-list/index",
"style": {
"navigationBarTitleText": "账期订单融资",
"navigationStyle": "custom"
}
},
{
"path": "pages/contract-manage/index",
"style": {
"navigationBarTitleText": "合同管理",
"navigationStyle": "custom"
}
},
{ {
"path": "pages/store-settings/index", "path": "pages/store-settings/index",
"style": { "style": {

2
pages/client-credit-detail/index.vue

@ -3,7 +3,7 @@
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="飞算授信"></uni-nav-bar> <uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="飞算授信"></uni-nav-bar>
<view class="card"> <view class="card">
<text class="label">授信额度()</text> <text class="label">授信额度()</text>
<text class="value">5{{ info.creditLine }}</text>
<text class="value">{{ info.creditLine }}</text>
</view> </view>
<qn-form-item label="授信客户信息" type="title"></qn-form-item> <qn-form-item label="授信客户信息" type="title"></qn-form-item>
<qn-form-item label="客户名称" required> <qn-form-item label="客户名称" required>

2
pages/client-list/index.vue

@ -103,8 +103,6 @@ export default {
} else { } else {
this.list = this.list.concat(res.records) this.list = this.list.concat(res.records)
} }
// this.list = []
// this.list = [...this.list, ...[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
resolve({ list: this.list, total: res.total }) resolve({ list: this.list, total: res.total })
} else { } else {
reject() reject()

257
pages/contract-manage/index.vue

@ -0,0 +1,257 @@
<template>
<view class="content">
<uni-nav-bar left-icon="back" @clickLeft="back" typeBar fixed title="合同管理"></uni-nav-bar>
<view class="condition-area flex-row-center-start">
<qn-data-picker
v-model="condition.customerEnterpriseId"
style="flex-shrink: 0; max-width: 300rpx"
text="right"
:border="false"
placeholder="请选择客户"
popup-title="请选择客户"
:map="{ text: 'name', value: 'id' }"
:clear-icon="false"
:localdata="customerList"
></qn-data-picker>
<qn-data-picker
style="flex-shrink: 0"
v-model="condition.type"
text="right"
:border="false"
placeholder="请选择"
popup-title="请选择合同类型"
:map="{ text: 'name', value: 'id' }"
:clear-icon="false"
:localdata="typeList"
></qn-data-picker>
<qn-datetime-picker style="flex-shrink: 1" type="date" v-model="condition.signDate" :border="false"></qn-datetime-picker>
</view>
<scroll-list ref="list" :option="option" @load="upCallback" @refresh="downCallback">
<view class="contract-item" v-for="item in list" :key="item.id">
<view class="header flex-col-start-start">
<view :class="'icon ' + typeMap[item.type].class">
<text style="font-size: 28rpx; color: #ffffff">{{ typeMap[item.type].label }}</text>
</view>
<text class="title">{{ item.customerEnterpriseName }}</text>
<view class="row flex-row-center-start" style="margin-top: 0rpx">
<text class="label">合同编号:</text>
<text class="value">{{ item.contractNo }}</text>
</view>
<view class="row flex-row-center-start">
<text class="label">签署时间:</text>
<text class="value">{{ item.signDate || '-' }}</text>
</view>
<view class="row flex-row-center-start">
<text class="label">合同金额:</text>
<text class="value">{{ item.totalOfferPrice || '-' }}</text>
</view>
</view>
<view class="footer flex-row-center-space">
<text style="font-size: 30rpx; color: #888888">操作人: {{ item.userName }}</text>
<text style="font-size: 28rpx; color: #007aff" @click="viewContract(item.imgUrl)">查看</text>
</view>
</view>
</scroll-list>
</view>
</template>
<script>
import { go2, back } from '@/utils/hook.js'
import { transformFileToImg } from '@/apis/commonApi.js'
import { dateTimeFormat } from '@/utils/index.js'
import { getContractList, getCooperationList } from '@/apis/orderApi.js'
import { financeStatusMap, contractTypeMap, contractTypeEnum } from '@/enums/index.js'
const typeList = [
{
id: '',
name: '全部'
},
{
id: contractTypeEnum.ORDER_CONTRACT,
name: contractTypeMap[contractTypeEnum.ORDER_CONTRACT]
},
{
id: contractTypeEnum.GUARANTEE_CONTRACT,
name: contractTypeMap[contractTypeEnum.GUARANTEE_CONTRACT]
}
]
const typeMap = {
[contractTypeEnum.ORDER_CONTRACT]: {
class: 'icon__ORDER_CONTRACT',
label: contractTypeMap[contractTypeEnum.ORDER_CONTRACT]
},
[contractTypeEnum.GUARANTEE_CONTRACT]: {
class: 'icon__GUARANTEE_CONTRACT',
label: contractTypeMap[contractTypeEnum.GUARANTEE_CONTRACT]
}
}
export default {
data() {
return {
customerList: [
{
id: '',
name: '全部客户'
}
],
typeList: Object.freeze(typeList),
financeStatusMap: Object.freeze(financeStatusMap),
typeMap: Object.freeze(typeMap),
condition: {
customerEnterpriseId: '',
type: '',
signDate: null
},
pagination: {
pageNum: 0, //
pageSize: 10
},
list: [],
option: {
size: 10,
auto: true,
emptyText: '暂无数据~',
background: '#F7F8FA'
}
}
},
methods: {
go2,
back,
dateTimeFormat,
getList() {
return new Promise((resolve, reject) => {
getContractList({ ...this.condition, ...this.pagination })
.then((res) => {
if (res) {
if (this.pagination.pageNum == 1) {
this.list = res.records
} else {
this.list = this.list.concat(res.records)
}
resolve({ list: this.list, total: res.total })
} else {
reject()
}
})
.catch((err) => {
reject(err)
})
})
},
downCallback() {
this.pagination.pageNum = 1
this.getList()
.then(({ list, total }) => {
this.$refs.list.refreshSuccess({ list, total })
})
.catch(() => {
this.$refs.list.refreshFail()
})
},
upCallback(page) {
this.pagination.pageNum++
this.getList()
.then(({ list, total }) => {
this.$refs.list.loadSuccess({ list, total })
})
.catch(() => {
this.$refs.list.loadFail()
})
},
//
viewContract(url) {
if (url) {
transformFileToImg({ fileUrl: url }).then((res) => {
uni.previewImage({ urls: [res.imgUrl], current: res.imgUrl })
})
}
}
},
watch: {
condition: {
handler() {
this.downCallback()
},
deep: true
}
},
created() {
//
getCooperationList({ pageNum: 1, pageSize: 1000 }).then((res) => {
if (res) {
this.customerList = this.customerList.concat(res.records)
}
})
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.condition-area {
width: 750rpx;
height: 80rpx;
padding: 0 32rpx 0 12rpx;
margin-bottom: 20rpx;
background-color: #fff;
}
}
.contract-item {
width: 750rpx;
background-color: #fff;
margin-bottom: 20rpx;
position: relative;
.header {
width: 750rpx;
padding: 24rpx 32rpx;
.icon {
top: 0;
right: 0;
position: absolute;
width: 160rpx;
height: 50rpx;
border-radius: 0 0 0 20rpx;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.icon__ORDER_CONTRACT {
background-color: #e28686;
}
.icon__GUARANTEE_CONTRACT {
background-color: #86e2df;
}
.title {
font-size: 32rpx;
color: #003a8c;
font-weight: 600;
margin-bottom: 28rpx;
}
.row {
margin-top: 24rpx;
.label {
font-size: 28rpx;
color: #888888;
margin-right: 24rpx;
}
.value {
font-size: 28rpx;
color: #333333;
}
}
}
.footer {
width: 750rpx;
padding: 24rpx 32rpx;
border-top: 1px solid #dddddd;
}
}
</style>

42
pages/credit-management/index.vue

@ -1,52 +1,24 @@
<template> <template>
<view>
<view class="content">
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="征信管理"></uni-nav-bar> <uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="征信管理"></uni-nav-bar>
<view @click="getPaperCategory">category</view>
<view @click="add">add</view>
</view> </view>
</template> </template>
<script> <script>
import { go2, back } from '@/utils/hook.js' import { go2, back } from '@/utils/hook.js'
import { addPaper, getPaperCategory } from '@/apis/creditManagementApi.js'
export default { export default {
data() { data() {
return {} return {}
}, },
methods: { methods: {
go2, go2,
back,
getPaperCategory,
add() {
let form = {
brandName: '博汇',
categoryId: 1,
description: '156企业测试纸品',
imgList: ['https://qncloudtest.oss-cn-shenzhen.aliyuncs.com/common/13390214088425427.jpg'],
isMainProduct: true,
manufacturerName: '156纸厂',
name: '156白卡',
otherNote: '没有说明',
sellingProposition: '没有卖点',
shippingNote: '没有送货说明',
skuList: [
{
isPromoting: false,
listPrice: 10000,
minimum: 1,
stock: 100,
stockUnit: 2,
weight: 200
}
],
supplierId: '678289470268772352'
}
addPaper(form).then((res) => {
console.log(res)
})
}
back
} }
} }
</script> </script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.content {
width: 750rpx;
}
</style>

208
pages/credit-order-list/index.vue

@ -0,0 +1,208 @@
<template>
<view class="content">
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="账期订单融资"></uni-nav-bar>
<view class="condition-area flex-row-center-start">
<qn-data-picker
v-model="condition.enterpriseId"
text="right"
:border="false"
placeholder="请选择客户"
popup-title="请选择客户"
:map="{ text: 'name', value: 'id' }"
:clear-icon="false"
:localdata="customerList"
></qn-data-picker>
<qn-data-picker
v-model="condition.status"
text="right"
:border="false"
placeholder="请选择"
popup-title="请选择融资状态"
:map="{ text: 'name', value: 'id' }"
:clear-icon="false"
:localdata="statusList"
></qn-data-picker>
</view>
<scroll-list ref="list" :option="option" @load="upCallback" @refresh="downCallback">
<view v-for="item in list" :key="item.id" class="order-area">
<view class="header flex-row-center-space">
<text style="font-size: 30rpx; font-weight: 600; word-break: break-all">{{ item.customerEnterpriseName }}</text>
<text style="font-size: 30rpx; font-weight: 500; color: #ff5368">{{ financeStatusMap[item.status] }}</text>
</view>
<view class="content">
<view
class="order-item flex-row-center-start"
v-for="(order, index) in item.orderItmes"
:key="order.productId"
:style="{ borderTop: index == 0 ? '' : '1px solid #dddddd' }"
>
<image class="img" :src="order.productImg"></image>
<view class="flex-col-start-start">
<text style="font-size: 30rpx; color: #333333; font-weight: 600; margin-bottom: 26rpx">{{ order.productName }}</text>
<text style="font-size: 26rpx; color: #888888; font-weight: 400; word-break: break-all">
{{ order.categoryName }}/{{ order.brandName }}/{{ order.gramWeight }}g/{{ order.width }}*{{ order.length }}/{{ order.pieceQuantity }}
</text>
</view>
</view>
</view>
<view class="footer flex-row-center-space">
<text style="font-size: 26rpx; color: #888888">{{ dateTimeFormat(item.createTime, 'yyyy/mm/dd') }}</text>
<text style="font-size: 30rpx; color: #ff5368"> {{ item.totalOfferPrice }}</text>
</view>
</view>
<!-- <packingStationItem style="margin-bottom: 20rpx" v-for="item in list" :key="item.enterpriseId" :info="item"></packingStationItem> -->
<!-- <packingStationItem></packingStationItem> -->
</scroll-list>
</view>
</template>
<script>
import { go2, back } from '@/utils/hook.js'
import { dateTimeFormat } from '@/utils/index.js'
import { getFinanceList, getCooperationList } from '@/apis/orderApi.js'
import { financeStatusMap } from '@/enums/index.js'
const statusList = [
{
id: 0,
name: '全部'
},
{
id: 1,
name: '未融资'
},
{
id: 2,
name: '已融资'
}
]
export default {
data() {
return {
customerList: [
{
id: '',
name: '全部客户'
},
{
id: '807704',
name: '揭阳市广工印刷有限公司'
}
],
statusList: Object.freeze(statusList),
financeStatusMap: Object.freeze(financeStatusMap),
condition: {
enterpriseId: '',
status: 0
},
pagination: {
pageNum: 0, //
pageSize: 10
},
list: [],
option: {
size: 10,
auto: true,
emptyText: '暂无数据~',
background: '#F7F8FA'
}
}
},
methods: {
go2,
back,
dateTimeFormat,
getList() {
return new Promise((resolve, reject) => {
getFinanceList({ ...this.condition, ...this.pagination })
.then((res) => {
if (res) {
if (this.pagination.pageNum == 1) {
this.list = res.records
} else {
this.list = this.list.concat(res.records)
}
resolve({ list: this.list, total: res.total })
} else {
reject()
}
})
.catch((err) => {
reject(err)
})
})
},
downCallback() {
this.pagination.pageNum = 1
this.getList()
.then(({ list, total }) => {
this.$refs.list.refreshSuccess({ list, total })
})
.catch(() => {
this.$refs.list.refreshFail()
})
},
upCallback(page) {
this.pagination.pageNum++
this.getList()
.then(({ list, total }) => {
this.$refs.list.loadSuccess({ list, total })
})
.catch(() => {
this.$refs.list.loadFail()
})
}
},
watch: {
condition: {
handler(val) {
this.downCallback()
},
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.condition-area {
width: 750rpx;
height: 80rpx;
padding: 0 32rpx;
margin-bottom: 20rpx;
background-color: #fff;
}
}
.order-area {
width: 750rpx;
background-color: #fff;
margin-bottom: 20rpx;
.header {
padding: 24rpx 32rpx;
border-bottom: 1px solid #dddddd;
}
.content {
padding: 0 32rpx;
width: 750rpx;
border-bottom: 1px solid #dddddd;
.order-item {
width: 686rpx;
padding: 24rpx 0;
.img {
width: 100rpx;
height: 100rpx;
margin-right: 20rpx;
}
}
}
.footer {
width: 750rpx;
padding: 24rpx 32rpx;
}
}
</style>

18
pages/mine/index.vue

@ -100,23 +100,23 @@
<text style="font-size: 30rpx; color: rgba(0, 0, 0, 0.85); font-weight: 600">其他工具</text> <text style="font-size: 30rpx; color: rgba(0, 0, 0, 0.85); font-weight: 600">其他工具</text>
</view> </view>
<view class="icon-area"> <view class="icon-area">
<view class="icon-item">
<!-- <view class="icon-item">
<image class="icon" src="/static/imgs/mine/order-icon.png"></image> <image class="icon" src="/static/imgs/mine/order-icon.png"></image>
<text class="label">订单管理</text> <text class="label">订单管理</text>
</view>
<view class="icon-item">
</view> -->
<view class="icon-item" @clickan class="s">="loginGo2('credit-order-list')">
<image class="icon" src="/static/imgs/mine/finance-icon.png"></image> <image class="icon" src="/static/imgs/mine/finance-icon.png"></image>
<text class="label">账期订单融资</text> <text class="label">账期订单融资</text>
</view> </view>
<view class="icon-item">
<view class="icon-item" @clickan class="s">="loginGo2('contract-manage')">
<image class="icon" src="/static/imgs/mine/contract-icon.png"></image> <image class="icon" src="/static/imgs/mine/contract-icon.png"></image>
<text class="label">合同管理</text> <text class="label">合同管理</text>
</view> </view>
<view class="icon-item" @click="go2('credit-management')">
<view class="icon-item" @click="loginGo2('credit-management')">
<image class="icon" src="/static/imgs/mine/credit-icon.png"></image> <image class="icon" src="/static/imgs/mine/credit-icon.png"></image>
<text class="label">征信管理</text> <text class="label">征信管理</text>
</view> </view>
<view class="icon-item" @click="go2('client-credit-list')">
<view class="icon-item" @click="loginGo2('client-credit-list')">
<image class="icon" src="/static/imgs/mine/credit-icon.png"></image> <image class="icon" src="/static/imgs/mine/credit-icon.png"></image>
<text class="label">授信记录</text> <text class="label">授信记录</text>
</view> </view>
@ -133,7 +133,7 @@
</template> </template>
<script> <script>
import { exit, go2 } from '@/utils/hook.js'
import { exit, go2, loginGo2 } from '@/utils/hook.js'
import { fddEnterpriseStatus } from '@/enums/index.js' import { fddEnterpriseStatus } from '@/enums/index.js'
import { getBaseInfo, getVerifyUrl } from '@/apis/commonApi.js' import { getBaseInfo, getVerifyUrl } from '@/apis/commonApi.js'
import qnDataPicker from '@/components/qn-data-picker/qn-data-picker.vue' import qnDataPicker from '@/components/qn-data-picker/qn-data-picker.vue'
@ -208,6 +208,7 @@ export default {
} }
}, },
go2, go2,
loginGo2,
// //
getStatistics() { getStatistics() {
if (!this.hasLogin) { if (!this.hasLogin) {
@ -270,8 +271,7 @@ export default {
} }
} }
}, },
onLoad() {
},
onLoad() {},
onShow() { onShow() {
getBaseInfo({}, true).then((res) => { getBaseInfo({}, true).then((res) => {
if (res) { if (res) {

6
pages/order-detail/index.vue

@ -3,7 +3,7 @@
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="订单详情"></uni-nav-bar> <uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="订单详情"></uni-nav-bar>
<view class="status-area flex-row-center-start"> <view class="status-area flex-row-center-start">
<image class="flex-base" style="width: 40rpx; height: 40rpx; margin-right: 16rpx" src="/static/imgs/order/status-icon.png"></image> <image class="flex-base" style="width: 40rpx; height: 40rpx; margin-right: 16rpx" src="/static/imgs/order/status-icon.png"></image>
<text style="font-size: 30rpx; color: #ffffff">{{ supplierOrderStatusMap[orderInfo.status] }}</text>
<text style="font-size: 30rpx; color: #ffffff">{{ supplierOrderStatusMap[orderInfo.status] || '-' }}</text>
</view> </view>
<view class="address-area"> <view class="address-area">
<view class="flex-row-start-start" style="padding: 24rpx 0 40rpx"> <view class="flex-row-start-start" style="padding: 24rpx 0 40rpx">
@ -16,7 +16,7 @@
<view class="flex-row-start-start footer" style="margin-bottom: 0"> <view class="flex-row-start-start footer" style="margin-bottom: 0">
<image style="width: 32rpx; height: 32rpx; margin-right: 10rpx" src="/static/imgs/order/location-icon.png"></image> <image style="width: 32rpx; height: 32rpx; margin-right: 10rpx" src="/static/imgs/order/location-icon.png"></image>
<text style="font-size: 26rpx; color: #333333; word-break: break-all"> <text style="font-size: 26rpx; color: #333333; word-break: break-all">
联系人: {{ `${orderInfo.deliveryAddress.receiver} ${orderInfo.deliveryAddress.receiverMobile}` }}
联系人: {{ `${orderInfo.deliveryAddress.receiver || '-'} ${orderInfo.deliveryAddress.receiverMobile || '-'}` }}
</text> </text>
</view> </view>
<view class="flex-row-start-start footer"> <view class="flex-row-start-start footer">
@ -196,7 +196,7 @@ export default {
back, back,
transformAddress(address) { transformAddress(address) {
let res = '' let res = ''
if (address) {
if (address.provinceName) {
res = `${address.provinceName}${address.cityName}${address.districtName}${address.detail}` res = `${address.provinceName}${address.cityName}${address.districtName}${address.detail}`
} }
return res return res

7
utils/hook.js

@ -1,5 +1,6 @@
import store from '@/store/index' import store from '@/store/index'
import { uploadUrl } from '@/enums/index.js'
import { uploadUrl, XAPPID } from '@/enums/index.js'
// 框架方法封装 // 框架方法封装
const tabList = ['client', 'trade', 'mall', 'mine'] const tabList = ['client', 'trade', 'mall', 'mine']
@ -136,6 +137,10 @@ export function uploadFile(path, type = 'image') {
url: uploadUrl[type], url: uploadUrl[type],
filePath: path, filePath: path,
name: type, name: type,
header: {
Authorization: store.state.qnToken,
'X-APP-ID': XAPPID
},
// fileType: type, // fileType: type,
success: (res) => { success: (res) => {
let result = JSON.parse(res.data) let result = JSON.parse(res.data)

2
utils/http/http.js

@ -53,7 +53,7 @@ export default class Http {
method: conf.method, method: conf.method,
success: (res) => { success: (res) => {
let data = resInterceptor(res, opt) let data = resInterceptor(res, opt)
if (env === 'test') {
if (!data) {
console.log('报错的请求参数:', conf) console.log('报错的请求参数:', conf)
} }
// 服务器错误也会用then抛出,需要自己判断data==null // 服务器错误也会用then抛出,需要自己判断data==null

4
utils/http/index.js

@ -1,9 +1,9 @@
import Http from './http.js' import Http from './http.js'
import env from '@/env/index.js' import env from '@/env/index.js'
import { XAPPID } from '@/enums/index.js'
// 请求封装文件 // 请求封装文件
const urlEnv = env === 'production' ? '' : `-${env}` const urlEnv = env === 'production' ? '' : `-${env}`
const xappid = '503258978847966403'
/** /**
* 系统默认的请求域名 * 系统默认的请求域名
*/ */
@ -49,7 +49,7 @@ const reqInterceptor = (config, options) => {
config.header = { config.header = {
...config.header, ...config.header,
Authorization: token || '', Authorization: token || '',
'X-APP-ID': xappid
'X-APP-ID': XAPPID
} }
// 改变url // 改变url
let newUrl = '' let newUrl = ''

246
utils/index.js

@ -1,64 +1,65 @@
import env from '@/env/index.js' import env from '@/env/index.js'
import store from '@/store/index.js' import store from '@/store/index.js'
import { isDate } from './is.js'
/** /**
* 日期格式化样例 yyyy-mm-dd hh:MM:ss * 日期格式化样例 yyyy-mm-dd hh:MM:ss
* @param date Date 需要转换的日期 * @param date Date 需要转换的日期
* @param fmt string 转化的格式 yyyy-mm-dd hh:MM:ss * @param fmt string 转化的格式 yyyy-mm-dd hh:MM:ss
*/ */
export const dateTimeFormat = (date, fmt) => { export const dateTimeFormat = (date, fmt) => {
if (!date) {
throw new Error('日期不正确')
}
let ret
const opt = {
'y+': date.getFullYear().toString(), // 年
'm+': (date.getMonth() + 1).toString(), // 月
'd+': date.getDate().toString(), // 日
'h+': date.getHours().toString(), // 时
'M+': date.getMinutes().toString(), // 分
's+': date.getSeconds().toString() // 秒
}
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) {
fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
}
}
return fmt
if (!isDate(date)) {
date = new Date(date)
}
if (!date || isNaN(date.getTime())) {
throw new Error('日期不正确')
}
let ret
const opt = {
'y+': date.getFullYear().toString(), // 年
'm+': (date.getMonth() + 1).toString(), // 月
'd+': date.getDate().toString(), // 日
'h+': date.getHours().toString(), // 时
'M+': date.getMinutes().toString(), // 分
's+': date.getSeconds().toString() // 秒
}
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) {
fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
}
}
return fmt
} }
/** /**
* 日期格式化文字描述样例 yyyy-mm-dd hh:MM:ss * 日期格式化文字描述样例 yyyy-mm-dd hh:MM:ss
* @param stringTime 需要转换的日期 * @param stringTime 需要转换的日期
*/ */
export const getTimer = (stringTime) => { export const getTimer = (stringTime) => {
var minute = 1000 * 60;
var hour = minute * 60;
var day = hour * 24;
var week = day * 7;
var month = day * 30;
var time1 = new Date().getTime(); //当前的时间戳
console.log(time1);
var time2 = Date.parse(new Date(stringTime)); //指定时间的时间戳
console.log(time2);
var time = time1 - time2;
var minute = 1000 * 60
var hour = minute * 60
var day = hour * 24
var week = day * 7
var month = day * 30
var time1 = new Date().getTime() //当前的时间戳
var time2 = Date.parse(new Date(stringTime)) //指定时间的时间戳
var time = time1 - time2
var result = null;
if (time < 0) {
} else if (time / month >= 1) {
result = parseInt(time / month) + "月前";
} else if (time / week >= 1) {
result = parseInt(time / week) + "周前";
} else if (time / day >= 1) {
result = parseInt(time / day) + "天前";
} else if (time / hour >= 1) {
result = parseInt(time / hour) + "小时前";
} else if (time / minute >= 1) {
result = parseInt(time / minute) + "分钟前";
} else {
result = "刚刚";
}
return result;
var result = null
if (time < 0) {
} else if (time / month >= 1) {
result = parseInt(time / month) + '月前'
} else if (time / week >= 1) {
result = parseInt(time / week) + '周前'
} else if (time / day >= 1) {
result = parseInt(time / day) + '天前'
} else if (time / hour >= 1) {
result = parseInt(time / hour) + '小时前'
} else if (time / minute >= 1) {
result = parseInt(time / minute) + '分钟前'
} else {
result = '刚刚'
}
return result
} }
/** /**
@ -68,88 +69,85 @@ export const getTimer = (stringTime) => {
* @value {true} retry 是否重连默认false * @value {true} retry 是否重连默认false
* @returns 一个websocket实例 * @returns 一个websocket实例
*/ */
export const makeSocket = async ({
pageInfo = '',
retry = false
}) => {
const socket = {
sockTask: null,
close: function() {
this.sockTask.close({
code: 1000
})
closeFlag = true
},
onMessage: function() {}
}
export const makeSocket = async ({ pageInfo = '', retry = false }) => {
const socket = {
sockTask: null,
close: function () {
this.sockTask.close({
code: 1000
})
closeFlag = true
},
onMessage: function () {}
}
let limitedNum = 0
let closeFlag = false
let timer = null
let limitedNum = 0
let closeFlag = false
let timer = null
async function createSocket() {
let url = ''
if (env == 'production') {
url = 'wss://api-client-yyt.qniao.cn/qn-websocket-service/wechatwebsock?token='
} else if (env == 'test') {
url = 'wss://api-client-yyt-test.qniao.cn/qn-websocket-service/wechatwebsock?token='
}
// if (env == 'production') {
// url = 'wss://api-client-yyt.qniao.cn/trading-center/wechatwebsock?token='
// } else if (env == 'test') {
// url = 'wss://api-client-yyt-test.qniao.cn/trading-center/wechatwebsock?token='
// }
const token = store.state.qnToken
const socketTask = await uni.connectSocket({
url: `${url}${token}`,
header: {
'content-type': 'application/json'
},
success: () => {
console.log('websocket连接成功')
},
fail: () => {
console.log('websocket连接失败')
}
})
socketTask.onOpen(() => {
console.log(pageInfo + ' onOpen')
timer = setInterval(() => {
socketTask.send({
data: 'ping'
})
}, 10000)
})
socketTask.onClose(() => {
console.log(pageInfo + ' onClose')
clearInterval(timer)
timer = null
if (!closeFlag && retry && limitedNum < 20) {
limitedNum++
console.log('重连次数:' + limitedNum)
createSocket()
}
})
async function createSocket() {
let url = ''
if (env == 'production') {
url = 'wss://api-client-yyt.qniao.cn/qn-websocket-service/wechatwebsock?token='
} else if (env == 'test') {
url = 'wss://api-client-yyt-test.qniao.cn/qn-websocket-service/wechatwebsock?token='
}
// if (env == 'production') {
// url = 'wss://api-client-yyt.qniao.cn/trading-center/wechatwebsock?token='
// } else if (env == 'test') {
// url = 'wss://api-client-yyt-test.qniao.cn/trading-center/wechatwebsock?token='
// }
const token = store.state.qnToken
const socketTask = await uni.connectSocket({
url: `${url}${token}`,
header: {
'content-type': 'application/json'
},
success: () => {
console.log('websocket连接成功')
},
fail: () => {
console.log('websocket连接失败')
}
})
socketTask.onOpen(() => {
console.log(pageInfo + ' onOpen')
timer = setInterval(() => {
socketTask.send({
data: 'ping'
})
}, 10000)
})
socketTask.onClose(() => {
console.log(pageInfo + ' onClose')
clearInterval(timer)
timer = null
if (!closeFlag && retry && limitedNum < 20) {
limitedNum++
console.log('重连次数:' + limitedNum)
createSocket()
}
})
socketTask.onError(() => {
console.log(pageInfo + ' error')
})
socketTask.onError(() => {
console.log(pageInfo + ' error')
})
socket.sockTask = socketTask
}
socket.sockTask = socketTask
}
await createSocket()
if (socket) {
socket.onMessage = (fn) => {
socket.sockTask.onMessage((res) => {
let data = JSON.parse(res.data)
console.log(pageInfo + '接收到消息:', data)
if (data.type != 'heartbeat') {
fn(data)
}
})
}
}
await createSocket()
if (socket) {
socket.onMessage = (fn) => {
socket.sockTask.onMessage((res) => {
let data = JSON.parse(res.data)
console.log(pageInfo + '接收到消息:', data)
if (data.type != 'heartbeat') {
fn(data)
}
})
}
}
return socket
return socket
} }

4
utils/is.js

@ -15,3 +15,7 @@ export function isObject(val) {
export function isArray(val) { export function isArray(val) {
return is(val, 'Array') return is(val, 'Array')
} }
export function isDate(val) {
return is(val, 'Date')
}
Loading…
Cancel
Save