buffeyu 4 years ago
parent
commit
6ec0178ad0
21 changed files with 1347 additions and 733 deletions
  1. 7
      apis/creditManagementApi.js
  2. 33
      apis/orderApi.js
  3. 2
      components/qn-datetime-picker/qn-datetime-picker.vue
  4. 2
      components/qn-map/qn-map.nvue
  5. 43
      enums/index.js
  6. 252
      manifest.json
  7. 19
      pages.json
  8. 97
      pages/agreement/index.vue
  9. 2
      pages/client-credit-detail/index.vue
  10. 2
      pages/client-list/index.vue
  11. 257
      pages/contract-manage/index.vue
  12. 42
      pages/credit-management/index.vue
  13. 208
      pages/credit-order-list/index.vue
  14. 805
      pages/mall/index.vue
  15. 22
      pages/mine/index.vue
  16. 6
      pages/order-detail/index.vue
  17. 7
      utils/hook.js
  18. 2
      utils/http/http.js
  19. 22
      utils/http/index.js
  20. 246
      utils/index.js
  21. 4
      utils/is.js

7
apis/creditManagementApi.js

@ -7,10 +7,3 @@ export function addPaper(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
})
}
/**
* 账期订单融资列表
* @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 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" />
<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">
<uni-icons type="clear" color="#e1e1e1" size="15"></uni-icons>
</view>

2
components/qn-map/qn-map.nvue

@ -70,7 +70,7 @@ export default {
// 生成markers
causeMarker(item) {
let result = {}
if (this.scale >= 15) {
if (this.scale >= 14) {
result = {
latitude: item.latitude - 0,
longitude: item.longitude - 0,

43
enums/index.js

@ -1,6 +1,8 @@
import env from '@/env/index.js'
const urlEnv = env === 'production' ? '' : `-${env}`
export const XAPPID = '503258978847966403'
/**
* 账号类型
*/
@ -43,8 +45,8 @@ export const fddEnterpriseStatus = {
* 上传地址
*/
export const uploadUrl = {
image: `https://api-ops-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/image`,
file: `https://api-ops-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/file`
image: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/image`,
file: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/file`
}
/**
* 结算周期1月结30飞算1期2月结453月结60飞算2期4月结755月结90飞算3期
@ -133,12 +135,12 @@ export const supplierOrderStatusMap = {
[supplierOrderStatusEnum.WAIT_SUPPLIER_CONFIRM]: '待确认',
[supplierOrderStatusEnum.WAIT_DELIVERY]: '待发货',
[supplierOrderStatusEnum.RECEIVED]: '已发货',
[supplierOrderStatusEnum.WAIT_CLIENT_LOAN]: '待借款',
[supplierOrderStatusEnum.WAIT_CLIENT_LOAN]: '待客户借款',
[supplierOrderStatusEnum.PAYING]: '支付中',
[supplierOrderStatusEnum.WAIT_CLIENT_PAY]: '待支付',
[supplierOrderStatusEnum.PAY_FAIL]: '付款失败',
[supplierOrderStatusEnum.FINISHED]: '已完成',
[supplierOrderStatusEnum.WAIT_CLIENT_REPAY]: '待还款',
[supplierOrderStatusEnum.WAIT_CLIENT_REPAY]: '待客户还款',
[supplierOrderStatusEnum.REPAYING]: '还款中',
[supplierOrderStatusEnum.CANCELED]: '已取消'
}
@ -157,3 +159,36 @@ export const paymentMethodMap = {
[paymentMethodEnum.MONTHLY_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]: '担保合同'
}

252
manifest.json

@ -1,119 +1,151 @@
{
"name": "纸掌柜",
"appid": "__UNI__8C1E198",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
"networkTimeout": {
"request": 6000
},
/* 5+App */
"app-plus": {
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
"name" : "纸掌柜",
"appid" : "__UNI__8C1E198",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
"networkTimeout" : {
"request" : 6000
},
"compatible": {
"ignoreVersion": true
},
/* */
"modules": {
"Maps": {},
"Geolocation": {},
"FaceID": {},
"iBeacon": {}
},
/* */
"distribute": {
/* android */
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>"
],
"abiFilters": ["armeabi-v7a", "x86"]
},
/* ios */
"ios": {},
/* SDK */
"sdkConfigs": {
"maps": {
"amap": {
"appkey_ios": "0182ee2a9fdd5fd3ef6a8bd5a2f98325",
"appkey_android": "877848546f7f3717101a17c33e1d4df3"
}
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"compatible" : {
"ignoreVersion" : true
},
"payment": {
"weixin": {
"__platform__": ["ios", "android"],
"appid": "",
"UniversalLinks": ""
}
/* */
"modules" : {
"Maps" : {},
"Geolocation" : {},
"FaceID" : {},
"iBeacon" : {}
},
"ad": {},
"geolocation": {
"amap": {
"__platform__": ["ios", "android"],
"appkey_ios": "0182ee2a9fdd5fd3ef6a8bd5a2f98325",
"appkey_android": "877848546f7f3717101a17c33e1d4df3"
}
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>"
],
"abiFilters" : [ "armeabi-v7a", "x86" ]
},
/* ios */
"ios" : {},
/* SDK */
"sdkConfigs" : {
"maps" : {
"amap" : {
"appkey_ios" : "0182ee2a9fdd5fd3ef6a8bd5a2f98325",
"appkey_android" : "877848546f7f3717101a17c33e1d4df3"
}
},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "",
"UniversalLinks" : ""
}
},
"ad" : {},
"geolocation" : {
"amap" : {
"__platform__" : [ "ios", "android" ],
"appkey_ios" : "0182ee2a9fdd5fd3ef6a8bd5a2f98325",
"appkey_android" : "877848546f7f3717101a17c33e1d4df3"
}
},
"share" : {}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
},
"share": {}
}
"uniStatistics" : {
"enable" : true
}
},
"uniStatistics": {
"enable": true
}
},
/* */
"quickapp": {},
/* */
"mp-weixin": {
"appid": "",
"setting": {
"urlCheck": false
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"usingComponents": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics": {
"enable": false
},
"vueVersion": "2",
"h5": {
"router": {
"mode": "history"
"vueVersion" : "2",
"h5" : {
"router" : {
"mode" : "history"
}
}
}
}

19
pages.json

@ -101,7 +101,9 @@
{
"path": "pages/agreement/index",
"style": {
"navigationBarTitleText": "用户与隐私协议"
"navigationBarTitleText": "用户与隐私协议",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
},
{
@ -221,6 +223,20 @@
"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",
"style": {
@ -232,6 +248,7 @@
{
"path": "pages/follow-up-records/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "跟进记录"
}
},

97
pages/agreement/index.vue

@ -1,35 +1,82 @@
<template>
<view class="content">agreement</view>
<view class="content">
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="用户与隐私协议"></uni-nav-bar>
<view style="word-break: break-all; white-space: pre-wrap; padding: 20rpx 16rpx" v-html="content"></view>
</view>
</template>
<script>
export default {}
</script>
const content = `软件许可使用协议
发布时间2020 7 1
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
提示条款
本软件许可使用协议以下称"本协议"由您与广州千鸟电商科技有限公司以下称我们于广东省广州市天河区共同签署
在使用纸掌柜软件软件名称以实际展示为准以下称许可软件之前请您认真阅读并同意千鸟互联服务协议以及隐私权政策这是我们向您提供许可软件及许可软件相关服务的前提我们特别在此提示您注意阅读免除或者限制责任的条款法律适用和争议解决条款相关条款将以粗体标识您需要重点阅读如您对协议有任何疑问可向客服咨询如果您完全同意并接受本协议您可下载安装或开始使用许可软件
本协议的内容包括协议正文及所有我们已经公布的适用于所有使用者的各类服务条款及规则诸如千鸟互联服务协议千鸟平台规则等未来我们会继续丰富相关的服务条款与规则并依法定程序公布生效所有条款与规则为协议不可分割的组成部分与协议具有同等法律效力
定义
1 许可软件是指由我们开发的供您从下载平台下载并仅限在相应系统手持移动终端中安装使用的软件系统
2 千鸟互联服务我们基于互联网以包含千鸟互联网站本软件等在内的各种形态包括未来技术发展出现的新的服务形态向您提供的各项服务
许可范围
1 由于软件适配平台及终端限制您理解您仅可在许可软件列明的系统终端使用许可软件您将许可软件安装在非对应系统的其他终端设备上的可能会对您硬件或软件功能造成损害
2 许可软件仅限用于非商业目的供您个人消费合理自用未经许可您不可为商业运营目的安装使用运行许可软件
3 为了改善用户体验完善服务内容保证许可软件与我们提供服务的商业诉求一致我们会对许可软件及/或其相关服务功能界面进行更新修改包括开发新的功能删除旧功能等您可按照变更后许可软件的实际情况取得相应功能或服务的授权并可适用本协议相关约定
使用规范
1 您应该规范使用许可软件以下方式是违反使用规范的
1 从事危害网络信息安全欺诈盗用他人账户资金等违法犯罪活动发表传送传播储存侵害我们及他人知识产权商业秘密权或其他违反国家法律法规政策破坏公序良俗损害公共利益的行为
2 擅自对许可软件及/或其组成部分进行出租出借再许可复制修改链接转载汇编发表出版建立镜像站点或借助许可软件发展与之有关的衍生产品作品服务插件外挂兼容互联等
3 通过非由我们或我们关联公司开发授权或认可的第三方兼容软件系统登录或使用许可软件或针对许可软件使用非我们及我们关联公司开发授权或认证的插件和外挂
4 删除许可软件及其他副本上关于版权的信息内容或修改删除或避开为保护知识产权而设置的任何技术措施
5 对许可软件或者许可软件运行过程中释放在终端中的任何数据及许可软件运行过程中终端与服务器端的交互数据进行获取复制修改或创作任何衍生作品包括使用插件外挂或非经授权的第三方工具/服务接入许可软件和相关系统等形式
6 通过修改或伪造许可软件运行中的指令数据数据包增加删减变动许可软件的功能或运行效果/或将具有上述用途的软件通过信息网络向公众传播或者运营
7 其他以任何不合法的方式不合法的目的或以任何与本协议约定不一致的方式使用许可软件
`
import { back } from '@/utils/hook.js'
export default {
data() {
return {
content: content
}
},
methods: {
back
}
}
</script>
.title {
font-size: 36rpx;
color: #8f8f94;
<style lang="scss" scoped>
.content {
width: 750rpx;
}
</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>
<view class="card">
<text class="label">授信额度()</text>
<text class="value">5{{ info.creditLine }}</text>
<text class="value">{{ info.creditLine }}</text>
</view>
<qn-form-item label="授信客户信息" type="title"></qn-form-item>
<qn-form-item label="客户名称" required>

2
pages/client-list/index.vue

@ -103,8 +103,6 @@ export default {
} else {
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 })
} else {
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>
<view>
<view class="content">
<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>
</template>
<script>
import { go2, back } from '@/utils/hook.js'
import { addPaper, getPaperCategory } from '@/apis/creditManagementApi.js'
export default {
data() {
return {}
},
methods: {
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>
<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>

805
pages/mall/index.vue

@ -1,414 +1,417 @@
<template>
<view class="warpper">
<uni-nav-bar :fixed="true" color="#ffffff" background-color="#ffffff" :status-bar="true">
<view slot="left" class="left-title">纸商城</view>
<view slot="right" class="right-title" @tap="shareTap">分享</view>
</uni-nav-bar>
<view class="top-box">
<view class=""><image class="image" src="https://qncloud.oss-cn-shenzhen.aliyuncs.com/ztb_pic/testPic.jfif" mode=""></image></view>
<view class="center">
<view class="title">{{ storeInformation.name }}</view>
<view class="desc">全部商品 39 &nbsp; | &nbsp;上新 9</view>
</view>
<view class="right">
<view class="cut" @click="checkMall()">
切换商城
<image class="cut-icon" src="/static/imgs/mall/cut-icon.png" mode=""></image>
</view>
<view class="set" @click="setting">设置</view>
</view>
</view>
<uGap></uGap>
<view class="" v-if="pageShow">
<scroll-list ref="list" :option="option" @load="upCallback" @refresh="downCallback" style="background-color: #FFFFFF;">
<view v-for="(item, index) in listData" :key="index" >
<view class="content" @click="detailInfo(item)">
<image class="image" :src="item.litPicUrl" mode=""></image>
<view class="" style="width: 100%;">
<view class="title">
<view class="">{{ item.brandName }}</view>
<view class="">
<image class="icon" :src="item.status === 30111 ? '/static/imgs/mall/grounding-icon.png' : '/static/imgs/mall/sold-out-icon.png'" mode=""></image>
</view>
</view>
<view class="sub-title">{{ item.categoryName }}/{{ item.name }}/{{ item.manufacturerName }}</view>
<view class="desc">
克重(价格)
<text v-for="(sku,index) in item.skuList">{{sku.weight}}({{sku.listPrice}})</text>
</view>
</view>
</view>
<view class="other">
<view class="time">{{item.updateTime | timeFilter }}</view>
<view class="btn">
<view class="" @click="editPaper(item)" v-if="item.status === 30112">编辑</view>
<view class="divide"></view>
<view class="" @click="productStatusChange(item)">{{ item.status === 30111 ? '下架' : '上架' }}</view>
</view>
</view>
<uGap></uGap>
</view>
</scroll-list>
</view>
<view>
<view class="offer-prices" @click="nativeTo()"><image class="my-image" src="../../static/imgs/trade/camera.png" mode=""></image></view>
</view>
<no-data v-if="!pageShow"></no-data>
</view>
<view class="wrapper">
<uni-nav-bar :fixed="true" color="#ffffff" background-color="#ffffff" :status-bar="true">
<view slot="left" class="left-title">纸商城</view>
<view slot="right" class="right-title" @tap="shareTap">分享</view>
</uni-nav-bar>
<view class="top-box">
<view class=""><image class="image" src="https://qncloud.oss-cn-shenzhen.aliyuncs.com/ztb_pic/testPic.jfif" mode=""></image></view>
<view class="center">
<view class="title">{{ storeInformation.name }}</view>
<view class="desc">全部商品 39 &nbsp; | &nbsp;上新 9</view>
</view>
<view class="right">
<view class="cut" @click="checkMall()">
切换商城
<image class="cut-icon" src="/static/imgs/mall/cut-icon.png" mode=""></image>
</view>
<view class="set" @click="setting">设置</view>
</view>
</view>
<uGap></uGap>
<view class="" v-if="pageShow">
<scroll-list ref="list" :option="option" @load="upCallback" @refresh="downCallback" style="background-color: #ffffff">
<view v-for="(item, index) in listData" :key="index">
<view class="content" @click="detailInfo(item)">
<image class="image" :src="item.litPicUrl" mode=""></image>
<view class="" style="width: 100%">
<view class="title">
<view class="">{{ item.brandName }}</view>
<view class="">
<image
class="icon"
:src="item.status === 30111 ? '/static/imgs/mall/grounding-icon.png' : '/static/imgs/mall/sold-out-icon.png'"
mode=""
></image>
</view>
</view>
<view class="sub-title">{{ item.categoryName }}/{{ item.name }}/{{ item.manufacturerName }}</view>
<view class="desc">
克重(价格)
<text v-for="(sku, index) in item.skuList" :key="index">{{ sku.weight }}({{ sku.listPrice }})</text>
</view>
</view>
</view>
<view class="other">
<view class="time">{{ item.updateTime | timeFilter }}</view>
<view class="btn">
<view class="" @click="editPaper(item)" v-if="item.status === 30112">编辑</view>
<view class="divide"></view>
<view class="" @click="productStatusChange(item)">{{ item.status === 30111 ? '下架' : '上架' }}</view>
</view>
</view>
<uGap></uGap>
</view>
</scroll-list>
</view>
<view>
<view class="offer-prices" @click="nativeTo()"><image class="my-image" src="../../static/imgs/trade/camera.png" mode=""></image></view>
</view>
<no-data v-if="!pageShow"></no-data>
</view>
</template>
<script>
import uGap from '@/components/u-gap/u-gap.vue'
import { back, go2, loginGo2 } from '@/utils/hook.js'
import { back, go2, loginGo2 } from '@/utils/hook.js'
import { SupplierList, productStatus } from '@/apis/add-paper.js'
import { getTimer }from '@/utils/index.js'
import { getTimer } from '@/utils/index.js'
import noData from './no-data.vue'
export default {
components: { uGap, noData },
filters:{
timeFilter(value){
var abs = ''
if(value){
abs = getTimer(value)
}
return abs
}
},
data() {
return {
pageShow: true,
storeInformation: {
supplierId: null,
name: null
},
option: {
size: 10,
auto: true,
emptyText: '暂无数据~',
background: '#F7F8FA',
disabled: false
},
pattern: {
backgroundColor: '#007AFF',
buttonColor: '#007AFF'
},
content: [],
horizontal: 'right',
vertical: 'bottom',
direction: 'vertical',
orderPagination: {
pageNum: 0, //
pageSize: 10,
storeId: null,
name: null,
supplierId: this.$store.state.supplierInfo.supplierId
},
listData: []
}
},
onShow() {
this.storeInformation = {
supplierId: this.$store.state.supplierInfo.supplierId,
name: this.$store.state.supplierInfo.name
}
this.quertData()
},
onLoad() {
this.quertData()
},
methods: {
back,
// pageShow
quertData() {
return new Promise((resolve, reject) => {
SupplierList({ ...this.orderPagination })
.then(res => {
if (res) {
if (res.records.length === 0) {
this.pageShow = false
return
}
if (this.orderPagination.pageNum == 1) {
this.listData = res.records
} else {
this.listData = this.listData.concat(res.records)
}
resolve({ list: this.listData, total: res.total })
}
})
.catch(err => {
reject(err)
})
})
},
downCallback() {
this.orderPagination.pageNum = 1
this.quertData()
.then(({ list, total }) => {
this.$refs.list.refreshSuccess({ list, total })
})
.catch(() => {
this.$refs.list.refreshFail()
})
},
upCallback() {
this.orderPagination.pageNum++
this.quertData()
.then(({ list, total }) => {
this.$refs.list.loadSuccess({ list, total })
})
.catch(() => {
this.$refs.list.loadFail()
})
},
//
checkMall() {
go2('switching-mall', { supplierId: this.storeInformation.supplierId })
},
//
nativeTo() {
var params = {
title: '添加纸品'
}
go2('add-paper', params)
},
//
editPaper(item) {
var params = {
...item,
title: '编辑纸品'
}
go2('add-paper', params)
},
//
setting(item) {
go2('store-settings')
},
//
detailInfo(item) {
loginGo2('paper-detail', item)
},
//
productStatusChange(item) {
var params = {
id: item.id,
status: item.status === 30111 ? 30112 : 30111
}
productStatus(params).then(res => {
if (res) {
uni.showToast({
title: '状态修改成功',
icon: 'success'
})
setTimeout(()=>{
this.orderPagination.pageNum = 1
this.quertData()
},500)
}
})
},
//
shareTap() {
uni.share({
provider: "weixin",
scene: "WXSceneSession",
type: 0,
href: "http://uniapp.dcloud.io/",
title: "uni-app分享",
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
imageUrl: "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png",
success: function (res) {
console.log("success:" + JSON.stringify(res));
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
}
});
}
}
components: { uGap, noData },
filters: {
timeFilter(value) {
var abs = ''
if (value) {
abs = getTimer(value)
}
return abs
}
},
data() {
return {
pageShow: true,
storeInformation: {
supplierId: null,
name: null
},
option: {
size: 10,
auto: true,
emptyText: '暂无数据~',
background: '#F7F8FA',
disabled: false
},
pattern: {
backgroundColor: '#007AFF',
buttonColor: '#007AFF'
},
content: [],
horizontal: 'right',
vertical: 'bottom',
direction: 'vertical',
orderPagination: {
pageNum: 0, //
pageSize: 10,
storeId: null,
name: null,
supplierId: this.$store.state.supplierInfo.supplierId
},
listData: []
}
},
onShow() {
this.storeInformation = {
supplierId: this.$store.state.supplierInfo.supplierId,
name: this.$store.state.supplierInfo.name
}
this.quertData()
},
onLoad() {
this.quertData()
},
methods: {
back,
// pageShow
quertData() {
return new Promise((resolve, reject) => {
SupplierList({ ...this.orderPagination })
.then((res) => {
if (res) {
if (res.records.length === 0) {
this.pageShow = false
return
}
if (this.orderPagination.pageNum == 1) {
this.listData = res.records
} else {
this.listData = this.listData.concat(res.records)
}
resolve({ list: this.listData, total: res.total })
}
})
.catch((err) => {
reject(err)
})
})
},
downCallback() {
this.orderPagination.pageNum = 1
this.quertData()
.then(({ list, total }) => {
this.$refs.list.refreshSuccess({ list, total })
})
.catch(() => {
this.$refs.list.refreshFail()
})
},
upCallback() {
this.orderPagination.pageNum++
this.quertData()
.then(({ list, total }) => {
this.$refs.list.loadSuccess({ list, total })
})
.catch(() => {
this.$refs.list.loadFail()
})
},
//
checkMall() {
go2('switching-mall', { supplierId: this.storeInformation.supplierId })
},
//
nativeTo() {
var params = {
title: '添加纸品'
}
go2('add-paper', params)
},
//
editPaper(item) {
var params = {
...item,
title: '编辑纸品'
}
go2('add-paper', params)
},
//
setting(item) {
go2('store-settings')
},
//
detailInfo(item) {
loginGo2('paper-detail', item)
},
//
productStatusChange(item) {
var params = {
id: item.id,
status: item.status === 30111 ? 30112 : 30111
}
productStatus(params).then((res) => {
if (res) {
uni.showToast({
title: '状态修改成功',
icon: 'success'
})
setTimeout(() => {
this.orderPagination.pageNum = 1
this.quertData()
}, 500)
}
})
},
//
shareTap() {
uni.share({
provider: 'weixin',
scene: 'WXSceneSession',
type: 0,
href: 'http://uniapp.dcloud.io/',
title: 'uni-app分享',
summary: '我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!',
imageUrl: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png',
success: function (res) {
console.log('success:' + JSON.stringify(res))
},
fail: function (err) {
console.log('fail:' + JSON.stringify(err))
}
})
}
}
}
</script>
<style lang="scss">
.warpper {
width: 750rpx;
.left-title {
font-size: 40rpx;
color: #000000;
letter-spacing: 0;
font-weight: 500;
}
.right-title {
font-size: 28rpx;
color: #007aff;
text-align: right;
font-weight: 500;
}
.top-box {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
height: 180rpx;
background: url('/static/imgs/mall/zsc-bg-icon.png') no-repeat;
background-size: 100%;
.image {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.right {
width: 140rpx;
}
.center {
position: relative;
left: -20rpx;
}
.title {
font-size: 34rpx;
color: #ffffff;
letter-spacing: 2rpx;
font-weight: 600;
margin-bottom: 12rpx;
}
.desc {
opacity: 0.75;
font-size: 28rpx;
color: #ffffff;
letter-spacing: 0;
font-weight: 500;
padding-right: 32rpx;
}
.cut {
display: flex;
align-items: center;
font-size: 24rpx;
color: #ffffff;
letter-spacing: 0;
text-align: center;
font-weight: 400;
.cut-icon {
width: 29.42rpx;
height: 26.67rpx;
margin-left: 10rpx;
}
}
.set {
opacity: 0.75;
font-size: 28rpx;
color: #ffffff;
letter-spacing: 0;
font-weight: 500;
position: relative;
top: 39rpx;
left: 60rpx;
}
}
.content {
background: #ffffff;
border-bottom: 2rpx solid #dddddd;
display: flex;
flex-direction: row;
padding: 24rpx 0rpx 24rpx 32rpx;
.image {
width: 100rpx;
height: 100rpx;
flex: 0 0 100rpx;
margin-right: 18rpx;
}
.title {
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: 32rpx;
color: #333333;
letter-spacing: 0;
font-weight: 500;
.icon {
position: relative;
top: -22rpx;
width: 150rpx;
height: 50rpx;
}
}
.sub-title {
position: relative;
font-size: 28rpx;
color: #333333;
letter-spacing: 0;
font-weight: 400;
top: -4rpx;
}
.desc {
font-size: 28rpx;
color: #555555;
letter-spacing: 0;
font-weight: 400;
padding-top: 10rpx;
line-height: 1.4;
}
}
.other {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
height: 80rpx;
background: #ffffff;
padding: 0rpx 32rpx;
.time {
font-size: 28rpx;
color: #888888;
letter-spacing: 0;
font-weight: 400;
}
.btn {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
font-size: 28rpx;
color: #007aff;
letter-spacing: 0;
text-align: right;
font-weight: 400;
}
.divide {
width: 2rpx;
height: 32rpx;
background: #d8d8d8;
margin: 0 32rpx;
}
.icon {
width: 24rpx;
height: 24rpx;
margin-left: 6rpx;
}
}
.offer-prices {
position: absolute;
z-index: 9999;
right: 32rpx;
bottom: 122rpx;
background-color: #007aff;
border-radius: 50%;
padding: 10rpx;
text-align: center;
width: 110rpx;
height: 110rpx;
border: 2rpx solid #f9f9f9;
box-shadow: 0rpx 4rpx 34rpx 0rpx rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.my-image {
width: 100rpx;
height: 100rpx;
}
.wrapper {
width: 750rpx;
overflow: hidden;
.left-title {
font-size: 40rpx;
color: #000000;
letter-spacing: 0;
font-weight: 500;
}
.right-title {
font-size: 28rpx;
color: #007aff;
text-align: right;
font-weight: 500;
}
.top-box {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
height: 180rpx;
background: url('/static/imgs/mall/zsc-bg-icon.png') no-repeat;
background-size: 100%;
.image {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.right {
width: 140rpx;
}
.center {
position: relative;
left: -20rpx;
}
.title {
font-size: 34rpx;
color: #ffffff;
letter-spacing: 2rpx;
font-weight: 600;
margin-bottom: 12rpx;
}
.desc {
opacity: 0.75;
font-size: 28rpx;
color: #ffffff;
letter-spacing: 0;
font-weight: 500;
padding-right: 32rpx;
}
.cut {
display: flex;
align-items: center;
font-size: 24rpx;
color: #ffffff;
letter-spacing: 0;
text-align: center;
font-weight: 400;
.cut-icon {
width: 29.42rpx;
height: 26.67rpx;
margin-left: 10rpx;
}
}
.set {
opacity: 0.75;
font-size: 28rpx;
color: #ffffff;
letter-spacing: 0;
font-weight: 500;
position: relative;
top: 39rpx;
left: 60rpx;
}
}
.content {
background: #ffffff;
border-bottom: 2rpx solid #dddddd;
display: flex;
flex-direction: row;
padding: 24rpx 0rpx 24rpx 32rpx;
.image {
width: 100rpx;
height: 100rpx;
flex: 0 0 100rpx;
margin-right: 18rpx;
}
.title {
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: 32rpx;
color: #333333;
letter-spacing: 0;
font-weight: 500;
.icon {
position: relative;
top: -22rpx;
width: 150rpx;
height: 50rpx;
}
}
.sub-title {
position: relative;
font-size: 28rpx;
color: #333333;
letter-spacing: 0;
font-weight: 400;
top: -4rpx;
}
.desc {
font-size: 28rpx;
color: #555555;
letter-spacing: 0;
font-weight: 400;
padding-top: 10rpx;
line-height: 1.4;
}
}
.other {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
height: 80rpx;
background: #ffffff;
padding: 0rpx 32rpx;
.time {
font-size: 28rpx;
color: #888888;
letter-spacing: 0;
font-weight: 400;
}
.btn {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
font-size: 28rpx;
color: #007aff;
letter-spacing: 0;
text-align: right;
font-weight: 400;
}
.divide {
width: 2rpx;
height: 32rpx;
background: #d8d8d8;
margin: 0 32rpx;
}
.icon {
width: 24rpx;
height: 24rpx;
margin-left: 6rpx;
}
}
.offer-prices {
position: absolute;
z-index: 9999;
right: 32rpx;
bottom: 122rpx;
background-color: #007aff;
border-radius: 50%;
padding: 10rpx;
text-align: center;
width: 110rpx;
height: 110rpx;
border: 2rpx solid #f9f9f9;
box-shadow: 0rpx 4rpx 34rpx 0rpx rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.my-image {
width: 100rpx;
height: 100rpx;
}
}
</style>
</style>

22
pages/mine/index.vue

@ -100,23 +100,23 @@
<text style="font-size: 30rpx; color: rgba(0, 0, 0, 0.85); font-weight: 600">其他工具</text>
</view>
<view class="icon-area">
<view class="icon-item">
<!-- <view class="icon-item">
<image class="icon" src="/static/imgs/mine/order-icon.png"></image>
<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>
<text class="label">账期订单融资</text>
</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>
<text class="label">合同管理</text>
</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>
<text class="label">征信管理</text>
</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>
<text class="label">授信记录</text>
</view>
@ -133,7 +133,7 @@
</template>
<script>
import { exit, go2 } from '@/utils/hook.js'
import { exit, go2, loginGo2 } from '@/utils/hook.js'
import { fddEnterpriseStatus } from '@/enums/index.js'
import { getBaseInfo, getVerifyUrl } from '@/apis/commonApi.js'
import qnDataPicker from '@/components/qn-data-picker/qn-data-picker.vue'
@ -208,6 +208,7 @@ export default {
}
},
go2,
loginGo2,
//
getStatistics() {
if (!this.hasLogin) {
@ -270,10 +271,9 @@ export default {
}
}
},
onLoad() {
},
onLoad() {},
onShow() {
getBaseInfo().then((res) => {
getBaseInfo({}, true).then((res) => {
if (res) {
this.companyNum = res.enterpriseList.length
}
@ -287,6 +287,8 @@ export default {
<style lang="scss" scoped>
.content {
width: 750rpx;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;

6
pages/order-detail/index.vue

@ -3,7 +3,7 @@
<uni-nav-bar left-icon="back" @clickLeft="back" statusBar fixed title="订单详情"></uni-nav-bar>
<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>
<text style="font-size: 30rpx; color: #ffffff">{{ supplierOrderStatusMap[orderInfo.status] }}</text>
<text style="font-size: 30rpx; color: #ffffff">{{ supplierOrderStatusMap[orderInfo.status] || '-' }}</text>
</view>
<view class="address-area">
<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">
<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">
联系人: {{ `${orderInfo.deliveryAddress.receiver} ${orderInfo.deliveryAddress.receiverMobile}` }}
联系人: {{ `${orderInfo.deliveryAddress.receiver || '-'} ${orderInfo.deliveryAddress.receiverMobile || '-'}` }}
</text>
</view>
<view class="flex-row-start-start footer">
@ -196,7 +196,7 @@ export default {
back,
transformAddress(address) {
let res = ''
if (address) {
if (address.provinceName) {
res = `${address.provinceName}${address.cityName}${address.districtName}${address.detail}`
}
return res

7
utils/hook.js

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

2
utils/http/http.js

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

22
utils/http/index.js

@ -1,15 +1,20 @@
import Http from './http.js'
import env from '@/env/index.js'
import { XAPPID } from '@/enums/index.js'
// 请求封装文件
const urlEnv = env === 'production' ? '' : `-${env}`
const xappid = '503258978847966403'
/**
* 系统默认的请求域名
*/
const baseUrl = `https://api-client-yyt${urlEnv}.qniao.cn`
// 请求url列表
const prefixList = {
'/yyt-uec': `https://api-client-yyt${urlEnv}.qniao.cn`,
'/base-paper-trading': `https://api-client-yyt${urlEnv}.qniao.cn`,
'/uec': `https://api-client-uec${urlEnv}.qniao.cn`,
'/document': `https://api-ops-yyt${urlEnv}.qniao.cn`
// '/yyt-uec': `https://api-client-yyt${urlEnv}.qniao.cn`,
// '/base-paper-trading': `https://api-client-yyt${urlEnv}.qniao.cn`,
'/uec': `https://api-client-uec${urlEnv}.qniao.cn`
// '/document': `https://api-client-yyt${urlEnv}.qniao.cn`,
// '/cloud-print-user-center':`https://api-client-yyt${urlEnv}.qniao.cn`
}
const config = {
@ -44,19 +49,24 @@ const reqInterceptor = (config, options) => {
config.header = {
...config.header,
Authorization: token || '',
'X-APP-ID': xappid
'X-APP-ID': XAPPID
}
// 改变url
let newUrl = ''
if (url.startsWith('http')) {
newUrl = url
} else {
let hit = false
for (let key in prefixList) {
if (url.startsWith(key)) {
newUrl = prefixList[key] + url
hit = true
break
}
}
if (!hit) {
newUrl = baseUrl + url
}
}
config.url = newUrl
if (!options.hideLoading) {

246
utils/index.js

@ -1,64 +1,65 @@
import env from '@/env/index.js'
import store from '@/store/index.js'
import { isDate } from './is.js'
/**
* 日期格式化样例 yyyy-mm-dd hh:MM:ss
* @param date Date 需要转换的日期
* @param fmt string 转化的格式 yyyy-mm-dd hh:MM:ss
*/
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
* @param 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
* @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) {
return is(val, 'Array')
}
export function isDate(val) {
return is(val, 'Date')
}
Loading…
Cancel
Save