36 Commits
dev ... ymf

Author SHA1 Message Date
bbcf8068c4 1 2025-10-13 11:33:03 +08:00
dd42743f26 增加协议文件 2025-05-26 17:01:17 +08:00
213bdcba88 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into ymf_3.0.0 2024-12-17 14:07:23 +08:00
7599157bfa 增加部分方法 2024-12-17 14:06:43 +08:00
duan
daa0d18501 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into dwb 2024-12-12 17:25:45 +08:00
duan
06e17a74b3 并转桌子 2024-12-12 17:25:16 +08:00
c63c187ed3 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into ymf_3.0.0 2024-12-11 16:33:58 +08:00
79839e3d39 修改最低sdk和目标sdk 2024-12-11 16:33:43 +08:00
GaoHao
973450b37a Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into test 2024-12-11 10:41:26 +08:00
GaoHao
7376e40fe3 app升级更新添加 2024-12-11 10:41:13 +08:00
魏啾
6d8284e78f 1 2024-12-07 14:15:04 +08:00
duan
cfb461829f Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into dwb 2024-12-06 16:43:11 +08:00
duan
8c15aadf21 添加商品如果套餐没选择规格,默认选中第一条 2024-12-06 16:42:58 +08:00
魏啾
65745d3033 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into wwz 2024-12-06 15:50:57 +08:00
魏啾
3616caac21 称重,默认选择营业时间 2024-12-06 15:49:15 +08:00
duan
b4dcfe7879 添加商品几选几总值没传 2024-12-06 14:56:37 +08:00
魏啾
38b640e82b 称重钱保留后两位 2024-12-06 10:35:56 +08:00
魏啾
85d5d59863 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into wwz 2024-12-06 10:06:05 +08:00
魏啾
51f3953459 称重增加 2024-12-06 10:05:06 +08:00
duan
b1e90ff1a9 Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into dwb 2024-12-05 11:23:48 +08:00
duan
de90f1249e 套餐优化 2024-12-05 11:23:39 +08:00
魏啾
3a5460894b Merge branch 'test' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into wwz 2024-12-05 10:48:31 +08:00
魏啾
e6ccfdafd6 核销管理 2024-12-05 10:48:11 +08:00
duan
9df5bc0e46 套餐 2024-12-04 17:46:51 +08:00
duan
4dfa7d627e 代客下单bug修改2 2024-12-04 10:44:25 +08:00
duan
ff1e6f60e0 代课下单bug修改 2024-12-04 09:38:18 +08:00
duan
c4f43a0626 单品改价 2024-12-03 16:19:48 +08:00
74d644c46b 修复套餐商品展示问题 2024-12-03 10:27:18 +08:00
3400c9422d 增加固定套餐提交时的套餐商品验证 2024-12-03 10:02:42 +08:00
b88b0b548f 修复商品编辑套餐商品保存问题 2024-12-03 09:53:11 +08:00
005c6336c0 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into test 2024-12-03 09:27:32 +08:00
1582bb85f1 商品编辑修改称重商品也展示分类 2024-12-03 09:25:27 +08:00
c36717a059 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into test 2024-12-02 15:49:36 +08:00
3f2ea98977 修复是否允许临时改价点击无反应问题 2024-12-02 15:49:16 +08:00
0d298f8413 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/cashier_front/cashier_admin_app into test 2024-12-02 15:44:20 +08:00
f6b0db3a70 修复商品类型称重type改为weigh 2024-12-02 15:40:03 +08:00
36 changed files with 2654 additions and 362 deletions

6
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"files.associations": {
"*.ttml": "xml",
"*.ttss": "css"
}
}

145
App.vue
View File

@@ -6,8 +6,11 @@ App.vue本身不是页面这里不能编写视图元素也就是没有<tem
import { import {
onLaunch onLaunch
} from '@dcloudio/uni-app'; } from '@dcloudio/uni-app';
import { getFindBySource } from '@/http/yskApi/version.js'
onLaunch(() => { onLaunch(() => {
let that = this
uni.hideTabBar() uni.hideTabBar()
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
const updateManager = wx.getUpdateManager() // 小程序版本更新管理器 const updateManager = wx.getUpdateManager() // 小程序版本更新管理器
@@ -23,6 +26,146 @@ App.vue本身不是页面这里不能编写视图元素也就是没有<tem
// 新版本下载失败 // 新版本下载失败
}) })
// #endif // #endif
//#ifdef APP-PLUS
//获取当前系统版本信息
plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
//请求后台接口 解析数据 对比版本
console.log("widgetInfo==",widgetInfo)
getFindBySource({source:'APP'}).then(res => {
console.log("selectNewApp==",res)
console.log("version===",res.url && widgetInfo.version < res.version)
if (res.url && widgetInfo.version < res.version) {
console.log("version===222")
let downloadLink = res.url;
// let downloadLink = "https://short-video.hnsiyao.cn/app/sy-duanju.apk";
console.log(downloadLink)
// let androidLink = res.androidWgtUrl;
// let iosLink = res.iosWgtUrl;
let ready = false;
// 校验是否强制升级
if (res.isUp == 1) {
uni.showModal({
showCancel: false,
title: '发现新版本',
confirmText: '立即更新',
content: res.message,
success: res => {
if (res.confirm) {
uni.showLoading('下载中...');
if (uni.getSystemInfoSync().platform ==
'android') {
uni.downloadFile({
url: downloadLink,
success: downloadResult => {
if (downloadResult.statusCode === 200) {
plus.io.resolveLocalFileSystemURL(downloadResult.tempFilePath, entry => {
entry.getParent(_oldFile=>{
entry.moveTo(_oldFile,'.apk',newFilePath=>{
console.log('newFilePath',newFilePath.fullPath)
plus.runtime
.install(newFilePath.fullPath, { force: false },
d => {
console
.log(
'install success...'
);
plus.runtime
.restart();
},
e => {
console.log(e)
console
.error(
'install fail...'
);
}
);
})
})
})
}
}
});
}
if (uni.getSystemInfoSync().platform ==
'ios') {
plus.runtime.openURL(downloadLink, function(
res) {});
}
} else if (res.cancel) {
console.log('取消');
}
}
});
} else {
uni.showModal({
title: '发现新版本',
confirmText: '立即更新',
cancelText: '下次更新',
content: res.message,
success: res => {
if (res.confirm) {
uni.showLoading('下载中...');
if (uni.getSystemInfoSync().platform ==
'android') {
uni.downloadFile({
url: downloadLink,
success: downloadResult => {
if (downloadResult
.statusCode ===
200) {
plus.io.resolveLocalFileSystemURL(downloadResult.tempFilePath, entry => {
entry.getParent(_oldFile=>{
entry.moveTo(_oldFile,'.apk',newFilePath=>{
console.log('newFilePath',newFilePath.fullPath)
plus.runtime
.install(newFilePath.fullPath, { force: false },
d => {
console
.log(
'install success...'
);
plus.runtime
.restart();
},
e => {
console.log(e)
console
.error(
'install fail...'
);
}
);
})
})
})
}
}
});
}
if (uni.getSystemInfoSync().platform ==
'ios') {
plus.runtime.openURL(downloadLink, function(
res) {});
}
} else if (res.cancel) {
console.log('取消');
}
}
});
}
}
}).catch((res)=>{
console.log(res)
})
});
// #endif
}); });
</script> </script>

33
http/php/api.ts Normal file
View File

@@ -0,0 +1,33 @@
import { request } from './request'
// 会员签入 登录
export const douyincheckIn = (data : object | any) => {
return request('douyin/checkIn', 'POST', data, true)
}
// 登出
export const userlogout = () => {
return request('user/logout', 'POST', '', true)
}
// 查询绑定状态
export const searchstorestatus = (data : object) => {
return request('meituan/searchstorestatus', 'POST', data, true)
}
// 团购核销准备
export const fulfilmentcertificateprepare = (data : object) => {
return request('douyin/fulfilmentcertificateprepare', 'POST', data, true)
}
// 获取uisdk 绑定 链接
export const getuisdk = (data : object) => {
return request('douyin/getuisdk', 'POST', data, true)
}
// 团购核销
export const certificateprepares = (data : object) => {
return request('douyin/certificateprepare', 'POST', data, true)
}
// 团购核销记录
export const orderlist = (data : object) => {
return request('douyin/orderlist', 'POST', data, true)
}
// 团购核销撤销
export const fulfilmentcertificatecanceles = (data : object) => {
return request('douyin/fulfilmentcertificatecancel', 'POST', data, true)
}

80
http/php/request.ts Normal file
View File

@@ -0,0 +1,80 @@
//服务器接口地址
const baseURL : string = 'https://czgdoumei.sxczgkj.com/index.php/api/'
// 封装公共请求方法
function request(url : string, method : "GET" | "POST" | undefined, data : object | any, toast : boolean) {
let networkType = ''
uni.getNetworkType({
success: (res) => {
networkType = res.networkType
}
});
if (networkType == 'none') {
uni.showToast({
title: '网络异常,请检查网络',
icon: 'none'
})
return false;
}
if (toast) {
uni.showLoading({
title: '加载中',
mask: true
})
}
return new Promise(async (resolve, reject) => {
let header : any
header = {
'content-type': 'application/json',
'clinttype':uni.getStorageSync('clint_type'),
'bausertoken': uni.getStorageSync('phpuserinfo').token
};
uni.request({
url: baseURL + url,
method: method,
data: data,
header: header,
success(res : any) {
if (res.data.code != 1) {
//是否提示错误
if (toast) {
uni.showToast({
title: res.data.msg || res.data.message,
icon: 'none'
})
setTimeout(() => {
uni.hideLoading()
}, 1000)
}
if (res.data.code == 401) {
uni.showToast({
title: res.message || res.msg,
icon: "none",
success: () => {
// uni.removeStorageSync('logintoken');
// uni.removeStorageSync('token');
uni.reLaunch({
url: '/pages/index/index'
})
}
})
}
uni.hideLoading()
reject(res.message | res.msg);
} else {
uni.hideLoading()
resolve(res.data.data);
}
},
fail(err) {
uni.hideLoading()
//请求失败
uni.showToast({
title: '无法连接到服务器',
icon: 'none'
})
reject(err)
}
})
})
}
export { request, baseURL }

View File

@@ -202,6 +202,7 @@ function request(args) {
method: method, method: method,
header: getHeader() header: getHeader()
}, extParams) }, extParams)
) )
}) })
} }

View File

@@ -24,6 +24,17 @@ export function $bind(data) {
} }
}); });
} }
// 转/并桌
export function tableswitch(data) {
return request({
url: '/api/place/switch',
method: "put",
data: {
shopId: uni.getStorageSync('shopId'),
...data
}
});
}
//获取台桌详情状态 //获取台桌详情状态
export function $returnTableDetail(data) { export function $returnTableDetail(data) {
return request({ return request({

15
http/yskApi/version.js Normal file
View File

@@ -0,0 +1,15 @@
import http from './http.js'
const request=http.request
/**
* 查询所属渠道升级版本
* @returns
*/
export function getFindBySource(params) {
return request({
url: `/api/tbVersion/findBySource`,
method: 'get',
params
})
}

View File

@@ -1,6 +1,6 @@
{ {
"name" : "银收客", "name" : "银收客",
"appid" : "__UNI__02A31D8", "appid" : "__UNI__E0B05B1",
"description" : "", "description" : "",
"versionName" : "1.0.0", "versionName" : "1.0.0",
"versionCode" : 100, "versionCode" : 100,
@@ -49,7 +49,7 @@
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
], ],
"abiFilters" : [ "armeabi-v7a" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"permissionExternalStorage" : { "permissionExternalStorage" : {
"request" : "none", "request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。" "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
@@ -59,8 +59,8 @@
"prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。" "prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
}, },
"autoSdkPermissions" : true, "autoSdkPermissions" : true,
"targetSdkVersion" : 26, "targetSdkVersion" : 30,
"minSdkVersion" : 21 "minSdkVersion" : 26
}, },
"ios" : { "ios" : {
"dSYMs" : false "dSYMs" : false

View File

@@ -51,6 +51,9 @@
} from 'vue'; } from 'vue';
import color from '@/commons/color.js'; import color from '@/commons/color.js';
import go from '@/commons/utils/go.js'; import go from '@/commons/utils/go.js';
import {
onLoad,
} from '@dcloudio/uni-app';
import { import {
tbShopPurveyorput tbShopPurveyorput
} from '@/http/yskApi/requestAll.js'; } from '@/http/yskApi/requestAll.js';
@@ -62,17 +65,15 @@
type: String type: String
} }
}) })
onMounted(() => { onLoad((d)=>{
datas.form = JSON.parse(props.item) datas.form = JSON.parse(d.item)
}) })
function sumbit() { function sumbit() {
tbShopPurveyorput({ tbShopPurveyorput({
shopId: uni.getStorageSync("shopId"), shopId: uni.getStorageSync("shopId"),
...datas.form ...datas.form
}).then(res => { }).then(res => {
// go.to('PAGES_SUPPLIER')
go.back() go.back()
}) })
} }

View File

@@ -12,14 +12,15 @@
<view class="block"> <view class="block">
<view class="border-top-0 typeEnum"> <view class="border-top-0 typeEnum">
<uni-forms-item label="商品类型" required showRequired> <uni-forms-item label="商品类型" required showRequired>
<up-radio-group v-model="FormData.type" placement="row"> <up-radio-group v-model="FormData.type" placement="row"
@change="changeFormDatatype">
<up-radio v-for="(item, index) in pageData.types" :key="index" <up-radio v-for="(item, index) in pageData.types" :key="index"
:label="item.name" :name="item.value"> :label="item.name" :name="item.value">
</up-radio> </up-radio>
</up-radio-group> </up-radio-group>
</uni-forms-item> </uni-forms-item>
</view> </view>
<view class="" v-if="FormData.type!='package'"> <view class="" v-if="FormData.type!='package' && FormData.type!='weigh'">
<uni-forms-item label="商品规格" required showRequired> <uni-forms-item label="商品规格" required showRequired>
<up-radio-group v-model="FormData.typeEnum" placement="row"> <up-radio-group v-model="FormData.typeEnum" placement="row">
<up-radio :custom-style="{marginRight:'30px'}" <up-radio :custom-style="{marginRight:'30px'}"
@@ -39,6 +40,10 @@
</up-radio-group> </up-radio-group>
</uni-forms-item> </uni-forms-item>
</view> </view>
<uni-forms-item required name="name" label="商品名称" showRequired>
<uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
:inputBorder="inputBorder" v-model="FormData.name" placeholder="请输入商品名称" />
</uni-forms-item>
<uni-forms-item ref="fileItem" label="图片" required showRequired> <uni-forms-item ref="fileItem" label="图片" required showRequired>
<my-upload-file ref="refFile" :images="FormData.images" <my-upload-file ref="refFile" :images="FormData.images"
:imageStyles="imageStyles"></my-upload-file> :imageStyles="imageStyles"></my-upload-file>
@@ -55,33 +60,27 @@
</up-checkbox-group> </up-checkbox-group>
</uni-forms-item> </uni-forms-item>
</view> </view>
<template v-if="FormData.type!='package'"> <view class="u-relative">
<uni-forms-item required name="name" label="商品名称" showRequired> <uni-forms-item label="商品分类" required showRequired name="categoryId">
<uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle" <uni-data-picker :clear-icon="false" :map="{text:'name',value:'id'}"
:inputBorder="inputBorder" v-model="FormData.name" placeholder="请输入商品名称" /> placeholder="请选择商品分类" popup-title="请选择商品分类" :localdata="pageData.category"
v-model="FormData.categoryId">
</uni-data-picker>
</uni-forms-item> </uni-forms-item>
<view class="u-relative"> <view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)"
<uni-forms-item label="商品分类" required showRequired name="categoryId"> v-if="option.type=='edit'&&disabledChangeCategory">
<uni-data-picker :clear-icon="false" :map="{text:'name',value:'id'}"
placeholder="请选择商品分类" popup-title="请选择商品分类" :localdata="pageData.category"
v-model="FormData.categoryId">
</uni-data-picker>
</uni-forms-item>
<view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)"
v-if="option.type=='edit'&&disabledChangeCategory">
</view>
</view> </view>
<view class="border-top-0"> </view>
<uni-forms-item label="单位" required showRequired name="units"> <view class="">
<uni-forms-item label="单位" required showRequired name="units">
<uni-data-picker :clear-icon="false" @change="unitIdChange" <uni-data-picker :clear-icon="false" @change="unitIdChange"
:map="{text:'name',value:'id'}" placeholder="请选择单位" popup-title="请选择单位" :map="{text:'name',value:'id'}" placeholder="请选择单位" popup-title="请选择单位"
:localdata="pageData.units" v-model="FormData.unitId"> :localdata="pageData.units" v-model="FormData.unitId">
</uni-data-picker> </uni-data-picker>
</uni-forms-item> </uni-forms-item>
</view> </view>
</template>
<template v-if="FormData.type==='package'"> <template v-if="FormData.type==='package'">
<!-- <view class="block border-top-0"> <!-- <view class="block border-top-0">
<uni-forms-item label="选择规格" required name="categoryId"> <uni-forms-item label="选择规格" required name="categoryId">
@@ -92,7 +91,8 @@
</uni-data-picker> </uni-data-picker>
</uni-forms-item> </uni-forms-item>
</view> --> </view> -->
<view class="border-top" >
<view class="border-top" v-if="FormData.proGroupVo">
<view class="" <view class=""
v-if=" (FormData.groupType==1&&FormData.proGroupVo.length)||(FormData.groupType==0&&FormData.proGroupVo.length&&FormData.proGroupVo[0].goods.length) "> v-if=" (FormData.groupType==1&&FormData.proGroupVo.length)||(FormData.groupType==0&&FormData.proGroupVo.length&&FormData.proGroupVo[0].goods.length) ">
<view class="border-bottom u-p-b-32" <view class="border-bottom u-p-b-32"
@@ -512,16 +512,16 @@
</view> </view>
</template> </template>
<template v-if="FormData.type=='weight'"> <template v-if="FormData.type=='weigh'">
<view class="block u-p-t-32 u-p-b-32"> <view class="block u-p-t-32 u-p-b-32">
<view class="font-bold"> <view class="font-bold">
<text class="color-red">*</text> <text class="color-red">*</text>
<text>重量</text> <text>单位</text>
</view> </view>
<view class=" u-m-t-16"> <view class=" u-m-t-16">
<up-input v-model="FormData.weight"> <up-input v-model="FormData.weight">
<template #suffix> <template #suffix>
<view class="bg-gray">千克</view> <view class="bg-gray">{{activeinHouseList}}</view>
</template> </template>
</up-input> </up-input>
<view class="u-m-t-16 color-999 u-font-24">用于快递或配送运费计重</view> <view class="u-m-t-16 color-999 u-font-24">用于快递或配送运费计重</view>
@@ -541,11 +541,10 @@
</view> </view>
</uni-forms-item> </uni-forms-item>
</view> --> </view> -->
<view class="border-top-0"> <!-- <view class="border-top-0">
<view class="u-flex u-row-between u-p-b-24 u-p-t-20"> <view class="u-flex u-row-between u-p-b-24 u-p-t-20">
<view class="label-title">是否允许临时改价</view> <view class="label-title">是否允许临时改价</view>
<my-switch disabled :openDisabledClass="false" <my-switch v-model="FormData.isTempPrice"></my-switch>
v-model="FormData.isTempPrice"></my-switch>
</view> </view>
</view> </view>
<view class="u-p-t-24 u-p-b-24 border-top u-flex u-row-between"> <view class="u-p-t-24 u-p-b-24 border-top u-flex u-row-between">
@@ -574,18 +573,20 @@
<price-number-box placeholder="请输入每人限购" <price-number-box placeholder="请输入每人限购"
v-model="FormData.singlePeopleLimit"></price-number-box> v-model="FormData.singlePeopleLimit"></price-number-box>
</view> </view>
</view> </view> -->
<view> <view>
<uni-forms-item label=""> <uni-forms-item label="">
<view class="u-flex u-row-between" @tap="toTimerPage"> <view class="u-flex u-row-between" @tap="toTimerPage">
<view> <view style="display: flex;">
<text class="color-red">*</text>
<view class="label-title">定时上下架</view> <view class="label-title">定时上下架</view>
</view> </view>
<view class="u-flex u-font-24"> <view class="u-flex u-font-24">
<view> <view>
<view class="color-666">{{returnTimerDayText()}}</view> <view class="color-666">{{returnTimerDayText()}}</view>
<view class="color-666 u-m-t-4" v-if="FormData.days"> <view class="color-666 u-m-t-4" v-if="FormData.days">
{{returnTimerTimeText()}}</view> {{returnTimerTimeText()}}
</view>
</view> </view>
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</view> </view>
@@ -702,8 +703,8 @@
<choose-guige ref="refChooseGuige" @confirm="refChooseGuigeConfirm"></choose-guige> <choose-guige ref="refChooseGuige" @confirm="refChooseGuigeConfirm"></choose-guige>
<!-- 更多操作 --> <!-- 更多操作 -->
<my-action-sheet @itemClick="actionSheetClick" ref="refMoreSheet" :list="actionSheet.list"></my-action-sheet> <my-action-sheet @itemClick="actionSheetClick" ref="refMoreSheet" :list="actionSheet.list"></my-action-sheet>
</view> </view>
@@ -897,13 +898,13 @@
let proGroupVoGoodsIndex = undefined let proGroupVoGoodsIndex = undefined
function refChooseGuigeOpen(skuList, groupIndex, goodsIndex) { function refChooseGuigeOpen(skuList, groupIndex, goodsIndex) {
console.log(groupIndex, goodsIndex)
proGroupVoIndex = groupIndex proGroupVoIndex = groupIndex
proGroupVoGoodsIndex = goodsIndex proGroupVoGoodsIndex = goodsIndex
refChooseGuige.value.open(skuList) refChooseGuige.value.open(skuList)
} }
function refChooseGuigeConfirm(sku) { function refChooseGuigeConfirm(sku) {
console.log(sku);
FormData.proGroupVo[proGroupVoIndex].goods[proGroupVoGoodsIndex].skuName = sku.specSnap || sku.name FormData.proGroupVo[proGroupVoIndex].goods[proGroupVoGoodsIndex].skuName = sku.specSnap || sku.name
FormData.proGroupVo[proGroupVoIndex].goods[proGroupVoGoodsIndex].skuId = sku.id FormData.proGroupVo[proGroupVoIndex].goods[proGroupVoGoodsIndex].skuId = sku.id
proGroupVoIndex = undefined proGroupVoIndex = undefined
@@ -917,7 +918,7 @@
function proGroupVoAddGoods(index, arr) { function proGroupVoAddGoods(index, arr) {
proGroupVoIndex = index proGroupVoIndex = index
if(!FormData.proGroupVo){ if (!FormData.proGroupVo) {
initDefaultProGroupVo() initDefaultProGroupVo()
} }
if (FormData.groupType == 0) { if (FormData.groupType == 0) {
@@ -946,7 +947,6 @@
} }
function refChooseGoodsConfirm(arr) { function refChooseGoodsConfirm(arr) {
console.log(arr);
refChooseGoodsClose() refChooseGoodsClose()
arr = arr.map(v => { arr = arr.map(v => {
const { const {
@@ -975,10 +975,8 @@
skuName: '' skuName: ''
} }
}) })
console.log(arr);
console.log(FormData.groupType);
if (FormData.groupType == 0) { if (FormData.groupType == 0) {
console.log(FormData.proGroupVo[0]);
return FormData.proGroupVo[0].goods = arr return FormData.proGroupVo[0].goods = arr
} }
if (FormData.groupType == 1 && proGroupVoIndex !== undefined) { if (FormData.groupType == 1 && proGroupVoIndex !== undefined) {
@@ -1231,15 +1229,15 @@
//表单边框 //表单边框
const inputBorder = ref(false) const inputBorder = ref(false)
const FormData = reactive({ const FormData = reactive({
days: '', days: "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",
startTime: '', endTime: "23:59",
endTime: '', startTime: "00:00",
//每日销量上限, //每日销量上限,
dayLimit: 0, dayLimit: 0,
singleOrderLimit:0, singleOrderLimit: 0,
singlePeopleLimit:0, singlePeopleLimit: 0,
type: 'normal', type: 'normal',
showType: 'table', showType: ['table'],
specsInfoName: '', specsInfoName: '',
id: "", id: "",
typeEnum: "normal", typeEnum: "normal",
@@ -1365,7 +1363,7 @@
res.specsInfoName = specsInfoName res.specsInfoName = specsInfoName
$goodsData = res $goodsData = res
skuList.list = res.skuList skuList.list = res.skuList
res.showType=res.showType.split(',') res.showType = res.showType.split(',')
Object.assign(FormData, res) Object.assign(FormData, res)
//多规格 //多规格
if (res.typeEnum === 'sku') { if (res.typeEnum === 'sku') {
@@ -1573,6 +1571,12 @@
getTbShopUnit() getTbShopUnit()
getTbProductSpec() getTbProductSpec()
}) })
const changeFormDatatype = (e) => {
console.log(e)
console.log(FormData)
// 当是称重商品时 默认是单规格
FormData.typeEnum = 'normal'
}
onShow(() => { onShow(() => {
// if (option.type === 'edit') { // if (option.type === 'edit') {
@@ -1686,13 +1690,15 @@
} }
} }
if (type == 'package') { if (type == 'package') {
if (groupType == 0) { if (groupType == 0 && FormData.proGroupVo[0].goods.length <= 0) {
// 固定套餐 // 固定套餐
return infoBox.showToast('套餐组合至少需要包含一种商品,请添加商品')
} }
if (groupType == 1) { if (groupType == 1) {
let ispase = FormData.proGroupVo.length > 0 ? true : false let ispase = FormData.proGroupVo.length > 0 ? true : false
let tips = ispase ? '' : '请添加至少一种套餐' let tips = ispase ? '' : '请添加至少一种套餐'
for (let i in FormData.proGroupVo) { for (let i in FormData.proGroupVo) {
FormData.proGroupVo[i].count = FormData.proGroupVo[i].goods.length
const item = FormData.proGroupVo[i] const item = FormData.proGroupVo[i]
if (item.goods.length <= 0) { if (item.goods.length <= 0) {
ispase = false ispase = false
@@ -1711,14 +1717,14 @@
// 可选套餐 // 可选套餐
} }
} }
if (type == 'weight') { if (type == 'weigh') {
if (!FormData.weight) { if (!FormData.weight) {
return infoBox.showToast('请输入重量') return infoBox.showToast('请输入重量')
} }
} }
const submitData = { const submitData = {
...FormData, ...FormData,
showType:FormData.showType.join(','), showType: FormData.showType.join(','),
proGroupVo: type != 'package' ? '' : FormData.proGroupVo, proGroupVo: type != 'package' ? '' : FormData.proGroupVo,
images: images, images: images,
coverImg: images[0] || '', coverImg: images[0] || '',
@@ -1744,6 +1750,19 @@
}) })
}) })
} }
// 如果套餐没选择规格,默认选中第一条
console.log(submitData.proGroupVo)
if (submitData.proGroupVo) {
submitData.proGroupVo.forEach((res, index) => {
submitData.proGroupVo[index].goods.forEach(ele => {
if (!ele.skuId) {
ele.skuId = ele.skuList[0].id
ele.skuName = ele.skuList[0].specSnap || ele.skuList[0].name
}
})
})
}
submitData.selectSpec = submitData.selectSpec =
$addProduct(submitData).then(res => { $addProduct(submitData).then(res => {
infoBox.showSuccessToast('添加成功') infoBox.showSuccessToast('添加成功')
@@ -1767,7 +1786,6 @@
return result.replace(/.$/, "") return result.replace(/.$/, "")
} }
}) })
/** /**
* 监听规格保存,拿到数据 * 监听规格保存,拿到数据
*/ */
@@ -1931,12 +1949,15 @@
watch(() => FormData.type, (newval) => { watch(() => FormData.type, (newval) => {
if (option.type == 'edit') { if (option.type == 'edit') {
if (newval == $goodsData.type) { if (newval == $goodsData.type) {
if($goodsData.proGroupVo){ if ($goodsData.proGroupVo) {
FormData.proGroupVo = $goodsData.proGroupVo||[] FormData.proGroupVo = $goodsData.proGroupVo || []
}else{ } else {
initDefaultProGroupVo() initDefaultProGroupVo()
} }
} }
if (FormData.groupType == null) {
FormData.groupType = 0
}
} else { } else {
if (newval == 'package') { if (newval == 'package') {
initDefaultProGroupVo() initDefaultProGroupVo()
@@ -2002,11 +2023,22 @@
disabledChangeCategory.value = !res disabledChangeCategory.value = !res
} }
} }
const activeinHouseList = computed(() => {
try {
return pageData.units.filter((item) => {
if (item.id == FormData.unitId) {
return item.name
}
})[0].name
} catch (error) {
//TODO handle the exception
}
});
/** /**
* 权限end * 权限end
*/ */
watch(() => pageData.types, (newval) => { watch(() => pageData.types, (newval) => {
Forms.value.setRules(rules) Forms.value.setRules(rules)
}) })
@@ -2017,6 +2049,7 @@
onReady(() => { onReady(() => {
Forms.value && Forms.value.setRules(rules) Forms.value && Forms.value.setRules(rules)
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => {
clearTimeout(timer) clearTimeout(timer)
}) })
@@ -2130,7 +2163,8 @@
flex-wrap: nowrap; flex-wrap: nowrap;
justify-content: space-between; justify-content: space-between;
} }
::v-deep .typeEnum .u-checkbox-group--row{
::v-deep .typeEnum .u-checkbox-group--row {
flex-wrap: nowrap; flex-wrap: nowrap;
justify-content: space-between; justify-content: space-between;
} }

View File

@@ -91,7 +91,8 @@
const hour = times.value[0][indexArr[0]] const hour = times.value[0][indexArr[0]]
const month = times.value[1][indexArr[1]] const month = times.value[1][indexArr[1]]
const s = times.value[2][indexArr[2]] const s = times.value[2][indexArr[2]]
return `${hour}:${month}:${s}` // return `${hour}:${month}:${s}`
return `${hour}:${month}`
} }
//获取$event.detail.value //获取$event.detail.value
function getEnentDetailValue(e) { function getEnentDetailValue(e) {
@@ -152,11 +153,11 @@
function returnBasicTimeConstructor() { function returnBasicTimeConstructor() {
return { return {
startTime: { startTime: {
value: '00:00:00', value: '00:00',
index: [0, 0, 0] index: [0, 0, 0]
}, },
endTime: { endTime: {
value: '00:00:00', value: '23:59',
index: [0, 0, 0] index: [0, 0, 0]
} }
} }
@@ -190,13 +191,13 @@
} }
// 触发定时器保存事件将数据给到添加商品页面 // 触发定时器保存事件将数据给到添加商品页面
function emitTimerSave() { function emitTimerSave() {
const par={ const par = {
days:list.value[0].cycleChecked.join(','), days: list.value[0].cycleChecked.join(','),
startTime:list.value[0].startTime.value, startTime: list.value[0].startTime.value,
endTime:list.value[0].endTime.value endTime: list.value[0].endTime.value
} }
console.log(par); console.log(par);
uni.$emit('timerSave',par) uni.$emit('timerSave', par)
go.back() go.back()
} }
@@ -207,14 +208,14 @@
function returnTimeIndex(time) { function returnTimeIndex(time) {
console.log(time); console.log(time);
return time.split(':').map(v=>{ return time.split(':').map(v => {
return v*1 return v * 1
}) })
} }
function returnTimer(res) { function returnTimer(res) {
return [{ return [{
cycleChecked: res.days ? res.days.split(',').filter(v=>v) : [], cycleChecked: res.days ? res.days.split(',').filter(v => v) : [],
startTime: res.startTime ? { startTime: res.startTime ? {
value: res.startTime, value: res.startTime,
index: returnTimeIndex(res.startTime) index: returnTimeIndex(res.startTime)

View File

@@ -11,7 +11,7 @@
<!-- 不需要label, 需要修改 label-width="0" --> <!-- 不需要label, 需要修改 label-width="0" -->
<uni-forms ref="loginFormRef" label-width="0" :model="vdata.formData" :rules="rules"> <uni-forms ref="loginFormRef" label-width="0" :model="vdata.formData" :rules="rules">
<view > <view>
<uni-forms-item name="username"> <uni-forms-item name="username">
<uni-easyinput class='jeepay-easyinput' placeholder="请输入登录名/手机号" <uni-easyinput class='jeepay-easyinput' placeholder="请输入登录名/手机号"
v-model="vdata.formData.username" :clearable="false"> v-model="vdata.formData.username" :clearable="false">
@@ -29,7 +29,8 @@
</template> </template>
<template #suffixIcon> <template #suffixIcon>
<view class='show-tips' @tap="vdata.isShowPwd = !vdata.isShowPwd "> <view class='show-tips' @tap="vdata.isShowPwd = !vdata.isShowPwd ">
{{ vdata.isShowPwd ? '隐藏' : '显示' }}</view> {{ vdata.isShowPwd ? '隐藏' : '显示' }}
</view>
</template> </template>
</uni-easyinput> </uni-easyinput>
</uni-forms-item> </uni-forms-item>
@@ -55,7 +56,6 @@
</view> </view>
</template> </template>
<script setup> <script setup>
import { import {
login login
} from '@/http/businessApiManger.js'; } from '@/http/businessApiManger.js';
@@ -107,12 +107,11 @@
function loginFunc() { function loginFunc() {
// 表单验证 // 表单验证
formUtil.validate(loginFormRef.value).then(() => { formUtil.validate(loginFormRef.value).then(() => {
login(vdata.formData).then((res) => { login(vdata.formData).then((res) => {
console.log(res);
useStorage.set('token', res.data.token); useStorage.set('token', res.data.token);
useStorage.set('userInfo', res.data.user); useStorage.set('userInfo', res.data.user);
uni.showToast({ uni.showToast({

View File

@@ -8,8 +8,7 @@
"^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue" "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"
} }
}, },
"pages": [ "pages": [{
{
"pageId": "PAGES_INDEX", "pageId": "PAGES_INDEX",
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
@@ -27,6 +26,20 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"pageId": "PAGES_STATIC_POLICY",
"path": "pages/login/privacyPolicy",
"style": {
"navigationBarTitleText": "隐私政策"
}
},
{
"pageId": "PAGES_STATIC_AGREEMENT",
"path": "pages/login/serviceAgreement",
"style": {
"navigationBarTitleText": "用户服务协议"
}
},
{ {
"pageId": "PAGES_ME", "pageId": "PAGES_ME",
"path": "pages/user/user", "path": "pages/user/user",
@@ -631,6 +644,13 @@
"navigationBarTitleText": "确认订单" "navigationBarTitleText": "确认订单"
} }
}, },
{
"pageId": "PAGES_ROTATING_TABLES",
"path": "confirm-order/rotatingTables",
"style": {
"navigationBarTitleText": "转桌/并桌"
}
},
{ {
"pageId": "PAGES_CHOOSE_TABLE", "pageId": "PAGES_CHOOSE_TABLE",
"path": "choose-table/choose-table", "path": "choose-table/choose-table",
@@ -639,7 +659,7 @@
} }
}, },
{ {
"pageId": "PAGES_ADD_TEMP_CUISINE", "pageId": "PAGES_CHOOSE_ADD_TEMP_CUISINE",
"path": "add-temp-cuisine/add-temp-cuisine", "path": "add-temp-cuisine/add-temp-cuisine",
"style": { "style": {
"navigationBarTitleText": "添加临时菜" "navigationBarTitleText": "添加临时菜"
@@ -760,13 +780,28 @@
{ {
"root": "pageBwc", "root": "pageBwc",
"pages": [{ "pages": [{
"pageId": "PAGES_BWC", "pageId": "PAGES_BWC",
"path": "index/index", "path": "index/index",
"style": { "style": {
"navigationBarTitleText": "霸王餐" "navigationBarTitleText": "霸王餐"
}
} }
] }]
},
{
"root": "pagewriteoff",
"pages": [{
"pageId": "PAGES_WEITEOFF",
"path": "index/index",
"style": {
"navigationBarTitleText": "核销列表"
}
}, {
"pageId": "PAGES_WEITEOFF_RECORD",
"path": "index/record",
"style": {
"navigationBarTitleText": "核销记录"
}
}]
}, },
{ {
"root": "pageBooking", "root": "pageBooking",
@@ -877,11 +912,10 @@
} }
}, },
{ {
"path" : "quan/quan", "path": "quan/quan",
"pageId": "PAGES_ORDER_QUAN", "pageId": "PAGES_ORDER_QUAN",
"style" : "style": {
{ "navigationBarTitleText": "券包"
"navigationBarTitleText" : "券包"
} }
} }
@@ -1094,44 +1128,42 @@
{ {
"root": "pageNotification", "root": "pageNotification",
"pages": [{ "pages": [{
"pageId": "PAGES_NOTIFICATION_INDEX", "pageId": "PAGES_NOTIFICATION_INDEX",
"path": "index", "path": "index",
"style": { "style": {
"navigationBarTitleText": "订阅通知" "navigationBarTitleText": "订阅通知"
}
} }
] }]
}, },
{ {
"root": "pageCreditBuyer", "root": "pageCreditBuyer",
"pages": [{ "pages": [{
"pageId": "PAGES_CREDIT_BUYER_INDEX", "pageId": "PAGES_CREDIT_BUYER_INDEX",
"path": "index", "path": "index",
"style": { "style": {
"navigationBarTitleText": "挂账管理" "navigationBarTitleText": "挂账管理"
}
},{
"pageId": "PAGES_CREDIT_BUYER_ADDDEBTOR",
"path": "addDebtor",
"style": {
"navigationBarTitleText": "挂账人"
}
},{
"pageId": "PAGES_CREDIT_BUYER_REPAYMENTRECORD",
"path": "rePaymentRecord",
"style": {
"navigationBarTitleText": "账单付款记录"
}
},{
"pageId": "PAGES_CREDIT_BUYER_DETAIL",
"path": "creditDetail",
"style": {
"navigationBarTitleText": "查看明细"
}
} }
] }, {
"pageId": "PAGES_CREDIT_BUYER_ADDDEBTOR",
"path": "addDebtor",
"style": {
"navigationBarTitleText": "挂账人"
}
}, {
"pageId": "PAGES_CREDIT_BUYER_REPAYMENTRECORD",
"path": "rePaymentRecord",
"style": {
"navigationBarTitleText": "账单付款记录"
}
}, {
"pageId": "PAGES_CREDIT_BUYER_DETAIL",
"path": "creditDetail",
"style": {
"navigationBarTitleText": "查看明细"
}
}]
} }
], ],
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",

View File

@@ -284,8 +284,11 @@
// pageUrl: 'PAGES_RED_INDEX', // pageUrl: 'PAGES_RED_INDEX',
// entId: 'ENT_MCH_MEMBER' // entId: 'ENT_MCH_MEMBER'
// }, // },
{
title: '核销管理',
icon: '/static/indexImg/pagewriteoff.svg',
pageUrl: 'PAGES_WEITEOFF'
},
{ {
title: '退出登录', title: '退出登录',
icon: '/static/indexImg/icon-login-out.svg', icon: '/static/indexImg/icon-login-out.svg',
@@ -373,6 +376,7 @@
/* #endif */ /* #endif */
/* #ifndef H5 */ /* #ifndef H5 */
padding-top: calc(84rpx + 44px); padding-top: calc(84rpx + 44px);
/* #endif */ /* #endif */
>view { >view {
text-align: center; text-align: center;

View File

@@ -109,7 +109,7 @@
</view> </view>
</uni-forms> </uni-forms>
<!-- #ifdef MP-WEIXIN -->
<view class="agreement-policy"> <view class="agreement-policy">
<JeepayCheckbox v-model:checked="vdata.isSelectedAgreement" /> <JeepayCheckbox v-model:checked="vdata.isSelectedAgreement" />
同意 同意
@@ -117,16 +117,18 @@
<text></text> <text></text>
<text class="policy" @click="toPrivacy">隐私政策</text> <text class="policy" @click="toPrivacy">隐私政策</text>
</view> </view>
<!-- #endif -->
<!-- <view class="agreement-policy"> <!-- #ifndef MP-WEIXIN -->
<view class="agreement-policy">
<JeepayCheckbox v-model:checked="vdata.isSelectedAgreement" /> <JeepayCheckbox v-model:checked="vdata.isSelectedAgreement" />
同意 同意
<text class="agreement" @click="go.to('PAGES_STATIC_AGREEMENT')">用户服务协议</text> <text class="agreement" @click="go.to('PAGES_STATIC_AGREEMENT')">用户服务协议</text>
<text></text> <text></text>
<text class="policy" @click="toPrivacy">隐私政策</text>
<text class="policy" @click="go.to('PAGES_STATIC_POLICY')">隐私政策</text> <text class="policy" @click="go.to('PAGES_STATIC_POLICY')">隐私政策</text>
</view> --> </view>
<!-- #endif -->
<Button @tap="loginFunc">登录</Button> <Button @tap="loginFunc">登录</Button>
@@ -249,7 +251,7 @@
}) })
// #ifdef H5 // #ifdef H5
vdata.formData.username = '17792050546' vdata.formData.username = '17792050546'
vdata.formData.pwd = 'sy666888' vdata.formData.pwd = 'qwer1234'
// #endif // #endif
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
// vdata.formData.username = '15699991111' // vdata.formData.username = '15699991111'
@@ -258,11 +260,11 @@
function accountTypeChange(e) { function accountTypeChange(e) {
// #ifdef H5 // #ifdef H5
if(e==1){ if (e == 1) {
vdata.formData.merchantName = '18049104914' vdata.formData.merchantName = '18049104914'
vdata.formData.username = '13666666666' vdata.formData.username = '13666666666'
vdata.formData.pwd = '123456' vdata.formData.pwd = '123456'
}else{ } else {
vdata.formData.pwd = 'qwer1234' vdata.formData.pwd = 'qwer1234'
} }
// #endif // #endif
@@ -301,6 +303,7 @@
} }
function loginFunc() { function loginFunc() {
// 表单验证 // 表单验证
formUtil.validate(loginFormRef.value).then(() => { formUtil.validate(loginFormRef.value).then(() => {
if (!vdata.isSelectedAgreement) { if (!vdata.isSelectedAgreement) {
@@ -375,11 +378,17 @@
storageManage.shopId(loginBizData.shopId) storageManage.shopId(loginBizData.shopId)
storageManage.shopUserId(loginBizData.user.user.id) storageManage.shopUserId(loginBizData.user.user.id)
storageManage.userInfo(loginBizData) storageManage.userInfo(loginBizData)
uni.showToast({
title: loginBizData.expireDate + '后到期',
icon: 'none'
});
setTimeout(() => {
// 跳转到首页
go.to("PAGES_INDEX", {
isGetCid: true
}, go.GO_TYPE_RELAUNCH)
}, 1000)
// 跳转到首页
go.to("PAGES_INDEX", {
isGetCid: true
}, go.GO_TYPE_RELAUNCH)
} }
// 点击发送验证码的函数 // 点击发送验证码的函数

View File

@@ -17,9 +17,9 @@ let vdata = reactive({
content: '', content: '',
}) })
onLoad(() => { onLoad(() => {
$getTreaty().then(({ bizData }) => { // $getTreaty().then(({ bizData }) => {
vdata.content = bizData.privacyPolicy // vdata.content = bizData.privacyPolicy
}) // })
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -1,28 +1,35 @@
<template> <template>
<!-- #ifdef APP || H5 --> <!-- #ifdef APP || H5 -->
<web-view src="/static/service.html"></web-view> <web-view src="/static/service.html"></web-view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<mp-html :content='vdata.content'/> <mp-html :content='vdata.content' />
<!-- #endif --> <!-- #endif -->
</template> </template>
<script setup> <script setup>
import { ref, reactive } from 'vue' import {
import { $getTreaty } from '@/http/apiManager.js' ref,
import { onLoad } from '@dcloudio/uni-app' reactive
} from 'vue'
import {
$getTreaty
} from '@/http/apiManager.js'
import {
onLoad
} from '@dcloudio/uni-app'
let vdata = reactive({ let vdata = reactive({
content: '', content: '',
}) })
onLoad(() => { onLoad(() => {
$getTreaty().then(({ bizData }) => { // $getTreaty().then(({ bizData }) => {
vdata.content = bizData.serviceAgreement // vdata.content = bizData.serviceAgreement
}) // })
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.content-wrapper{ .content-wrapper {
padding: 30rpx; padding: 30rpx;
} }
</style> </style>

View File

@@ -125,9 +125,12 @@
reactive, reactive,
onMounted, onMounted,
ref, ref,
onBeforeMount onBeforeMount,
} from 'vue'; } from 'vue';
import {onLoad} from '@dcloudio/uni-app' import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const units = reactive({ const units = reactive({
list: [], list: [],
current: '' current: ''
@@ -187,11 +190,12 @@
}] }]
}, },
} }
let timer=null let timer = null
function submit() { function submit() {
refform.value.validate(res => { refform.value.validate(res => {
console.log(res) console.log(res)
if(!res){ if (!res) {
$temporaryDishes({ $temporaryDishes({
"useType": option.useType, "useType": option.useType,
"masterId": option.masterId, "masterId": option.masterId,
@@ -200,15 +204,15 @@
"categoryId": category[categoryCurrent.value].id, "categoryId": category[categoryCurrent.value].id,
"price": form.price, "price": form.price,
"num": form.num, "num": form.num,
unit:units.list[units.current].id, unit: units.list[units.current].id,
"note": form.note, "note": form.note,
"vipUserId": option.vipUserId "vipUserId": option.vipUserId
}).then(r=>{ }).then(r => {
uni.$emit('add:cashCai') uni.$emit('add:cashCai')
clearInterval(timer) clearInterval(timer)
timer=setTimeout(()=>{ timer = setTimeout(() => {
uni.navigateBack() uni.navigateBack()
},500) }, 500)
}) })
} }
}).catch(err => { }).catch(err => {
@@ -234,7 +238,7 @@
page: 0, page: 0,
size: 600 size: 600
}) })
const arr = returnAllCategory(res.content).map(v => { const arr = forList(res.content).map(v => {
return { return {
...v, ...v,
value: v.id value: v.id
@@ -244,23 +248,39 @@
for (let i in arr) { for (let i in arr) {
category[i] = arr[i] category[i] = arr[i]
} }
console.log(category); }
function forList(arr) {
let arrs = []
arr.forEach(ele => {
arrs.push(ele)
if (ele.childrenList.length) {
ele.childrenList.forEach(res => {
arrs.push(res)
})
}
})
return arrs
} }
async function init() { async function init() {
getTbShopUnit() getTbShopUnit()
getCategory() getCategory()
} }
onMounted(() => { // onMounted(() => {
init() // init()
// })
onLoad((opt) => {
Object.assign(option, opt)
setTimeout(() => {
init()
}, 600)
}) })
onBeforeMount(()=>{
onBeforeMount(() => {
clearInterval(timer) clearInterval(timer)
}) })
const option=reactive({ const option = reactive({
})
onLoad((opt)=>{
Object.assign(option,opt)
}) })
</script> </script>

View File

@@ -1,9 +1,9 @@
<template> <template>
<my-model ref="model" :title="title" iconColor="#000" @close="resetForm"> <my-model ref="model" :title="title" iconColor="#000" @close="resetForm">
<template #desc> <template #desc>
<view class="u-m-t-48 tab"> <!-- <view class="u-m-t-48 tab">
<my-tabs :list="tabs" @change="tabsChange"></my-tabs> <my-tabs :list="tabs" @change="tabsChange"></my-tabs>
</view> </view> -->
<view class="u-text-left u-p-30 "> <view class="u-text-left u-p-30 ">
<template v-if="!current"> <template v-if="!current">
<view> <view>
@@ -34,7 +34,6 @@
<view class="u-flex-1"> <view class="u-flex-1">
<input @input="discountMoneyInput" v-model="form.discountMoney" type="digit" <input @input="discountMoneyInput" v-model="form.discountMoney" type="digit"
placeholder-class="placeholder-class" placeholder="减8.55元请输入8.55" /> placeholder-class="placeholder-class" placeholder="减8.55元请输入8.55" />
</view> </view>
<view class="color-999 u-p-l-48 u-p-r-48 u-flex u-row-center u-col-center"> <view class="color-999 u-p-l-48 u-p-r-48 u-flex u-row-center u-col-center">
<view></view> <view></view>
@@ -46,19 +45,22 @@
</view> </view>
</template> </template>
<view class="u-m-t-48"> <view class="u-m-t-48">
<view class="u-font-24"> <view class="u-font-24">
<text class="color-999">打折原因</text> <text class="color-999">当前单品价格{{price}}</text>
<text class="color-red">*</text> </view>
</view> <view class="u-font-24">
<text class="color-999">打折原因</text>
<text class="color-red">*</text>
</view>
<view class="u-flex u-m-t-24"> <view class="u-flex u-m-t-24">
<view class="u-flex" v-for="(item,index) in causes" :key="index"> <view class="u-flex" v-for="(item,index) in causes" :key="index">
<button @tap="changeCauses(item)" class="tag u-m-r-20" <button @tap="changeCauses(item,index)" class="tag u-m-r-20"
:class="{active:item.checked}">{{item.name}}</button> :class="{active:item.checked}">{{item.name}}</button>
</view> </view>
</view> </view>
</view> </view>
<view class="u-m-t-32 u-flex "> <view class="u-m-t-32 u-flex ">
<uni-easyinput type="textarea" v-model="value" placeholder="自定义内容"></uni-easyinput> <uni-easyinput type="textarea" v-model="form.note" placeholder="自定义内容"></uni-easyinput>
</view> </view>
</view> </view>
@@ -67,7 +69,10 @@
<view class="u-p-30"> <view class="u-p-30">
<view class="u-m-t-10"> <view class="u-m-t-10">
<my-button @tap="confirm" shape="circle" showShadow>确认</my-button> <my-button @tap="confirm" shape="circle" showShadow>确认</my-button>
<my-button type="cancel" bgColor="#fff" @tap="confirm">取消</my-button> <view style="height: 20rpx;">
</view>
<!-- <my-button type="cancel" bgColor="#fff" @tap="confirm">取消</my-button> -->
</view> </view>
</view> </view>
</template> </template>
@@ -86,7 +91,7 @@
import myTabs from '@/components/my-components/my-tabs.vue' import myTabs from '@/components/my-components/my-tabs.vue'
const props = defineProps({ const props = defineProps({
price: { price: {
type: [Number,String], type: [Number, String],
default: 0 default: 0
}, },
title: { title: {
@@ -98,12 +103,10 @@
default: [] default: []
} }
}) })
function changeCauses(item) {
item.checked = !item.checked
}
const discounts = [95, 90, 85, 80] const discounts = [95, 90, 85, 80]
const causes = reactive([{ const causes = reactive([{
@@ -120,6 +123,11 @@
} }
]) ])
function changeCauses(item, index) {
item.checked = !item.checked
form.notes = causes
}
function discountInput(e) { function discountInput(e) {
if (e.detail.value >= 100) { if (e.detail.value >= 100) {
nextTick(() => { nextTick(() => {
@@ -127,8 +135,9 @@
}) })
} }
} }
function discountMoneyInput(e) { function discountMoneyInput(e) {
const max=100 const max = 100
if (e.detail.value >= max) { if (e.detail.value >= max) {
nextTick(() => { nextTick(() => {
form.discountMoney = 100 form.discountMoney = 100
@@ -142,7 +151,7 @@
const tabs = ['打折', '减免'] const tabs = ['打折', '减免']
let current = ref(0) let current = ref(1)
function tabsChange(i) { function tabsChange(i) {
console.log(i); console.log(i);
@@ -158,11 +167,12 @@
const form = reactive({ const form = reactive({
...$form ...$form
}) })
watch(()=>props.price,(newval)=>{ watch(() => props.price, (newval) => {
console.log(newval); console.log(newval);
form.price=newval form.price = newval
form.currentPrice=newval form.currentPrice = newval
}) })
function resetForm() { function resetForm() {
Object.assign(form, { Object.assign(form, {
...$form ...$form
@@ -182,22 +192,23 @@
function confirm() { function confirm() {
const { const {
discount,discountMoney discount,
discountMoney
} = form } = form
if (current.value===0&& discount==='') { if (current.value === 0 && discount === '') {
return uni.showToast({ return uni.showToast({
icon: 'none', icon: 'none',
title: '请输入有效折扣!' title: '请输入有效折扣!'
}) })
} }
if (current.value===1&& discountMoney==='') { if (current.value === 1 && discountMoney === '') {
return uni.showToast({ return uni.showToast({
icon: 'none', icon: 'none',
title: '请输入有效减免价格!' title: '请输入有效减免价格!'
}) })
} }
close()
emits('confirm', form) emits('confirm', form)
close()
} }
defineExpose({ defineExpose({
open, open,

View File

@@ -112,6 +112,15 @@
</view> </view>
</view> </view>
</template> </template>
<template v-if="goods.list[0].tableId">
<!-- 不免餐位费 -->
<view class="block" @tap="rotatingTables"
style="display: flex;align-items: center;justify-content: space-between;">
<view>转桌/并桌</view>
<uni-icons type="right" color="#999" size="16"></uni-icons>
</view>
</template>
</template> </template>
<view class="block"> <view class="block">
@@ -136,10 +145,15 @@
:key="index"> :key="index">
<view class="u-flex u-row-between "> <view class="u-flex u-row-between ">
<view class="u-flex"> <view class="u-flex">
<image class="img" :src="item.coverImg" mode=""></image> <image class="img" v-if="item.coverImg" :src="item.coverImg" mode=""></image>
<view
style="background-color: #3f9eff; width: 84rpx;height: 84rpx;line-height: 84rpx;text-align: center;color: #fff;"
v-else>
临时菜
</view>
<view class="u-m-l-32"> <view class="u-m-l-32">
<view class="u-flex"> <view class="u-flex">
<view class="u-flex u-m-r-20" v-if="item.isWait"> <view class="u-flex u-m-r-20" v-if="item.isWaitCall">
<uni-tag text="等叫" <uni-tag text="等叫"
custom-style="background-color: #FFF0DF; border-color: #FFF0DF; color: #FF9F2E;"> custom-style="background-color: #FFF0DF; border-color: #FFF0DF; color: #FF9F2E;">
</uni-tag> </uni-tag>
@@ -154,6 +168,11 @@
custom-style="background-color: #E6F0FF; border-color: #E6F0FF; color: #318AFE;" custom-style="background-color: #E6F0FF; border-color: #E6F0FF; color: #318AFE;"
size="small" text="打包" inverted type="success" /> size="small" text="打包" inverted type="success" />
</view> </view>
<view class="u-m-r-20 u-flex" v-if="item.isPrint">
<uni-tag
custom-style="background-color: #E6F0FF; border-color: #E6F0FF; color: #318AFE;"
size="small" text="打印" inverted type="success" />
</view>
<view> <view>
{{item.name}} {{item.name}}
</view> </view>
@@ -174,7 +193,8 @@
<text <text
class="line-th color-999">{{formatPrice(item.salePrice*item.number) }}</text> class="line-th color-999">{{formatPrice(item.salePrice*item.number) }}</text>
<view class="u-absolute" style="right: 0;bottom: 100%;"> <view class="u-absolute" style="right: 0;bottom: 100%;">
<text class="font-bold">{{formatPrice(item.memberPrice*item.number) }}</text> <text
class="font-bold">{{formatPrice(item.memberPrice*item.number) }}</text>
</view> </view>
</template> </template>
<template v-else> <template v-else>
@@ -196,9 +216,10 @@
</template> </template>
<scroll-view class="u-m-t-32" scroll-x="true" v-if="index==goods.sel"> <scroll-view class="u-m-t-32" scroll-x="true" v-if="index==goods.sel">
<view class=" u-flex no-wrap "> <view class=" u-flex no-wrap ">
<!-- <view class="u-flex u-m-r-20 u-m-b-20"> <view class="u-flex u-m-r-20 " v-if="!item.isGift">
<button class="tag" hover-class="hover-class" @tap="showModel('discount')">单品打折</button> <button class="tag" hover-class="hover-class"
</view> --> @tap="showModel('discount',index)">单品打折</button>
</view>
<view class="u-flex u-m-r-20 "> <view class="u-flex u-m-r-20 ">
<!-- <button class="tag" hover-class="hover-class" @tap="showModel('giveFood')">赠菜</button> --> <!-- <button class="tag" hover-class="hover-class" @tap="showModel('giveFood')">赠菜</button> -->
<button class="tag" hover-class="hover-class" <button class="tag" hover-class="hover-class"
@@ -208,10 +229,14 @@
<button class="tag" hover-class="hover-class" <button class="tag" hover-class="hover-class"
@tap="toggleGoodsItemKey(item,index,'isPack')">{{item.isPack?'取消打包':'打包'}}</button> @tap="toggleGoodsItemKey(item,index,'isPack')">{{item.isPack?'取消打包':'打包'}}</button>
</view> </view>
<!-- <view class="u-flex u-m-r-20 u-m-b-20"> <view class="u-flex u-m-r-20 ">
<button class="tag" hover-class="hover-class" <button class="tag" hover-class="hover-class"
@tap="toggleWait(item)">{{item.isWait?'取消等叫':'等叫'}}</button> @tap="toggleWait(item)">{{item.isWaitCall?'取消等叫':'等叫'}}</button>
</view> --> </view>
<view class="u-flex u-m-r-20 ">
<button class="tag" hover-class="hover-class"
@tap="toggisPrint(item)">{{item.isPrint?'免厨打':'打印'}}</button>
</view>
<view class="u-flex u-m-r-20 "> <view class="u-flex u-m-r-20 ">
<button class="tag" hover-class="hover-class" <button class="tag" hover-class="hover-class"
@tap="showModel('remark',index)">单品备注</button> @tap="showModel('remark',index)">单品备注</button>
@@ -251,7 +276,7 @@
<view class="font-bold u-font-32">{{formatPrice(youhui) }}</view> <view class="font-bold u-font-32">{{formatPrice(youhui) }}</view>
</view> </view>
</view> </view>
<view class="u-flex price u-m-l-32"> <view class="u-flex price u-m-l-32">
<view class="">实收金额</view> <view class="">实收金额</view>
<view class="font-bold u-font-32">{{formatPrice(allPrice) }}</view> <view class="font-bold u-font-32">{{formatPrice(allPrice) }}</view>
@@ -278,8 +303,8 @@
</view> </view>
</view> </view>
<model-discount title="菜品减免" :ref="setModel" name="discount" :price="modelData.data.salePrice"
<model-discount title="菜品打折/减免" :ref="setModel" name="discount" :price="allPrice"></model-discount> @confirm="discountconfirm"></model-discount>
<give-food title="赠菜" :ref="setModel" name="giveFood"></give-food> <give-food title="赠菜" :ref="setModel" name="giveFood"></give-food>
<one-remark @confirm="goodsOneRemarkConfirm" title="单品备注" :ref="setModel" name="remark"></one-remark> <one-remark @confirm="goodsOneRemarkConfirm" title="单品备注" :ref="setModel" name="remark"></one-remark>
<edit-discount title="优惠金额" :ref="setModel" name="editMoney" :price="allPrice"></edit-discount> <edit-discount title="优惠金额" :ref="setModel" name="editMoney" :price="allPrice"></edit-discount>
@@ -351,7 +376,31 @@
return Number(n).toFixed(2) return Number(n).toFixed(2)
} }
function rotatingTables() {
uni.navigateTo({
url: '/pagesCreateOrder/confirm-order/rotatingTables?item='+JSON.stringify(goods.list),
})
}
// 单品打折
async function discountconfirm(form) {
if (form.discountMoney != '.') {
let str = ''
if (form.notes) {
form.notes.forEach(ele => {
if (ele.checked) {
str = str + ele.name + ','
}
})
}
let obj = {
saleAmount: form.discountMoney,
note: str + form.note,
cartId: modelData.data.id
}
const res = await Api.$updatePrice(obj)
getCart()
}
}
//用餐人数 //用餐人数
const userNumbers = reactive({ const userNumbers = reactive({
@@ -416,18 +465,46 @@
skuId skuId
} }
par[key] = !item[key] par[key] = !item[key]
const res = await Api.$updateCart(par) const res = await Api.$updateCart(par)
goods.list[index][key] = returnBoolean(res[key]) goods.list[index][key] = returnBoolean(res[key])
if (key == 'isPack') { getCart()
getCart()
}
} }
//等叫 //等叫
function toggleWait(item) { async function toggleWait(item) {
item.isWait = !item.isWait item.isWaitCall = !item.isWaitCall
let obj = {
cartId: item.id,
isGift: item.isGift,
isPack: item.isPack,
isPrint: item.isPrint,
isWaitCall: item.isWaitCall,
masterId: option.masterId,
num: item.number, // 0会删除此商品
productId: item.productId,
skuId: item.skuId,
vipUserId: '',
}
let res = await Api.$updateCart(obj)
}
// 打印
async function toggisPrint(item) {
item.isPrint = !item.isPrint
let obj = {
cartId: item.id,
isGift: item.isGift,
isPack: item.isPack,
isPrint: item.isPrint,
isWaitCall: item.isWaitCall,
masterId: option.masterId,
num: item.number, // 0会删除此商品
productId: item.productId,
skuId: item.skuId,
vipUserId: '',
}
let res = await Api.$updateCart(obj)
} }
const eatTypes = reactive({ const eatTypes = reactive({
list: [{ list: [{
@@ -479,7 +556,6 @@
function watchChooseuser() { function watchChooseuser() {
uni.$off('choose-user') uni.$off('choose-user')
uni.$on('choose-user', (data) => { uni.$on('choose-user', (data) => {
console.log(data);
user.value = data user.value = data
setUser() setUser()
}) })
@@ -520,20 +596,25 @@
totalNumber: 0, totalNumber: 0,
totalAmount: 0, totalAmount: 0,
}) })
const isVip=computed(()=>{ const isVip = computed(() => {
return $shop.value.isMemberPrice&& user.value&&user.value.id&&user.value.isVip return $shop.value.isMemberPrice && user.value && user.value.id && user.value.isVip
})
const discountSaleAmount = computed(() => {
return goods.list.filter((v) => v.discountSaleAmount && v.discountSaleAmount > 0)
.reduce((a, b) => {
return a + b.number * b.discountSaleAmount;
}, 0);
}) })
const goodsPrice = computed(() => { const goodsPrice = computed(() => {
const goodsTotalPrice = goods.list.reduce((prve, cur) => { const goodsTotalPrice = goods.list.reduce((prve, cur) => {
const memberPrice=cur.memberPrice?cur.memberPrice:cur.salePrice const memberPrice = cur.memberPrice ? cur.memberPrice : cur.salePrice
const tPrice = (isVip.value? memberPrice:cur.salePrice) * cur.number const tPrice = (isVip.value ? memberPrice : cur.salePrice) * cur.number
const tpackFee = cur.isPack ? cur.packFee * 1 : 0 const tpackFee = cur.isPack ? cur.packFee * 1 : 0
return prve + (cur.isGift ? 0 : tPrice) + tpackFee return prve + (cur.isGift ? 0 : tPrice) + tpackFee
}, 0) }, 0)
return (goodsTotalPrice || 0).toFixed(2) return ((goodsTotalPrice - discountSaleAmount.value) || 0).toFixed(2)
}) })
const allPrice = computed(() => { const allPrice = computed(() => {
console.log(goodsPrice.value);
const n = goodsPrice.value * 1 + $seatFee.totalAmount const n = goodsPrice.value * 1 + $seatFee.totalAmount
return n.toFixed(2) return n.toFixed(2)
// const goodsTotalPrice = goods.list.reduce((prve, cur) => { // const goodsTotalPrice = goods.list.reduce((prve, cur) => {
@@ -541,18 +622,21 @@
// }, 0) // }, 0)
// return (goodsTotalPrice + ($seatFee.totalAmount || 0)).toFixed(2) // return (goodsTotalPrice + ($seatFee.totalAmount || 0)).toFixed(2)
}) })
const youhui=computed(()=>{ const youhui = computed(() => {
if(user.value&&user.value.id&&user.value.isVip){ let goodsTotalPrice = 0
const goodsTotalPrice = goods.list.reduce((prve, cur) => { if (user.value && user.value.id && user.value.isVip) {
goodsTotalPrice = goods.list.reduce((prve, cur) => {
const tPrice = cur.salePrice * cur.number const tPrice = cur.salePrice * cur.number
const tpackFee = cur.isPack ? cur.packFee * 1 : 0 const tpackFee = cur.isPack ? cur.packFee * 1 : 0
return prve + tPrice + tpackFee return prve + tPrice + tpackFee
}, 0) }, 0)
return goodsTotalPrice-allPrice.value return goodsTotalPrice - allPrice.value
}else{ } else {
return 0 console.log(discountSaleAmount.value, '优惠金额')
return (discountSaleAmount.value)
} }
return goodsTotalPrice console.log(discountSaleAmount.value, '优惠金额1')
return (goodsTotalPrice + discountSaleAmount.value * 1).toFixed(2)
}) })
function setGoodsItem(key, val) { function setGoodsItem(key, val) {
@@ -573,16 +657,16 @@
records, records,
seatFee seatFee
} = await Api.getCart(par) } = await Api.getCart(par)
let useType='' let useType = ''
if (seatFee && seatFee.useType) { if (seatFee && seatFee.useType) {
useType=seatFee.useType useType = seatFee.useType
$storageManage.useType(useType) $storageManage.useType(useType)
}else{ } else {
useType=records[0].info[0].useType useType = records[0].info[0].useType
$storageManage.useType(useType) $storageManage.useType(useType)
} }
console.log(useType); console.log(useType);
eatTypes.active =useType == 'takeout' ? useType : useType.replace( eatTypes.active = useType == 'takeout' ? useType : useType.replace(
/-after|-before/g, ''); /-after|-before/g, '');
goods.list = getNowCart(records) goods.list = getNowCart(records)
if (seatFee && seatFee.totalNumber) { if (seatFee && seatFee.totalNumber) {

View File

@@ -0,0 +1,179 @@
<template>
<view style="padding: 20rpx;">
<view class="uni-padding-wrap uni-common-mt">
<uni-segmented-control :current="datas.current" :values=" ['转桌', '并桌']" style-type="button"
active-color="#007aff" @clickItem="onClickItem" />
</view>
<view class="u-m-t-48">
请选择其他桌
</view>
<view class="uni-list">
<radio-group @change="radioChange">
<label class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in datas.tableList" :key="index">
<view class="u-m-t-48 u-m-b-48" v-if="item.status=='using'">
<radio :value="item" /> {{item.name}}
</view>
</label>
</radio-group>
</view>
<view class="uni-list" v-if="datas.current==0">
<view class="u-m-t-48">
请选择需要转桌的菜品
</view>
<checkbox-group @change="checkboxChange">
<label class="uni-list-cell uni-list-cell-pd" v-for="(item,index) in datas.item" :key="index">
<view class="u-flex u-m-t-48 u-m-b-48" style="justify-content: space-between;align-items: center;">
<view class="u-flex">
<checkbox :value="item.id" />
<image class="img" v-if="item.coverImg" :src="item.coverImg" mode=""></image>
&nbsp;&nbsp;
{{item.name}}
</view>
<view class="">
<view class=" u-relative">
<template v-if="item.isGift">
<text class="line-th color-999">{{formatPrice(item.salePrice*item.number) }}</text>
<view class="u-absolute" style="right: 0;bottom: 100%;">
<text class="font-bold">0</text>
</view>
</template>
<template v-else>
<template v-if="isVip&&item.memberPrice&&item.memberPrice*1!=item.salePrice*1">
<text
class="line-th color-999">{{formatPrice(item.salePrice*item.number) }}</text>
<view class="u-absolute" style="right: 0;bottom: 100%;">
<text
class="font-bold">{{formatPrice(item.memberPrice*item.number) }}</text>
</view>
</template>
<template v-else>
<view class="font-bold">
<text></text>
<text class="">{{formatPrice(item.salePrice*item.number) }}</text>
</view>
</template>
</template>
</view>
<view class="color-999 u-text-right u-font-24 u-m-t-12">×{{item.number}}</view>
</view>
<!-- <text class=" color-999">{{formatPrice(item.salePrice*item.number) }}</text> -->
</view>
</label>
</checkbox-group>
</view>
<my-button shape="circle" @tap="confirm">确定</my-button>
</view>
</template>
<script setup>
import {
reactive,
defineProps
} from 'vue';
import {
onLoad,
} from '@dcloudio/uni-app';
import go from '@/commons/utils/go.js';
import {
$table,
tableswitch
} from '@/http/yskApi/table.js'
let datas = reactive({
current: 0,
item: "",
// 桌台列表
tableList: [],
// 并桌选中
selecttableList: '',
// 转桌数据
changeTable: []
})
const props = defineProps({
item: {
type: Array
},
})
onLoad((opt) => {
// console.log(JSON.parse(opt.item) ,'调试1')
gettableList()
datas.item = JSON.parse(opt.item)
})
async function confirm() {
console.log(datas.selecttableList, 'debug')
console.log(datas.item, 'debug2')
// 是否选择其他桌
if (datas.selecttableList) {
if (datas.current == 0) {
// 转桌是否选择菜品
if (datas.changeTable.length) {
let res = await tableswitch({
masterId: datas.item[0].masterId,
useType: datas.item[0].useType,
cartIds: datas.changeTable,
currentTableId: datas.item[0].tableId,
targetTableId: datas.selecttableList.tableId
})
if (res) {
go.back()
}
}
} else {
let res = await tableswitch({
masterId: datas.item[0].masterId,
useType: datas.item[0].useType,
isFull: true,
currentTableId: datas.item[0].tableId,
targetTableId: datas.selecttableList.tableId
})
if (res) {
go.back()
}
}
}
}
function radioChange(d) {
datas.selecttableList = d.detail.value
}
// 切换转/并桌
function onClickItem(e) {
if (datas.current !== e.currentIndex) {
datas.current = e.currentIndex
}
}
// 获取桌台
async function gettableList() {
const res = await $table.get({
page: 1,
size: 999
})
datas.tableList = res.content
}
function formatPrice(n) {
return Number(n).toFixed(2)
}
function checkboxChange(e) {
datas.changeTable = e.detail.value
}
</script>
<style scoped lang="scss">
.goods {
// padding-bottom: 30rpx;
border-bottom: 1px dashed #E5E5E5;
.item {}
}
.img {
width: 84rpx;
height: 84rpx;
border-radius: 8rpx 8rpx 8rpx 8rpx;
}
</style>

View File

@@ -6,7 +6,7 @@
<view class="u-absolute goods bg-fff"> <view class="u-absolute goods bg-fff">
<view <view
class="u-p-t-32 color-666 border-bottom bg-fff u-absolute total u-p-r-28 u-p-b-32 u-p-l-28 u-flex u-row-between"> class="u-p-t-32 color-666 border-bottom bg-fff u-absolute total u-p-r-28 u-p-b-32 u-p-l-28 u-flex u-row-between">
<view>已添加{{goodsNumber}}件商品</view> <view>已添加{{goodsNumber.toFixed(0)}}件商品</view>
<view class="color-666"> <view class="color-666">
<uni-icons color="#666" type="trash"></uni-icons> <uni-icons color="#666" type="trash"></uni-icons>
<text class="u-m-l-10" @tap="setModalShow('clear',true)">清空</text> <text class="u-m-l-10" @tap="setModalShow('clear',true)">清空</text>
@@ -36,7 +36,7 @@
</image> </image>
</view> </view>
<view class="u-m-l-30 u-m-r-30 color-333"> <view class="u-m-l-30 u-m-r-30 color-333">
{{item.number}} {{(item.number).toFixed(2)}}
</view> </view>
<view class="u-flex" @tap="updateNumber(true,index,item)"> <view class="u-flex" @tap="updateNumber(true,index,item)">
<image src="/pagesCreateOrder/static/images/icon-add-black.svg" class="icon" mode=""> <image src="/pagesCreateOrder/static/images/icon-add-black.svg" class="icon" mode="">

View File

@@ -1,30 +1,34 @@
<template> <template>
<view class="u-relative u-flex item"> <view class="u-relative u-flex item">
<up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image> <up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image>
<!-- <image lazy-load class="img" :src="data.coverImg" mode="aspectFill" :style="computedImgStyle()"></image> --> <!-- <image lazy-load class="img" :src="data.coverImg" mode="aspectFill" :style="computedImgStyle()"></image> -->
<view class="info u-flex u-row-between u-col-top u-flex-col" @tap="emitEvent('add')"> <view class="info u-flex u-row-between u-col-top u-flex-col">
<view> <view>
<view> <view>
<text class="u-line-2">{{data.name}}</text> <text class="u-line-2">{{data.name}}
</text>
</view> </view>
<view class="u-font-32 font-bold u-m-t-16"> <view class="u-font-32 font-bold u-m-t-16">
{{data.price}} {{data.price}}
</view> </view>
<template v-if="data.type=='weigh'">
<view class="btnweigh">称重</view>
</template>
</view> </view>
<view class="u-flex"> <view class="u-flex">
<template v-if="!isSellout"> <template v-if="!isSellout">
<template v-if="!data.isDan"> <template v-if="!data.isDan||data.groupType==1">
<button class="btn" hover-class="btn-hover-class" @tap="emitEvent('chooseGuige')">选规格</button> <button class="btn" hover-class="btn-hover-class" @tap="emitEvent('chooseGuige')">选规格</button>
</template> </template>
<template v-else> <template v-else>
<view class="u-flex icon-btn"> <view class="u-flex icon-btn">
<view class="u-flex" @tap.stop="emitEvent('add')"> <view class="u-flex" @tap.stop="emitEvent(data.type=='weigh'?'tapweigh':'add')">
<image src="/pagesCreateOrder/static/images/icon-add.svg" class="icon" mode=""></image> <image src="/pagesCreateOrder/static/images/icon-add.svg" class="icon" mode=""></image>
</view> </view>
<template v-if="data.chooseNumber"> <template v-if="data.chooseNumber">
<view class="u-font-32"> <view class="u-font-32">
{{data.chooseNumber}} {{(data.chooseNumber).toFixed(2)}}
</view> </view>
<view class="u-flex" @tap.stop="emitEvent('reduce')"> <view class="u-flex" @tap.stop="emitEvent('reduce')">
<image src="/pagesCreateOrder/static/images/icon-reduce.svg" class="icon" mode=""> <image src="/pagesCreateOrder/static/images/icon-reduce.svg" class="icon" mode="">
@@ -55,20 +59,20 @@
} from 'vue'; } from 'vue';
import util from '../util.js'; import util from '../util.js';
const props = defineProps({ const props = defineProps({
img:{ img: {
type:Object, type: Object,
default:{ default: {
width:'250rpx', width: '250rpx',
height:'272rpx' height: '272rpx'
} }
}, },
index: { index: {
type: [Number,String], type: [Number, String],
}, },
isSeatFee:{ isSeatFee: {
//是否为餐位费 //是否为餐位费
type:Boolean, type: Boolean,
default:false default: false
}, },
data: { data: {
type: Object, type: Object,
@@ -79,36 +83,36 @@
} }
} }
}) })
function computedImgStyle(){ function computedImgStyle() {
return { return {
width:props.img.width, width: props.img.width,
height:props.img.height height: props.img.height
} }
} }
//判断是否是菜品 //判断是否是菜品
function isGoods(){ function isGoods() {
return props.data.hasOwnProperty('id') return props.data.hasOwnProperty('id')
} }
//判断商品是否售尽 //判断商品是否售尽
const isSellout = computed(() => { const isSellout = computed(() => {
const item = props.data const item = props.data
if(!isGoods()){ if (!isGoods()) {
return false return false
} }
return ( return (
item.isPauseSale || item.isPauseSale ||
(item.typeEnum !== "sku" && item.isStock==1&& item.stockNumber <= 0) (item.typeEnum !== "sku" && item.isStock == 1 && item.stockNumber <= 0)
); );
}) })
const emits = defineEmits(['add', 'reduce', 'chooseGuige']) const emits = defineEmits(['add', 'reduce', 'chooseGuige','tapweigh'])
function emitEvent(emitName){ function emitEvent(emitName) {
if(isGoods()){ if (isGoods()) {
emits(emitName, props.index) emits(emitName, props.index)
} }
} }
@@ -133,10 +137,24 @@
color: #fff; color: #fff;
} }
.btnweigh {
margin: 5rpx 0;
width: 100rpx;
background: linear-gradient(124deg, #73c969 6%, #27921b 93%);
border-radius: 10rpx;
font-size: 24rpx;
padding: 6rpx 0;
text-align: center;
}
.btn-hover-class { .btn-hover-class {
opacity: .6; opacity: .6;
} }
image{will-change: transform}
image {
will-change: transform
}
.item { .item {
// width: 250rpx; // width: 250rpx;
// height: 272rpx; // height: 272rpx;

View File

@@ -0,0 +1,180 @@
<template>
<my-model ref="model" borderRadius="12" :title="datas.title">
<template #desc>
<scroll-view scroll-y="true" style="height: 50vh;" class="u-p-30 guigeModel">
<view class="u-m-b-40" v-for="(item,index) in datas.skus" :key="index">
<view class="u-text-left">
<view class="color-333">{{item.title}} <text
style="color:#999">({{item.count}}{{item.number}})</text> </view>
</view>
<view class="u-flex u-m-t-20 u-flex-wrap">
<view class="item" @tap="chooseSkd(skd,item)" :class="{active:skd.select==true}"
v-for="(skd,skdIndex) in item.goods" :key="skdIndex">
{{skd.proName}}
</view>
</view>
</view>
</scroll-view>
</template>
<template #btn>
<view class="u-p-30 border-top ">
<view class="u-flex u-p-b-30 u-row-between">
<view class="price">
<text></text>
<text>{{datas.price}}</text>
</view>
</view>
<view class="u-m-t-10">
<my-button @tap="confirm">添加</my-button>
</view>
</view>
</template>
</my-model>
<uni-popup ref="popup" type="message">
<uni-popup-message type="info" message="请选择套餐" :duration="2000"></uni-popup-message>
</uni-popup>
</template>
<script setup>
import {
computed,
getCurrentInstance,
reactive,
ref,
watch
} from 'vue';
import util from '../util.js';
import infobox from '@/commons/utils/infoBox.js'
import myModel from '@/components/my-components/my-model.vue'
import myButton from '@/components/my-components/my-button.vue'
import {
onShow,
} from '@dcloudio/uni-app';
const props = defineProps({
goodsData: {
type: Object,
default: () => {}
},
})
let datas = reactive({
item: "",
title: "",
price: "",
skus: [],
// 几选几,的和
selectNumber: 0,
})
// const selSku = computed(() => {
// return props.skus.reduce((prve, cur) => {
// prve.push(cur.sel)
// return prve
// }, []).join()
// })
// const goods = computed(() => {
// return props.skuMap[selSku.value]
// })
watch(() => props.goodsData, (newval) => {
newval.proGroupVo.forEach(ele => {
ele.selectData = []
})
datas.item = newval
datas.title = newval.name
datas.price = newval.price
datas.skus = newval.proGroupVo
datas.skus.forEach(ele => {
datas.selectNumber += ele.number
})
})
const emits = defineEmits(['confirm', 'updateSku'])
function chooseSkd(skd, item) {
if (item.selectData.includes(skd.proId)) {
skd.select = false
let indexs = item.selectData.indexOf(skd.proId)
item.selectData.splice(indexs, 1)
} else {
if (item.selectData.length < item.number) {
skd.select = true
item.selectData.push(skd.proId)
}
}
}
const model = ref(null)
function open() {
model.value.open()
}
function close() {
model.value.close()
}
const instance = getCurrentInstance();
function confirm() {
// 将数据保存进对应的值
let arr = []
datas.item.proGroupVo.forEach(ele => {
arr.push(...ele.selectData)
})
if (arr.length == datas.selectNumber) {
emits('confirm', arr, datas.item)
close()
} else {
instance.ctx.$refs.popup.open()
}
}
defineExpose({
open,
close
})
</script>
<style lang="scss">
.border-top {}
.icon {
width: 40rpx;
height: 40rpx;
}
.guigeModel {
.item {
color: #666;
font-size: 24rpx;
padding: 4rpx 28rpx;
border: 1px solid #E5E5E5;
border-radius: 8rpx;
margin-right: 20rpx;
margin-bottom: 20rpx;
transition: all .2s ease-in-out;
&.active {
border-color: $my-main-color;
color: $my-main-color;
}
&.disabled {
color: #ccc;
border-color: #eee;
}
}
}
.price {
color: #EB4F4F;
}
.border-top {
border-top: 1px solid #E5E5E5;
}
</style>

View File

@@ -0,0 +1,290 @@
<template>
<view class="">
<up-overlay :show="overlayshow" @click="overlayshow = false">
<view class="boxoverlay">
<view class="rect" @tap.stop>
<view class="title">
<view>
标题
</view>
<view class="" @click="overlayshow = false">
<up-icon name="close" color="#93969b" size="20"></up-icon>
</view>
</view>
<view class="inputtop">
<view class="dj">
<view class="text">单价</view>
<view class="jg">{{form.goods.lowPrice}}/{{form.goods.unitName}}</view>
</view>
<view class="inputdj">
<view>重量</view>
<view class="inputdjbox">
<view class="inputdisplay">{{ currentInput }}</view>
<text>{{ form.goods.unitName }}</text>
</view>
</view>
</view>
<view class="keyboard">
<button v-for="(num, index) in numberButtons" :key="index" @click="handleClick(num)">
{{ num }}
</button>
<button @click="deleteLast"></button>
</view>
<view class="classmoney">
{{ (form.goods.lowPrice * currentInput).toFixed(2) }}
</view>
<view class="classconfirm" @click="clickconfirm">
确认
</view>
</view>
</view>
</up-overlay>
</view>
</template>
<script setup>
import {
onLoad,
onShow,
onReachBottom
} from '@dcloudio/uni-app';
import {
computed,
reactive,
ref,
watch,
defineExpose,
defineEmits
} from 'vue';
const emit = defineEmits(['refresh'])
const currentInput = ref('');
const numberButtons = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'];
const handleClick = (value) => {
// 首位不能输入0
if (currentInput.value === '') {
if (value === '0') {
return;
}
}
if (value === '.' && currentInput.value.indexOf('.') !== -1) {
return; // 如果已经存在小数点,不再添加
}
if (value === '.' && currentInput.value === '') {
currentInput.value = '0.';
} else {
currentInput.value += value;
}
// 限制小数点后两位
const parts = currentInput.value.split('.');
if (parts.length > 1 && parts[1].length > 2) {
currentInput.value = currentInput.value.slice(0, -1);
}
};
const deleteLast = () => {
currentInput.value = currentInput.value.slice(0, -1);
};
const clickconfirm = () => {
// 首位不能输入0
if (currentInput.value === '') {
uni.showToast({
title: '请输入',
icon: 'none'
})
return false;
}
emit('weighgoodsUpdate', form.foodsindex, form.index, true, undefined, currentInput.value)
overlayshow.value = false
}
//显示
const overlayshow = ref(false);
const form = reactive({})
const open = (foodsindex, index, goods) => {
currentInput.value = ''
Object.assign(form, {
foodsindex,
index,
goods
})
overlayshow.value = true
}
defineExpose({
open
})
</script>
<style lang="scss" scoped>
page {
background: #F9F9F9;
}
.boxoverlay {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.rect {
padding: 32rpx 28rpx;
width: 80%;
background-color: #fff;
border-radius: 18rpx;
.title {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20rpx;
font-size: 40rpx;
border-bottom: 1rpx solid #ccc;
}
.inputtop {
margin-top: 20rpx;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
.dj {
width: 32%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
.text {
font-weight: 300;
font-size: 24rpx;
}
.jg {
margin-top: 16rpx;
background-color: #e8f4ff;
color: #1890ff;
height: 60rpx;
line-height: 60rpx;
padding: 0 20rpx;
font-size: 24rpx;
color: #1890ff;
border-radius: 10rpx;
}
}
.inputdj {
width: 66%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
font-weight: 300;
font-size: 24rpx;
.inputdjbox {
margin-top: 16rpx;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
border: 1rpx solid #ccc;
border-radius: 10rpx;
padding-left: 20rpx;
height: 60rpx;
line-height: 60rpx;
background: #fff;
.inputdisplay {
width: auto;
}
text {
border: 1rpx solid #ccc;
border-radius: 10rpx;
border-radius: 10rpx;
padding: 0 20rpx;
background: #f5f7fa;
color: #a7aaaf;
}
}
}
}
.keyboard {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
button {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 28%;
margin: 10rpx;
}
.keyboard-button {
width: 28%;
margin: 10rpx;
border: none;
border-radius: 5rpx;
box-shadow: 0 0 5rpx rgba(0, 0, 0, 0.3), 0 0 10rpx rgba(0, 0, 0, 0.2);
cursor: pointer;
transition: all 0.3s ease;
}
// .keyboard-button:hover {
// box-shadow: 0 0 10rpx rgba(255, 0, 0, 0.5), 0 0 20px rgba(255, 0, 0, 0.3);
// transform: translateY(-2rpx);
// }
.dot-button {
// background-color: #FFC107;
}
.clear-button {
// background-color: #FF5733;
}
.clear-button:hover {
box-shadow: 0 0 10px rgba(255, 87, 51, 0.5), 0 0 20px rgba(255, 87, 51, 0.3);
}
.delete-button {
// background-color: #33FF57;
}
.delete-button:hover {
// box-shadow: 0 0 10px rgba(51, 255, 87, 0.5), 0 0 20px rgba(51, 255, 87, 0.3);
}
}
.classmoney {
margin-top: 16rpx;
width: 100%;
font-size: 40rpx;
text-align: left;
color: #ff5152;
font-weight: 600;
}
.classconfirm {
width: 100%;
margin: 30rpx auto 0 auto;
border-radius: 16rpx;
text-align: center;
background: #1890ff;
color: #fff;
padding: 10rpx 0;
}
}
}
</style>

View File

@@ -78,7 +78,8 @@
<view class="thumb-box" v-for="(goodsItem, goodsIndex) in item.foods" :key="goodsIndex"> <view class="thumb-box" v-for="(goodsItem, goodsIndex) in item.foods" :key="goodsIndex">
<list-goods-item @chooseGuige="chooseGuige($event,index)" <list-goods-item @chooseGuige="chooseGuige($event,index)"
@add="goodsUpdate($event,index,true)" @reduce="goodsUpdate($event,index,false)" @add="goodsUpdate($event,index,true)" @reduce="goodsUpdate($event,index,false)"
:index="goodsIndex" :data="goodsItem"></list-goods-item> @tapweigh="tapweigh($event,index)" :index="goodsIndex"
:data="goodsItem"></list-goods-item>
</view> </view>
<!-- <template v-if="item.name==='附加费'"> <!-- <template v-if="item.name==='附加费'">
@@ -104,8 +105,8 @@
@chooseGuige="chooseGuige(goodsItem.goodsIndex,goodsItem.index)" @chooseGuige="chooseGuige(goodsItem.goodsIndex,goodsItem.index)"
@add="searchGoodsUpdate(goodsItem,goodsIndex,true)" @add="searchGoodsUpdate(goodsItem,goodsIndex,true)"
@reduce="searchGoodsUpdate(goodsItem,goodsIndex,false)" @reduce="searchGoodsUpdate(goodsItem,goodsIndex,false)"
@tapweigh="tapweigh(goodsItem.goodsIndex,goodsItem.index)"
:index="goodsItem.goodsIndex" :data="goodsItem"></list-goods-item> :index="goodsItem.goodsIndex" :data="goodsItem"></list-goods-item>
</view> </view>
</view> </view>
<my-img-empty v-if="!searchResult.length" tips="未搜索到相关商品"></my-img-empty> <my-img-empty v-if="!searchResult.length" tips="未搜索到相关商品"></my-img-empty>
@@ -120,15 +121,16 @@
<my-car :isCreateOrderToDetail="isCreateOrderToDetail" @updateNumber="carsNumberChange" :user="data.vipUser" <my-car :isCreateOrderToDetail="isCreateOrderToDetail" @updateNumber="carsNumberChange" :user="data.vipUser"
:masterId="data.masterId" :table="data.table" :data="cars" @clear="onClearCart"></my-car> :masterId="data.masterId" :table="data.table" :data="cars" @clear="onClearCart"></my-car>
</view> </view>
<!-- 套餐选择规格 -->
<taocanModel ref="taocanModelRef" @confirm="taocanConfirm" :goodsData="selGoods"></taocanModel>
<!-- 选择规格 --> <!-- 选择规格 -->
<guige-model @update-sku="updateSkuSel" @confirm="guigeConfirm" ref="chooseGuigeModel" :goodsData="selGoods" <guige-model @update-sku="updateSkuSel" @confirm="guigeConfirm" ref="chooseGuigeModel" :goodsData="selGoods"
:title="guigeModelData.title" :sku-map="guigeModelData.chooseGoods.skuMap" :title="guigeModelData.title" :sku-map="guigeModelData.chooseGoods.skuMap"
:skus="guigeModelData.chooseGoods.skus"></guige-model> :skus="guigeModelData.chooseGoods.skus"></guige-model>
<!-- 添加附加费 --> <!-- 添加附加费 -->
<my-surcharge @confirm="surchargeConfirm" ref="surcharge" title="添加附加费"></my-surcharge> <my-surcharge @confirm="surchargeConfirm" ref="surcharge" title="添加附加费"></my-surcharge>
<!-- 称重 -->
<weigh-item ref="refweighitem" @weighgoodsUpdate='goodsUpdate'></weigh-item>
</view> </view>
<up-modal title="提示" content="该台桌购物车里有商品,是否清除该台桌里的商品?" :show="modal.clear" showCancelButton closeOnClickOverlay <up-modal title="提示" content="该台桌购物车里有商品,是否清除该台桌里的商品?" :show="modal.clear" showCancelButton closeOnClickOverlay
@confirm="confirmModelConfirm" @cancel="confirmModelConfirm('cancel')" @close="setModalShow('clear',false)" @confirm="confirmModelConfirm" @cancel="confirmModelConfirm('cancel')" @close="setModalShow('clear',false)"
@@ -150,6 +152,8 @@
import util from './util.js'; import util from './util.js';
import color from '@/commons/color.js'; import color from '@/commons/color.js';
import guigeModel from './components/guige' import guigeModel from './components/guige'
import taocanModel from './components/taocanModel.vue'
import weighItem from './components/weigh.vue'
import listGoodsItem from './components/list-goods-item.vue' import listGoodsItem from './components/list-goods-item.vue'
import mySurcharge from './components/surcharge' import mySurcharge from './components/surcharge'
import { import {
@@ -277,6 +281,26 @@
} }
return obj return obj
} }
// 添加套餐
async function taocanConfirm(d, item) {
const cartGoods = await addCart({
num: 1,
groupProductIdList: d,
productId: item.id,
skuId: item.specList[0].id
})
infoBox.showToast('添加成功')
// guigeConfirm(item, 1)
// updateCartGoods({
// productId: item.id,
// skuId: item.specList[0].id,
// cartId: cartGoods.id
// })
cars.push({
...cartGoods,
specSnap: item.specSnap
})
}
function scanCode() { function scanCode() {
// 只允许通过相机扫码 // 只允许通过相机扫码
@@ -671,11 +695,11 @@
} }
function toLinshi() { function toLinshi() {
go.to('PAGES_ADD_TEMP_CUISINE',{ go.to('PAGES_CHOOSE_ADD_TEMP_CUISINE', {
masterId:data.masterId, masterId: data.masterId,
tableId:data.table.tableId, tableId: data.table.tableId,
vipUserId:option.vipUserId?option.vipUserId:'', vipUserId: option.vipUserId ? option.vipUserId : '',
useType:uni.getStorageSync('useType') useType: uni.getStorageSync('useType')
}) })
} }
@@ -833,7 +857,14 @@
} }
let selGoods = ref({}) let selGoods = ref({});
// 称重
const refweighitem = ref(null)
const tapweigh = (foodsindex, index) => {
const goods = data.tabbar[index].foods[foodsindex]
refweighitem.value.open(foodsindex, index, goods)
}
function chooseGuige(foodsindex, index) { function chooseGuige(foodsindex, index) {
if (!canAddGoods()) { if (!canAddGoods()) {
@@ -843,13 +874,19 @@
} }
const $goods = data.tabbar[index].foods[foodsindex] const $goods = data.tabbar[index].foods[foodsindex]
selGoods.value = $goods selGoods.value = $goods
guigeModelData.title = $goods.name if ($goods.groupType == 1) {
const specList = $goods.specList; instance.ctx.$refs.taocanModelRef.open()
const tagSnap = JSON.parse($goods.skuResult.tagSnap) } else {
const skuMap = returnSelGoodsSkuMap(specList) guigeModelData.title = $goods.name
const skuList = returnSelGoodsSkuList(tagSnap) const specList = $goods.specList;
setSkugoodsDefaultInit($goods, skuList, skuMap, specList) const skuMap = returnSelGoodsSkuMap(specList)
chooseGuigeModel.value.open() // 多规格,和套餐规格区分.groupType=1 套餐多规格
let tagSnap = JSON.parse($goods.skuResult.tagSnap)
const skuList = returnSelGoodsSkuList(tagSnap)
setSkugoodsDefaultInit($goods, skuList, skuMap, specList)
chooseGuigeModel.value.open()
}
} }
async function guigeConfirm(sku, num) { async function guigeConfirm(sku, num) {
@@ -902,13 +939,15 @@
categoryId, categoryId,
skuId skuId
} = goods } = goods
const cartId = goods.id const cartId = goods.id
const tabbarIndex = data.tabbar.findIndex(v => v.id == categoryId) const tabbarIndex = data.tabbar.findIndex(v => v.id == categoryId)
//临时菜没有对应商品数据 //临时菜没有对应商品数据
const $goods =!productId?undefined:data.tabbar[tabbarIndex].foods.find(v => v.id == productId) const $goods = !productId ? undefined : data.tabbar[tabbarIndex].foods.find(v => v.id == productId)
//临时菜没有skuList //临时菜没有skuList
const $sku =!productId?{suit:1}:$goods.specList.find(v => v.id == skuId) const $sku = !productId ? {
suit: 1
} : $goods.specList.find(v => v.id == skuId)
if (num === 0 || num < $sku.suit) { if (num === 0 || num < $sku.suit) {
//移除 //移除
@@ -958,7 +997,8 @@
searchResult.value[index].chooseNumber = chooseNumber searchResult.value[index].chooseNumber = chooseNumber
} }
} }
async function goodsUpdate(foodsindex, index, isAdd, searchGoodsIndex) {
async function goodsUpdate(foodsindex, index, isAdd, searchGoodsIndex, showCurrentInput) { // showCurrentInput 称重才会传的参数
// if (!canAddGoods()) { // if (!canAddGoods()) {
// return infoBox.showToast('请先选择桌台', 0.5).then(res => { // return infoBox.showToast('请先选择桌台', 0.5).then(res => {
// chooseTable() // chooseTable()
@@ -972,13 +1012,13 @@
}); });
const productId = $goods.id const productId = $goods.id
const skuId = $goods.specList[0].id const skuId = $goods.specList[0].id
const suit = $goods.specList[0].suit || 1 let suit = $goods.specList[0].suit || 1
if (goodsInCarIndex !== -1) { if (goodsInCarIndex !== -1) {
//更新 //更新
const carGoods = cars[goodsInCarIndex] const carGoods = cars[goodsInCarIndex]
const cartId = carGoods.id const cartId = carGoods.id
const step = isAdd ? 1 : -1 const step = isAdd ? 1 : -1
const num = carGoods.number * 1 + step let num = carGoods.number * 1 + step
if (num === 0 || num < suit) { if (num === 0 || num < suit) {
//移除 //移除
cars.splice(goodsInCarIndex, 1) cars.splice(goodsInCarIndex, 1)
@@ -988,6 +1028,10 @@
cartId cartId
}) })
} }
// 不影响之前的代码 称重num单独处理
if ($goods.type == 'weigh' && showCurrentInput) {
num = carGoods.number * 1 + Number(showCurrentInput)
}
const { const {
number number
} = await updateCartGoods({ } = await updateCartGoods({
@@ -1000,16 +1044,23 @@
$goods.chooseNumber = number $goods.chooseNumber = number
setSearchGoods(searchGoodsIndex, number) setSearchGoods(searchGoodsIndex, number)
} else { } else {
//增加 // 不影响之前的代码 称重suit单独处理
const num = suit if ($goods.type == 'weigh' && showCurrentInput) {
const cartGoods = await addCart({ suit = showCurrentInput
num, }
productId, // 套餐和单规格
skuId if ($goods.groupType != 1) {
}) //增加
infoBox.showToast('添加成功') const num = suit
$goods.chooseNumber = num const cartGoods = await addCart({
cars.push(cartGoods) num,
productId,
skuId
})
infoBox.showToast('添加成功')
$goods.chooseNumber = Number(num)
cars.push(cartGoods)
}
} }
return return
} }
@@ -1188,7 +1239,7 @@
setTabBar($category, $originGoods, cars) setTabBar($category, $originGoods, cars)
} }
onBeforeUnmount(() => {}) onBeforeUnmount(() => {})
function watchUpdate() { function watchUpdate() {
uni.$off('update:createOrderIndex') uni.$off('update:createOrderIndex')
uni.$off('get:table') uni.$off('get:table')
@@ -1201,7 +1252,7 @@
console.log('update:createOrderIndex'); console.log('update:createOrderIndex');
init() init()
}) })
uni.$on('add:cashCai', async() => { uni.$on('add:cashCai', async () => {
console.log('add:cashCai'); console.log('add:cashCai');
const cartRes = await getCart() const cartRes = await getCart()
cars.length = 0 cars.length = 0

View File

@@ -0,0 +1,255 @@
<template>
<view class="">
<up-overlay :show="overlayshow" @click="overlayshow = false">
<view class="boxoverlay">
<view class="rect" @tap.stop>
<!-- 抖音 -->
<view class="bottomconstant">
<view class="itemlist">
<!-- <view class="ordernumber">
订单号111
</view> -->
<view class="title">
请选择商品
</view>
<view class="itemlists" v-for="(item,index) in form.goods" :key="index">
<view class="top">
<view class="tag">
{{item.title}}
</view>
<view class="date">
¥{{item.amount}}
</view>
</view>
<!-- <view class="bottom">
核销
</view> -->
<view v-if="item.type" @click="item.type =!item.type">
<up-icon name="checkmark-circle" color="#2979ff" size="22"></up-icon>
</view>
<view class="icon" v-else @click="item.type =!item.type"></view>
</view>
<view class="bouttonbox">
<view class="keep" @click="confirms">
确定核销
</view>
<view class="cancel" @click="overlayshow = false">
取消
</view>
</view>
</view>
</view>
</view>
</view>
</up-overlay>
</view>
</template>
<script setup>
import {
onLoad,
onShow,
onReachBottom
} from '@dcloudio/uni-app';
import {
computed,
reactive,
ref,
watch,
defineExpose
} from 'vue';
const form = reactive({
id: "",
number: '',
sum_pay_amount: '',
goods: [],
verify_token: '',
});
import {
certificateprepares
} from '@/http/php/api.ts';
//显示
const overlayshow = ref(false);
const open = (val) => {
Object.assign(form, val)
form.goods.map((item) => {
item.type = true
})
overlayshow.value = true
}
let confirms = async () => {
// 判断是否选择商品
if (form.goods.filter(i => i.type).length == 0) {
uni.showToast({
title: '请选择商品',
icon: 'none'
})
return false
}
let data = null
if (uni.getStorageSync('clint_type') == 1) {
data = {
couponCode: form.couponCode,
num: form.goods.length
}
} else {
let encrypted_codes = form.goods.filter(i => i.type).map((obj, index) => {
return obj.encrypted_code;
})
data = {
verify_token: form.verify_token,
encrypted_codes: encrypted_codes.toString(),
id: form.id
}
}
await certificateprepares(data)
uni.showToast({
title: '验证成功',
icon: 'none'
})
overlayshow.value = false
}
defineExpose({
open
})
</script>
<style lang="scss" scoped>
page {
background: #F9F9F9;
}
.boxoverlay {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.rect {
padding: 32rpx 28rpx;
width: 80%;
background-color: #fff;
border-radius: 18rpx;
.bottomconstant {
padding: 0 28rpx;
width: 100%;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.itemlist:nth-child(1) {
margin-top: 0;
}
.itemlist {
// margin-top: 16rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.ordernumber {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.title {
margin-top: 16rpx;
padding-bottom: 16rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 28rpx;
color: #333333;
border-bottom: 1rpx solid #E5E5E5;
}
.itemlists {
padding-top: 16rpx;
display: flex;
justify-content: space-between;
align-items: center;
.top {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
.date {
margin-top: 10rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.tag {
width: 350rpx;
overflow: hidden; //超出的文本隐藏
text-overflow: ellipsis; //溢出用省略号显示
white-space: nowrap; //溢出不换行
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.icon {
width: 40rpx;
height: 40rpx;
border: 1px solid #909399;
border-radius: 50%;
}
.bottom {
background: #EAF4FD;
border-radius: 4rpx 4rpx 4rpx 4rpx;
padding: 6rpx 12rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 20rpx;
color: #318AFE;
}
}
.bouttonbox {
margin-top: 80rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.keep {
width: 490rpx;
height: 80rpx;
background: #318AFE;
border-radius: 40rpx 40rpx 40rpx 40rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
line-height: 80rpx;
}
.cancel {
text-align: center;
width: 490rpx;
height: 80rpx;
background: #ffffff;
border-radius: 40rpx 40rpx 40rpx 40rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
line-height: 80rpx;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,155 @@
<template>
<view class="">
<up-overlay :show="overlayshow" @click="overlayshow = false">
<view class="boxoverlay">
<view class="rect" @tap.stop>
<!-- 抖音 -->
<view class="bottomconstant">
<view class="itemlist">
<!-- <view class="ordernumber">
订单号111
</view> -->
<view class="title">
绑定门店
</view>
<view class="itemlists" v-for="(item,index) in 4" :key="index">
<view class="top">
<view class="tag">
名称qqqqqqqqq
</view>
<view class="date">
地址qqqqqqq
</view>
</view>
<view class="bottom">
操作
</view>
</view>
</view>
</view>
</view>
</view>
</up-overlay>
</view>
</template>
<script setup>
import {
onLoad,
onShow,
onReachBottom
} from '@dcloudio/uni-app';
import {
computed,
reactive,
ref,
watch,
defineExpose
} from 'vue';
//显示
const overlayshow = ref(false);
const open = () => {
overlayshow.value = true
}
defineExpose({
open
})
</script>
<style lang="scss" scoped>
page {
background: #F9F9F9;
}
.boxoverlay {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.rect {
padding: 32rpx 28rpx;
width: 80%;
background-color: #fff;
border-radius: 18rpx;
.bottomconstant {
padding: 0 28rpx;
width: 100%;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.itemlist:nth-child(1) {
margin-top: 0;
}
.itemlist {
// margin-top: 16rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.ordernumber {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.title {
margin-top: 16rpx;
padding-bottom: 16rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 28rpx;
color: #333333;
border-bottom: 1rpx solid #E5E5E5;
}
.itemlists {
padding-top: 16rpx;
display: flex;
justify-content: space-between;
align-items: center;
.top {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
.date {
margin-top: 10rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.tag {
width: 350rpx;
overflow: hidden; //超出的文本隐藏
text-overflow: ellipsis; //溢出用省略号显示
white-space: nowrap; //溢出不换行
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.bottom {
background: #EAF4FD;
border-radius: 4rpx 4rpx 4rpx 4rpx;
padding: 6rpx 12rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 20rpx;
color: #318AFE;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,267 @@
<template>
<view class="constant">
<view class="constantitem" @click="object_id =null,overlayshow = true">
<view>扫码核销</view>
<view>
<up-icon name="arrow-right" color="#909399" size="20"></up-icon>
</view>
</view>
<view class="constantitem" @click="clickpath('PAGES_WEITEOFF_RECORD',1)">
<view>美团记录</view>
<view>
<up-icon name="arrow-right" color="#909399" size="20"></up-icon>
</view>
</view>
<view class="constantitem" @click="clickpath('PAGES_WEITEOFF_RECORD',2)">
<view>抖音记录</view>
<view>
<up-icon name="arrow-right" color="#909399" size="20"></up-icon>
</view>
</view>
<!-- 核销准备 -->
<up-overlay :show="overlayshow">
<view class="boxoverlay">
<view class="rect" @tap.stop>
<view class="top">
团购卷核销
</view>
<view class="subsection">
<up-subsection :list="subsectionlist" :current="subsectioncurrent" @change="sectionChange">
</up-subsection>
</view>
<view class="search">
<up-search :show-action="false" searchIcon="scan" :clearabled="true" @clickIcon='clickIcon'
placeholder="请扫码或者输入卷码" v-model="object_id"></up-search>
</view>
<view class="search">
<up-alert fontSize='10' :show-icon="true" title="请使用相机识别扫码" type="warning"
:closable="true"></up-alert>
</view>
<view class="bouttonbox">
<view class="keep" @click="confirms">
确认
</view>
<view class="cancel" @click="overlayshow = false">
取消
</view>
</view>
</view>
</view>
</up-overlay>
<!-- 绑定门店 -->
<dialogs ref="dialogsref"></dialogs>
<!-- 选择商品 -->
<commodity ref="refcommodity"></commodity>
<!-- 二维码 -->
<up-overlay :show="qrcodes.show" @click="qrcodes.show = false">
<view class="boxoverlay">
<view class="rect" @tap.stop
style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<!-- <view>{{subsectioncurrent==0?'请用美团':'抖音'}}</view> -->
<view style="padding-bottom:40rpx;font-weight: 600;">请进行手机扫码</view>
<!-- <up-qrcode :size="200" :val="qrcodes.val" :icon='qrcodes.icon'></up-qrcode> -->
<up-qrcode :size="200" :val="qrcodes.val"></up-qrcode>
</view>
</view>
</up-overlay>
</view>
</template>
<script setup>
import {
onLoad,
onShow,
onUnload,
} from '@dcloudio/uni-app';
import {
computed,
reactive,
ref,
watch
} from 'vue';
import {
userlogout,
douyincheckIn,
fulfilmentcertificateprepare, //准备核销
searchstorestatus, //状态查询
getuisdk //获取uisdk 绑定 链接
} from '@/http/php/api.ts';
import go from '@/commons/utils/go.js'
import dialogs from '../components/dialogs.vue'
import commodity from '../components/commodity.vue'
onLoad(async () => {
// 登录 会员入签
let res = await douyincheckIn({
token: uni.getStorageSync("iToken"),
loginName: uni.getStorageSync("shopId"),
clientType: 'ADMIN'
})
uni.setStorageSync('phpuserinfo', res.userInfo)
uni.setStorageSync('clint_type', 1)
})
//显示
const overlayshow = ref(false);
// 切换
const subsectioncurrent = ref(0);
const subsectionlist = ref(['美团', '抖音']);
const sectionChange = (index) => {
subsectioncurrent.value = index;
uni.setStorageSync('clint_type', index + 1)
}
// 二维码或者条形码
const object_id = ref(null)
// 扫码
const clickIcon = () => {
uni.scanCode({ // 允许从相机和相册扫码
success: (res) => {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
object_id.value = res.result
}
});
}
// 二维码
const qrcodes = reactive({
val: 'www.baidu.com',
icon: '@/static/logo.png',
show: false
})
// 首先获取状态
let confirms = async () => {
if (object_id.value == null) {
uni.showToast({
title: '请扫码或者输入卷码',
icon: 'none'
})
return false;
}
let res = await searchstorestatus()
// status == 0 则需要显示二维码 ==1 去核销
if (res.status == 0) {
qrcodes.val = await getuisdk()
overlayshow.value = false
qrcodes.show = true
} else {
clickkeep()
}
}
// 点击确定
const clickkeep = async () => {
let data = null
if (uni.getStorageSync('clint_type') == 1) {
data = {
code: object_id.value
}
} else {
data = {
object_id: object_id.value
}
}
let res = await fulfilmentcertificateprepare(data)
overlayshow.value = false
refcommodity.value.open(res)
}
// 这是选择门店
// const dialogsref = ref(null)
// const dialogconfirm = () => {
// dialogsref.value.open()
// }
// 选择商品
const refcommodity = ref(null)
// 跳转
const clickpath = (URL, title) => {
uni.setStorageSync('clint_type', title)
go.to(URL)
}
onShow(async () => {})
// 销毁组件
onUnload(async () => {
// 退出
await userlogout()
})
</script>
<style lang="scss" scoped>
page {
background: #F9F9F9;
}
.constant {
.constantitem {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 24rpx 32rpx;
}
.boxoverlay {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.rect {
padding: 32rpx 28rpx;
width: 80%;
background-color: #fff;
border-radius: 18rpx;
.top {
font-size: 32rpx;
font-weight: 600;
}
.subsection {
margin-top: 24rpx;
}
.search {
margin-top: 24rpx;
}
.bouttonbox {
margin-top: 80rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.keep {
width: 490rpx;
height: 80rpx;
background: #318AFE;
border-radius: 40rpx 40rpx 40rpx 40rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
line-height: 80rpx;
}
.cancel {
text-align: center;
width: 490rpx;
height: 80rpx;
background: #ffffff;
border-radius: 40rpx 40rpx 40rpx 40rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
line-height: 80rpx;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,360 @@
<template>
<view class="constant">
<!-- <view class="topbox">
<view class="left">
<view class="">
筛选
</view>
<view class=""></view>
</view>
<view class="right">
<up-input class="input" placeholder="搜索订单号" v-model="value"
@change="change"></up-input>
</view>
</view> -->
<!-- 抖音 -->
<view v-if="form.type == 2">
<view class="bottomconstant" v-for="(item,index) in form.list" :key="index">
<view class="itemlist">
<view class="ordernumber">
{{item.d_order_id}}
</view>
<view class="title">
{{item.title}}
</view>
<view class="itemlists" v-for="(item1,index1) in item.douyinCodeGoods" :key="item1.id">
<view class="top">
<view class="date">
{{item1.create_time}}
</view>
<view class="tag" v-if="item1.status == 1" @click="clickcancel(item1)"
style="background: #318AFE;color: #fff; border-radius: 10rpx;">
撤销核销
</view>
<view class="tag" v-if="item1.status == 0">
等待验券
</view>
<view class="tag" v-if="item1.status == 2">
失败
</view>
</view>
<view class="bottom">
<view class="bottomtitle">
{{item1.title}}
</view>
<view class="price">
<view class="prices">
{{item1.pay_amount}}
</view>
<!-- <view class="pricees">
{{item1.market_price}}
</view> -->
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 美团 -->
<view class="bottomconstant" v-else>
<view class="itemlist" v-for="(item,index) in form.list" :key="index">
<view class="itemlists" style="padding: 0;">
<view class="top">
<view class="date">
{{item.couponUseTime}}
</view>
<view class="tag" :style="!item.type?'background: #318AFE;color: #fff; border-radius: 10rpx;':''"
@click="clickcancel(item)">
{{item.type ? item.couponStatusDesc:'撤销核销'}}
</view>
</view>
<view class="bottom">
<view class="bottomtitle">
{{item.dealTitle}}
</view>
<view class="price">
<view class="prices">
¥{{item.couponBuyPrice}}
</view>
<!-- <view class="pricees">
156
</view> -->
</view>
</view>
</view>
</view>
</view>
<up-loadmore :status="form.status" />
</view>
</template>
<script setup>
import {
onLoad,
onShow,
onReachBottom
} from '@dcloudio/uni-app';
import {
computed,
reactive,
ref,
watch
} from 'vue';
import dayjs from "dayjs";
import {
orderlist,
fulfilmentcertificatecanceles
} from '@/http/php/api.ts';
// 下拉加载
onReachBottom(() => {
if (form.status != 'nomore') {
form.page = ++form.page;
getlist()
}
})
onLoad(async (e) => {
form.type = uni.getStorageSync('clint_type')
initial()
})
const dropdownvalue = ref(1)
const optionsdropdown = [{
label: '等待验证',
value: 1,
},
{
label: '成功',
value: 2,
},
{
label: '失败',
value: 3,
}
]
// 初始化
const initial = () => {
form.page = 1
form.status = 'loadmore'
form.d_order_id = ''
form.querystatus = ''
getlist()
}
//
const form = reactive({
type: '',
d_order_id: '',
querystatus: '',
page: 1,
status: '',
list: [],
count: '',
date: ''
});
const getlist = async () => {
let data = null
if (uni.getStorageSync('clint_type') == 1) {
data = {
page: form.page,
date: form.date
}
} else {
data = {
page: form.page,
status: form.querystatus,
d_order_id: form.d_order_id
}
}
let res = await orderlist(data)
form.count = res.count
form.status = 'loading';
if (form.page == 1 && res.list.length == 0) {
form.status = 'nomore'
return false;
} else {
setTimeout(() => {
if (form.page == 1) {
form.list = res.list
} else {
form.list = [...form.list, ...res.list];
}
if (form.list.length >= form.count && res.list.length < 10) {
form.status = 'nomore';
} else {
form.status = 'loadmore';
}
// 这是美团处理的数据
if (uni.getStorageSync('clint_type') == 1) {
form.list = form.list.map(item => {
// 计算60天后
item.couponUseTimes = dayjs(item.couponUseTime).add(60, 'day').format(
'YYYY-MM-DD HH:mm:ss')
item.type = dayjs().isAfter(dayjs(item.couponUseTime).add(60, 'day'),
'year')
return item
});
}
}, 500)
}
}
const clickcancel = async (item) => {
uni.showModal({
title: '确认撤销吗?',
success: async (res) => {
if (res.confirm) {
let data = null
if (uni.getStorageSync('clint_type') == 1) {
data = {
couponCode: item.couponCode
}
} else {
data = {
verify_id: item.verify_id,
certificate_id: item.certificate_id
}
}
await fulfilmentcertificatecanceles(data)
uni.showToast({
title: '撤销核销成功',
icon: 'success'
})
setTimeout(() => {
initial()
}, 1000)
} else if (res.cancel) {
console.log('用户点击取消');
}
}
})
}
</script>
<style lang="scss" scoped>
page {
background: #F9F9F9;
}
.constant {
padding-bottom: 32rpx;
.topbox {
width: 100%;
padding: 32rpx 28rpx;
background: #fff;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
.left {}
.right {
width: 80%;
.input {
width: 100%;
}
}
}
.bottomconstant {
padding: 0 28rpx;
width: 100%;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.itemlist {
margin-top: 32rpx;
padding: 32rpx 24rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.ordernumber {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.title {
margin-top: 16rpx;
padding-bottom: 24rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 28rpx;
color: #333333;
border-bottom: 1rpx solid #E5E5E5;
}
.itemlists {
padding-top: 24rpx;
.top {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
.date {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.tag {
background: #EAF4FD;
border-radius: 4rpx 4rpx 4rpx 4rpx;
padding: 6rpx 12rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 20rpx;
color: #318AFE;
}
}
.bottom {
display: flex;
justify-content: space-between;
align-items: center;
.bottomtitle {
width: 350rpx;
overflow: hidden; //超出的文本隐藏
text-overflow: ellipsis; //溢出用省略号显示
white-space: nowrap; //溢出不换行
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
.price {
margin-top: 16rpx;
display: flex;
justify-content: flex-start;
align-items: center;
.prices {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
.pricees {
margin-left: 12rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 24rpx;
color: #999999;
text-decoration-line: line-through;
}
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve"> <image id="image0" width="96" height="96" x="0" y="0"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo
AAB1MAAA6mAAADqYAAAXcJy6UTwAAABRUExURQAAAFCf/0uZ/0yZ/kyY/kuY/UyZ/0yZ/kuY/k2Z
/0yZ/UqX/0uZ/0uY/kuZ/kyZ/kyY/UuZ/UiX/0uZ/kuZ/UyX/0yY/kqa/0uZ/kyZ/v///7LMcjEA
AAAZdFJOUwAQX6+/n3/v31CAYHCwz8CQoCDwj0DQMODQpj2tAAAAAWJLR0QadWfkMgAAAAd0SU1F
B+gMBQIoEmmNJfAAAAHtSURBVGje7ZnZloMgDEChm63RKlK3///RsXVciTUBOmdmDnkF7wVTSU4R
IgQr5OF4ap3idD684V8iN3of19vW8o8+8M844wJv/A1D7I/ftoC8IC/vf4hIGoLEJx/bQupXkBqC
u19BZgj88ts2CH5KkEoh8w8K1OtR1OBF0PNF8SmBevesB8HI/9AORr5Ai6CzYOKf0XFXwR7fVbDL
pwp0ZsknChKBllICnyaIXyNgw6cJvgsrWPBpgmEM+HyaoEAMRD5NcBSGgcon/opgbSDzqd/BykDn
k7/khYHBpx8VMwOHzziLkD6WwOccdmDDZ52mYMHnHdfA5zPrAbD53IIDXD67ogGTzy+Zl26OpPMt
avL18bjS+X+muw6CIAiC3y5QJTmUjQAp9tsBfEHF4QtRsQUxT5CzBSlPkLIFUcHh1xFb0N5rBt+s
dfuCrkieiIGVUorAKYIgCIIgCILgnwneXk9VjaNAq0LU2RZEJ11H1DgIdNz/75holJH1fUGZWQqa
qbcrEIaehmub1jFb3grDehPp4rayyPWeYLlGVa7H5SLZjXEpLeNFMsybwNnzz8wicZsIucQmzPNt
NoZjfzxk1ozhQqspNybM8p2Yg9U6sxjgucbNBczyXSFzZFytM4tO2usou3w3SooQIfzFFziLPvqM
MV6wAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDI0LTEyLTA1VDAyOjQwOjE4KzAwOjAwFHedYwAAACV0
RVh0ZGF0ZTptb2RpZnkAMjAyNC0xMi0wNVQwMjo0MDoxOCswMDowMGUqJd8AAAAodEVYdGRhdGU6
dGltZXN0YW1wADIwMjQtMTItMDVUMDI6NDA6MTgrMDA6MDAyPwQAAAAAAElFTkSuQmCC" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1249,11 +1249,11 @@ pre[class*="language-"] {
</head> </head>
<body> <body>
<article class="markdown-body"><h2 class="atx" id="隐私政策">隐私政策</h2> <article class="markdown-body"><h2 class="atx" id="隐私政策">隐私政策</h2>
<p>商福通商户通APP以下简称“我们”尊重并保护所有商福通商户通用户的个人信息及隐私安全。为了给您提供更准确、更有个性化的服务,我们依据《中华人民共和国网络安全法》、《信息安全技术 个人信息安全规范》以及其他相关法律法规和技术规范明确了我们收集/使用/披露您的个人信息的原则。本隐私政策进一步阐述了关于您个人信息的相关权利。</p> <p>银收客APP以下简称“我们”尊重并保护所有银收客用户的个人信息及隐私安全。为了给您提供更准确、更有个性化的服务,我们依据《中华人民共和国网络安全法》、《信息安全技术 个人信息安全规范》以及其他相关法律法规和技术规范明确了我们收集/使用/披露您的个人信息的原则。本隐私政策进一步阐述了关于您个人信息的相关权利。</p>
<p>本政策与您所使用的我们的产品与/或服务息息相关,您在下载、安装、启动、浏览、注册、登录、使用我们的产品和/或服务(以下统称“使用我们的产品和/或服务时”)时,我们将按照本政策的约定处理和保护您的个人信息。</p> <p>本政策与您所使用的我们的产品与/或服务息息相关,您在下载、安装、启动、浏览、注册、登录、使用我们的产品和/或服务(以下统称“使用我们的产品和/或服务时”)时,我们将按照本政策的约定处理和保护您的个人信息。</p>
<p>请在使用/继续使用我们的各项产品与服务前,仔细阅读并充分理解本政策。如果您不同意本政策的内容,将可能导致我们的产品/服务无法正常运行,您应立即停止访问/使用我们的产品与/或服务。若您同意本《隐私政策》,即视为您已经仔细阅读/充分理解,并同意本《隐私政策》的全部内容。若您使用/继续使用我们提供的产品与/或服务的行为,均视为您已仔细阅读/充分理解,并同意本《隐私政策》(包括更新版本)的全部内容。</p> <p>请在使用/继续使用我们的各项产品与服务前,仔细阅读并充分理解本政策。如果您不同意本政策的内容,将可能导致我们的产品/服务无法正常运行,您应立即停止访问/使用我们的产品与/或服务。若您同意本《隐私政策》,即视为您已经仔细阅读/充分理解,并同意本《隐私政策》的全部内容。若您使用/继续使用我们提供的产品与/或服务的行为,均视为您已仔细阅读/充分理解,并同意本《隐私政策》(包括更新版本)的全部内容。</p>
<h3 class="atx" id="关于我们">关于我们</h3> <h3 class="atx" id="关于我们">关于我们</h3>
<p>商福通付网站及商福通商户通APP的经营者为河北商福通科技有限公司及其关联公司。</p> <p>银收客付网站及银收客APP的经营者为河北银收客科技有限公司及其关联公司。</p>
<p>注册地址为河北省沧州市运河区御河新城小区东16号楼2-2202</p> <p>注册地址为河北省沧州市运河区御河新城小区东16号楼2-2202</p>
<h3 class="atx" id="目录">目录</h3> <h3 class="atx" id="目录">目录</h3>
<p><a href="#%E4%B8%80%E3%80%81%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E6%94%B6%E9%9B%86%E5%92%8C%E4%BD%BF%E7%94%A8%E6%82%A8%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF">一、我们如何收集和使用您的个人信息</a></p> <p><a href="#%E4%B8%80%E3%80%81%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E6%94%B6%E9%9B%86%E5%92%8C%E4%BD%BF%E7%94%A8%E6%82%A8%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF">一、我们如何收集和使用您的个人信息</a></p>
@@ -1269,13 +1269,13 @@ pre[class*="language-"] {
<h3 class="atx" id="一、我们如何收集和使用您的个人信息">一、我们如何收集和使用您的个人信息</h3> <h3 class="atx" id="一、我们如何收集和使用您的个人信息">一、我们如何收集和使用您的个人信息</h3>
<p>我们会遵循正当、合法、必要的原则,处于对本政策所述的以下目的,收集和使用您在使用我们的产品与/或服务时所主动提供,或因使用我们的产品与/或服务时被动产生的个人信息。除本政策另有规定外,在未征得您事先许可的情况下,我们不会将这些信息对外披露或提供给第三方。若我们需要将您的个人信息用于本政策未载明的其他用途,或基于特定目的将已经收集的信息用于其他目的,我们将以合理的方式告知您,并在使用前征得您的同意。</p> <p>我们会遵循正当、合法、必要的原则,处于对本政策所述的以下目的,收集和使用您在使用我们的产品与/或服务时所主动提供,或因使用我们的产品与/或服务时被动产生的个人信息。除本政策另有规定外,在未征得您事先许可的情况下,我们不会将这些信息对外披露或提供给第三方。若我们需要将您的个人信息用于本政策未载明的其他用途,或基于特定目的将已经收集的信息用于其他目的,我们将以合理的方式告知您,并在使用前征得您的同意。</p>
<h4 class="atx" id="1账号注册及登录">1.账号注册及登录</h4> <h4 class="atx" id="1账号注册及登录">1.账号注册及登录</h4>
<p>1.1当您注册商福通商户通APP账号时您需要根据商福通商户通APP的要求提供您的个人注册信息我们会收集您所填写的商户名称、手机号码以及您所选择的商户类型。</p> <p>1.1当您注册银收客APP账号时您需要根据银收客APP的要求提供您的个人注册信息我们会收集您所填写的商户名称、手机号码以及您所选择的商户类型。</p>
<p>1.2为了给您提供更合理的服务,当您登录商福通商户通APP时我们会使用您的用户ID/手机号,以确认您账号所属的商户信息。</p> <p>1.2为了给您提供更合理的服务,当您登录银收客APP时我们会使用您的用户ID/手机号,以确认您账号所属的商户信息。</p>
<h4 class="atx" id="2向您提供产品与或服务时">2.向您提供产品与/或服务时</h4> <h4 class="atx" id="2向您提供产品与或服务时">2.向您提供产品与/或服务时</h4>
<p>2.1信息浏览、管理、修改、新增等功能。</p> <p>2.1信息浏览、管理、修改、新增等功能。</p>
<p>当您使用商福通商户通APP中的信息浏览、管理、修改和新增等功能时我们会请求您授权照片、相机、和存储功能的权限。如果您拒绝授权提供将无法使用相应的功能但并不影响您使用商福通商户通APP的其他功能。</p> <p>当您使用银收客APP中的信息浏览、管理、修改和新增等功能时我们会请求您授权照片、相机、和存储功能的权限。如果您拒绝授权提供将无法使用相应的功能但并不影响您使用银收客APP的其他功能。</p>
<p>2.1.1当您使用用户头像修改/上传等功能时,我们会请求您授权存储功能的权限,如果您拒绝授权提供,将无法使用相应功能。但并不影响您使用商福通商户通APP的其他功能。</p> <p>2.1.1当您使用用户头像修改/上传等功能时,我们会请求您授权存储功能的权限,如果您拒绝授权提供,将无法使用相应功能。但并不影响您使用银收客APP的其他功能。</p>
<p>2.1.2当您使用商福通商户通APP中的编辑个人信息、门店管理、码牌管理、云喇叭管理、云打印机管理、扫码POS管理等功能时您所提供的图片、文字、状态等信息将会上传并存储至云端服务器中由于存储是实现以上功能及其多端同步的必要条件。我们会以加密的方式存储这些信息您也可以随时修改这些信息。</p> <p>2.1.2当您使用银收客APP中的编辑个人信息、门店管理、码牌管理、云喇叭管理、云打印机管理、扫码POS管理等功能时您所提供的图片、文字、状态等信息将会上传并存储至云端服务器中由于存储是实现以上功能及其多端同步的必要条件。我们会以加密的方式存储这些信息您也可以随时修改这些信息。</p>
<p>2.2我们的产品基于DCloud uni-app(5+ App/Wap2App)开发应用运行期间需要收集您的设备唯一识别码IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息、OAID以提供统计分析服务并通过应用启动数据及异常错误日志分析改进性能和用户体验为用户提供更好的服务。详情内容请访问<a href="https://ask.dcloud.net.cn/protocol.html">《DCloud用户服务条款》</a></p> <p>2.2我们的产品基于DCloud uni-app(5+ App/Wap2App)开发应用运行期间需要收集您的设备唯一识别码IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息、OAID以提供统计分析服务并通过应用启动数据及异常错误日志分析改进性能和用户体验为用户提供更好的服务。详情内容请访问<a href="https://ask.dcloud.net.cn/protocol.html">《DCloud用户服务条款》</a></p>
<table> <table>
<thead> <thead>
@@ -1295,15 +1295,15 @@ pre[class*="language-"] {
<td>存储的个人文件设备信息IMEI、ANDROID_ID、DEVICE_ID、IMSI网络信息</td> <td>存储的个人文件设备信息IMEI、ANDROID_ID、DEVICE_ID、IMSI网络信息</td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>2.3搜索功能。当您使用商福通商户通APP提供的搜索功能时我们会收集您所输入的关键词信息、访问时间信息。这些信息是搜索功能的必要条件。</p> <p>2.3搜索功能。当您使用银收客APP提供的搜索功能时我们会收集您所输入的关键词信息、访问时间信息。这些信息是搜索功能的必要条件。</p>
<p>2.4扫码。当您使用商福通商户通APP提供的扫一扫支付、绑定新码、扫码获取云喇叭/打印机设备号等功能和/或服务时,我们会请求您授权相机的权限。如果您拒绝授权提供,将无法使用上述功能。</p> <p>2.4扫码。当您使用银收客APP提供的扫一扫支付、绑定新码、扫码获取云喇叭/打印机设备号等功能和/或服务时,我们会请求您授权相机的权限。如果您拒绝授权提供,将无法使用上述功能。</p>
<p>2.5地址。当您使用商福通商户通APP提供的门店/辅助终端设备信息修改或新增中的选择地址功能时,我们会请求您授权位置的权限。如果您拒绝授权提供,将无法使用上述功能。</p> <p>2.5地址。当您使用银收客APP提供的门店/辅助终端设备信息修改或新增中的选择地址功能时,我们会请求您授权位置的权限。如果您拒绝授权提供,将无法使用上述功能。</p>
<p>2.6收款。当您使用商福通商户通APP提供的收款功能时、我们会收集该笔收款订单的订单号、收款金额、收款时间、支付时间、支付方式、订单状态、门店信息、用户信息这些信息用于生成详细的订单记录。</p> <p>2.6收款。当您使用银收客APP提供的收款功能时、我们会收集该笔收款订单的订单号、收款金额、收款时间、支付时间、支付方式、订单状态、门店信息、用户信息这些信息用于生成详细的订单记录。</p>
<p>2.7退款。当您使用商福通商户通APP提供的订单退款功能时、我们会收集该笔订单的订单号、订单金额、支付金额、退款金额、支付时间、退款时间、门店信息、用户信息这些信息用于生成详细的退款记录并对比收退款金额以限制退款金额不能大于支付金额。</p> <p>2.7退款。当您使用银收客APP提供的订单退款功能时、我们会收集该笔订单的订单号、订单金额、支付金额、退款金额、支付时间、退款时间、门店信息、用户信息这些信息用于生成详细的退款记录并对比收退款金额以限制退款金额不能大于支付金额。</p>
<p>2.8查询。当您使用商福通商户通APP提供的订单记录、门店列表、码牌列表、云喇叭列表、云打印机列表、收款通知接收人列表等功能时我们会收集您的账户信息和商户ID用于展示在您查询权限内的信息。</p> <p>2.8查询。当您使用银收客APP提供的订单记录、门店列表、码牌列表、云喇叭列表、云打印机列表、收款通知接收人列表等功能时我们会收集您的账户信息和商户ID用于展示在您查询权限内的信息。</p>
<p>2.9拨号。当您使用商福通商户通APP关于我们-联系电话中的快捷拨号功能时,我们会请求您设备的拨号权限。如果您拒绝授权提供,将无法使用快捷拨号功能,但不会影响您使用商福通商户通APP的其他服务。</p> <p>2.9拨号。当您使用银收客APP关于我们-联系电话中的快捷拨号功能时,我们会请求您设备的拨号权限。如果您拒绝授权提供,将无法使用快捷拨号功能,但不会影响您使用银收客APP的其他服务。</p>
<p>2.10设备权限调用汇总</p> <p>2.10设备权限调用汇总</p>
<p>我们对商福通商户通APP为您提供服务时所需要您授权的设备权限汇总如下。注意您可以拒绝其中部分权限但将无法使用需要该权限的功能和服务。您可以随时取消已授权的设备权限不同设备权限显示方式和关闭方式可能有所不同具体请参考设备及操作系统开发方的说明和操作指引</p> <p>我们对银收客APP为您提供服务时所需要您授权的设备权限汇总如下。注意您可以拒绝其中部分权限但将无法使用需要该权限的功能和服务。您可以随时取消已授权的设备权限不同设备权限显示方式和关闭方式可能有所不同具体请参考设备及操作系统开发方的说明和操作指引</p>
<table> <table>
<thead> <thead>
<tr> <tr>
@@ -1362,11 +1362,11 @@ pre[class*="language-"] {
<p>1事先已获得您的授权</p> <p>1事先已获得您的授权</p>
<p>2您自行提出的</p> <p>2您自行提出的</p>
<p>3与商业合作伙伴的必要共享</p> <p>3与商业合作伙伴的必要共享</p>
<p>您理解并知悉,为了向您提供更完善、优质的产品和服务;或由于您在使用商福通商户通中由第三方服务提供企业/机构所提供的服务时的情况下,我们将授权第三方服务提供企业/机构为您提供部分服务。此种情况下我们可能会与合作伙伴共享您的某些个人信息其中包括您已授权或自行提出的包括但不限于商户名称、手机号、法人信息、商户营业执照等必要信息以及您在使用本APP时自动产生的某些信息包括订单、订单金额、交易时间、收款方式、收款金额、门店信息、退款信息。请您注意、我们仅处于合法、正当、必要、特定、明确的目的共享这些信息。我们将对信息数据的输出形式、流转、使用进行安全评估与处理以保护数据安全。同时我们会对合作伙伴、服务商机构进行严格的监督与管理一但发现其存在违规处理个人信息的行为将立即停止合作并追究其法律责任。</p> <p>您理解并知悉,为了向您提供更完善、优质的产品和服务;或由于您在使用银收客中由第三方服务提供企业/机构所提供的服务时的情况下,我们将授权第三方服务提供企业/机构为您提供部分服务。此种情况下我们可能会与合作伙伴共享您的某些个人信息其中包括您已授权或自行提出的包括但不限于商户名称、手机号、法人信息、商户营业执照等必要信息以及您在使用本APP时自动产生的某些信息包括订单、订单金额、交易时间、收款方式、收款金额、门店信息、退款信息。请您注意、我们仅处于合法、正当、必要、特定、明确的目的共享这些信息。我们将对信息数据的输出形式、流转、使用进行安全评估与处理以保护数据安全。同时我们会对合作伙伴、服务商机构进行严格的监督与管理一但发现其存在违规处理个人信息的行为将立即停止合作并追究其法律责任。</p>
<p>目前,我们的合作伙伴包括以下类型:</p> <p>目前,我们的合作伙伴包括以下类型:</p>
<p>A.第三方支付机构:当您使用商福通商户通提供的支付业务时,将会使用并通过第三方支付机构的支付通道,其中包括但不限于微信支付、支付宝支付、银联云闪付支付、盛付通等第三方支付平台。我们会与第三方支付机构共享来自于您的部分交易信息。为保障您在使用我们所提供的收款功能/服务时的合理、合规及合法性,在您正式使用前述功能/服务前,您需要向对应的第三方支付机构发起支付通道申请,在此情况下,我们会收集您所主动提供的商户名称、企业名称、法人信息、营业执照、账户信息等必要信息,并将上述信息与第三方支付机构共享。</p> <p>A.第三方支付机构:当您使用银收客提供的支付业务时,将会使用并通过第三方支付机构的支付通道,其中包括但不限于微信支付、支付宝支付、银联云闪付支付、盛付通等第三方支付平台。我们会与第三方支付机构共享来自于您的部分交易信息。为保障您在使用我们所提供的收款功能/服务时的合理、合规及合法性,在您正式使用前述功能/服务前,您需要向对应的第三方支付机构发起支付通道申请,在此情况下,我们会收集您所主动提供的商户名称、企业名称、法人信息、营业执照、账户信息等必要信息,并将上述信息与第三方支付机构共享。</p>
<p>B.消息推送服务供应商由每日互动股份有限公司提供推送技术服务我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息应用列表信息、网络信息以及位置相关信息提供给每日互动股份有限公司用于为您提供消息推送技术服务。我们在向您推送消息时我们可能会授权每日互动股份有限公司进行链路调节相互促活被关闭的SDK推送进程保障您可以及时接收到我们向您推送的消息。详细内容请访问<a href="http://docs.getui.com/privacy">《个推用户隐私政策》</a></p> <p>B.消息推送服务供应商由每日互动股份有限公司提供推送技术服务我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息应用列表信息、网络信息以及位置相关信息提供给每日互动股份有限公司用于为您提供消息推送技术服务。我们在向您推送消息时我们可能会授权每日互动股份有限公司进行链路调节相互促活被关闭的SDK推送进程保障您可以及时接收到我们向您推送的消息。详细内容请访问<a href="http://docs.getui.com/privacy">《个推用户隐私政策》</a></p>
<p>当您使用商福通商户通APP的收款通知及语音播报等功能时为了保证通知的时效性我们需使用自启动服务以便您能够正常接收通知。如果您关掉自启动可能会无法正常接收通知。如需关闭请在手机设置-应用-自启动管理中关闭本APP的自启动权限。具体操作方法可能会因手机系统产生差异请前往手机品牌操作指南处查看。</p> <p>当您使用银收客APP的收款通知及语音播报等功能时为了保证通知的时效性我们需使用自启动服务以便您能够正常接收通知。如果您关掉自启动可能会无法正常接收通知。如需关闭请在手机设置-应用-自启动管理中关闭本APP的自启动权限。具体操作方法可能会因手机系统产生差异请前往手机品牌操作指南处查看。</p>
<p>UniPush模块集成的三方SDK说明</p> <p>UniPush模块集成的三方SDK说明</p>
<table> <table>
<thead> <thead>
@@ -1388,7 +1388,7 @@ pre[class*="language-"] {
<td><a href="http://docs.getui.com/privacy">个推用户隐私政策-个推文档中心</a></td> <td><a href="http://docs.getui.com/privacy">个推用户隐私政策-个推文档中心</a></td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>4您可以基于商福通商户通APP与第三人包括不特定对象共享您的个人信息或其他信息但因您的共享行为而导致的信息泄露、被使用及其他相关请何况商福通商户通APP无关商福通商户通不因此承担法律责任。</p> <p>4您可以基于银收客APP与第三人包括不特定对象共享您的个人信息或其他信息但因您的共享行为而导致的信息泄露、被使用及其他相关请何况银收客APP无关银收客不因此承担法律责任。</p>
<h4 class="atx" id="2转让">2.转让</h4> <h4 class="atx" id="2转让">2.转让</h4>
<p>转让是指将取得您个人信息的控制权转让给其他公司、组织或个人。除非获取您的明确同意,否则我们不会将您的个人信息转让给任何公司、组织或个人。但下述情形除外:</p> <p>转让是指将取得您个人信息的控制权转让给其他公司、组织或个人。除非获取您的明确同意,否则我们不会将您的个人信息转让给任何公司、组织或个人。但下述情形除外:</p>
<p>1已事先征得您的同意</p> <p>1已事先征得您的同意</p>
@@ -1439,9 +1439,9 @@ pre[class*="language-"] {
<h3 class="atx" id="五、您如何注销您的账号">五、您如何注销您的账号</h3> <h3 class="atx" id="五、您如何注销您的账号">五、您如何注销您的账号</h3>
<p>您可以通过第九条中指明的联系方式联系我们或在本APP的”我的-设置-其他设置-注销账号“页面提供的联系方式联系我们并向我们阐明您注销账号的原因。在满足账号注销的条件下我们将尽快注销您的账号。注意由于您账号在使用期间内产生的交易信息将不会被立刻处理而是需要经过确认、复查后确保该笔交易已完成所有流程后进行脱敏处理。此外除法律明确规定必须由我们保留的个人信息外您在使用本APP期间内所产生或由您提交的其他个人信息将会被删除或匿名化处理且该处理不可逆您将无法找回这些个人信息。</p> <p>您可以通过第九条中指明的联系方式联系我们或在本APP的”我的-设置-其他设置-注销账号“页面提供的联系方式联系我们并向我们阐明您注销账号的原因。在满足账号注销的条件下我们将尽快注销您的账号。注意由于您账号在使用期间内产生的交易信息将不会被立刻处理而是需要经过确认、复查后确保该笔交易已完成所有流程后进行脱敏处理。此外除法律明确规定必须由我们保留的个人信息外您在使用本APP期间内所产生或由您提交的其他个人信息将会被删除或匿名化处理且该处理不可逆您将无法找回这些个人信息。</p>
<h3 class="atx" id="六、有关第三方提供产品和或服务的特别说明">六、有关第三方提供产品和/或服务的特别说明</h3> <h3 class="atx" id="六、有关第三方提供产品和或服务的特别说明">六、有关第三方提供产品和/或服务的特别说明</h3>
<p>您在使用商福通商户通APP时可能会使用到由第三方提供的产品和/或服务,在这种情况下,您需要接受该第三方的服务条款及隐私政策(而非本隐私政策)的约束,您需要仔细阅读其条款并自行决定是否接受。请您妥善保管您的个人信息,仅在必要的情况下向他人提供。本政策仅适用于我们所收集、保存、使用、共享、披露信息,并不适用于任何第三方提供服务时(包含您向该第三方提供的任何个人信息)或第三方信息的使用规则,第三方使用您的个人信息时的行为,由其自行负责。</p> <p>您在使用银收客APP时可能会使用到由第三方提供的产品和/或服务,在这种情况下,您需要接受该第三方的服务条款及隐私政策(而非本隐私政策)的约束,您需要仔细阅读其条款并自行决定是否接受。请您妥善保管您的个人信息,仅在必要的情况下向他人提供。本政策仅适用于我们所收集、保存、使用、共享、披露信息,并不适用于任何第三方提供服务时(包含您向该第三方提供的任何个人信息)或第三方信息的使用规则,第三方使用您的个人信息时的行为,由其自行负责。</p>
<h3 class="atx" id="七、我们如何使用cookie和其他同类技术">七、我们如何使用Cookie和其他同类技术</h3> <h3 class="atx" id="七、我们如何使用cookie和其他同类技术">七、我们如何使用Cookie和其他同类技术</h3>
<p>在您未拒绝接受cookies的情况下我们会在您的计算机以及相关移动设备上设定或取用cookies以便您能登录或使用依赖于cookies的商福通商户通的产品与/或服务。您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式或在移动设备设置中设置拒绝我们使用cookies。若您拒绝使用cookies则您可能无法登录或使用依赖于cookies的商福通商户通App网络服务或功能。</p> <p>在您未拒绝接受cookies的情况下我们会在您的计算机以及相关移动设备上设定或取用cookies以便您能登录或使用依赖于cookies的银收客的产品与/或服务。您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式或在移动设备设置中设置拒绝我们使用cookies。若您拒绝使用cookies则您可能无法登录或使用依赖于cookies的银收客App网络服务或功能。</p>
<h3 class="atx" id="八、更新隐私政策">八、更新隐私政策</h3> <h3 class="atx" id="八、更新隐私政策">八、更新隐私政策</h3>
<p>我们保留更新或修订本隐私政策的权力。这些修订或更新构成本政策的一部分,并具有等同于本政策的效。未经您的同意,我们不会削减您依据当前生效的本政策所应享受的权利。</p> <p>我们保留更新或修订本隐私政策的权力。这些修订或更新构成本政策的一部分,并具有等同于本政策的效。未经您的同意,我们不会削减您依据当前生效的本政策所应享受的权利。</p>
<p>我们会不时更新本政策如遇本政策更新我们会通过APP通知等相关合理方式通知您如遇重大更新您需要重新仔细阅读、充分理解并同意修订更新后的政策才可继续使用我们所提供的产品和/或服务。</p> <p>我们会不时更新本政策如遇本政策更新我们会通过APP通知等相关合理方式通知您如遇重大更新您需要重新仔细阅读、充分理解并同意修订更新后的政策才可继续使用我们所提供的产品和/或服务。</p>

View File

@@ -1249,19 +1249,19 @@ pre[class*="language-"] {
</head> </head>
<body> <body>
<article class="markdown-body"><h2 class="atx" id="用户服务协议">用户服务协议</h2> <article class="markdown-body"><h2 class="atx" id="用户服务协议">用户服务协议</h2>
<p>感谢您使用商福通付产品,在使用“商福通商户通”、“商福通展业宝”、“商福通店管家”、“商福通付商户系统”、“商福通付代理商系统”、“商福通付门店系统”等软件及相关服务前,请您认真阅读本协议,并确认承诺同意遵守本协议的全部约定。本协议由您与商福通科技(河北)有限公司(包括其关联机构,以下合成“本公司”)于您点击同意本协议之时,在河北省沧州市签署并生效。</p> <p>感谢您使用银收客付产品,在使用“银收客”、“银收客展业宝”、“银收客店管家”、“银收客付商户系统”、“银收客付代理商系统”、“银收客付门店系统”等软件及相关服务前,请您认真阅读本协议,并确认承诺同意遵守本协议的全部约定。本协议由您与陕西超掌柜科技(西安)有限公司(包括其关联机构,以下合成“本公司”)于您点击同意本协议之时,在河北省沧州市签署并生效。</p>
<h3 class="atx" id="一、协议条款的确认及接受">一、协议条款的确认及接受</h3> <h3 class="atx" id="一、协议条款的确认及接受">一、协议条款的确认及接受</h3>
<p><strong>1</strong>.商福通付(包括网址为<a href="www.xxx.com">www.xxx.com</a> 的网站以及可在IOS系统及Android 系统中运行的名为“商福通商户通APP”、“商福通展业宝APP”、“商福通店管家APP”及其他不同版本的应用程序以及名为“商福通商户通”、“商福通展业宝”、“商福通店管家APP”的微信小程序以下简称"本网站"或“商福通付”)由商福通科技(河北)有限公司(包括其关联机构,以下合称“本公司”)运营并享有完全的所有权及知识产权等权益,商福通付提供的服务将完全按照其发布的条款和操作规则严格执行。</p> <p><strong>1</strong>.银收客付(包括网址为<a href="https://www.sxczgkj.cn/#/">https://www.sxczgkj.cn/#/</a> 的网站以及可在IOS系统及Android 系统中运行的名为“银收客APP”、“银收客展业宝APP”、“银收客店管家APP”及其他不同版本的应用程序以及名为“银收客”、“银收客展业宝”、“银收客店管家APP”的微信小程序以下简称"本网站"或“银收客付”)由陕西超掌柜科技(西安)有限公司(包括其关联机构,以下合称“本公司”)运营并享有完全的所有权及知识产权等权益,银收客付提供的服务将完全按照其发布的条款和操作规则严格执行。</p>
<p><strong>2</strong>.您确认同意本协议(协议文本包括《商福通付用户服务协议》、《商福通付用户隐私政策》及商福通付已公示或将来公示的各项规则及提示,所有前述协议、规则及提示乃不可分割的整体,具有同等法律效力,共同构成用户使用商福通付及相关服务的整体协议,以下合称“本协议”)所有条款并完成注册程序时,本协议在您于本公司间成立并发生法律效力,同时您成为商福通付正式用户。</p> <p><strong>2</strong>.您确认同意本协议(协议文本包括《银收客付用户服务协议》、《银收客付用户隐私政策》及银收客付已公示或将来公示的各项规则及提示,所有前述协议、规则及提示乃不可分割的整体,具有同等法律效力,共同构成用户使用银收客付及相关服务的整体协议,以下合称“本协议”)所有条款并完成注册程序时,本协议在您于本公司间成立并发生法律效力,同时您成为银收客付正式用户。</p>
<h3 class="atx" id="二、账号注册及使用规则">二、账号注册及使用规则</h3> <h3 class="atx" id="二、账号注册及使用规则">二、账号注册及使用规则</h3>
<p><strong>1</strong>.当您使用“商福通商户通”APP和/或小程序,及“商福通付商户系统”时您可以在APP/微信小程序中的注册页,或在地址为<a href="https://mch.s.jeepay.vip/register%E7%9A%84%E7%BD%91%E9%A1%B5%E8%BF%9B%E8%A1%8C%E6%B3%A8%E5%86%8C%EF%BC%8C%E6%B3%A8%E5%86%8C%E6%88%90%E5%8A%9F%E5%90%8E%EF%BC%8C%E8%AE%A1%E5%85%A8%E4%BB%98%E5%B0%86%E7%BB%99%E4%B8%8E%E6%82%A8%E4%B8%80%E4%B8%AA%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E5%8F%8A%E7%9B%B8%E5%BA%94%E7%9A%84%E5%AF%86%E7%A0%81%EF%BC%8C%E8%AF%A5%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E5%92%8C%E5%AF%86%E7%A0%81%E7%94%B1%E6%82%A8%E8%B4%9F%E8%B4%A3%E4%BF%9D%E7%AE%A1%EF%BC%8C%E6%82%A8%E5%BA%94%E5%BD%93%E5%AF%B9%E4%BB%A5%E5%85%B6%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E8%BF%9B%E8%A1%8C%E7%9A%84%E6%89%80%E6%9C%89%E6%B4%BB%E5%8A%A8%E5%92%8C%E4%BA%8B%E4%BB%B6%E8%B4%9F%E6%B3%95%E5%BE%8B%E8%B4%A3%E4%BB%BB%E3%80%82">https://mch.s.jeepay.vip/register的网页进行注册注册成功后商福通付将给与您一个商户账号及相应的密码,该商户账号和密码由您负责保管,您应当对以其商户账号进行的所有活动和事件负法律责任。</a></p> <p><strong>1</strong>.当您使用“银收客”APP和/或小程序,及“银收客付商户系统”时您可以在APP/微信小程序中的注册页,或在地址为<a href="https://mch.s.jeepay.vip/register%E7%9A%84%E7%BD%91%E9%A1%B5%E8%BF%9B%E8%A1%8C%E6%B3%A8%E5%86%8C%EF%BC%8C%E6%B3%A8%E5%86%8C%E6%88%90%E5%8A%9F%E5%90%8E%EF%BC%8C%E8%AE%A1%E5%85%A8%E4%BB%98%E5%B0%86%E7%BB%99%E4%B8%8E%E6%82%A8%E4%B8%80%E4%B8%AA%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E5%8F%8A%E7%9B%B8%E5%BA%94%E7%9A%84%E5%AF%86%E7%A0%81%EF%BC%8C%E8%AF%A5%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E5%92%8C%E5%AF%86%E7%A0%81%E7%94%B1%E6%82%A8%E8%B4%9F%E8%B4%A3%E4%BF%9D%E7%AE%A1%EF%BC%8C%E6%82%A8%E5%BA%94%E5%BD%93%E5%AF%B9%E4%BB%A5%E5%85%B6%E5%95%86%E6%88%B7%E8%B4%A6%E5%8F%B7%E8%BF%9B%E8%A1%8C%E7%9A%84%E6%89%80%E6%9C%89%E6%B4%BB%E5%8A%A8%E5%92%8C%E4%BA%8B%E4%BB%B6%E8%B4%9F%E6%B3%95%E5%BE%8B%E8%B4%A3%E4%BB%BB%E3%80%82">https://mch.s.jeepay.vip/register的网页进行注册注册成功后银收客付将给与您一个商户账号及相应的密码,该商户账号和密码由您负责保管,您应当对以其商户账号进行的所有活动和事件负法律责任。</a></p>
<p><strong>1.1</strong>.当您使用“商福通展业宝”APP和/或小程序,及“商福通付代理商系统”时,我们会为您创建一个代理商账号并给与您该账号及相应密码。该代理商账号和密码由您负责保管,您应当对以其代理商账号进行的所有活动和事件负法律责任。</p> <p><strong>1.1</strong>.当您使用“银收客展业宝”APP和/或小程序,及“银收客付代理商系统”时,我们会为您创建一个代理商账号并给与您该账号及相应密码。该代理商账号和密码由您负责保管,您应当对以其代理商账号进行的所有活动和事件负法律责任。</p>
<p><strong>1.2</strong>.当您使用“商福通店管家”APP和/或小程序,及“商福通付门店系统”时,我们或对应商户用户将会为您创建一个门店操作员用户账号,并给与您该账号及相应密码。该门店操作员用户账号和密码由您负责保管,您应当对以其门店操作员账号进行的所有活动和事件负法律责任。</p> <p><strong>1.2</strong>.当您使用“银收客店管家”APP和/或小程序,及“银收客付门店系统”时,我们或对应商户用户将会为您创建一个门店操作员用户账号,并给与您该账号及相应密码。该门店操作员用户账号和密码由您负责保管,您应当对以其门店操作员账号进行的所有活动和事件负法律责任。</p>
<p><strong>2</strong>.您须对在商福通付注册信息的真实性、合法性、有效性承担全部责任,您不得冒充他人(包括但不限于冒用他人姓名、名称、字号、头像等足以让人引起混淆的方式,以及冒用他人手机号码)开设账号;不得利用他人的名义发布任何信息;不得利用他人的名义发起任何交易;不得恶意使用注册账户导致他人误认;否则商福通付有权立即停止提供服务,收回账号,并由您独自承担由此而产生的一切法律责任。</p> <p><strong>2</strong>.您须对在银收客付注册信息的真实性、合法性、有效性承担全部责任,您不得冒充他人(包括但不限于冒用他人姓名、名称、字号、头像等足以让人引起混淆的方式,以及冒用他人手机号码)开设账号;不得利用他人的名义发布任何信息;不得利用他人的名义发起任何交易;不得恶意使用注册账户导致他人误认;否则银收客付有权立即停止提供服务,收回账号,并由您独自承担由此而产生的一切法律责任。</p>
<p><strong>3</strong>.您理解且确认,您在商福通付注册的账号的所有权及有关权益均归本公司所有,您完成注册手续后仅享有该账号的使用权(包括但不限于该账号绑定的由商福通付提供的产品和/或服务)。您的账号仅限于您本人使用,未经本公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他任何形式许可他人使用该账号。如果本公司发现或有合理理由认为使用者并非账号初始注册人,公司有权在未通知您的请款修改,暂停或终止向该账号提供服务,并有权注销该账号,而无需向注册该账号的用户承担法律责任。</p> <p><strong>3</strong>.您理解且确认,您在银收客付注册的账号的所有权及有关权益均归本公司所有,您完成注册手续后仅享有该账号的使用权(包括但不限于该账号绑定的由银收客付提供的产品和/或服务)。您的账号仅限于您本人使用,未经本公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他任何形式许可他人使用该账号。如果本公司发现或有合理理由认为使用者并非账号初始注册人,公司有权在未通知您的请款修改,暂停或终止向该账号提供服务,并有权注销该账号,而无需向注册该账号的用户承担法律责任。</p>
<p><strong>4</strong>.您理解并确认除用于登录、使用本APP相关服务外您还可以使用您的注册账号登录使用商福通付提供的其他产品和/或服务,以及其他本公司的合作伙伴、第三方服务提供商所提供的软件及服务。若您以商福通付账号登录和/或使用前述服务时,同样应受到其他软件、服务实际提供方的用户协议及其他协议条款的约束。</p> <p><strong>4</strong>.您理解并确认除用于登录、使用本APP相关服务外您还可以使用您的注册账号登录使用银收客付提供的其他产品和/或服务,以及其他本公司的合作伙伴、第三方服务提供商所提供的软件及服务。若您以银收客付账号登录和/或使用前述服务时,同样应受到其他软件、服务实际提供方的用户协议及其他协议条款的约束。</p>
<p><strong>5</strong>.您理解并确认,部分由其他第三方平台(包括但不限于银联云闪付、微信支付、支付宝支付、盛付通等)提供的产品及服务,在您使用商福通付提供的产品和/或服务时,仅作为基础服务为您提供。您的商福通付账号与您在上述第三方平台注册的第三方平台账号仅在技术层面上构成单方面绑定。如果您不使用/不继续使用商福通付提供的产品和/或服务,您的第三方平台账号均不会受到影响,您可以继续第三方平台提供的产品及服务。</p> <p><strong>5</strong>.您理解并确认,部分由其他第三方平台(包括但不限于银联云闪付、微信支付、支付宝支付、盛付通等)提供的产品及服务,在您使用银收客付提供的产品和/或服务时,仅作为基础服务为您提供。您的银收客付账号与您在上述第三方平台注册的第三方平台账号仅在技术层面上构成单方面绑定。如果您不使用/不继续使用银收客付提供的产品和/或服务,您的第三方平台账号均不会受到影响,您可以继续第三方平台提供的产品及服务。</p>
<p><strong>6</strong>.您承诺不得以任何方式利用商福通付直接或间接从事违反中国法律、社会公德的行为,商福通付有权对违反上述承诺的内容予以屏蔽、留证,并将由您独自承担由此而产生的一切法律责任。</p> <p><strong>6</strong>.您承诺不得以任何方式利用银收客付直接或间接从事违反中国法律、社会公德的行为,银收客付有权对违反上述承诺的内容予以屏蔽、留证,并将由您独自承担由此而产生的一切法律责任。</p>
<p><strong>7</strong>.您不得利用本网站制作、上传、复制、发布、传播或转载如下内容:</p> <p><strong>7</strong>.您不得利用本网站制作、上传、复制、发布、传播或转载如下内容:</p>
<p>1反对宪法所确定的基本原则的</p> <p>1反对宪法所确定的基本原则的</p>
<p>2危害国家安全泄露国家秘密颠覆国家政权破坏国家统一的</p> <p>2危害国家安全泄露国家秘密颠覆国家政权破坏国家统一的</p>
@@ -1273,22 +1273,22 @@ pre[class*="language-"] {
<p>8侮辱或者诽谤他人侵害他人合法权益的</p> <p>8侮辱或者诽谤他人侵害他人合法权益的</p>
<p>9侵害未成年人合法权益或者损害未成年人身心健康的</p> <p>9侵害未成年人合法权益或者损害未成年人身心健康的</p>
<p>10含有法律、行政法规禁止的其他内容的信息。</p> <p>10含有法律、行政法规禁止的其他内容的信息。</p>
<p><strong>8</strong>.商福通付有权对您使用我们的产品和/或服务时的情况进行审查和监督,如您在使用商福通付时违反任何上述规定,本公司有权暂停或终止对您提供服务,以减轻您的不当行为所造成的影响。</p> <p><strong>8</strong>.银收客付有权对您使用我们的产品和/或服务时的情况进行审查和监督,如您在使用银收客付时违反任何上述规定,本公司有权暂停或终止对您提供服务,以减轻您的不当行为所造成的影响。</p>
<h3 class="atx" id="三、服务内容">三、服务内容</h3> <h3 class="atx" id="三、服务内容">三、服务内容</h3>
<p><strong>1</strong>.本公司可能为不同的终端设备及使用需求开发不同的应用程序软件版本,您应当更具实际设备需求状况获取、下载、安装合适的版本。</p> <p><strong>1</strong>.本公司可能为不同的终端设备及使用需求开发不同的应用程序软件版本,您应当更具实际设备需求状况获取、下载、安装合适的版本。</p>
<p><strong>2</strong>.本网站的服务具体内容根据实际情况提供,商福通付保留变更、中断或终止部分或全部服务的权力。商福通付不承担因业务调整给您造成的损失。除非本协议另有其他明示规定,增加或强化目前本网站的任何新功能,包括所推出的新产品,均受到本协议之规范。您了解并同意,本网站服务仅依其当前所呈现的状况提供,对于任何用户通讯或个人化设定之时效、删除、传递错误、未予储存或其他任何问题,商福通付均不承担任何责任。如您不接受服务调整,请停止使用本服务;否则,您的继续使用行为将被视为其对调整服务的完全同意且承诺遵守。</p> <p><strong>2</strong>.本网站的服务具体内容根据实际情况提供,银收客付保留变更、中断或终止部分或全部服务的权力。银收客付不承担因业务调整给您造成的损失。除非本协议另有其他明示规定,增加或强化目前本网站的任何新功能,包括所推出的新产品,均受到本协议之规范。您了解并同意,本网站服务仅依其当前所呈现的状况提供,对于任何用户通讯或个人化设定之时效、删除、传递错误、未予储存或其他任何问题,银收客付均不承担任何责任。如您不接受服务调整,请停止使用本服务;否则,您的继续使用行为将被视为其对调整服务的完全同意且承诺遵守。</p>
<p><strong>3</strong>.商福通付在提供服务时, 可能会对部分服务的用户收取一定的费用或交易佣金。在此情况下,商福通付会在相关页面上做明确的提示。如您拒绝支付该等费用,则不能使用相关的服务。</p> <p><strong>3</strong>.银收客付在提供服务时, 可能会对部分服务的用户收取一定的费用或交易佣金。在此情况下,银收客付会在相关页面上做明确的提示。如您拒绝支付该等费用,则不能使用相关的服务。</p>
<p><strong>4</strong>.您理解,商福通付仅提供相应的服务,除此外与相关服务有关的设备(如电脑、移动设备、调制解调器及其他与接入互联网有关的装置)及所需的费用(如电话费、上网费等)均应由您自行负担。</p> <p><strong>4</strong>.您理解,银收客付仅提供相应的服务,除此外与相关服务有关的设备(如电脑、移动设备、调制解调器及其他与接入互联网有关的装置)及所需的费用(如电话费、上网费等)均应由您自行负担。</p>
<p><strong>5</strong>.商福通付提供的服务可能包括:文字、软件、声音、图片、视频、数据统计、图表、支付通道等。所有这些内容均受著作权、商标和其他财产所有权法律保护。您只有在获得商福通付或其他相关权利人的授权之后才能使用这些内容,不能擅自复制、再造这些内容、或创造与内容有关的派生产品。</p> <p><strong>5</strong>.银收客付提供的服务可能包括:文字、软件、声音、图片、视频、数据统计、图表、支付通道等。所有这些内容均受著作权、商标和其他财产所有权法律保护。您只有在获得银收客付或其他相关权利人的授权之后才能使用这些内容,不能擅自复制、再造这些内容、或创造与内容有关的派生产品。</p>
<h3 class="atx" id="四、知识产权">四、知识产权</h3> <h3 class="atx" id="四、知识产权">四、知识产权</h3>
<p><strong>1</strong>.本公司在商福通付软件及相关服务中提供的内容(包括但不限于软件、技术、程序、网页、文字、图片、图像、商标、标识、音频、视频、图表、版面设计、电子文档等,未申明版权或网络上公开的无版权内容除外)的知识产权属于本公司所有。同时本公司提供服务所依托的软件著作权、专利权、商标及其他知识产权均归本公司所有。未经本公司许可,任何人不得擅自使用。</p> <p><strong>1</strong>.本公司在银收客付软件及相关服务中提供的内容(包括但不限于软件、技术、程序、网页、文字、图片、图像、商标、标识、音频、视频、图表、版面设计、电子文档等,未申明版权或网络上公开的无版权内容除外)的知识产权属于本公司所有。同时本公司提供服务所依托的软件著作权、专利权、商标及其他知识产权均归本公司所有。未经本公司许可,任何人不得擅自使用。</p>
<p><strong>2</strong>.请您在任何情况下都不要私自使用本公司的包括但不限于“商福通”、“商福通支付”、“商福通付”、“xxx”、“xxx.cn”、“xxx.com”、“jeequan”和“jeequan.com”等在内的任何商标、服务标记、商号、域名、网站名称或其他显著品牌特征等以下统称为“标识”。未经本公司事先书面同意您不得将本条款前述标识以单独或结合任何方式展示、使用或申请注册商标、进行域名注册等也不得实时向他人明示或暗示有权展示、使用或其他有权处理这些标识的行为。由于您违反本协议使用公司上述商标、标识等给本公司或他人造成损失的由您承担全部法律责任。</p> <p><strong>2</strong>.请您在任何情况下都不要私自使用本公司的包括但不限于“银收客”、“银收客支付”、“银收客付”、“xxx”、“xxx.cn”、“xxx.com”、“jeequan”和“jeequan.com”等在内的任何商标、服务标记、商号、域名、网站名称或其他显著品牌特征等以下统称为“标识”。未经本公司事先书面同意您不得将本条款前述标识以单独或结合任何方式展示、使用或申请注册商标、进行域名注册等也不得实时向他人明示或暗示有权展示、使用或其他有权处理这些标识的行为。由于您违反本协议使用公司上述商标、标识等给本公司或他人造成损失的由您承担全部法律责任。</p>
<h3 class="atx" id="五、用户授权及隐私保护">五、用户授权及隐私保护</h3> <h3 class="atx" id="五、用户授权及隐私保护">五、用户授权及隐私保护</h3>
<p>商福通付尊重并保护所有商福通付用户的个人信息及隐私安全。为了给您提供更准确、更有个性化的服务,商福通付依据《中华人民共和国网络安全法》、《信息安全技术 个人信息安全规范》以及其他相关法律法规和技术规范明确了本公司收集/使用/披露您的个人信息的原则。详情请参照<a href="#%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96">《隐私协议》</a></p> <p>银收客付尊重并保护所有银收客付用户的个人信息及隐私安全。为了给您提供更准确、更有个性化的服务,银收客付依据《中华人民共和国网络安全法》、《信息安全技术 个人信息安全规范》以及其他相关法律法规和技术规范明确了本公司收集/使用/披露您的个人信息的原则。详情请参照<a href="#%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96">《隐私协议》</a></p>
<h3 class="atx" id="六、免责声明">六、免责声明</h3> <h3 class="atx" id="六、免责声明">六、免责声明</h3>
<p><strong>1</strong>.商福通付不担保本网站服务一定能满足您的要求,也不担保本网站服务不会中断,对本网站服务的及时性、安全性、准确性、真实性、完整性也都不作担保。</p> <p><strong>1</strong>.银收客付不担保本网站服务一定能满足您的要求,也不担保本网站服务不会中断,对本网站服务的及时性、安全性、准确性、真实性、完整性也都不作担保。</p>
<p><strong>2</strong>.对于因不可抗力或本公司不能控制的原因造成的本网站服务中断或其他缺陷,本网站不承担任何责任,但本公司将尽力减少因此而给您造成的损失和影响。</p> <p><strong>2</strong>.对于因不可抗力或本公司不能控制的原因造成的本网站服务中断或其他缺陷,本网站不承担任何责任,但本公司将尽力减少因此而给您造成的损失和影响。</p>
<p><strong>3</strong>.对于您利用商福通付或本公司发布的其他产品和/或服务,进行违法犯罪,或进行任何违反中国法律、社会公德的行为,本公司有权立即停止对您提供服务,并将由您独自承担由此产生的一切法律责任。</p> <p><strong>3</strong>.对于您利用银收客付或本公司发布的其他产品和/或服务,进行违法犯罪,或进行任何违反中国法律、社会公德的行为,本公司有权立即停止对您提供服务,并将由您独自承担由此产生的一切法律责任。</p>
<h3 class="atx" id="七、违约责任">七、违约责任</h3> <h3 class="atx" id="七、违约责任">七、违约责任</h3>
<p><strong>1</strong>.针对您违反本协议或其他服务条款的行为,本公司有权独立判断并视情况采取预先警示、限制帐号部分或者全部功能直至永久关闭帐号等措施。本公司有权公告处理结果,且有权根据实际情况决定是否恢复使用。对涉嫌违反法律法规、涉嫌违法犯罪的行为将保存有关记录,并依法向有关主管部门报告、配合有关主管部门调查。</p> <p><strong>1</strong>.针对您违反本协议或其他服务条款的行为,本公司有权独立判断并视情况采取预先警示、限制帐号部分或者全部功能直至永久关闭帐号等措施。本公司有权公告处理结果,且有权根据实际情况决定是否恢复使用。对涉嫌违反法律法规、涉嫌违法犯罪的行为将保存有关记录,并依法向有关主管部门报告、配合有关主管部门调查。</p>
<h3 class="atx" id="八、协议修改">八、协议修改</h3> <h3 class="atx" id="八、协议修改">八、协议修改</h3>

Binary file not shown.

26
utils/app.js Normal file
View File

@@ -0,0 +1,26 @@
export function openApp(url) {
// #ifdef H5
window.location.href = 'com.hnsiyao.duanju://'
// #endif
}
export function isAndroid() {
const systemInfo = uni.getSystemInfoSync();
const isA = systemInfo.platform === 'android'
isAndroid = () => {
return isA
}
isA
}
export function isIos() {
const systemInfo = uni.getSystemInfoSync();
const isIOS = /iOS/.test(systemInfo.platform);
isIos = () => {
return isIOS
}
return isIOS
}
// 获取当前系统版本信息
export function getVeriosn() {
return plus.runtime.getProperty(plus.runtime.appid)
}

View File

@@ -1,4 +1,4 @@
## 商福通商户通项目 ## 银收客商户通项目
版本要求: 版本要求: