This commit is contained in:
YeMingfei666 2024-12-11 16:33:58 +08:00
commit c63c187ed3
21 changed files with 1857 additions and 145 deletions

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

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

143
App.vue
View File

@ -6,8 +6,9 @@ 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 +24,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)
) )
}) })
} }

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

@ -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'}"
@ -68,12 +69,12 @@
</uni-forms-item> </uni-forms-item>
<view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)" <view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)"
v-if="option.type=='edit'&&disabledChangeCategory"> v-if="option.type=='edit'&&disabledChangeCategory">
</view> </view>
</view> </view>
<view class=""> <view class="">
<uni-forms-item label="单位" required showRequired name="units"> <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">
@ -90,7 +91,7 @@
</uni-data-picker> </uni-data-picker>
</uni-forms-item> </uni-forms-item>
</view> --> </view> -->
<view class="border-top" v-if="FormData.proGroupVo"> <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) ">
@ -515,12 +516,12 @@
<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>
@ -540,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 <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">
@ -573,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>
@ -701,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>
@ -896,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
@ -916,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) {
@ -945,7 +947,6 @@
} }
function refChooseGoodsConfirm(arr) { function refChooseGoodsConfirm(arr) {
console.log(arr);
refChooseGoodsClose() refChooseGoodsClose()
arr = arr.map(v => { arr = arr.map(v => {
const { const {
@ -974,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) {
@ -1230,13 +1229,13 @@
// //
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: '',
@ -1364,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') {
@ -1572,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') {
@ -1685,7 +1690,7 @@
} }
} }
if (type == 'package') { if (type == 'package') {
if (groupType == 0&& FormData.proGroupVo[0].goods.length<=0) { if (groupType == 0 && FormData.proGroupVo[0].goods.length <= 0) {
// //
return infoBox.showToast('套餐组合至少需要包含一种商品,请添加商品') return infoBox.showToast('套餐组合至少需要包含一种商品,请添加商品')
} }
@ -1693,6 +1698,7 @@
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
@ -1718,7 +1724,7 @@
} }
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,14 +1949,14 @@
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){ if (FormData.groupType == null) {
FormData.groupType=0 FormData.groupType = 0
} }
} else { } else {
if (newval == 'package') { if (newval == 'package') {
@ -2005,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)
}) })
@ -2020,6 +2049,7 @@
onReady(() => { onReady(() => {
Forms.value && Forms.value.setRules(rules) Forms.value && Forms.value.setRules(rules)
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => {
clearTimeout(timer) clearTimeout(timer)
}) })
@ -2133,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

@ -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": {
@ -760,13 +759,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 +891,10 @@
} }
}, },
{ {
"path" : "quan/quan", "path": "quan/quan",
"pageId": "PAGES_ORDER_QUAN", "pageId": "PAGES_ORDER_QUAN",
"style" : "style": {
{ "navigationBarTitleText": "券包"
"navigationBarTitleText" : "券包"
} }
} }
@ -1094,44 +1107,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

@ -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,17 +1,20 @@
<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" > <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 class="u-line-2">{{data.name}}
</text> </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">
@ -20,12 +23,12 @@
</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="">
@ -56,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,
@ -80,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)
} }
} }
@ -134,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

@ -8,7 +8,7 @@
style="color:#999">({{item.count}}{{item.number}})</text> </view> style="color:#999">({{item.count}}{{item.number}})</text> </view>
</view> </view>
<view class="u-flex u-m-t-20 u-flex-wrap"> <view class="u-flex u-m-t-20 u-flex-wrap">
<view class="item" @tap="chooseSkd(skd,item.number)" :class="{active:skd.select==true}" <view class="item" @tap="chooseSkd(skd,item)" :class="{active:skd.select==true}"
v-for="(skd,skdIndex) in item.goods" :key="skdIndex"> v-for="(skd,skdIndex) in item.goods" :key="skdIndex">
{{skd.proName}} {{skd.proName}}
</view> </view>
@ -62,7 +62,6 @@
title: "", title: "",
price: "", price: "",
skus: [], skus: [],
selectData: [],
// , // ,
selectNumber: 0, selectNumber: 0,
}) })
@ -80,6 +79,9 @@
// return props.skuMap[selSku.value] // return props.skuMap[selSku.value]
// }) // })
watch(() => props.goodsData, (newval) => { watch(() => props.goodsData, (newval) => {
newval.proGroupVo.forEach(ele => {
ele.selectData = []
})
datas.item = newval datas.item = newval
datas.title = newval.name datas.title = newval.name
datas.price = newval.price datas.price = newval.price
@ -90,22 +92,23 @@
}) })
const emits = defineEmits(['confirm', 'updateSku']) const emits = defineEmits(['confirm', 'updateSku'])
let number = ref(1)
function chooseSkd(skd, number) { function chooseSkd(skd, item) {
if (datas.selectData.includes(skd.proId)) { if (item.selectData.includes(skd.proId)) {
skd.select = false skd.select = false
let indexs = datas.selectData.indexOf(skd.proId) let indexs = item.selectData.indexOf(skd.proId)
datas.selectData.splice(indexs, 1) item.selectData.splice(indexs, 1)
} else { } else {
if (datas.selectData.length < number) { if (item.selectData.length < item.number) {
skd.select = true skd.select = true
datas.selectData.push(skd.proId) item.selectData.push(skd.proId)
} }
} }
} }
const model = ref(null) const model = ref(null)
function open() { function open() {
@ -118,10 +121,13 @@
const instance = getCurrentInstance(); const instance = getCurrentInstance();
function confirm() { function confirm() {
console.log(datas.selectData.length) //
console.log(datas.selectNumber,'调试1111') let arr = []
if (datas.selectData.length == datas.selectNumber) { datas.item.proGroupVo.forEach(ele => {
emits('confirm', datas.selectData,datas.item) arr.push(...ele.selectData)
})
if (arr.length == datas.selectNumber) {
emits('confirm', arr, datas.item)
close() close()
} else { } else {
instance.ctx.$refs.popup.open() instance.ctx.$refs.popup.open()

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,6 +105,7 @@
@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>
@ -127,8 +129,8 @@
: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)"
@ -151,6 +153,7 @@
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 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 {
@ -856,6 +859,13 @@
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()) {
return infoBox.showToast('请先选择桌台', 0.5).then(res => { return infoBox.showToast('请先选择桌台', 0.5).then(res => {
@ -987,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()
@ -1001,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)
@ -1017,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({
@ -1029,6 +1044,10 @@
$goods.chooseNumber = number $goods.chooseNumber = number
setSearchGoods(searchGoodsIndex, number) setSearchGoods(searchGoodsIndex, number)
} else { } else {
// suit
if ($goods.type == 'weigh' && showCurrentInput) {
suit = showCurrentInput
}
// //
if ($goods.groupType != 1) { if ($goods.groupType != 1) {
// //
@ -1039,7 +1058,7 @@
skuId skuId
}) })
infoBox.showToast('添加成功') infoBox.showToast('添加成功')
$goods.chooseNumber = num $goods.chooseNumber = Number(num)
cars.push(cartGoods) cars.push(cartGoods)
} }
} }

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

Binary file not shown.